「从零到 AI 应用工程师」专栏 · 第 13 篇
能答还不够。工业场景还要回答:你这话从哪份手册、哪一页来的?
references 和 citations 经常被混用------今天把它们掰开。
一、两个字段分别是什么
references |
citations |
|
|---|---|---|
| 何时产生 | 检索/重排之后,喂给模型之前 | 模型(或兜底)生成答案之后 |
| 含义 | 本轮候选证据(上下文) | 答案里实际用到的出处 |
| 典型用途 | 调试「模型看了啥」 | 前端高亮、审计、工单溯源 |
关系:
text
references = [切片1, 切片2, 切片3] # 候选
answer = "......处理步骤见【1】,阈值见【2】。"
citations = [切片1对应项, 切片2对应项] # 子集
可以召回了 3 条,答案只标了【1】------这很正常。
二、标记怎么落到 doc_id / page
- Prompt 要求:有依据时写
【1】【2】(或[1]); - 后处理用正则抽出序号;
- 序号对齐
references[N-1],拷贝doc_id、page、source、text等。
python
# 伪代码
indices = extract_cited_indices(answer) # 【1】【2】 → [1, 2]
citations = []
for i in indices:
if 1 <= i <= len(references):
ref = references[i - 1]
citations.append({
"ref_index": i,
"doc_id": ref.doc_id,
"page": ref.page,
"source": basename(ref.source),
"text": ref.text,
})
计划里说的「响应带 [doc_id, page]」,落在每个 citation 对象上。
三、模型忘了标引用怎么办
| 策略 | 说明 |
|---|---|
| 检索兜底回答 | 本地拼装时自己带【N】,再整表映射 |
fallback_all |
无标记时临时把全部 references 当作 citations(便于人工核对,正式产品要慎用) |
| 拒答 / 降置信 | 无依据或无引用时不装有出处(见下两篇治理) |
原则:没有可靠映射,就不要假装有强引用。
四、前端与 Agent 怎么用
- 展示答案时,把【N】做成脚注或侧栏卡片;
- 卡片显示:文件名、页码、摘录;
- Agent 写工单:只把
citations写进「依据」字段,不要把整份references当已引用。
五、带走这三条
- references = 候选;citations = 实际引用。
- 靠 Prompt 标号 + 后处理映射 meta,不是靠模型口述文件名。
- 无标记就要降级策略,不能默认为「全都引用了」。
下一篇:治幻觉------没依据就拒答,禁止「可能大概也许」。
这是专栏第 13 篇。两到三天一更,拒答见。