引用合成与报告生成(quick vs detailed)
30 秒导读: 搜索引擎捞回一堆网页片段后,这一环负责两件事——先把片段喂给 LLM,产出带
[1] [2]编号引用、且不敢编造来源的文字;再把这些文字拼成用户能读的产物。产物分两档:轻量的 quick summary(一段综述)和重量的 detailed report(带目录、逐小节深挖的长 文)。本章讲透"编号怎么保持连续""怎么防幻觉""两档产物怎么拼",不重复策略循环(01)和搜索引擎(02)。
1. 这是什么(零基础也能懂)
一句话定义: 把"一堆搜索结果 + 一个问题"变成"一段有理有据、每个论断后面挂着 [3] 这种编号、结尾附来源清单"的可信文本,再装配成报告。
它解决什么问题。 LLM 天生爱"一本正经地编"——你让它"带引用回答",它会顺手编出一个看着像真的、其实不存在的来源。深度研究工具最怕这个:引用一旦是假的,整份报告就不可信。这一环的核心任务,就是用工程手段把"编造引用"这条路堵死。
三个绕不开的小问题:
| 小问题 | 白话 |
|---|---|
| 编号怎么来 | 第 5 篇搜索结果,凭什么在正文里叫 [5]、在来源清单里也叫 [5]? |
| 编号怎么跨轮不乱 | 一份 detailed report 有十几个小节,每节都各搜各的,编号凭什么不从 [1] 重头再来、彼此打架? |
| 怎么不让模型编 | 搜索一无所获时,怎么保证模型不退回"我记得好像是……"然后编个假链接? |
一句话 直觉: 把整个系统里所有见过的源(网页)想象成一本共享的花名册(all_links_of_system),每条源进册子时就分到一个永久工号(index 字段)。正文里的 [n]、结尾清单里的 [n]、导出的 PDF 里的 [n]——引的都是同一个工号。编号连续、不重号、跨小节可追,全靠这本花名册只有一份。
2. 顶层全景(它大概怎么转)
怎么读这张图: 从左到右是一次合成的数据流。左半("引用侧")把搜索结果变成带编号的可信文本;右半("报告侧")把文本拼成产物并导出。中间那本"共享花名册"是编号连续的关键。
┌──────────────────────────────────────────┐
│ 共享花名册 all_links_of_system │
│ [每条源一个永久 index 工号] │
└───────▲───────────────────────┬────────────┘
│ 写入 index │ 读取全部源
搜索结果 ─────────────────┤ │
(List[Dict]) │ ▼
│ ┌───────┴────────┐ ┌──────────────┐
▼ │ 引用处理器 │ │ 来源清单装配 │
┌─────────┐ │ CitationHandler │ │ format_links │
│ 无源? │──是──▶│ → 按 type 选实现│ │ _to_markdown │
│ 防幻觉门 │ │ → 调 LLM 带编号 │ └──────┬───────┘
└────┬────┘ └───────┬──────────┘ │
│否 / 拒答 │ {content, documents} │
└───────────────────▶│ ▼
▼ ┌──────────────┐
┌─────────────────┐ │ 两种产物 │
│ 带 [n] 的合成文本 │──────────▶│ quick 综述 │
└─────────────────┘ │ detailed 报告 │
└──────┬───────┘
▼
┌──────────────┐
│ 导出 exporters│
│ PDF/ODT/LaTeX │
└──────────────┘
部件一句话职责:
| 部件 | 干什么 | 在哪 |
|---|---|---|
CitationHandler | 统一入口,按 handler_type 把活派给具体实现 | citation_handler.py:10 |
BaseCitationHandler | 公共底座:建文档、编号、格式化、无源防幻觉门 | citation_handlers/base_citation_handler.py:15 |
StandardCitationHandler | 默认实现:详细分析 + 可选事实核查 | citation_handlers/standard_citation_handler.py:11 |
ForcedAnswerCitationHandler | 逼模型给确定答案(BrowseComp 基准用) | citation_handlers/forced_answer_citation_handler.py:14 |
PrecisionExtractionHandler | 正则 + LLM 精确抠答案(SimpleQA 用) | citation_handlers/precision_extraction_handler.py:21 |
format_links_to_markdown | 把花名册渲染成结尾"来源"段 | utilities/search_utilities.py:217 |
IntegratedReportGenerator | detailed 报告装配器,逐小节调 analyze_topic | report_generator.py:33 |
CitationFormatter | 把正文 [n] 变成超链接 [[n]](url) | text_optimization/citation_formatter.py:54 |
ExporterRegistry / 各 exporter | 把最终 Markdown 导成 PDF/ODT/LaTeX… | exporters/registry.py:15 |