AutoPodAutoPod

قياس تأثير استشهاد الذكاء الاصطناعي: التحليلات، السجلات، واستخلاص لوحات الإجابة

•قراءة 23 دقائق
مقال صوتي
قياس تأثير استشهاد الذكاء الاصطناعي: التحليلات، السجلات، واستخلاص لوحات الإجابة
0:00—:—
قياس تأثير استشهاد الذكاء الاصطناعي: التحليلات، السجلات، واستخلاص لوحات الإجابة

قياس تأثير استشهاد الذكاء الاصطناعي: التحليلات، السجلات، واستخلاص لوحات الإجابة

مقدمة

تتوزع عملية الاكتشاف المدفوعة بالذكاء الاصطناعي الآن عبر عدة طبقات قياس. قد يرى الشخص شركة مستشهد بها في إجابة من الذكاء الاصطناعي، وينقر على رابط بدون محيل مفيد، أو يزور عبر متصفح يجرد بيانات الحملة، أو يقرأ إجابة دون النقر على الإطلاق. في الوقت نفسه، قد يطلب زاحف الذكاء الاصطناعي صفحة الشركة دون أن يمثل زائرًا بشريًا.

لذلك، يجب أن يفصل نظام القياس المفيد بين أربعة أسئلة:

  1. هل تم الزحف إلى الموقع أو استرداده؟
  2. هل تم الاستشهاد بالموقع في إجابة من الذكاء الاصطناعي؟
  3. هل زار شخص الموقع من تلك الإجابة؟
  4. هل أدت تلك الزيارة إلى تفاعل أو إيرادات ذات معنى؟

اعتبارًا من 22 سبتمبر 2026، تتحسن التقارير الأولية. توفر Google Search Console تقرير أداء الذكاء الاصطناعي التوليدي لـ AI Overviews و AI Mode، بما في ذلك مرات الظهور، والصفحات، والبلدان، والأجهزة، والتواريخ. أصبح التقرير متاحًا في جميع أنحاء العالم في 31 أغسطس 2026. تقرير أداء الذكاء الاصطناعي التوليدي من Google (support.google.com)

توفر Microsoft أيضًا تقرير AI Performance في Bing Webmaster Tools. تُبلغ معاينته العامة عن إجمالي الاستشهادات، والصفحات المستشهد بها، واستعلامات التأسيس، واتجاهات الاستشهاد عبر تجارب الذكاء الاصطناعي المدعومة من Microsoft. أداء الذكاء الاصطناعي في Bing Webmaster Tools (blogs.bing.com)

يجب التعامل مع هذه الأدوات كسلطة لأسطحها الخاصة، لكنها لا تنشئ نظام قياس كامل عبر المساعدات. النهج الموصى به هو الجمع بين التقارير الأولية، وسجلات الخادم، وروابط التتبع المتحكم بها، وصادرات التحليلات، وملاحظات لوحة الإجابات المجدولة.


1. لماذا قياس إحالة الذكاء الاصطناعي صعب

تعتمد تحليلات الويب التقليدية بشكل كبير على رأس Referer ومعلمات الحملة. وكلاهما قد يكون مفقودًا أو غير مكتمل.

قد يحتوي رأس HTTP Referer على الصفحة السابقة، أو أصل الموقع السابق فقط، أو لا يحتوي على أي قيمة على الإطلاق. يمكن أن تحد سياسات محيل المتصفح أو تزيل تلك المعلومات عمدًا. وثائق سياسة المحيل من MDN (developer.mozilla.org)

تخلق أنظمة الذكاء الاصطناعي تعقيدات إضافية:

  • قد يربط المساعد بصفحة دون إرسال محيل يمكن التعرف عليه.
  • قد يستخدم المساعد عنوان URL معاد توجيهه أو معاد كتابته.
  • قد يجلب المساعد المحتوى من جانب الخادم قبل عرض الإجابة.
  • قد يزور زاحف الذكاء الاصطناعي صفحة دون أن يراها أي إنسان.
  • قد تستشهد الإجابة بعنوان URL قانوني بدلاً من عنوان URL الذي تم استرداده في الأصل.
  • قد تتغير الإجابة اعتمادًا على الموقع، والجهاز، واللغة، والوقت، أو التخصيص.

على سبيل المثال، تميز OpenAI بين OAI-SearchBot لاكتشاف البحث، و GPTBot للاستخدام التدريبي المحتمل، و ChatGPT-User للإجراءات التي يبدأها المستخدم. تحدد Perplexity بشكل منفصل PerplexityBot و Perplexity-User. تحدد Anthropic ClaudeBot و Claude-SearchBot و Claude-User. يجب عدم دمج هذه الطلبات في رقم واحد عام يمثل "حركة مرور الذكاء الاصطناعي". وثائق زاحف OpenAI (openai.com) وثائق زاحف Perplexity (docs.perplexity.ai) وثائق زاحف Anthropic (support.anthropic.com)

القاعدة الأساسية هي:

نشاط الزاحف ليس حركة إحالة، ورؤية الاستشهاد ليست حركة مرور، وحركة المرور ليست تأثيرًا تجاريًا.


2. إطار القياس

استخدم خمس طبقات قياس.

الطبقةالسؤال الرئيسيالبيانات الموصى بها
الوصولهل طلب نظام الذكاء الاصطناعي الصفحة؟سجلات خادم الويب، سجلات جدار الحماية
الرؤيةهل تم عرض الصفحة أو الاستشهاد بها؟Google Search Console، Bing Webmaster Tools، ملاحظات لوحة الإجابة
الاستحواذهل وصل شخص من سطح الذكاء الاصطناعي؟المحيل، معلمات الحملة، نقرات الروابط القصيرة، التحليلات
التفاعلهل تفاعل الزائر بشكل هادف؟أحداث التحليلات، مشاهدات الصفحة، وقت التفاعل
القيمةهل أدت الزيارة إلى نتيجة مرغوبة؟التسجيلات، العملاء المحتملون، المشتريات، الاشتراكات

تسلسل الهرمي الموصى به لمصدر الحقيقة

