التحقق من المصادر وإضافة الاستشهادات
مقارنة الادعاءات عبر المصادر وإرفاق عناوين URL للمصادر بالحقائق.
التحقق من المصادر وإضافة الاستشهادات درس مجاني في AI Agents على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Agents، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Agents 4 دروس في المجموع.
أهمية التحقق من المصادر
قد يسترجع الوكيل ادعاءً زائفًا من مصدر منخفض الجودة ويقدمه على أنه حقيقة. ومن دون التحقق، لا يكون وكيل البحث سوى محرك بحث متطور لا يمتلك مرشحًا للجودة.
يضيف التحقق طبقة تفحص ما إذا كانت الادعاءات تؤكدها مصادر مستقلة متعددة.
قاعدة المصدرين
يُعد الادعاء موثّقًا عندما يظهر في مصدرين مستقلين على الأقل. ويعني مصطلح «مستقل» نطاقات مختلفة — إذ لا يُحتسب العثور على الادعاء نفسه في موقعين يستشهد كلاهما بالمقالة الأصلية نفسها.
from urllib.parse import urlparse
def extract_domain(url: str) -> str:
return urlparse(url).netloc.replace('www.', '')
def is_verified(fact: str, all_facts: list[dict]) -> bool:
matching_domains = set()
for f in all_facts:
if fact.lower() in f['fact'].lower() or f['fact'].lower() in fact.lower():
matching_domains.add(extract_domain(f['source']))
return len(matching_domains) >= 2
# Example
facts = [
{'fact': 'Inflation peaked at 9.1% in June 2022', 'source': 'https://bls.gov/cpi'},
{'fact': 'US inflation hit 9.1% peak in mid-2022', 'source': 'https://reuters.com/article/a'}
]
print(is_verified('inflation peaked at 9.1%', facts)) # Trueالمطابقة الدلالية المستندة إلى LLM
تفشل مطابقة السلاسل النصية في اكتشاف الادعاءات المعاد صياغتها. استخدم LLM للحكم على ما إذا كانت حقيقتان متكافئتين دلاليًا قبل احتسابهما مصدرين مؤيدين.
import openai, json
client = openai.OpenAI(api_key='YOUR_OPENAI_KEY')
def claims_are_equivalent(claim_a: str, claim_b: str) -> bool:
prompt = (
f'Are these two statements making the same factual claim?\n'
f'A: "{claim_a}"\n'
f'B: "{claim_b}"\n'
f'Answer JSON: {{"equivalent": true/false}}'
)
resp = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': prompt}],
response_format={'type': 'json_object'}
)
return json.loads(resp.choices[0].message.content).get('equivalent', False)
print(claims_are_equivalent(
'CPI hit 9.1% in June 2022',
'US consumer prices rose 9.1 percent year-over-year in June 2022'
)) # Trueتقييم جودة المصادر
ليست جميع المصادر متساوية. قيّم كل مصدر بناءً على نوع النطاق وتاريخ النشر والموثوقية المعروفة. يجب أن يكون وزن مصادر المستوى الأول، مثل الإحصاءات الحكومية والمجلات المحكمة، أكبر من وزن المدونات أو وسائل التواصل الاجتماعي.
from datetime import datetime, timezone
HIGH_AUTHORITY_DOMAINS = [
'gov', 'edu', 'nature.com', 'science.org', 'pubmed.ncbi.nlm.nih.gov',
'reuters.com', 'bbc.com', 'apnews.com', 'who.int'
]
def score_source(url: str, publication_date: str | None) -> float:
score = 0.5 # baseline
domain = extract_domain(url)
tld = domain.split('.')[-1]
# Domain authority
if any(ha in domain for ha in HIGH_AUTHORITY_DOMAINS):
score += 0.3
elif tld in ('gov', 'edu', 'org'):
score += 0.1
# Recency
if publication_date:
try:
pub = datetime.fromisoformat(publication_date)
days_old = (datetime.now(timezone.utc) - pub.replace(tzinfo=timezone.utc)).days
if days_old < 365:
score += 0.1
elif days_old > 1825: # 5 years
score -= 0.1
except ValueError:
pass
return min(1.0, max(0.0, score))مقارنة الادعاءات بالمصادر
لكل ادعاء ينوي الوكيل تضمينه في التقرير النهائي، قارنه بجميع المستندات المسترجعة للعثور على أفضل المصادر المؤيدة له.
def cross_reference(claim: str, all_facts: list[dict]) -> list[dict]:
supporting = []
seen_domains = set()
for fact in all_facts:
if claims_are_equivalent(claim, fact['fact']):
domain = extract_domain(fact['source'])
if domain not in seen_domains: # only one per domain
seen_domains.add(domain)
supporting.append({
'source': fact['source'],
'domain': domain,
'fact': fact['fact'],
'score': score_source(fact['source'], fact.get('publication_date'))
})
return sorted(supporting, key=lambda x: x['score'], reverse=True)التحقق من مؤهلات المؤلفين
تهم مؤهلات المؤلفين في الادعاءات العلمية أو الطبية. فالدراسة التي يذكر مؤلفيها بالاسم وتنتسب إلى مؤسسات معتمدة تتفوق على تدوينة مجهولة المصدر. استخرج معلومات المؤلفين وعلّم الادعاءات الواردة من مصادر مجهولة.
def assess_authorship(url: str, page_text: str) -> dict:
prompt = (
f'From this webpage text, extract:\n'
f'1. Author name(s) (or null)\n'
f'2. Author affiliation/credentials (or null)\n'
f'3. Publication name (or null)\n'
f'Return JSON: {{"authors": [], "affiliation": null, "publication": null}}\n\n'
f'TEXT:\n{page_text[:2000]}'
)
resp = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': prompt}],
response_format={'type': 'json_object'}
)
return json.loads(resp.choices[0].message.content)تمييز الادعاءات غير الموثّقة
يجب تمييز الادعاءات التي لا يمكن مقارنتها بمصدرين مستقلين على أنها غير موثّقة في المخرجات. وبحسب مستوى مخاطر التقرير، قد تُستبعد الادعاءات غير الموثّقة أو تُعرض مع إخلاء مسؤولية.
def classify_claims(claims: list[str], all_facts: list[dict]) -> list[dict]:
classified = []
for claim in claims:
support = cross_reference(claim, all_facts)
classified.append({
'claim': claim,
'verified': len(support) >= 2,
'sources': support[:3], # top 3 supporting sources
'confidence': 'high' if len(support) >= 3 else
'medium' if len(support) == 2 else
'low'
})
return classifiedتنسيق الاستشهادات: داخل النص وقائمة المراجع
يجب أن تتضمن التقارير استشهادات داخل النص، على شكل أرقام مرتفعة، وقائمة مراجع في النهاية. أنشئ كليهما من البيانات الوصفية للمصادر الموثّقة.
def format_citations(classified_claims: list[dict]) -> tuple[list[str], list[str]]:
ref_list = []
ref_map = {} # url -> citation number
inline_claims = []
for item in classified_claims:
nums = []
for src in item['sources']:
url = src['source']
if url not in ref_map:
ref_map[url] = len(ref_list) + 1
ref_list.append(f'[{ref_map[url]}] {url}')
nums.append(f'[{ref_map[url]}]')
citation_str = ''.join(nums)
prefix = '' if item['verified'] else '[UNVERIFIED] '
inline_claims.append(f'{prefix}{item["claim"]} {citation_str}')
return inline_claims, ref_list
if __name__ == '__main__':
demo_claims = [
{'claim': 'Revenue grew 12% year over year', 'verified': True, 'sources': [{'source': 'https://example.com/report'}]},
{'claim': 'The CEO plans to step down', 'verified': False, 'sources': [{'source': 'https://example.com/rumor'}]},
]
inline, refs = format_citations(demo_claims)
for line in inline:
print(line)
print('References:')
for r in refs:
print(' ', r)
اكتشاف التناقضات بين المصادر
قد يتناقض مصدران موثوقان أحيانًا. اكتشف التناقضات واعرض كلا الجانبين بدلًا من اختيار أحدهما بصمت. ويكتسب ذلك أهمية خاصة في الادعاءات التجريبية محل الجدل.
def find_contradictions(claim: str, all_facts: list[dict]) -> list[dict]:
contradictions = []
for fact in all_facts:
if extract_domain(fact['source']) == extract_domain(claim):
continue
prompt = (
f'Does fact B contradict fact A?\n'
f'A: "{claim}"\nB: "{fact["fact"]}"\n'
f'JSON: {{"contradicts": true/false}}'
)
resp = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': prompt}],
response_format={'type': 'json_object'}
)
result = json.loads(resp.choices[0].message.content)
if result.get('contradicts'):
contradictions.append(fact)
return contradictionsبطاقة تقييم التحقق
قبل إنشاء التقرير النهائي، أنشئ ملخصًا للتحقق: عدد الادعاءات الموثّقة، وعدد الادعاءات غير الموثّقة، وأفضل المصادر حسب درجة السلطة، وأي تناقضات تم اكتشافها.
def verification_report_card(classified: list[dict]) -> dict:
total = len(classified)
verified = sum(1 for c in classified if c['verified'])
all_sources = [
src for c in classified for src in c['sources']
]
top_domains = sorted(
set(s['domain'] for s in all_sources),
key=lambda d: max(s['score'] for s in all_sources if s['domain'] == d),
reverse=True
)[:5]
return {
'total_claims': total,
'verified': verified,
'unverified': total - verified,
'verification_rate': f'{verified/max(total,1)*100:.0f}%',
'top_sources': top_domains
}
if __name__ == '__main__':
demo_classified = [
{'verified': True, 'sources': [{'domain': 'docs.python.org', 'score': 1.3}]},
{'verified': False, 'sources': [{'domain': 'quora.com', 'score': 0.5}]},
]
card = verification_report_card(demo_classified)
for k, v in card.items():
print(f'{k}: {v}')
مخرجات محكومة بدرجة الثقة
حدّد حدًا أدنى للتحقق قبل النشر. إذا كانت نسبة الادعاءات الموثّقة أقل من 70%، فاطلب من حلقة البحث تنفيذ تكرار آخر يستهدف الادعاءات غير الموثّقة تحديدًا.
MIN_VERIFICATION_RATE = 0.70
def should_run_more_research(classified: list[dict]) -> list[str]:
unverified = [c for c in classified if not c['verified']]
total = len(classified)
if total == 0:
return []
rate = (total - len(unverified)) / total
if rate >= MIN_VERIFICATION_RATE:
return [] # Sufficient confidence — stop
# Return search queries to verify remaining claims
return [f'verify: {c["claim"]}' for c in unverified[:3]]
if __name__ == '__main__':
demo_classified = [
{'claim': 'A', 'verified': True},
{'claim': 'B', 'verified': False},
{'claim': 'C', 'verified': False},
]
followups = should_run_more_research(demo_classified)
print('Follow-up queries needed:', followups)
ما الذي يحدد مصدرين «مستقلين» وفق قاعدة التحقق القائمة على مصدرين؟
يمنع معيار الاستقلالية التحقق القائم على صدى الآراء، حيث يُتتبع الادعاء نفسه إلى مصدر أصلي واحد تستشهد به جهات نشر متعددة.
مراجعة التحقق من المصادر
يتطلب البحث الموثّق: تأييد مصدرين عبر نطاقات مختلفة، ومطابقة دلالية باستخدام LLM لاكتشاف الصيغ المعاد التعبير عنها، وتقييم جودة المصادر (سلطة النطاق وحداثته)، واكتشاف التناقضات، ومخرجات محكومة بدرجة الثقة تطلق مزيدًا من البحث إذا كانت نسبة التحقق منخفضة جدًا.
الأسئلة الشائعة
هل درس «التحقق من المصادر وإضافة الاستشهادات» مجاني؟
نعم — نص درس «التحقق من المصادر وإضافة الاستشهادات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Agents، انتقل إلى CoddyKit PRO. تتضمن دورة AI Agents 4 دروس في المجموع.
ماذا ستتعلم في «التحقق من المصادر وإضافة الاستشهادات»؟
مقارنة الادعاءات عبر المصادر وإرفاق عناوين URL للمصادر بالحقائق. تتمرن على AI Agents مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ AI Agents؟
لا تُشترط خبرة سابقة. AI Agents على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «التحقق من المصادر وإضافة الاستشهادات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس AI Agents هذا؟
نعم. كل درس في AI Agents يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تصميم حلقة البحث متعددة الخطوات
- التحقق من المصادر وإضافة الاستشهادات
- إنشاء التقارير المنظَّمة
- تدقيق الحقائق ومنع الهلوسة