DAY 21 / PHASE 2 · SYSTEMS

AI for Research

Deep Research Loop · Research Harness · Source Curation · Citation Tracing

2026-06-04 · BigCat

研究的深度不来自一次大召回,来自「读完再搜」的迭代。

// WHY THIS MATTERS

2026 年,"Deep Research" 已经从功能名变成一类系统的统称:OpenAI、Gemini、Perplexity、Anthropic 各有一套。但绝大多数人把它当成「更强的搜索框」,结果是——拿它生成一篇读起来很专业、引用一查一半是错的报告。本期不讲「Deep Research 是什么」,讲怎么把它当工程系统用、以及怎么自建一个属于你的研究 agent。四个工程点:(1)为什么 Deep Research 本质是 search-read-reflect 的 agent loop 而不是 RAG,何时该用、何时是杀鸡用牛刀;(2)用 orchestrator + fan-out subagents 自建研究 harness,以及它 15× token 成本的代价边界;(3)信息源筛选——搜到 ≠ 可信;(4)引用追溯与对抗式验证——研究 agent 最危险的失败是自信地综合一个没有来源支撑的结论

// 01

Deep Research 是 agent loop,不是 RAG

论断:深度来自「基于已读内容生成下一个 query」的迭代,单次大召回再强也到不了。

背景与原理

普通 RAG 是一次性的:embed query → 召回 top-k → 塞进 context → 生成。它的天花板是「你第一次问对了关键词」。Deep Research 不同——它是一个多轮 agentic loop:plan → search → read → 基于读到的新信息再 search → … → synthesize。OpenAI 公开说 Deep Research 是用端到端 RL 在浏览 + 推理任务上训出来的,模型学会了 plan、backtrack、对实时信息做反应;Gemini Deep Research 的描述几乎一样——「像你一样浏览:搜索、发现线索、基于学到的东西开启新搜索」。关键区别在于query 是动态生成的:第一轮你不知道该搜什么,读完第一批结果才知道第二轮该问什么。这正是 RAG 做不到的——RAG 的 query 在召回那一刻就定死了。

代价是真实的:一份 Deep Research 报告通常跑 5–30 分钟、烧掉远超普通对话的 token。所以决策不是「能不能用」,而是「值不值」。

RAG(一次性) Deep Research(迭代 agent loop) ┌──────────┐ ┌─────────────────────────────────────┐ │ query │ │ plan ─▶ search ─▶ read ─┐ │ │ ▼ │ │ ▲ │ 学到新东西 │ │ retrieve │ │ └──── 生成新 query ◀──┘ │ │ ▼ │ │ ▼ (够了?) │ │ generate │ │ synthesize + cite │ └──────────┘ └─────────────────────────────────────┘ 深度 = 召回质量 深度 = 迭代轮数 × 每轮筛选质量

实战示例

选型清单——把任务对号入座,别一律上 Deep Research:

# 单次 search 就够(秒级)
- 事实查询:「X 的最新版本号 / 发布日期」
- 已知关键词、答案在单个页面

# RAG(你有私有语料库)
- 在固定文档集里问答(内部 wiki、合同、论文库)
- query 一次就能命中相关 chunk

# Deep Research(分钟级、值得等)
- 开放式、需要跨多源综合:「对比 A/B/C 三家方案的 X」
- 答案需要「读完一批才知道下一步搜什么」
- 输出价值高到能 justify 15× 成本 + 几十分钟

判据是「下一步搜什么取决于上一步读到什么」——满足才上 Deep Research,否则更便宜的方案准确率不输还快得多。

失败模式:把 Deep Research 当事实查询用。问「今天某股价多少」它会跑 10 分钟、综合一堆二手解读,反而不如一次 search 直接拿一手数据。迭代 loop 的价值只在需要综合时才兑现;事实查询用它是纯浪费 + 引入二手噪声。
进阶资源 · OpenAI Introducing deep research, openai.com/index/introducing-deep-research · Gemini Deep Research, gemini.google/overview/deep-research
// 02

自建研究 harness:orchestrator + fan-out subagents

论断:研究是「广度优先 + 可并行」的天然多 agent 场景——但 15× token 成本划定了它的适用边界。

背景与原理