استخدم أقوى إشارة متاحة لكل سؤال:

  1. تقارير المنصات الأولية لمرات الظهور والاستشهادات.
  2. ملاحظات لوحة الإجابة للرؤية على مستوى المطالبة والمقارنات التنافسية.
  3. سجلات إعادة التوجيه لنقرات الروابط المتحكم بها.
  4. تحليلات الويب للجلسات، والتفاعل، والتحويلات.
  5. سجلات الخادم لنشاط الزاحف والجالب.
  6. التقديرات النموذجية فقط عندما لا تتوفر أدلة مباشرة.

لا تجمع كل الإشارات في رقم واحد دون الحفاظ على المصدر ومستوى الثقة.


3. نموذج البيانات الأساسي

أنشئ مستودعًا بجداول منفصلة للملاحظات الخام والمقاييس المشتقة.

panel_runs

صف واحد لكل مطالبة وفحص السطح.

text run_id observed_at surface topic prompt_id query_text locale country device panel_present panel_type answer_hash raw_html_path screenshot_path collector_version status

panel_citations

صف واحد لكل رابط لوحظ في لوحة إجابة.

text run_id surface topic prompt_id cited_url cited_domain citation_position link_scope target_domain target_cited

ai_crawler_requests

بيانات سجل الخادم المجمعة.

text date bot_name bot_role path requests successful_requests error_requests unique_ip_count

shortener_clicks

صف واحد لكل طلب رابط متحكم به.

text click_id occurred_at slug surface topic prompt_id asset_id referrer_host user_agent_family ip_hmac destination_path

ai_sessions

جدول تحليلات معياري.

text session_id date surface topic prompt_id landing_page attribution_method confidence engaged engagement_time_seconds key_event revenue

حقل confidence مهم. القيم الموصى بها هي:

  • A — مباشر: نقرة رابط قصير متحكم بها أو معلمة حملة موثوق بها.
  • B — قوي: محيل مساعد معروف أو طلب جلب مستخدم متحقق منه.
  • C — محتمل: دليل حملة أو صفحة هبوط بدون محيل كامل.
  • D — نموذج: استنتاج من التوقيت، أو ملاحظات اللوحة، أو التغييرات الإجمالية.

أبلغ عن A و B بشكل منفصل عن C و D.


4. تعريفات المقاييس

حصة الاستشهاد حسب الموضوع

تقيس حصة الاستشهاد حسب الموضوع مدى تكرار ظهور نطاق مستهدف بين المصادر الملاحظة لموضوع ما.

\[ \text{Citation Share}_{topic}

\frac{\text{Target-domain citation occurrences}} {\text{All citation occurrences}} \]

مثال:

  • 100 استشهاد إجمالي لوحظ لـ "برامج إدارة المشاريع"
  • 12 استشهادًا تشير إلى نطاقك
  • حصة الاستشهاد حسب الموضوع = 12%

يقيس هذا المقياس حصة المصدر، وليس ما إذا كانت الإجابة تحتوي على موقعك مرة واحدة على الأقل.

تغطية الاستشهاد

استخدم مقياسًا ثانيًا لتواجد الإجابة على مستوى الإجابة:

\[ \text{Citation Coverage}_{topic}

\frac{\text{Answer runs containing a target citation}} {\text{Answer runs where a panel was present}} \]

غالبًا ما تكون تغطية الاستشهاد أسهل فهمًا للجمهور غير التقني:

"ظهر موقعنا في 34% من إجابات الذكاء الاصطناعي الملاحظة لهذا الموضوع."

موضع الاستشهاد

سجل موضع الاستشهاد ضمن الإجابة:

  • 1 = المصدر الأول الملاحظ
  • 2 = المصدر الثاني الملاحظ
  • 3 = المصدر الثالث الملاحظ

نظرًا لأن واجهات الذكاء الاصطناعي غالبًا ما تجمع أو تعيد ترتيب المصادر، تعامل مع الموضع كملاحظة وصفية، وليس كترتيب عالمي.


معدل إحالة المساعد

يقيس معدل إحالة المساعد نسبة جلسات الموقع البشرية التي يمكن أن تعزى إلى سطح ذكاء اصطناعي.

\[ \text{Assistant Referral Rate}

\frac{\text{AI-attributed human sessions}} {\text{All human sessions}} \]

أبلغ عن نسختين على الأقل:

text Confirmed Assistant Referral Rate = A-confidence AI sessions / all human sessions

Expanded Assistant Referral Rate = A + B + C-confidence AI sessions / all human sessions

النسخة المؤكدة أكثر تحفظًا. النسخة الموسعة مفيدة لتحليل الاتجاهات ولكن لا ينبغي تقديمها على أنها حركة مرور مرصودة بالكامل.

لا تستخدم تشغيل اللوحة كمرات ظهور

إذا قمت باستخلاص 500 مطالبة، فهذا لا يعني أن 500 شخص رأوا تلك الإجابات. يقوم الكاشط الخاص بك بقياس عينة متحكم بها من حالات الإجابة. استخدم تقارير مرات الظهور من المنصة الأولية عندما تكون متاحة.


التفاعل بعد الاستشهاد

يقيس التفاعل بعد الاستشهاد ما إذا كان الأشخاص الذين وصلوا عبر استشهاد من الذكاء الاصطناعي قد اتخذوا إجراءً ذا معنى.

\[ \text{Post-Citation Engagement}

\frac{\text{Engaged AI sessions}} {\text{AI-attributed sessions}} \]

بالنسبة لـ Google Analytics 4، تستمر الجلسة المتفاعلة لأكثر من 10 ثوانٍ، أو تتضمن حدثًا رئيسيًا، أو تتضمن ما لا يقل عن مشاهدتين للصفحة أو الشاشة. وثائق معدل التفاعل في Google Analytics (support.google.com)

أبلغ أيضًا عن:

text Post-Citation Engagement Time = median engaged seconds per AI session

Post-Citation Conversion Rate = AI sessions with a key event / AI-attributed sessions

Post-Citation Revenue per Session = revenue from AI sessions / AI-attributed sessions

عادةً ما يكون متوسط وقت التفاعل أكثر استقرارًا من متوسط وقت التفاعل لأن عددًا صغيرًا من الجلسات الطويلة جدًا يمكن أن يشوه المتوسط.


