用智能体自动化在线事实核查
事实核查流程的核心:网络搜索、开源工具、Python和AI代理
梯形图转SCL | AI模型价格对比 | AI工具导航 | ONNX模型库 | Vibe Coding教程 | PLC在线仿真器 | Tripo 3D | Meshy AI | ElevenLabs | KlingAI | ArtSpace | Phot.AI | InVideo
最近,研究公司开始越来越像算命先生了。
这篇文章源于我第100万次看到某个信息巨头做出"AI将在2030年吞噬你"之类的大胆声明。我发誓我之前很有耐心——我忍了999,999次。但第100万次,我受够了!
你算老几,凭什么跟我说这些?你有多可靠?你预测未来的记录如何?——我心想。
因为有了快速计算、LLM和智能体编排带来的所有能力,我不再只能听你的一面之词。我可以查证你!
注意:我并非针对任何特定的研究或媒体机构。我被这个现象本身所驱动。我只使用具体的名称和实例来说明问题。
1、GPT Researcher:开源研究引擎的核心
我的旅程从寻找合适的基础工具开始。我知道我需要一个能帮我获取、抓取和编排研究代理的工具。我也知道我不想自己构建它。在AI驱动的研究采用的这个阶段,一定有一些好的工具存在。或者至少比我能在有限时间内自己构建的更好。
我评估了几个工具,GPT Researcher给我留下了最成熟的印象。它承诺提供一个自主研究代理,接受查询,通过多层搜索从多个来源收集信息,并生成结构化报告。
这几乎完美契合我的需求。只需安装一个包,我就获得了一个具备所有必要技能、第三方提供商集成和编排整个研究流程机制的代理,最重要的功能包括:
技能:
ResearchConductor— 编排数据收集ReportGenerator— 撰写最终报告ContextManager— 按相关性过滤内容BrowserManager— 抓取网页SourceCurator— 评估来源质量DeepResearchSkill— 可选的迭代深度研究Image Generator— 图像生成
提供商:
- 检索器:支持20+搜索后端(Tavily、DuckDuckGo、SerpAPI、Exa、Semantic Scholar、MCP等)
- 抓取器:BS4、Playwright、PDF等
- LLM:OpenAI、Anthropic等
- 图像生成器
操作:查询处理、网页抓取和研究过程中涉及的不同组件的编排。
但抛开我对它全面性的钦佩,最重要的是要理解其内部研究流程到底是如何进行的。
2、研究材料
在深入细节之前,让我们先确定一些将在整篇文章中使用的示例材料。
我选择了Gartner的一个较旧的预测:
"预计手机将主导整体设备出货量,2014年手机出货量将达到19亿部"
为什么选这个?因为到现在,互联网应该已经知道2014年手机出货量的所有信息了;)这使得它成为让AI代理基于在线来源知识评估该预测的良好学习材料。
3、研究规划阶段:构建研究基础
一旦选择了研究代理——无论是工具自动选择最适合我们查询的代理,还是通过我们自己的代理和角色定义——研究阶段就开始了。
researcher = GPTResearcher(
query=query,
report_type="custom_report",
agent="Historical Market Fact-Checker",
role=role,
)
await researcher.conduct_research()
在其关键函数中,ResearchConductor.plan_research()为后续研究构建基础:
- 初始搜索 — 通过调用已配置检索器的
get_search_results(),它获取关于我们要搜索内容的初始知识,形式为原始查询的URL片段。 - 子查询生成 — 该搜索结果随后发送给LLM。
plan_research_outline()→generate_sub_queries()(actions/query_processing.py)将初始搜索结果发送给LLM,LLM将研究任务分解为专注的子查询。
到目前为止的过程如下:
原始查询 → LLM → [子查询-1, 子查询-2, ..., 子查询-N]
值得注意的是,GPT Researcher允许我们为不同任务使用不同的模型。例如,子查询生成由于在指导整个研究方向上起着关键作用,使用所谓的战略LLM模型。
你可以通过STRATEGIC_LLM变量配置它。其他可用的有FAST_LLM、SMART_LLM和EMBEDDING。详情请参阅文档。谨慎使用这些设置可以让我们控制研究成本。
4、数据收集阶段
这里的 key 函数是ResearchConductor._process_sub_query()。对于每个子查询,其管道执行:
- 搜索 —
_scrape_data_by_urls()→_search_relevant_source_urls()遍历所有检索器,收集URL。 - 去重 —
_get_new_urls()跟踪visited_urls以避免重复获取。 - 网页抓取 —
BrowserManager.browse_urls()→scrape_urls()→Scraper.run()使用WorkerPool进行并行、速率受限的抓取,提取页面内容和图像。 - 上下文收集和压缩 — 从抓取的数据中,
ContextManager.get_similar_content_by_query()→ContextCompressor.async_get_context()选择最相关的部分,这里的相关性意味着与研究查询相似。通过一系列步骤,只有最相关的N个块进入上下文。这不仅为进一步研究构建了基础,还保持了整个过程的上下文效率。
这部分过程如下:
抓取的页面 → 分块 → 嵌入 → 相似性过滤 → 相关上下文
你可能认为这是文章填充物。但恰恰相反!我希望你关注这里,而不是简单略过,因为这可能是整篇文章最重要的部分。
注意这里出现的关键术语:相关来源URL、数据的相关部分,以及在上下文选择阶段通过相似性衡量的相关性。这些如果不注意,可能会让你陷入麻烦。
因为这里有一个缺陷。
研究工具倾向于寻找与定义查询接近的信息并用它来得出结论,但事实核查是关于其他事情的。它需要将查询,或者更准确地说主张,与一组独立的事实和来源进行测试。将"相关"视为"相似"可能使整个研究变得毫无意义。
当我们使用依赖网络搜索引擎收集研究数据的自动化方法时,这一点变得尤其重要。我很快会向你展示原因。请耐心等待;)
5、策划和报告阶段
策划和报告阶段完成了基本研究流程,整体如下:
查询
↓
[代理选择] ← LLM选择角色
↓
[研究规划] ← 初始搜索 → LLM生成子查询
↓
[标准研究,每个子查询并行:] [或其深度模式对应部分]
├── 搜索(检索器)→ URL
├── 抓取(Scraper)→ 原始内容
└── 压缩(ContextCompressor)→ 嵌入 + 相似性过滤
↓
[策划来源] ← LLM按可信度排名 [可选]
↓
[撰写报告] ← LLM使用上下文生成Markdown
↓
报告 + 参考文献 + 图像
在这里我希望你注意一点——看看来源策划发生得有多晚(如果启用了的话)。在这个阶段清除可疑来源的上下文在经典研究中可能有效,但对于事实核查呢?
对于事实核查,一些来源,特别是最初产生主张的来源及其引用和衍生品,应该从一开始就移除。
6、搜索引擎不是事实核查器
LLM研究工具的主要问题在于,我们通常将网络搜索引擎视为信息检索器。这是可以理解的——它们是我们可以访问的最庞大、最常见的知识来源。
问题在于,我们将一个并非真正为此目的设计的工具放在了研究过程的基础之上。我们经常以一种污染后续所有内容的方式使用它。
搜索引擎服务于信息需求。它的工作是找到与该需求相关的页面,并排列出它认为最有用的讨论该问题的页面。
但在事实核查中,你不仅想要讨论该主张的页面。
你需要知道该主张从何而来,什么证据支持它,什么证据反驳它。或者,至少,你使用的来源是否独立于你正在测试的主张的原始来源,而不是简单重复相同的陈述并最终指向它。
让我们回到Gartner的声明,问DuckDuckGo一个问题。