Anthropic 在《How we built our multi-agent research system》里给出了可抄的架构:一个 Lead Researcher(orchestrator)把问题拆成若干子方向,并行 spawn 多个 subagent,每个 subagent 在独立 context window 里搜一个子方向,最后把摘要回收给 lead 综合。他们报告这种结构在内部研究类评测上比单 agent 强 90%+,原因是把推理分散到多个独立上下文,绕开了单 agent 的 context 上限。但同一篇也给了冷水:multi-agent 大约消耗 15× 于普通 chat 的 token——只有当结果价值远超成本、且任务能并行拆分时才划算。这正好接上 Day 13 的「协调税」:研究恰是少数协调收益 > 协调成本的场景,因为子方向之间弱依赖(搜 A 公司和搜 B 公司互不阻塞)。

实战示例

最小研究 harness 的骨架——重点是 orchestrator 只发 query、不自己读,subagent 只读一个方向、context 隔离:

def research(question):
    # 1) ORCHESTRATOR:把问题拆成弱依赖子方向
    subqs = plan(question)        # LLM 输出 3-5 个正交子问题
    # 2) FAN-OUT:每个子方向一个隔离 context 的 subagent(可并行)
    findings = parallel_map(subagent, subqs)
    # 3) SYNTHESIZE:lead 只看摘要 + 引用,不碰原始网页
    return synthesize(question, findings)

def subagent(subq, max_iters=8):
    notes = []
    for _ in range(max_iters):
        q = next_query(subq, notes)      # 动态生成下一个 query
        hits = web_search(q)
        for h in rank_sources(hits)[:3]:   # 见 §3:先筛源
            notes.append(extract(fetch(h.url), keep_quote=True))
        if enough(subq, notes): break     # loop control,别无限搜
    return compress(notes)   # 压成 {claim, url, quote},原文丢掉

四个关键:子问题正交(重叠 = 浪费并行)、context 隔离(subagent 的网页噪声不污染 lead)、每个 subagent 有 max_iters(防无限搜)、回收的是 {claim, url, quote} 不是原文(为 §4 的引用追溯留锚点)。

失败模式:Anthropic 复盘的真实坑——早期 agent 给简单问题 spawn 50 个 subagent、为不存在的源把全网翻烂、互相之间狂发更新把彼此带偏。根因都是 orchestrator 的 prompt 没给清「拆几个、何时停」的预算。研究 harness 的主要调优杠杆是 orchestrator prompt,不是模型。
进阶资源 · Anthropic How we built our multi-agent research system, anthropic.com/engineering/multi-agent-research-system · Simon Willison 的精读笔记, simonwillison.net/2025/Jun/14
// 03

信息源筛选:搜到 ≠ 可信

论断:研究 agent 质量的瓶颈往往不是「搜得够不够多」,而是「读之前有没有筛源」。

背景与原理

web_search 返回的是按相关性排序,不是按可信度排序。SEO 农场、AI 生成的二手洗稿、过期内容会和一手权威源混在一起排进 top-k。如果 subagent 不加判断地 fetch 前几条,等于把噪声当事实喂给综合层——而 LLM 不会自动质疑来源权威性,它默认你给的都可信。所以筛源必须是 harness 层显式的一步,发生在 fetch 之前。可用的信号:一手 vs 二手(官方文档/原论文 > 博客转述 > 聚合站)、域名权威度(官方域、arXiv、知名机构 > 内容农场)、时效(对快变主题,旧页面要降权)、去重(多个站点抄同一篇稿,本质是单一来源,别当成「多源印证」)。这一步也是把 §4 的「跨源印证」做实的前提——你得先知道哪些是真正独立的源。

实战示例

一个轻量 source ranking,插在 search 和 fetch 之间:

def rank_sources(hits):
    AUTHORITY = {"arxiv.org":3, "*.gov":3, ".edu":2,
                 "official_docs":3, "content_farm":-2}
    def score(h):
        s = AUTHORITY.get(domain_class(h.url), 0)
        s += 2 if is_primary(h) else 0   # 一手来源加权
        s -= recency_penalty(h.date, topic)        # 快变主题旧页降权
        return s
    uniq = dedup_by_content(hits)   # 抄稿合并:别把转载当独立源
    return sorted(uniq, key=score, reverse=True)

更省事的版本:直接在 subagent 的 prompt 里写明「优先一手来源,遇到二手转述要回溯到原始出处,对单一来源的关键结论标注 [需印证]」——把筛源指令前置,比事后纠错便宜得多。