مقاييس إضافية مفيدة

معدل نجاح زاحف الذكاء الاصطناعي

\[ \text{Crawler Success Rate}

\frac{\text{AI crawler requests returning 2xx or 3xx}} {\text{AI crawler requests}} \]

قم بتقسيم هذا حسب الروبوت والمسار. قد يشير انخفاض كبير في الاستشهاد مع ارتفاع معدل خطأ الزاحف إلى مشكلة في الاستضافة، أو جدار الحماية، أو تكوين ملف robots.

معدل الاستشهاد إلى النقر

للملاحظات المتحكم بها في لوحة الإجابة:

\[ \text{Observed Citation-to-Click Rate}

\frac{\text{Confirmed short-link clicks}} {\text{Observed target citations}} \]

هذا ليس معدل نقر مستخدم حقيقي ما لم يمثل المقام مرات ظهور المستخدم الفعلية. صفه بوضوح على أنه مقياس تشغيلي ملاحظ.

حداثة الاستشهاد

قيس مدى تكرار انعكاس عنوان URL المستشهد به لإصدار الصفحة الحالي.

text Citation Freshness = cited pages with current content hash / cited pages

هذا مفيد لصفحات الوثائق، والتسعير، والمنتجات، والسياسات التي تتغير بشكل متكرر.


5. تحليل سجلات الخادم

تكوين سجلات الوصول المنظمة

السجلات المنظمة أسهل في التحليل من السجلات التقليدية المفصولة بمسافات.

مثال على تكوين Nginx:

nginx log_format ai_json escape=json '{' '"ts":"$time_iso8601",' '"remote_addr":"$remote_addr",' '"request":"$request",' '"status":$status,' '"bytes":$body_bytes_sent,' '"referer":"$http_referer",' '"user_agent":"$http_user_agent",' '"host":"$host"' '}';

access_log /var/log/nginx/ai-access.jsonl ai_json;

قم بتخزين ملفات السجل في موقع مقيد. لا ترسل عناوين IP الخام إلى جدول تحليلات عام إلا إذا كان لديك سبب تشغيلي واضح.

تحديد أنواع طلبات الذكاء الاصطناعي

على الأقل، افصل:

text OpenAI:

  • OAI-SearchBot
  • ChatGPT-User
  • GPTBot

Anthropic:

  • Claude-SearchBot
  • Claude-User
  • ClaudeBot

Perplexity:

  • PerplexityBot
  • Perplexity-User

Search engines:

  • Googlebot
  • Bingbot

تستخدم ميزات بحث الذكاء الاصطناعي من Google عمومًا عناصر التحكم الحالية لزحف Google Search بدلاً من "روبوت نظرة عامة الذكاء الاصطناعي" عام منفصل. وتذكر Google أن Googlebot يتحكم في الوصول للبحث، بما في ذلك ميزات الذكاء الاصطناعي. ميزات الذكاء الاصطناعي من Google ومواقع الويب (developers.google.com)

يمكن تزوير سلاسل وكيل المستخدم. لاتخاذ القرارات التشغيلية، اجمع بين مطابقة وكيل المستخدم ونطاقات IP المنشورة من قبل المزود أو DNS العكسي المتحقق منه حيثما كان متاحًا. تنشر OpenAI و Perplexity معلومات IP لزواحفها وجالبيها ذوي الصلة. (openai.com)

ملخص سجل قابل لإعادة الإنتاج

احفظ ما يلي باسم ai_log_summary.py.

python #!/usr/bin/env python3

import csv import hashlib import hmac import json import os import re import sys from collections import Counter, defaultdict from datetime import datetime from urllib.parse import urlsplit

BOT_PATTERNS = { "OAI-SearchBot": ("openai", re.compile(r"\bOAI-SearchBot\b", re.I)), "ChatGPT-User": ("openai_user", re.compile(r"\bChatGPT-User\b", re.I)), "GPTBot": ("openai_training", re.compile(r"\bGPTBot\b", re.I)), "Claude-SearchBot": ("anthropic", re.compile(r"\bClaude-SearchBot\b", re.I)), "Claude-User": ("anthropic_user", re.compile(r"\bClaude-User\b", re.I)), "ClaudeBot": ("anthropic_training", re.compile(r"\bClaudeBot\b", re.I)), "PerplexityBot": ("perplexity", re.compile(r"\bPerplexityBot\b", re.I)), "Perplexity-User": ("perplexity_user", re.compile(r"\bPerplexity-User\b", re.I)), "Googlebot": ("google_search", re.compile(r"\bGooglebot\b", re.I)), "Bingbot": ("bing_search", re.compile(r"\bbingbot\b", re.I)), }

SECRET = os.environ.get("HMAC_SECRET", "replace-this-in-production").encode()

def hmac_ip(ip): return hmac.new(SECRET, ip.encode(), hashlib.sha256).hexdigest()[:16]

def classify_bot(user_agent): for bot_name, (role, pattern) in BOT_PATTERNS.items(): if pattern.search(user_agent or ""): return bot_name, role return None, None

def parse_path(request_line): try: parts = request_line.split() return urlsplit(parts[1]).path except Exception: return "/"

def main(input_path): totals = defaultdict(lambda: { "requests": 0, "success": 0, "errors": 0, "ips": set(), "paths": Counter(), })

with open(input_path, "r", encoding="utf-8") as source:
    for line in source:
        try:
            record = json.loads(line)
        except json.JSONDecodeError:
            continue

        bot_name, bot_role = classify_bot(record.get("user_agent", ""))
        if not bot_name:
            continue

        timestamp = record.get("ts", "")
        date = datetime.fromisoformat(
            timestamp.replace("Z", "+00:00")
        ).date().isoformat()

        status = int(record.get("status", 0))
        path = parse_path(record.get("request", ""))
        key = (date, bot_name, bot_role)

        totals[key]["requests"] += 1
        totals[key]["ips"].add(hmac_ip(record.get("remote_addr", "")))
        totals[key]["paths"][path] += 1

        if 200 <= status < 400:
            totals[key]["success"] += 1
        else:
            totals[key]["errors"] += 1