尽管我没有使用与Gartner新闻中相同的措辞,但排名靠前的结果仍然由Gartner或其引用主导。这并不特别令人惊讶。事实上,当我们看到它时,感觉就像搜索引擎的完美自然行为,不是吗?
但你是否想过这种行为对你基于搜索引擎的AI研究工具可能有多大的损害?我敢打赌你没有,因为通过自动化过程,工具将这种原本明显的行为隐藏了。我们很少怀疑实施了什么措施来处理它。
我希望你现在明白我为什么拖着你经历这些无聊的内部细节了:)你需要了解你的工具,才能知道可以对它有什么期待。
7、让我们总结一下我们已经知道的
GPT Researcher的当前设计在事实核查任务方面有些薄弱。它从作为检索器的搜索引擎继承了上下文污染的倾向。
尽管生成最终报告的模型可能理解它应该忽略循环来源,但当它被要求这样做时,上下文已经被大量处理——收集、分块、压缩和过滤。
仅这一点就应该让我们至少对最终结果的可信度保持一点谨慎。
8、是时候给工具一个证明自己的机会了
首先,我按原样运行了该工具,添加了一些关于使用独立来源等的明确预防措施。我还要求它完全揭示用作参考的引用,以便我们自己检查。
claim = """
Gartner says worldwide mobile phone shipments in 2014 were 1.9 billion units.
"""
query = f"""
Fact-check the following historical prediction using independent online sources:
{claim}
Find reliable sources describing the actual worldwide shipments of mobile phones
in 2014. Compare the observed market outcome with the original prediction.
"""
role = """
Research historical market data and compare observed outcomes with the
original prediction using independent online sources and citations.
Especially avoid using sources that are directly affiliated with the original prediction.
"""
report_prompt = """
Write a concise fact-checking report.
Include:
- what actually happened in 2014
- evidence
- a final assessment: True or False
- citations for the evidence used
"""
researcher = GPTResearcher(
query=query,
report_type="custom_report",
agent="Historical Market Fact-Checker",
role=role,
)
await researcher.conduct_research()
report = await researcher.write_report(custom_prompt=report_prompt)
print(report)
结果如下(只展示部分):
2014年实际发生的情况: 全球智能手机出货量达到约12至13亿部,标志着该行业首次突破10亿部大关。智能手机约占当年所有手机出货量的64%至70%。
所以这次他们说对了;)但对我们来说,更有趣的部分是来源。让我们看看数据实际上来自哪里:
1. Counterpoint Research. (2015年1月29日). Market Monitor: Handset & Smartphone Markets — Q4 2014
2. Juniper Research. (2015年1月29日). Global Smartphone Shipments Exceeded 1.2 Billion in 2014
- Business Insider / BI Intelligence. (2014). 智能手机市场更新2014. [基于Gartner数据的报告]
- IDC (via mobiForge). (2014). 2014年全球移动统计 Part A. [基于Gartner数据的报告]
5. Statista. (2023). 2014年至2024年全球智能手机出货量. 对Gartner*、Canalys和Strategy Analytics历史报告的数据聚合。*
尽管我们明确告诉工具使用独立来源并避免与主张原始来源相关的来源,5个引用中有3个回到了原始来源。很难称其为可信的研究,不是吗?
此时,我们还可以自信地说,这不仅仅是简单过滤的问题。要阻止此类来源影响我们的研究,仅过滤出版商或域名是不够的。
我们可能拥有看似独立但实际上依赖于我们试图验证的同一来源的报告。
我们需要一个独立于研究上下文的独立评估阶段,该阶段可以独立审查收集的来源,并拒绝那些会污染证据基础的来源。
但我带你来这里不只是为了看它失败。让我们修复它!
一旦我们知道我们需要什么:
- 一个早期的评估代理,
- 以及一个在搜索引擎层面排除特定术语的补充选项——基于LLM的评估很昂贵,所以我们应该尽早在管道中减少它需要做的工作量。告诉搜索引擎排除某些术语正是如此。
交付似乎很容易:)
第一部分有点棘手,因为不同的检索器对"搜索结果"有不同的理解:
- 一些(例如Tavily、Google)返回URL + 片段供进一步抓取
- 其他(例如PubMed Central、ArXiv)直接返回完整文章文本
更糟糕的是,在原始流程中,第二类在搜索循环中就被研究指导器注册了。该注册必须推迟到评估之后。而第一类则必须在抓取阶段进行控制,大致如下:
检索器 ──► 新搜索URL ──► 浏览器抓取 ──► ⓵ 控制 ──► 接受 ─┐
│ ├─► 合并 ─► 向量存储
└──► 预取内容 ──► ⓶ 控制 ──► 接受 ──► 拒绝记录 ──┘
(从搜索循环延迟注册)
设计不算最漂亮,但有什么就用什么;)这能完成工作!
如果有人对实现细节感兴趣,这里是原始项目的PR。看到这个项目的PR有多长,我想知道我是否能完成审查和合并。祈祷中;)
9、现在让我们看看这带来了什么
总之,有了修复,我们现在可以使用额外的来源评估提示运行研究,以及直接发送到搜索引擎的排除术语。任何违反准入策略超过0.25的来源都将被拒绝。整个设置如下:
claim = """
Worldwide mobile phone shipments in 2014 were 1.9 billion units.
"""
query = f"""
Fact-check the following historical prediction using independent online sources:
{claim}
Find reliable sources describing the actual worldwide shipments of mobile phones
in 2014. Compare the observed market outcome with the original prediction.
"""
role = """
Research historical market data and compare observed outcomes with the
original prediction using independent online sources and citations.
"""
source_assessment_prompt = """
Score how much this source violates the admission policy below.
The score is a float in [0.0, 1.0]: 0.0 means no violation, 1.0 means complete violation.
Admission policy:
- Reject sources from Gartner or Gartner-owned domains.
- Reject sources that quote, paraphrase, syndicate, or attribute the claim to Gartner.
- Accept only independent observed outcome data, primary sources, official statistics,
company reports, or reporting based on primary data independent of Gartner.
- If source independence is ambiguous, reject conservatively.
"""
report_prompt = """
Write a concise fact-checking report.
Include:
- what actually happened in 2014
- evidence
- a final assessment: True or False
- citations for the evidence used
"""
researcher = GPTResearcher(
query=query,
report_type="custom_report",
agent="Historical Market Fact-Checker",
role=role,
search_exclude_terms=["gartner"],
source_assessment_prompt=source_assessment_prompt,
source_assessment_threshold=0.25,
)
想看最终结果吗? 这就是:
最终评估:True
但更重要的是,这次结论建立在一组精心选择的独立来源之上:
- IDC. (2015年1月). Worldwide Quarterly Mobile Phone Tracker: Q4 2014.
- Counterpoint Research. (2015年1月). Market Monitor: Handset & Smartphone Markets — Q4 2014.
- Juniper Research. (2015年1月). Global Smartphone Shipments Exceeded 1.2 Billion in 2014.
- GSMA. (2015). The Mobile Economy 2015
- Strategy Analytics. (2015年1月). Global Smartphone Market Report.
所以我们终于可以说,我们拥有一个不会盲目处理搜索引擎提供的任何数据的研究引擎。一个我们可以真正开始信任的引擎。
这就是我结束这篇文章的地方,这篇文章……
10、完全不是我原本打算的;)
实际上,当我开始写作时,我打算展示执行大规模高质量研究所需的一切编排。因为这远不止一个工具:提取主张、清理它们、提出正确的问题、评估和评分来源。
但当我深入研究工具时,我意识到这不会是那篇文章了。相反,这篇文章成为了字母A的赞助商,即意识(Awareness)。仅专注于研究工具本身、其设计及其在失败场景中的缺陷。
我们越来越多地信任黑盒子。或者更确切地说,忽略它们,我应该说。我们在软件中已经有了大量抽象层,几乎不理解它们真正做什么。现在我们又在上面加了AI。天哪,它能多么令人信服地为它掩盖的任何混乱辩护。 魔鬼从未有过更好的辩护者。 结合所有这些,我们可以在不知不觉中欺骗自己。
但好消息是。我希望这样的案例表明,良好的工程和人类的谨慎仍然有价值。我们可能仍然被需要。至少在一段时间内:)
私下告诉你更多。老实说,这整件事真的让我筋疲力尽。但嘿,至少我上垒了!;)
所以我要在这里结束这篇文章,因为它意外地变成了一个长而独立的章节。但还有更多内容。在下一部分中,我将把它放入一个更大的流程中,创造高质量研究的环境,并让我们大规模进行。
原文链接:How to Automate Online Fact-Checking with LLMs and AI Agents, Part 1
汇智网翻译整理,转载请标明出处