4.2 复杂查询处理与知识空白识别


知道自己不知道

本节在评估章的第二站:比"覆盖得多"更难的是"知道自己哪没覆盖"。全册里,知识空白识别是诚实性的前置(4.4 会讲诚实回答)。设想一个场景:你问"某新药对亚洲人群的副作用",系统搜了一堆欧美试验,给出结论——但它从没意识到"亚洲人群"这个限定根本没被任何来源覆盖。这种"不知道自己不知道",是研究报告最危险的漏洞。

复杂查询的处理,第一步是识别其中的约束与子维度。人类会本能地把"亚洲人群""长期""轻中度"拆成独立维度去验证覆盖;机器需要被显式设计成这么做。下面用代码演示"约束覆盖检查":把查询里的约束逐条核对证据是否覆盖,未覆盖的列为知识空白。

# 知识空白识别:逐条核对查询约束是否被证据覆盖 def find_gaps(query_constraints: list, covered: list) -> list: return [c for c in query_constraints if c not in covered] # 运行示例 constraints = ["亚洲人群", "长期", "轻中度", "副作用"] covered = ["欧美人群", "短期", "轻中度", "副作用"] # 证据实际覆盖 print(find_gaps(constraints, covered)) # ['亚洲人群', '长期'] —— 这两维是知识空白

运行输出 ['亚洲人群', '长期']。系统据此应明说"结论基于欧美、短期数据,亚洲人群与长期效应尚缺证据",而非把结论包装成普适。空白识别把"答得不全"转成"答得诚实"——这正是研究智能体区别于瞎答系统的分水岭。

我们主张:知识空白的呈现方式决定报告可信度。两类错误最该避免:一是把空白当"无此问题"默默跳过;二是为填满空白去编造。正确做法是显式列空白,并给出"已覆盖部分的适用边界"。这要求综合层(3.4)在成文时把约束覆盖率写进每句结论。

复杂查询还涉及"多跳":答案不在单一来源,而要 A 推 B 再推 C。评估多跳能力,看中间推理链是否每跳都有证据。下面演示多跳覆盖检查:

# 多跳推理覆盖:每跳是否都有来源支撑 def check_hops(hops: list) -> list: # hops: [("A->B", True), ("B->C", False)] 表示第二跳缺证据 return [h[0] for h in hops if not h[1]] hops = [("技术成熟->可量产", True), ("可量产->成本低", False), ("成本低->普及", True)] print(check_hops(hops)) # ['可量产->成本低']

输出 ['可量产->成本低'],指出第二跳"可量产导致成本低"缺证据。多跳里任一跳悬空,整条链就不可信。评估时必须逐跳验,而不是只看首尾。

完整案例:背景→操作→结果→解读→变式

  • 背景:投研报告称"该技术将快速普及",依据仅"技术成熟"和"成本低"两句,第二跳无源。
  • 操作:用 check_hops 验链,发现"可量产->成本低"悬空,标记为待验证。
  • 结果:报告改为"技术成熟,但量产降本路径未获证据,普及结论待验证"。
  • 解读:多跳覆盖检查拦住了一个看似顺滑、实则断链的论断。
  • 变式:若场景容许推测,可保留断链但显式标注"此跳为合理推断非已证事实",与 3.4 证据等级衔接。

知识空白识别还有一层工程含义:它决定了检索该往哪补。系统发现"亚洲人群"是空白后,下一步不是泛泛再搜,而是生成针对性查询"亚洲 临床 副作用 队列研究"——把空白翻译成检索式,这正是 3.2 迭代细化在验证侧的应用。若系统只列空白不补搜,等于把球踢回给人;若补搜后仍空,才该标注"确属证据缺口"。两步之分很重要:临时空白(能补)与真缺口(补不到)应对策略不同,报告里必须区分,否则读者无法判断是哪一类。

对比之下,"覆盖得多却漏关键约束"是更隐蔽的失败。曾有系统回答"某疗法安全性",覆盖 20 篇,却全部基于短期随访,对"长期安全性"这一约束毫无触及。按 find_gaps 检查,约束"长期"未被任何来源覆盖,判为空白。但系统未标,读者以为"安全"是全面结论。这说明空白识别不能只看子任务是否都有来源,还要逐约束核对——子任务"安全性"有来源,不代表其下每个维度都有。约束粒度比子任务粒度更细,是验证的最后一道闸。

还有一个常踩的坑:把"未检索到"当成"不存在"。空白识别的输出应是"当前证据未覆盖 X",而非"X 不成立"。这两句差之千里——前者留口子,后者下结论。综合层(3.4)成文时必须用"未覆盖"措辞,且若某约束持续空白,应在报告开头预警"结论适用范围受限"。这又回到 1.1 的诚实边界:研究智能体的价值不在于永远答对,在于永远说清"我覆盖了什么、没覆盖什么"。空白识别就是把"没覆盖"从隐性变成显性的一道工序。

空白识别还应接入"用户追问"闭环。报告标了"亚洲人群未覆盖"后,若用户追问"那亚洲到底怎样",系统应立刻把该空白转为新子任务去补,而不是答"我不知道"就结束。这把 4.2 和 3.2 的迭代细化连成用户侧闭环——空白不是终点,是下一轮研究的起点。工程上,空白项应带"可点击转任务"的元信息,前端一键即触发补搜。这种交互设计让"诚实说不知道"不再冷场,而是自然续上探索。

再谈一个边界:空白识别对"开放式问题"和"封闭式问题"粒度不同。封闭式如"某药是否获批",空白就是"是否获批"这一布尔;开放式如"某领域现状",空白是若干未覆盖的子维度。后者更难,因为"全"本就无界——你永远能说"还差 X 没覆盖"。工程上应对开放式设"覆盖阈值"(如核心子任务 80% 覆盖即算够),而非追求穷尽,否则系统会无限补搜。阈值定在哪,回到 3.2 的预算与 5.2 的早停——资源约束决定了"够"的标准。空白识别不是要把未知清零,而是要把未知"讲清楚、画边界",让人类决定要不要继续。

举个可落地的空白看板设计。系统维护一张"约束覆盖矩阵":行是查询约束(人群、时段、剂量等),列是已检索来源,单元格填"已印证、单一、空白"三态。成稿前渲染这张表,读者一眼看到哪格空白,比读一段"本报告存在若干未覆盖"更实在。矩阵还能驱动补搜——空白格自动生成补检索任务。这个设计把 4.2 的 find_gaps 从命令行输出变成可视资产,也方便审计"上次缺的这次补上没有"。空白不再是脚注里的小字,而是研究的仪表盘。它把"知道自己不知道"从一句宣言变成可持续维护的工程对象,让诚实性可被日常巡检而不只是被写进原则。

4.3 看多源信息怎么被整合——空白识别之后,是整合质量。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U