AI 答题引擎引用 400 条文档
上周在 Perplexity 里问个冷门历史事件,它底气十足地甩给我 12 个 citation。我顺手点开前三个:一个是 Wikipedia,一个是某新闻网转载的美联社稿件,第三个是个个人博客——博客里写着「据美联社报道」。再往下翻,第 4 到第 12 个,全是同一条美联社稿件在不同站点的镜像、翻译、摘要版。
下一篇
有人把 Warp 给 Fork 成了 Clinch →
把这 12 条链接扔进脚本跑一下去重,最后只剩一条一手源头。
import requests
from urllib.parse import urlparse
def trace_origin(url, depth=0, max_depth=3):
if depth >= max_depth:
return url
try:
resp = requests.get(url, timeout=5, allow_redirects=True)
final_url = resp.url
# 简单判断:如果域名变了,可能是转载
if urlparse(url).netloc != urlparse(final_url).netloc:
return trace_origin(final_url, depth+1, max_depth)
return final_url
except:
return url

citations = [...] # Perplexity 返回的 12 个链接
origins = set(trace_origin(u) for u in citations)
print(f"12 citations -> {len(origins)} unique origins")
# 输出: 12 citations -> 1 unique origins这还只是显性转载。更隐蔽的是:Wikipedia 引用新闻,新闻引用通稿,通稿引用官方声明,AI 再把 Wikipedia 作为「权威来源」吐给你。链条跑了四层,最底层那份声明可能早就 404 了,或者根本不公开。
文档计数 ≠ 证据独立性。这是大模型检索里最容易被忽视的陷阱。
RAG 系统里常见的做法:向量检索 Top-K,把 chunk 扔给 LLM 总结。K=20 时,如果这 20 个 chunk 有 18 个来自同一份 PDF 的不同切片、或者同一篇新闻的不同语言版本,模型看到的依然是「压倒性共识」。可这共识的基因里只有一个祖先。
我在自建的本地 RAG 里加了个 provenance 去重层,逻辑很简单:
# config/retrieval.yaml
deduplication:
enabled: true
strategy: "simhash+domain_cluster"
simhash_threshold: 0.85
max_per_domain: 2
require_primary_source: true
primary_indicators:
- "gov.cn"
- "sec.gov"
- "arxiv.org"
- "patents.google.com"检索回来先算 SimHash 去重,再按域名聚类,每个域名最多保留 2 条,优先保留带 primary_indicators 的源。效果立竿见影:以前问「某专利的核心权利要求」,模型会综合 15 篇博客解读;现在它直接把 USPTO 原文扔给我,后面跟两句「博客普遍认为...」做补充。
但这只是缓解。根本问题在上游:整个网络的信息生态已经变成「一份源头,一万份回声」。AI 答题引擎把回声当合唱,把转载计数当置信度。
更讽刺的是:当你问「这事儿到底有没有一手证据?」时,模型大概率会回答「有大量文献记载...」——然后再给你列那 12 个转载链接。
下次看到 AI 答题界面上密密麻麻的 citation 数字,别光数个数。点开前三个,看看域名。如果全是同一家通讯社的不同镜像站,那这答案的证据链,其实只有 1 条。
免费 AI 工具箱 · 全部完全免费
