Kaynak Doğrulama ve Atıf
İddiaları kaynaklar arasında karşılaştırma ve gerçeklere kaynak URL'leri ekleme.
Kaynak Doğrulama ve Atıf, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Agents öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Agents kursu toplamda 4 dersten oluşur.
Kaynak Doğrulaması Neden Önemlidir?
Ajan, düşük kaliteli bir kaynaktan yanlış bir iddia getirip bunu gerçekmiş gibi sunabilir. Doğrulama olmadan araştırma ajanı, kalite filtresi bulunmayan gelişmiş bir arama motorundan ibaret kalır.
Doğrulama, iddiaların birden fazla bağımsız kaynak tarafından desteklenip desteklenmediğini denetleyen bir katman ekler.
İki Kaynak Kuralı
Bir iddia, en az iki bağımsız kaynakta yer aldığında doğrulanmış kabul edilir. "Bağımsız" ifadesi farklı alan adlarını belirtir; aynı özgün makaleye atıf yapan iki sitede aynı iddiayı bulmak yeterli sayılmaz.
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)) # TrueLLM Tabanlı Anlamsal Eşleştirme
Dize eşleştirme, farklı ifadelerle yeniden yazılmış iddiaları gözden kaçırır. İki bilgiyi destekleyici kaynaklar olarak saymadan önce anlamsal açıdan eşdeğer olup olmadıklarına karar vermesi için bir LLM kullanın.
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'
)) # TrueKaynak Kalitesini Puanlama
Tüm kaynaklar eşit değildir. Her kaynağı alan adı türüne, yayımlanma tarihine ve bilinen güvenilirliğine göre puanlayın. 1. Seviye kaynaklar (resmî istatistikler, hakemli dergiler) bloglardan veya sosyal medyadan daha fazla ağırlık taşımalıdır.
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))İddiaları Kaynaklarla Çapraz Karşılaştırma
Ajanın son rapora eklemeyi planladığı her iddiayı, en iyi destekleyici kaynakları bulmak için getirilen tüm belgelerle çapraz karşılaştırın.
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)Yazar Yetkinliklerini Denetleme
Bilimsel veya tıbbi iddialar için yazarların yetkinlikleri önemlidir. Akredite kurumlarda görev yapan, adı belirtilmiş yazarların hazırladığı bir çalışma; anonim bir blog yazısından daha güvenilirdir. Yazar bilgilerini çıkarın ve anonim kaynaklardan gelen iddiaları işaretleyin.
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)Doğrulanmamış İddiaları İşaretleme
İki bağımsız kaynakla çapraz karşılaştırılamayan iddialar, çıktıda doğrulanmamış olarak işaretlenmelidir. Raporun risk düzeyine bağlı olarak doğrulanmamış iddialar çıkarılabilir veya bir uyarı metniyle sunulabilir.
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 classifiedAtıf Biçimi: Metin İçi ve Kaynakça Listesi
Raporlar, metin içi atıfları (numaralandırılmış üst simgeler) ve sonunda bir kaynakça listesini içermelidir. Her ikisini de doğrulanmış kaynak üst verilerinden oluşturun.
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)
Kaynaklar Arasındaki Çelişkileri Algılama
Bazen iki güvenilir kaynak birbiriyle çelişir. Çelişkileri algılayın ve birini sessizce seçmek yerine her iki tarafı da sunun. Bu, özellikle tartışmalı deneysel iddialar için önemlidir.
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 contradictionsDoğrulama Raporu Kartı
Son raporu oluşturmadan önce bir doğrulama özeti hazırlayın: kaç iddianın doğrulandığı, kaçının doğrulanmadığı, yetki puanına göre en iyi kaynaklar ve algılanan çelişkiler.
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}')
Güven Düzeyine Göre Kısıtlanan Çıktı
Yayımlamadan önce asgari bir doğrulama eşiği belirleyin. İddiaların %70'inden azı doğrulanmışsa araştırma döngüsünden, özellikle doğrulanmamış iddiaları hedefleyen bir yineleme daha gerçekleştirmesini isteyin.
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)
İki kaynaklı doğrulama kuralında iki "bağımsız" kaynağı ne tanımlar?
Bağımsızlık ölçütü, aynı iddianın birçok yayın tarafından atıf yapılan tek bir özgün kaynağa dayandığı yankı odası doğrulamasını önler.
Kaynak Doğrulamasının Özeti
Doğrulanmış araştırma şunları gerektirir: farklı alan adları arasında iki kaynakla destekleme, farklı ifadelerle yazılmış eşdeğerleri algılamak için LLM anlamsal eşleştirmesi, kaynak kalitesi puanlaması (alan adı yetkinliği + güncellik), çelişki algılama ve doğrulama oranı çok düşükse daha fazla araştırmayı tetikleyen güven düzeyine göre kısıtlanan çıktı.
Sıkça Sorulan Sorular
“Kaynak Doğrulama ve Atıf” dersi ücretsiz mi?
Evet — “Kaynak Doğrulama ve Atıf” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Agents kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Agents kursu toplamda 4 dersten oluşur.
“Kaynak Doğrulama ve Atıf” dersinde ne öğreneceğim?
İddiaları kaynaklar arasında karşılaştırma ve gerçeklere kaynak URL'leri ekleme. AI Agents ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
AI Agents öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te AI Agents, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Kaynak Doğrulama ve Atıf” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu AI Agents dersinde kod yazıp çalıştırabilir miyim?
Evet. Her AI Agents dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Çok Adımlı Araştırma Döngüsü Tasarımı
- Kaynak Doğrulama ve Atıf
- Yapılandırılmış Rapor Oluşturma
- Bilgi Doğrulama ve Halüsinasyonları Önleme