RAG 问答如何证明答案来自文档,关键不是完成一次调用,而是让输入口径、处理状态和结果证据可以复核。本文围绕“如何上传文档、确认解析入库状态,并让每个 RAG 回答携带可核对的引用来源”给出一套面向真实业务流程的实现方式。
问题与结果
只有完成解析和索引的文档进入检索,回答同时保存知识库、线程、消息和引用片段。
适用场景
- 开发者文档问答
- 产品帮助中心
- 企业内部知识检索
实现前先确定边界
- 上传成功不等于索引完成,必须检查 parse_status 和 index_status
- tenant_id、knowledge_base_id 和 thread_id 分别承担隔离职责
- 回答没有引用或引用不支持结论时进入人工复核
入库与问答必须分成两个状态机
网页资料可以先通过 文章正文抽取形成稳定正文,再与本地文档一起进入知识库。文档上传返回document_id后,继续检查解析和索引状态;只有parse_status与index_status满足可用条件,文档才进入问答范围。原文件哈希、文件名、知识库和租户标识应一起保存。
最小问答示例
curl -X POST "https://api.gugudata.com/ai/knowledge-bases/default/chat/completions?appkey=YOUR_APPKEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gugudata-knowledge-chat", "messages": [{"role": "user", "content": "这个接口的错误处理规则是什么?"}], "tenant_id": "docs-portal", "stream": false, "top_k": 6 }'知识库问答知识库问答知识库问答响应中的回答正文和sources必须一起保存。界面应让用户展开引用片段,而不是只显示自然语言答案。多轮追问继续使用服务端返回的thread_id,但文档版本变化时应明确开始新线程或记录索引版本。
引用验收
- 关键事实至少有一个引用片段;
- 引用属于当前知识库和租户;
- 引用文档版本与回答生成时一致;
- 引用缺失、冲突或不足时,回答状态标记为“需要复核”。
任务状态与失败处理
生产接入至少区分INPUT_INVALID、PENDING、RUNNING、SUCCEEDED、PARTIALLY_FAILED和FAILED。状态名称可以按业务调整,但不能把“任务已创建”“请求 HTTP 成功”和“结果可用”合并成一个成功状态。
参数错误应直接返回给调用方;频率或额度限制停止当前批次并保留下一次可执行条件;依赖服务失败可以进入有上限的退避重试;业务结果缺失、覆盖不足或引用不足则进入人工复核。每次尝试记录请求标识、开始和结束时间、业务状态、失败原因以及是否产生可用结果。
还应为重试设置幂等键和最大次数。相同输入、相同规则版本和相同业务目标不能因为网络超时重复写入多个正式结果;超过重试上限后保留最后错误和人工处理入口。
运行记录与回归检查
上线前保存一组脱敏固定样本,用于比较接口或规则升级前后的字段结构、状态流转和关键结果。回归测试不追求结果文本逐字一致,而是检查必填字段、来源证据、错误分类和能力边界是否稳定。
对于本文场景,重点回归以下约束:
- 上传成功不等于索引完成,必须检查 parse_status 和 index_status
- tenant_id、knowledge_base_id 和 thread_id 分别承担隔离职责
- 回答没有引用或引用不支持结论时进入人工复核
监控指标至少包括成功结果数、失败数、处理中任务数、人工复核数和数据新鲜度。任何未采样指标都应显示“未采样”,不能默认为零。
数据契约与留痕
| 字段 | 作用 |
|---|---|
knowledge_base_id | 稳定业务标识,用于关联记录和请求追踪 |
tenant_id | 稳定业务标识,用于关联记录和请求追踪 |
document_id | 稳定业务标识,用于关联记录和请求追踪 |
document_hash | 内容哈希,用于完整性、版本和重复识别 |
index_status | 显式状态或原因,禁止以空值代替失败 |
thread_id | 稳定业务标识,用于关联记录和请求追踪 |
message_id | 稳定业务标识,用于关联记录和请求追踪 |
answer | 业务数据字段,保存来源、口径和缺失状态 |
sources | 原始来源或响应,供后续复核 |
usage | 业务数据字段,保存来源、口径和缺失状态 |
重试应新增尝试记录,不覆盖最后一次失败。派生结果必须关联输入版本、生成时间和业务状态。
验收清单
能力边界
RAG 引用能提高可追溯性,但不能证明原文真实、最新或足以支持专业结论。
示例中的YOUR_APPKEY仅为占位符。真实密钥只能放在服务端环境变量或密钥管理系统中。