失败模式:把「N 个网站都这么说」当强证据。这些网站很可能都在转同一篇通稿——这是伪多源。去重要按内容而非 URL,否则你的「跨源印证」是自欺。另一个坑:对慢变主题(数学、历史)滥用 recency 降权,把经典权威源误杀。
进阶资源 · OpenAI deep research(cite 一手句子段落的设计), openai.com/index/introducing-deep-research · 本系列 Day 11 Hallucination(citations/URLs 是高编造 token),hallucination-day11
// 04

引用追溯与对抗式验证

论断:研究 agent 最危险的失败不是「搜不到」,是「自信地综合一个没有来源支撑的结论」。

背景与原理

承接 Day 11:引用、URL、日期、数字是 LLM 最容易编造的 token——而这些恰恰是研究报告的主体。一个读起来完美的综述,引用可能一半是模型「脑补」出来的——格式正确、链接 404、或链接真实但内容根本没说那句话。治理靠两件事。其一 grounded generation:综合层只允许引用 subagent 实际 fetch 回来的 {claim, url, quote},不给模型「自由发挥引用」的口子。Anthropic 的 Citations API 把这做成原生能力——它把源文档切成句子,让 Claude 引用确实用到的原句,官方称比纯 prompt 方案更可靠(且不对引文 quote 收输出 token 费)。其二 对抗式验证:综合完成后,再跑一遍「逐条 claim → 回到 quote 核对 → 标注支撑强度」,这是 evaluator pattern 在研究场景的应用。

实战示例

一个 quote-grounded synthesis + 验证 prompt,直接拷:

# 综合阶段:禁止自由引用
你只能基于下面提供的 FINDINGS 写综述。每个结论后必须附 [url]。
若某结论在 FINDINGS 里找不到直接支撑句 → 写「证据不足」,不要补全。

FINDINGS = [{claim, url, quote}, ...]   # 来自 subagent,带原句

# 验证阶段(单独一轮,对抗式):逐条核对
逐条检查上面综述里的每个带引用结论:
1. 这个结论是否被它引用的 quote 直接支撑?(yes/partial/no)
2. 该结论是否只有单一来源?是 → 标 [单源未印证]
3. 标 no 的结论 → 删除或降级为「有观点称…」
输出修订后的综述 + 一份 claim→证据强度对照表。

核心是把「生成」和「验证」拆成两轮、用不同视角。同一轮里让模型边写边自检几乎无效(它会顺着自己刚写的合理化);独立一轮做对抗核对,才抓得住编造的引用。

失败模式:(1)只验证「URL 能不能打开」——链接真实但内容不支撑那句话,是最隐蔽的错;必须核对 quote 是否真出自该 URL 且真说了那个意思。(2)让生成和验证在同一轮、同一视角下做,等于让模型给自己打分,必然偏高(backward rationalization)。(3)信任模型自报的 confidence——它和真实正确率不校准。
进阶资源 · Anthropic Introducing Citations on the API, claude.com/blog/introducing-citations-api · Simon Willison Anthropic's new Citations API, simonwillison.net/2025/Jan/24

// 综合实战 · 周末造一个 personal research agent

把四点串成一个能替你做半小时主题调研的研究 harness。目标不是复刻 Deep Research,是亲手把「迭代 loop + 筛源 + 引用追溯」走通一遍。

  1. 判型(§1):先确认你的问题真需要迭代综合(「下一步搜什么取决于上一步读到什么」)。否则一次 search 就收工,别造 agent。
  2. Orchestrator(§2):把问题拆成 3–5 个正交子方向,在 prompt 里写死预算「最多 N 个 subagent、每个最多 8 轮搜索」。
  3. Subagent + 筛源(§2/§3):每个 subagent 独立 context;fetch 前先 rank_sources 取 top-3;回收 {claim, url, quote},原文丢掉。
  4. Grounded synthesis(§4):综合层只许引用回收的 quote,找不到支撑就写「证据不足」。
  5. 对抗验证(§4):单独一轮逐条核对 claim→quote,标注单源/未印证,删掉编造引用。
  6. 自评:出 5 个有已知答案的问题,对比「你的 agent」vs「直接问 Deep Research」的引用准确率和 token 成本。你会亲身体会 §1 的论断:值不值,取决于任务该不该用迭代。

走完一遍,你看任何「AI 研究产品」都会习惯性剥皮——它的迭代 loop 在哪、怎么筛源、引用怎么追溯——而不是被一篇「读起来很专业」的报告唬住。

// ENGLISH GLOSSARY