writer = csv.writer(sys.stdout)
writer.writerow([
    "date",
    "bot_name",
    "bot_role",
    "requests",
    "successful_requests",
    "error_requests",
    "unique_ip_count",
    "top_paths",
])

for (date, bot_name, bot_role), values in sorted(totals.items()):
    top_paths = values["paths"].most_common(10)
    writer.writerow([
        date,
        bot_name,
        bot_role,
        values["requests"],
        values["success"],
        values["errors"],
        len(values["ips"]),
        json.dumps(top_paths),
    ])

if name == "main": if len(sys.argv) != 2: print("Usage: python ai_log_summary.py /path/to/access.jsonl") sys.exit(1)

main(sys.argv[1])

شغّله باستخدام:

bash HMAC_SECRET='a-long-random-secret' \ python ai_log_summary.py /var/log/nginx/ai-access.jsonl \

data/ai_crawler_daily.csv

ينتج هذا دليلًا تشغيليًا حول نشاط الاسترداد، وليس حركة مرور بشرية.


6. مختصرات روابط مخصصة من الطرف الأول للملخصات التي يواجهها الذكاء الاصطناعي

يوفر مختصر الروابط من الطرف الأول نقطة قياس متحكم بها عندما تنشر ملخصات أو مواد مصدرية قد تستشهد بها أنظمة الذكاء الاصطناعي.

استخدم نطاقًا تتحكم فيه، مثل:

text https://go.example.com/ai-docs

يجب أن تتضمن الوجهة معلمات الحملة مثل:

text utm_source=perplexity utm_medium=ai_answer utm_campaign=product_documentation utm_content=pricing_summary_v3

توصي Google بمعلمات الحملة لتحديد مصادر حركة المرور والحملات. وثائق عنوان URL لحملات Google Analytics (support.google.com)

حقول الرابط الموصى بها

text surface topic prompt_id asset_id content_version destination_path

لا تضع معلومات شخصية، أو عناوين بريد إلكتروني، أو استعلامات بحث المستخدم في الرابط. يجب أن تصف معرفات الحملة الأصول المنشورة، ولا تحدد شخصًا.

قيود مهمة

الرابط القصير هو جهاز معايرة، وليس حلاً عالميًا:

  • قد يعيد المساعد كتابة عنوان URL الوجهة.
  • قد يستشهد المساعد بعنوان URL القانوني بدلاً من ذلك.
  • قد يتم عرض الرابط ولكن لا يتم النقر عليه أبدًا.
  • قد يزيل المتصفح أو أداة الخصوصية المحيل.
  • قد تجلب بعض الأنظمة الوجهة من جانب الخادم.
  • الرابط القصير لا يقيس المستخدمين الذين يتذكرون العلامة التجارية ويعودون لاحقًا.

لا تستخدم مختصرًا لإخفاء الوجهة، أو تجاوز أنظمة الأمان، أو التلاعب بالاستشهادات. استخدم إعادة توجيه واضحة إلى صفحة ذات صلة وقانونية.

مختصر أول طرف بسيط

يستخدم المثال التالي FastAPI و SQLite. قم بحماية نقطة نهاية إنشاء الرابط بالمصادقة قبل استخدامها في الإنتاج.

python

shortener.py

import hashlib import hmac import os import secrets import sqlite3 from datetime import datetime, timezone from urllib.parse import parse_qsl, urlencode, urlsplit, urlunsplit

from fastapi import FastAPI, HTTPException, Request from fastapi.responses import RedirectResponse from pydantic import BaseModel

DB_PATH = os.environ.get("SHORTENER_DB", "shortener.db") HMAC_SECRET = os.environ.get( "HMAC_SECRET", "replace-this-in-production" ).encode()

ALLOWED_HOST = "www.example.com"

app = FastAPI()

def db(): connection = sqlite3.connect(DB_PATH) connection.row_factory = sqlite3.Row return connection

def init_db(): connection = db() connection.execute(""" CREATE TABLE IF NOT EXISTS links ( slug TEXT PRIMARY KEY, destination TEXT NOT NULL, surface TEXT NOT NULL, topic TEXT, prompt_id TEXT, asset_id TEXT, created_at TEXT NOT NULL ) """) connection.execute(""" CREATE TABLE IF NOT EXISTS clicks ( id INTEGER PRIMARY KEY AUTOINCREMENT, occurred_at TEXT NOT NULL, slug TEXT NOT NULL, surface TEXT, topic TEXT, prompt_id TEXT, referrer_host TEXT, user_agent TEXT, ip_hmac TEXT ) """) connection.commit() connection.close()

def append_query(url, params): parsed = urlsplit(url) query = dict(parse_qsl(parsed.query, keep_blank_values=True)) query.update(params) return urlunsplit(( parsed.scheme, parsed.netloc, parsed.path, urlencode(query), parsed.fragment, ))

def hash_ip(ip): return hmac.new( HMAC_SECRET, (ip or "").encode(), hashlib.sha256 ).hexdigest()[:16]

class LinkRequest(BaseModel): destination_path: str surface: str topic: str | None = None prompt_id: str | None = None asset_id: str | None = None

@app.on_event("startup") def startup(): init_db()

@app.post("/links") def create_link(payload: LinkRequest): destination = f"https://{ALLOWED_HOST}{payload.destination_path}"

if not payload.destination_path.startswith("/"):
    raise HTTPException(400, "destination_path must be a site-relative path")

slug = secrets.token_urlsafe(7).replace("_", "-").replace("/", "-")

target = append_query(destination, {
    "utm_source": payload.surface,
    "utm_medium": "ai_answer",
    "utm_campaign": "citation_measurement",
    "utm_content": payload.asset_id or "unspecified",
})

connection = db()
connection.execute("""
    INSERT INTO links
    (slug, destination, surface, topic, prompt_id, asset_id, created_at)
    VALUES (?, ?, ?, ?, ?, ?, ?)
""", (
    slug,
    target,
    payload.surface,
    payload.topic,
    payload.prompt_id,
    payload.asset_id,
    datetime.now(timezone.utc).isoformat(),
))
connection.commit()
connection.close()

return {"slug": slug, "url": f"https://go.example.com/{slug}"}

@app.get("/{slug}") def redirect(slug: str, request: Request): connection = db() row = connection.execute( "SELECT * FROM links WHERE slug = ?", (slug,) ).fetchone()

