Deep Research 写到第 8 节跑题:scope_manifest 里少了 exclude_terms

1 阅读1分钟

一个常见现场:用户问“科研 Agent 的文献发现评测怎么做”,Deep Research 跑了 20 分钟,吐出 8 节报告。前两节还在讲 benchmark、retrieval recall、citation grounding,到了第 8 节,主题滑到“AI 科研自动化趋势”和“Agentic Science 的组织影响”。

这类报告不好判错。语气稳定,结构完整,引用密集。问题藏在过程里:原始问题被多轮 query rewrite、检索召回和章节生成逐步放宽,最后变成相邻主题综述。

!图1:用户问题 → scope_manifest → query_plan → 检索 → 章节生成 → scope check

图1:用户问题 → scope_manifest → query_plan → 检索 → 章节生成 → scope check(./images/scope-flow.png)

漂移从 query rewrite 开始

用户原问是“科研 Agent 的文献发现评测”。第一次扩展成 AI agents for scientific discovery evaluation。为了提高召回,第二次加入 automated scienceAI for research。第三次抓到几篇综述,开始检索 scientific automation。章节生成时,模型把这些材料串起来,第 8 节就写成了“AI 科研自动化趋势”。

单看每一步都合理,连起来就偏题。工程上应先写一份 scope_manifest,把研究边界变成可检查对象。它记录研究问题、领域、时间范围、来源类型、纳入词、排除词和未知项。缺少 exclude_terms 时,Agent 很容易把“相关”当成“可回答”。

字段应写什么缺失后的症状
research_question原始问题的可执行版本报告变成泛综述
domain学科和任务边界跨到产业趋势、组织管理
time_window年份范围引入过旧方法或未来预测
source_typepaper、benchmark、dataset、review新闻稿混入证据池
quality_filter是否有方法、实验、数据说明工具介绍冒充研究证据
include_terms必须覆盖的主题词查询召回变宽
exclude_terms明确排除的主题背景材料写成论据
unknowns暂不确定的概念和分类模型自行补定义

一个 30 行以内的最小实现:

{
  "scope_manifest": {
    "research_question": "Evaluate literature discovery in scientific research agents",
    "domain": ["AI research", "information retrieval"],
    "time_window": {"from": 2020, "to": 2026},
    "source_type": ["paper", "benchmark", "dataset", "review"],
    "quality_filter": ["has_method_section", "has_evaluation_metric"],
    "include_terms": [
      "research agent",
      "literature discovery",
      "retrieval evaluation",
      "citation grounding"
    ],
    "exclude_terms": [
      "general AI automation trend",
      "market report",
      "product launch",
      "clinical decision support"
    ],
    "unknowns": ["benchmark taxonomy may be inconsistent"]
  },
  "guards": {
    "query_rewrite": "include_hit_rate >= 0.5 && exclude_hit == false",
    "source_add": "require_scope_reason",
    "section_generate": "require_coverage_and_source_map"
  }
}

query_plan 要能追责

scope_manifest 之后再生成 query_plan。它不该只是一串关键词,还要解释每条查询为什么存在,命中了哪些边界,外溢时怎么处理。

主查询可以是 scientific research agent literature discovery evaluation,命中 research agent、literature discovery、evaluation,放行。指标补充查询可以是 citation grounding benchmark retrieval recall research agents,用于找 evaluation protocol。术语消歧查询出现 RAG agent scientific discovery literature search benchmark 时,scientific discovery 过宽,应改成 literature discovery benchmark。外溢探测查询如 AI research automation trend agentic science,命中 automation trend,只能留作背景判断,不能进入主证据池。来源过滤查询如 research agent product launch literature search,命中 product launch,排除出论据集合。

这套记录用于定位责任。第 8 节写偏了,可以回看是哪条 rewrite 把 trend 材料带进来,还是章节生成时把背景材料误用成证据。

一个模拟审计流程可以这样跑:先把问题写成带边界的中文请求——“2020 年以来,AI Research Agent 在文献发现任务中的评测方法、数据集和指标,限定 AI、信息检索、科学发现论文,排除泛科研自动化趋势、产业报道和缺少方法细节的工具介绍。”然后在 超能文献 用中文检索候选文献,重点看 DOI、摘要、年份和来源类型,再人工标注“入池理由”或“排除理由”。这里它只承担证据入口和候选记录整理,报告结论仍要做来源审计。

!图2:query 演化审计图,从 literature discovery evaluation 漂移到 AI research automation trend

图2:query 演化审计图,从 literature discovery evaluation 漂移到 AI research automation trend(./images/query-drift.png)

章节生成前,先写 coverage

检索池里只要混进宽泛材料,章节生成就会自动补叙事。“评测方法”被扩写成“发展趋势”,“benchmark”被扩写成“未来机会”。所以每节开写前,要先声明 coverage:本节覆盖什么,排除什么,绑定哪些来源。

例如第 3 节只覆盖“现有文献发现评测指标”,不得写“科研自动化产业影响”;每个小节至少绑定两条同范围来源;综述只能提供背景,不能冒充原始 benchmark。Research Agent 评测框架通常会把过程拆成检索、证据选择、引用支撑、结论一致性等任务,焦点落在过程审计,少看最终文本是否顺眼。

指标也要能落地。scope_violation_rate 统计不符合 manifest 的段落比例。unsupported_section_rate 统计没有来源支撑的章节比例。query_drift_distance 可以先用启发式公式:0.5 * (1 - embedding_sim(original_question, rewritten_query)) + 0.3 * exclude_hit + 0.2 * (1 - include_hit_rate)。其中 exclude_hit 命中排除词时记 1,未命中记 0;include_hit_rate 按纳入词覆盖比例计算。这里的 0.5、0.3、0.2 是初始权重,需要用人工标注审计集校准阈值。超过阈值的 query 进入人工复核,不能直接写入证据池。

回到开头那个跑了 20 分钟的报告,矛盾很具体:用户问的是“科研 Agent 的文献发现评测”,第 8 节却开始写“AI 科研自动化趋势”。它未必引用了假论文,也未必语言差,问题多半出在 query rewrite 后没有回看 scope_manifest,章节生成前也没有声明 coverage

下一步先做 50 条审计集。每条包含用户原问、scope_manifestquery_plan、候选文献池、排除理由、章节-来源映射。让 Agent 每次改写查询和生成章节时都留下痕迹,再统计 scope_violation_rateunsupported_section_ratequery_drift_distance。长报告可以继续生成,但要先证明题目没有被写丢。