AI综述引用丢失根因追踪:Sciverse接入后chunk实战全攻略
一位用户提出了一个关于AI文献研究的典型问题,值得深入分析。
在使用 Sciverse 进行 AI 文献分析时,即使检索结果包含相关论文,生成的综述却经常出现引用缺失。最终输出中仅浮现一句模糊的“某研究表明”,缺少 doc_id 和精确的原文位置。
那日志长什么样呢?大概是这么一溜:
[INFO] agentic-search success, results=20
[INFO] llm generate report success
[WARN] citation missing: paragraph=3
[WARN] source_location is null
[ERROR] report validation failed: evidence_id not found
Sciverse 的检索并未失败,API 调用成功返回了结果。问题根源在于中间层工程链路中丢失了 evidence 的元数据。
错误的上下文构建方式
很多人容易写成这样:
def build_context(results):
chunks = []
for item in results:
# 错误:只保留文本,丢弃 doc_id 和 source_location
chunks.append(item["chunk"])
return "nn".join(chunks)
这种做法看似简洁,实则将 Sciverse 返回的结构化证据对象压缩成了无上下文的纯文本,丢失了所有关联元数据。
无论 LLM 能力多强,它都无法追溯文本来源的具体 doc_id、chunk 或 source_location,信息断层由此形成。
正确的证据保留方式
正确的做法,应该是把证据对象原封不动地保留下来,并且给每个证据配一个明确的 ID:
def build_context(results):
evidence_blocks = []
for idx, item in enumerate(results, start=1):
evidence_blocks.append({
"evidence_id": f"E{idx}",
"doc_id": item.get("doc_id"),
"title": item.get("title"),
"chunk": item.get("chunk"),
"source_location": item.get("source_location"),
"score": item.get("score")
})
return evidence_blocks
同时,prompt 也需要相应调整,明确指示 LLM 使用这些结构化证据:
def build_prompt(question, evidence_blocks):
text = []
for ev in evidence_blocks:
text.append(f"""
[{ev["evidence_id"]}]
doc_id: {ev["doc_id"]}
title: {ev["title"]}
source_location: {ev["source_location"]}
chunk: {ev["chunk"]}
""")
return f"""
请基于以下证据回答问题。
问题:
{question}
证据:
{chr(10).join(text)}
要求:
1. 每个结论必须引用 evidence_id;
2. 每个引用必须包含 doc_id;
3. 不允许使用证据外的信息。
"""
根本原因解析
Sciverse 的核心优势在于其返回的多级结构化数据,包括 doc_id、tag、chunk 等,而非单纯的文本片段。
根据官方文档,Sciverse 支持以下丰富功能:
- doc_id、tag、chunk 管理;
- 多阶段 Top-K;
- cross-encoder 重排序;
- meta-search;
- agentic-search;
- deep-search;
- graph-search;
- seqstudio。
如果在代码中仅提取 chunk_text,就等于主动舍弃了所有结构化能力,将精密工具降级为简陋的文本拼接。
排查方法:如何定位引用丢失问题
当出现引用丢失时,按以下顺序排查,而非直接归咎于模型:
第一步,检查原始响应。优先打印 Sciverse 返回的原始数据,确认数据完整性。
第二步,审核中间对象。验证 doc_id、source_location 等关键字段是否准确传递至 prompt。
第三步,审查 prompt。引用丢失往往源于 prompt 未要求模型输出证据引用,而非模型能力不足。
第四步,实现报告校验器。在生成报告后,运行校验逻辑确保每条结论均关联 evidence_id。
第五步,优化前端展示。界面应呈现完整的追溯链路:结论 → 证据 → 原文位置,确保每一步可追踪。
最小化校验函数示例
def validate_report(report_items):
errors = []
for idx, item in enumerate(report_items, start=1):
if not item.get("evidence_id"):
errors.append(f"item {idx}: missing evidence_id")
if not item.get("doc_id"):
errors.append(f"item {idx}: missing doc_id")
return errors
核心要点
问题的本质并非“AI 无法引用”,而是工程链路中未能将证据视为体系中的“一等公民”。
Sciverse 提供的是科学的结构化数据,不应在进入模型前将其扁平化为无意义的字符串。
牢记以下准则:
在 AI 文献研究中,chunk 是内容基石,doc_id 是唯一标识,source_location 是溯源路径。