if not row:
    connection.close()
    raise HTTPException(404, "Unknown link")

referrer = request.headers.get("referer", "")
referrer_host = urlsplit(referrer).hostname or ""

connection.execute("""
    INSERT INTO clicks
    (occurred_at, slug, surface, topic, prompt_id,
     referrer_host, user_agent, ip_hmac)
    VALUES (?, ?, ?, ?, ?, ?, ?, ?)
""", (
    datetime.now(timezone.utc).isoformat(),
    slug,
    row["surface"],
    row["topic"],
    row["prompt_id"],
    referrer_host,
    request.headers.get("user-agent", "")[:300],
    hash_ip(request.client.host if request.client else ""),
))
connection.commit()
connection.close()

return RedirectResponse(row["destination"], status_code=302)

شغّله باستخدام:

bash pip install fastapi uvicorn uvicorn shortener:app --host 0.0.0.0 --port 8080

استخدم إعادة توجيه 302 لروابط القياس بحيث تقل احتمالية قيام المتصفحات والأنظمة الوسيطة بتخزين إعادة التوجيه بشكل دائم.


7. الاستخلاص المجدول للوحات إجابات الذكاء الاصطناعي

يعد استخلاص اللوحات مفيدًا للإجابة على الأسئلة التي قد لا تكشفها تحليلات الطرف الأول:

  • ما هي المصادر المتنافسة التي يتم الاستشهاد بها؟
  • ما الصفحة المستشهد بها لمطالبة معينة؟
  • هل تتغير الإجابة حسب البلد أو الجهاز؟
  • هل يظهر الاستشهاد في الإجابة، قائمة المصادر، أم كليهما؟
  • ما مدى استقرار الإجابة بمرور الوقت؟
  • هل يستشهد المساعد برابط قصير أم بعنوان URL القانوني؟

ومع ذلك، يجب أن يتم الاستخلاص بعناية.

قواعد التجميع المسؤول

  1. فضل استخدام واجهة برمجة تطبيقات رسمية، أو مزود بيانات بحث مرخص، أو تقرير طرف أول.
  2. راجع شروط المزود قبل أتمتة الطلبات.
  3. احترم تعليمات ملف robots حيثما ينطبق ذلك.
  4. لا تتجاوز CAPTCHAs، أو حواجز تسجيل الدخول، أو حدود المعدل، أو حماية الروبوتات.
  5. استخدم مجموعة مطالبات صغيرة وثابتة.
  6. قم بالتشغيل بتردد منخفض.
  7. احفظ الاستجابة والطابع الزمني حتى يمكن تدقيق النتائج.
  8. توقف عندما يعيد المزود استجابة تحدي أو رفض الوصول.

بروتوكول استبعاد الروبوتات هو آلية تفضيل للزاحف، وليس نظام أمان. ولا يسمح بالوصول إلى المحتوى المحمي. RFC 9309: بروتوكول استبعاد الروبوتات (rfc-editor.org)

بناء بيان مطالبة

csv prompt_id,topic,query,locale,surface,target_domain pm_001,project-management,"best project management software for remote teams",en-US,google,example.com pm_001,project-management,"best project management software for remote teams",en-US,bing,example.com pm_002,analytics,"how to measure AI referral traffic",en-US,google,example.com

حافظ على استقرار المطالبات. إذا تغيرت المطالبات، تصبح مقارنات الاتجاهات أقل موثوقية.

قم بتخزين أيضًا:

  • البلد
  • اللغة
  • نوع الجهاز
  • إصدار المتصفح
  • إصدار المطالبة
  • إصدار المحتوى
  • وقت التجميع بتوقيت UTC

تلاحظ Google أن استجابات AI Overview و AI Mode قد تختلف لأنها تستخدم أنظمة مختلفة وقد تستخدم عمليات بحث ذات صلة أو "توسيع استعلام". ميزات الذكاء الاصطناعي من Google ووثائق موقع الويب (developers.google.com)

سكربت تجميع Playwright

السكربت التالي هو أداة بحث للأغراض العامة. يسجل الصفحة المعروضة، لقطة الشاشة، روابط الصفحة، ونص الإجابة. وهو لا يتجاوز التحديات عمدًا ولا يحاول إحباط ضوابط الوصول.

python

scrape_panels.py

import asyncio import csv import hashlib import json import os import re from datetime import datetime, timezone from pathlib import Path from urllib.parse import quote_plus, urljoin, urlsplit

from playwright.async_api import async_playwright

DATA_DIR = Path("data/panels") DATA_DIR.mkdir(parents=True, exist_ok=True)

SURFACE_URLS = { "google": "https://www.google.com/search?q={query}&hl=en&gl=us", "bing": "https://www.bing.com/search?q={query}&setlang=en-us", }

PANEL_MARKERS = { "google": ["AI Overview", "AI Mode"], "bing": ["Copilot", "Generative search"], }

BLOCK_MARKERS = [ "captcha", "unusual traffic", "verify you are human", "access denied", ]

def clean_text(value): return re.sub(r"\s+", " ", value or "").strip()

def host_matches(url, target_domain): host = (urlsplit(url).hostname or "").lower() target = target_domain.lower().lstrip("www.") return host == target or host.endswith("." + target)

def page_hash(text): normalized = clean_text(text).encode("utf-8") return hashlib.sha256(normalized).hexdigest()

async def collect_one(page, row): surface = row["surface"] query = row["query"] target_domain = row["target_domain"]

search_url = SURFACE_URLS[surface].format(
    query=quote_plus(query)
)

await page.goto(
    search_url,
    wait_until="domcontentloaded",
    timeout=45_000,
)
await page.wait_for_timeout(2500)

text = await page.locator("body").inner_text()
lowered = text.lower()

if any(marker in lowered for marker in BLOCK_MARKERS):
    return {
        **row,
        "observed_at": datetime.now(timezone.utc).isoformat(),
        "status": "blocked_or_challenged",
        "panel_present": False,
        "links": [],
    }

links = await page.locator("a").evaluate_all("""
    anchors => anchors.map(a => ({
        href: a.href || "",
        text: (a.innerText || "").trim()
    })).filter(x => x.href)
""")