Deep Research
用迭代 search-read-reflect loop 自主完成开放式调研、产出带引用报告的一类 agent 系统。
Search-Read-Reflect Loop
研究 agent 的核心循环:搜索→阅读→基于所读生成下一个 query,区别于一次性 RAG。
Orchestrator-Worker
Lead agent 拆分子方向、并行派给隔离 context 的 subagent,再回收综合的架构。
Fan-out
把一个研究问题并行展开成多个弱依赖子任务的过程。
Source Curation
fetch 之前对搜索结果按一手性/权威度/时效/去重排序筛选。
Primary vs Secondary Source
一手来源(原论文/官方文档)vs 二手转述;研究 agent 应优先一手并回溯。
Grounded Generation
只允许模型引用确实检索到的内容,禁止「自由发挥」式引用。
Citations API
Anthropic 的原生能力:把源文档切句,让 Claude 引用确实用到的原句。
Citation Tracing
逐条把结论回溯到支撑它的原始 quote 并核对的过程。
Adversarial Verification
用独立一轮、对抗视角核对每条 claim 的证据强度,抓编造引用。

// 深入思考

Deep Research 用 RL 端到端训出「会浏览的推理模型」,和你用现成 API 拼一个研究 harness,能力上限的差距在哪?
差在停止判断和 query 质量。RL 训练让模型内化了「什么时候该 backtrack、什么时候够了」,这是奖励信号磨出来的隐性策略;harness 只能用 max_iters + 启发式 enough() 粗暴逼近。其次是 query 生成的「品味」——RL 模型见过海量浏览轨迹,知道下一步搜什么更高效。但 harness 的可控性是优势:你能精确插入筛源、引用追溯、domain allowlist。结论是 hosted Deep Research 适合开放探索,自建 harness 适合可审计、可定制、需要私有源接入的场景——两者不是替代,是不同 trade-off。
Anthropic 报告 multi-agent 比单 agent 强 90%+,但烧 15× token。什么情况下单 agent 长上下文反而是更优解?
当任务串行依赖强需要全局一致的判断时。研究之所以适合 multi-agent,是因为子方向弱依赖、可并行(搜 A 和搜 B 互不阻塞)。反过来,如果每一步都依赖上一步的精确结论(如多步数学推导、需要前后文严格一致的法律分析),拆成 subagent 会让 context 在 agent 间漂移、决策不一致——这正是 Cognition《Don't Build Multi-Agents》的复盘。判据:子任务能否独立完成且结果可拼接?能 → fan-out;不能 → 单 agent 长上下文。
「搜到 N 个网站都这么说」在直觉上是强证据,为什么在 AI 研究里反而危险?
因为独立性是幻觉。互联网上大量内容是相互转载/洗稿同一篇通稿,甚至现在很多是 AI 生成的二手内容互相引用。表面 N 个 URL,本质是单一来源被放大 N 次——这是伪多源印证。更糟的是 AI 生成内容污染搜索结果后,可能形成「模型编的东西被写进网页,又被下一个模型搜到当事实」的回音壁。所以真正的印证要按内容去重 + 回溯到一手,问的是「有几个真正独立的一手来源」,而不是「有几个 URL」。
为什么「让模型边写综述边自检引用」几乎无效,必须拆成独立一轮对抗验证?
同一轮里模型处于生成模式,会倾向合理化自己刚写的内容(backward rationalization)——它已经 committed 到那个 claim,自检时只会找支持它的理由。这和人「写完立刻自己校对抓不到错」同理。独立一轮、换成挑刺视角(「假设这条是编的,证据真支撑吗?」),打破了生成惯性,才暴露漏洞。这是 evaluator-optimizer pattern 的本质:generator 和 evaluator 必须是不同的「人格」,最好不同 context、不同 prompt 框架,否则评估退化成自我背书。
如果未来 web 上越来越多内容由 AI 生成,研究 agent 的「筛源」会面临什么结构性难题?
核心难题是一手来源的稀释与伪装。AI 生成内容可以完美模仿权威格式(带假引用、假数据、像模像样的方法论),传统的域名权威度/格式信号会失效。可能的演化方向:依赖可验证溯源(内容签名、出处链、official API 而非网页抓取)、依赖机构信任锚(只信少数可验证的一手发布渠道)、以及把「这条信息能否追到一个负责任的人/机构」作为硬门槛。这会让 §3 的筛源从「排序问题」升级成「溯源问题」——可信不再是搜索结果的属性,而是来源身份的属性。

// 延伸阅读