panel_present = any(
    marker.lower() in lowered
    for marker in PANEL_MARKERS.get(surface, [])
)

observed_at = datetime.now(timezone.utc)
run_id = hashlib.sha256(
    f"{surface}|{row['prompt_id']}|{observed_at.isoformat()}".encode()
).hexdigest()[:20]

html_path = DATA_DIR / f"{run_id}.html"
screenshot_path = DATA_DIR / f"{run_id}.png"

await page.screenshot(path=str(screenshot_path), full_page=True)
html_path.write_text(await page.content(), encoding="utf-8")

output_links = []
for position, link in enumerate(links, start=1):
    output_links.append({
        "href": urljoin(search_url, link["href"]),
        "text": clean_text(link["text"])[:300],
        "position": position,
        "target_cited": host_matches(
            link["href"],
            target_domain
        ),
    })

return {
    **row,
    "run_id": run_id,
    "observed_at": observed_at.isoformat(),
    "status": "ok",
    "panel_present": panel_present,
    "answer_hash": page_hash(text),
    "answer_text": clean_text(text)[:50_000],
    "html_path": str(html_path),
    "screenshot_path": str(screenshot_path),
    "link_scope": "page_fallback",
    "links": output_links,
}

async def main(manifest_path): rows = [] with open(manifest_path, newline="", encoding="utf-8") as source: rows = list(csv.DictReader(source))

output_path = DATA_DIR / (
    datetime.now(timezone.utc).strftime("%Y-%m-%d") + ".jsonl"
)

async with async_playwright() as playwright:
    browser = await playwright.chromium.launch(headless=True)
    context = await browser.new_context(
        locale="en-US",
        timezone_id="UTC",
    )
    page = await context.new_page()

    with open(output_path, "w", encoding="utf-8") as output:
        for row in rows:
            try:
                result = await collect_one(page, row)
            except Exception as exc:
                result = {
                    **row,
                    "observed_at": datetime.now(timezone.utc).isoformat(),
                    "status": f"error:{type(exc).__name__}",
                    "panel_present": False,
                    "links": [],
                }

            output.write(json.dumps(result) + "\

") output.flush()

            # Keep request volume low.
            await asyncio.sleep(8)

    await browser.close()

if name == "main": asyncio.run(main("prompts.csv"))

قم بتثبيت وتشغيل:

bash pip install playwright playwright install chromium python scrape_panels.py

جدولها بقفل حتى لا تتداخل عمليتان:

cron 15 3 * * * flock -n /tmp/ai-panel.lock \ /usr/bin/python3 /opt/ai-measure/scrape_panels.py

تحسين الدقة باستخدام محولات السطح

يسجل السكربت الاحتياطي الروابط على مستوى الصفحة. وهذا مفيد للاكتشاف ولكنه قد يتضمن روابط نتائج بحث عادية. للاستخدام في الإنتاج:

  • استخدم واجهة برمجة تطبيقات (API) للوحة الإجابات المرخصة عندما تكون متاحة.
  • أنشئ محول محدد منفصل لكل سطح.
  • قم بتخزين إصدار المحدد.
  • قم بتخزين HTML الخام ولقطة شاشة.
  • ضع علامة على كل سجل بـ link_scope = "panel_selector" أو link_scope = "page_fallback".

احسب حصة الاستشهاد فقط من بيانات panel_selector عندما يمكنك تحديد اللوحة بشكل موثوق. احتفظ بملاحظات الاحتياطي في تقرير استكشافي منفصل.


8. تكامل Google Analytics و BigQuery

يمكن لـ Google Analytics 4 تصدير بيانات الأحداث الخام إلى BigQuery. توفر الصادرات اليومية جداول مستقرة مثل events_YYYYMMDD؛ الصادرات المتدفقة مفيدة للمراقبة شبه الفورية ولكنها قد تكون غير مكتملة حتى يتم الانتهاء من الجدول اليومي. تصدير Google Analytics BigQuery (support.google.com)

قد يبدو استعلام جلسة مبسط كما يلي:

sql WITH page_events AS ( SELECT event_date, user_pseudo_id,

(
  SELECT value.int_value
  FROM UNNEST(event_params)
  WHERE key = 'ga_session_id'
) AS session_id,

(
  SELECT value.string_value
  FROM UNNEST(event_params)
  WHERE key = 'page_location'
) AS page_location,

(
  SELECT value.string_value
  FROM UNNEST(event_params)
  WHERE key = 'session_engaged'
) AS session_engaged,

event_name

FROM PROJECT.analytics_PROPERTY.events_* WHERE _TABLE_SUFFIX BETWEEN '20260901' AND '20260921' ),

session_rollup AS ( SELECT event_date, user_pseudo_id, session_id,

MAX(
  CASE
    WHEN REGEXP_CONTAINS(
      LOWER(page_location),
      r'[?&]utm_medium=ai_answer'
    )
    THEN 1 ELSE 0
  END
) AS ai_session,

MAX(
  CASE
    WHEN session_engaged = '1'
    THEN 1 ELSE 0
  END
) AS engaged_session,

MAX(
  CASE
    WHEN event_name IN ('purchase', 'generate_lead', 'sign_up')
    THEN 1 ELSE 0
  END
) AS key_event

FROM page_events GROUP BY event_date, user_pseudo_id, session_id )

SELECT event_date, COUNTIF(ai_session = 1) AS ai_sessions, COUNTIF(ai_session = 1 AND engaged_session = 1) AS engaged_ai_sessions, COUNTIF(ai_session = 1 AND key_event = 1) AS ai_key_events, SAFE_DIVIDE( COUNTIF(ai_session = 1 AND engaged_session = 1), COUNTIF(ai_session = 1) ) AS post_citation_engagement_rate FROM session_rollup GROUP BY event_date ORDER BY event_date;

لتطبيق ناضج، أضف surface و topic و prompt_id إلى بنية الحملة أو اضممها من جدول نقرات المختصر.

لا تنشئ بعدًا تحليليًا عالي التعدد لكل مستخدم أو جلسة فردية. تحذر Google من أن الأبعاد المخصصة عالية التعدد المفرطة يمكن أن تقلل من جودة التقارير. الأبعاد والمقاييس المخصصة في Google Analytics (support.google.com)


9. تصميم لوحة القيادة

يجب أن تحتوي لوحة القيادة العملية على خمسة عروض.

ملخص تنفيذي

عرض:

  • حصة الاستشهاد حسب الموضوع
  • تغطية الاستشهاد حسب الموضوع
  • معدل إحالة المساعد المؤكد
  • معدل إحالة المساعد الموسع
  • التفاعل بعد الاستشهاد
  • معدل نجاح زاحف الذكاء الاصطناعي
  • الأحداث الرئيسية أو الإيرادات المنسوبة للذكاء الاصطناعي

اتجاه حصة الاستشهاد

مخطط خطي:

text Date × Topic × Surface

عرض كلاً من:

  • حدوث استشهادات النطاق المستهدف
  • جميع حدوث الاستشهادات الملاحظة

مسار حركة مرور المساعد

text Observed citations ↓ Controlled-link clicks ↓ AI-attributed sessions ↓ Engaged AI sessions ↓ Key events

يجب أن تعرض كل مرحلة ثقتها في الإحالة.

صحة الزاحف

جدول حسب الروبوت:

text bot_name requests successful_requests error_rate unique_ip_count top_paths

تنبيه عند:

  • تجاوز معدل الخطأ 2 بالمائة
  • اختفاء روبوت فجأة
  • قسم محتوى كان يمكن الوصول إليه سابقًا يعيد 403 أو 429
  • تركز طلبات الزاحف على مسار خاص غير مقصود

جدول فرص المحتوى

رتب الصفحات والمواضيع حسب:

text high citation share + low referral rate high impressions + low citation coverage high engagement + low citation visibility high crawler errors + high business importance

عادةً ما تنتج هذه المجموعات قرارات أفضل من النظر فقط إلى حجم حركة المرور.

لوحة تحكم Streamlit بسيطة

احفظ باسم dashboard.py.

python import glob import json from pathlib import Path

import pandas as pd import streamlit as st

st.set_page_config( page_title="AI Citation Impact", layout="wide", )

@st.cache_data(ttl=300) def load_panel_rows(): rows = []

for filename in glob.glob("data/panels/*.jsonl"):
    with open(filename, encoding="utf-8") as source:
        for line in source:
            record = json.loads(line)

            run_id = record.get("run_id")
            for link in record.get("links", []):
                hostname = link.get("href", "").split("/")[2]
                rows.append({
                    "run_id": run_id,
                    "observed_at": record.get("observed_at"),
                    "surface": record.get("surface"),
                    "topic": record.get("topic"),
                    "prompt_id": record.get("prompt_id"),
                    "panel_present": record.get("panel_present"),
                    "target_domain": record.get("target_domain"),
                    "cited_domain": hostname,
                    "target_cited": link.get("target_cited", False),
                    "position": link.get("position"),
                    "link_scope": record.get("link_scope"),
                })

return pd.DataFrame(rows)

panels = load_panel_rows()

st.title("AI Citation Impact Dashboard")

if panels.empty: st.warning("No panel observations found.") st.stop()

panels["date"] = pd.to_datetime( panels["observed_at"], errors="coerce" ).dt.date

citation_share = ( panels.groupby("topic") .apply( lambda group: group["target_cited"].sum() / max(len(group), 1) ) .reset_index(name="citation_share") )

coverage = ( panels.groupby(["topic", "run_id"], dropna=False) .agg( panel_present=("panel_present", "max"), target_cited=("target_cited", "max"), ) .reset_index() )

coverage = ( coverage[coverage["panel_present"] == True] .groupby("topic") .apply(lambda group: group["target_cited"].mean()) .reset_index(name="citation_coverage") )

col1, col2 = st.columns(2)

with col1: st.subheader("Citation Share by Topic") st.dataframe(citation_share, use_container_width=True) st.bar_chart( citation_share.set_index("topic")["citation_share"] )

with col2: st.subheader("Citation Coverage by Topic") st.dataframe(coverage, use_container_width=True) st.bar_chart( coverage.set_index("topic")["citation_coverage"] )

st.subheader("Citation Position") st.dataframe( panels.groupby(["topic", "surface"], dropna=False) .agg( citations=("target_cited", "sum"), median_position=("position", "median"), observations=("run_id", "nunique"), ) .reset_index(), use_container_width=True, )

st.subheader("Daily Observations") daily = ( panels.groupby(["date", "surface"], dropna=False) .agg( citations=("target_cited", "sum"), observed_links=("cited_domain", "count"), ) .reset_index() )

st.line_chart( daily.pivot( index="date", columns="surface", values="citations" ).fillna(0) )

شغّله باستخدام:

bash pip install streamlit pandas streamlit run dashboard.py

للإنتاج، قم بتحميل الجداول المعيارية إلى DuckDB، أو BigQuery، أو Snowflake، أو PostgreSQL بدلاً من قراءة الملفات الخام مباشرة.


10. ضوابط الجودة

يمكن لنظام القياس أن ينتج أرقامًا تبدو دقيقة ولكنها مضللة. أضف هذه الضوابط.

فصل الروبوتات عن الأشخاص

لا تحسب أبدًا OAI-SearchBot، أو GPTBot، أو ClaudeBot، أو PerplexityBot كجلسات بشرية. هذه إشارات زاحف أو استرداد.

الحفاظ على الأدلة الخام

لكل تشغيل لوحة، احتفظ بـ:

  • HTML الخام
  • لقطة شاشة
  • نص الإجابة
  • الطابع الزمني
  • إصدار المتصفح والجامع
  • المطالبة واللغة
  • هاش الإجابة

هذا يجعل من الممكن شرح سبب تغير المقياس.

تتبع غياب اللوحة

لوحة الذكاء الاصطناعي المفقودة ليست هي نفسها إجابة بدون استشهادك.

استخدم:

text panel_not_present panel_present_no_target panel_present_target_cited blocked_or_challenged collection_error

التحكم في تحيز العينة

يتأثر الاستخلاص المجدول بما يلي:

  • الموقع
  • الجهاز
  • اللغة
  • الوقت
  • التخصيص
  • حالة المتصفح
  • صياغة المطالبة

استخدم مجموعة أساسية ثابتة من المطالبات ومجموعة دوارة من المطالبات الاستكشافية. حافظ على المجموعتين منفصلتين في التقارير.

تجنب الدقة الزائفة

أبلغ عن فترات الثقة أو الحد الأدنى لأحجام العينات للمجموعات المواضيعية الصغيرة. لا ينبغي مقارنة موضوع بثلاث ملاحظات مباشرة بموضوع يحتوي على 300 ملاحظة.

قارن المتشابه بالمتشابه

عند مقارنة الأسطح، حافظ على ثبات ما يلي:

  • المطالبة
  • اللغة
  • البلد
  • الجهاز
  • ساعة التجميع
  • قواعد النطاق المستهدف
  • إصدار محلل الاستشهاد

11. خطة الطرح الموصى بها

الأسبوع الأول: الأجهزة

  • تكوين سجلات الخادم المنظمة.
  • إنشاء سجل الروبوتات.
  • إنشاء نطاق المختصر.
  • إضافة قواعد تسمية الحملة.
  • تحديد تصنيف الموضوع.
  • تمكين تصدير Google Analytics 4 BigQuery.

الأسبوع الثاني: الروابط المتحكم بها

  • نشر من خمسة إلى عشرة ملخصات متتبعة.
  • إنشاء روابط لمواضيع وإصدارات محتوى مختلفة.
  • التحقق من سجلات إعادة التوجيه مقابل جلسات التحليلات.
  • تأكيد عدم دخول أي معلومات شخصية إلى عناوين URL أو معلمات التحليلات.

الأسبوع الثالث: ملاحظات اللوحة

  • إنشاء بيان مطالبة.
  • ابدأ بسطحين و 20 إلى 50 مطالبة مستقرة.
  • العمل مرة واحدة يوميًا.
  • حفظ لقطات الشاشة و HTML.
  • قياس فشل التجميع بشكل منفصل عن غياب الاستشهاد.

الأسبوع الرابع: لوحة القيادة والحوكمة

  • بناء لوحات تحكم للموضوع والسطح.
  • إضافة تنبيهات صحة الزاحف.
  • تحديد قواعد الثقة.
  • مقارنة تقارير الطرف الأول بملاحظات اللوحة.
  • توثيق سياسات الاحتفاظ والوصول والحذف.

خاتمة

يجب بناء قياس استشهاد الذكاء الاصطناعي كنظام إحالة متعدد الإشارات، وليس كتقرير إحالة واحد.

يجمع الإطار الأكثر موثوقية بين:

  • تقارير الرؤية الأولية من Google و Bing
  • سجلات الخادم لنشاط الزاحف والجالب
  • روابط قصيرة من الطرف الأول لقياس النقرات المتحكم بها
  • ملاحظات لوحة الإجابات المجدولة والمتوافقة
  • بيانات التحليلات والتحويل للقيمة النهائية

المقاييس الثلاثة الأكثر أهمية هي:

  1. حصة الاستشهاد حسب الموضوع — مقدار مساحة المصدر الملاحظة التي تنتمي إلى نطاقك.
  2. معدل إحالة المساعد — مقدار حركة المرور البشرية التي يمكن أن تعزى إلى أسطح الذكاء الاصطناعي.
  3. التفاعل بعد الاستشهاد — ما إذا كان الزوار الذين تمت إحالتهم بواسطة الذكاء الاصطناعي يتخذون إجراءات ذات معنى.

يصبح النظام مفيدًا عندما يتضمن كل رقم سطحه، والفترة الزمنية، والمقام، وطريقة الإحالة، ومستوى الثقة. يمنع هذا الانضباط الخلط بين نقرات الزاحف والمستخدمين، وبين الإجابات المستخلصة ومرات الظهور، وبين الاستشهادات ونتائج الأعمال.

مقالات ذات صلة

التحسين من أجل Perplexity ومساعدي الاستشهاد الآخرين

التحسين من أجل Perplexity ومساعدي الاستشهاد الآخرين

التحسين من أجل Perplexity ومساعدي الاستشهاد الآخرين بقلم كيران شارما، استراتيجي محتوى موجه نحو النمو تحديث: 14 أكتوبر 2026 لا تعرض مساعدات الذكاء الاص…

اقرأ المقال
بطاقات الإجابة وصناديق TL;DR: هل تدفع الملخصات اختيار الذكاء الاصطناعي؟

بطاقات الإجابة وصناديق TL;DR: هل تدفع الملخصات اختيار الذكاء الاصطناعي؟

بطاقات الإجابة وصناديق TL;DR: هل تدفع الملخصات اختيار الذكاء الاصطناعي؟ صندوق TL;DR ليس زرًا للاستشهاد بالذكاء الاصطناعي. قد يسهل العثور على إجابة مفي…

اقرأ المقال
هندسة فقرات الإجابة: صياغة مقتطفات قابلة للاستخراج والتحقق

هندسة فقرات الإجابة: صياغة مقتطفات قابلة للاستخراج والتحقق

هندسة فقرات الإجابة: صياغة مقتطفات قابلة للاستخراج والتحقق بواسطة كيران شارما، خبير استراتيجيات محتوى موجه نحو النمو يجب أن يساعد المحتوى الجيد الشركا…

اقرأ المقال
التوحيد القياسي وإزالة الازدواجية: منع تشتت الإشارات

التوحيد القياسي وإزالة الازدواجية: منع تشتت الإشارات

التوحيد القياسي وإزالة الازدواجية: منع تشتت الإشارات يمكن أن ينتهي المطاف بمصدر واحد مفيد في عدة عناوين: مقالة على الموقع الرئيسي، نسخة على نطاق فرعي…

اقرأ المقال

هل أعجبك هذا المحتوى؟

اشترك في نشرتنا الإخبارية للحصول على أحدث رؤى تسويق المحتوى وأدلة النمو.

هذا المقال للأغراض المعلوماتية فقط. قد تختلف المحتويات والاستراتيجيات بناءً على احتياجاتك الخاصة.
قياس تأثير استشهاد الذكاء الاصطناعي: التحليلات، السجلات، واستخلاص لوحات الإجابة | AutoPod