RAG 智能体听到“它的期限呢”时,不能只把这句话送进检索,也不能随意猜“它”指哪份材料。把已确认对象编号放进会话状态,再生成检索问题;新编号冲突时先澄清。
开发RAG多轮检索工作流的读者。本文使用 Python 3.11 或以上版本的标准库,先验证一组人工构造的小样本。AI 负责提出实现或解释差异,结果由本地检查决定;这里没有把模型回答当成真实运行结果。

核对追问的检索对象前,先定规则
示例只处理DOC-数字形式的文档身份,不解析任意自然语言实体。会话状态来自此前用户已确认编号,不是模型从记忆编出的值。
追问不含编号时沿用已确认对象;出现一个新编号与状态不同,本例拒绝自动切换并请求澄清。
显式切换对象可以合法发生,但需要单独入口更新状态。检索问题改写不得改变日期、金额和编号。
给 AI 的输入要包含什么
把下面这份输入说明和你的实际样本一起交给可用的 AI 编程助手。示例只含虚构数据;对真实材料先去除账号凭据和个人信息。
会话确认doc_id=DOC-12。追问“它的期限呢”生成含DOC-12的问题;追问出现DOC-99则报冲突待澄清。无已确认ID时拒绝省略对象追问。不得猜文档内容或期限。
要求模型保留检查条件,并把它认为缺少的业务定义列出来。若回答改变了输入字段、忽略异常分支或直接删除原材料,先要求修正,再运行。提示词的作用是缩小任务范围,验收仍以代码和数据为准。
保存并运行最小验证程序
下方程序把关键规则和验证用例放在同一个可复跑示例中,便于先理解输入如何变成输出,再用它检查 AI 给出的实现。
新建一个空目录,把下面代码保存为 check.py,在该目录打开终端,运行 python -X utf8 check.py。代码自带示例输入,不需要安装第三方库。
import re
def retrieval_question(question,state):
current=state.get('doc_id')
if not current or re.fullmatch(r'DOC-[0-9]+',current) is None: raise ValueError('先确认对象')
mentioned=set(re.findall(r'DOC-[0-9]+',question))
if mentioned and mentioned!={current}: raise ValueError('对象冲突,需澄清')
return f'文档 {current}:{question}'
state={'doc_id':'DOC-12'}
result=retrieval_question('它的期限呢',state)
assert result=='文档 DOC-12:它的期限呢'
print('retrieval_query',result)
try: retrieval_question('DOC-99的期限呢',state)
except ValueError as e: print('blocked',e)
else: raise AssertionError('编号冲突必须澄清')
怎样判断结果符合要求
检索问题明确DOC-12,DOC-99冲突被拒绝。程序没有返回任何真实期限,期限需要检索证据后再回答。
下方是这份最小示例在本地执行得到的输出。它验证示例程序与断言的关系,不代表任何 AI 模型一次就能生成同样代码,也不构成性能或生产可靠性结论。
retrieval_query 文档 DOC-12:它的期限呢
blocked 对象冲突,需澄清
这只是实体状态约束,不是自然语言理解模型,也不证明所有代词都被正确解释。
多个已确认对象时不能把最近一个永远当当前对象,应显示候选让用户选择。
哪些失败必须停下来处理
编号正则可能从更长标识截出子串,生产需匹配业务完整边界。
会话状态必须按用户与会话隔离,不能把上一用户的doc_id复用给下一用户。
接入自己的任务前再核对一次
保留原追问、改写问题、对象选择与检索来源,便于定位跑题发生在哪一步。
用无对象、冲突对象与正确沿用三类输入回归,并验证回答仍有原文引用。
资料与适用范围
re.fullmatch与findall可核对示例固定格式编号;会话实体选择是应用策略。以下链接核对于 2026-10-03;运行环境及额外依赖按本文前述说明。
相关基础可阅读 DeepSeek API 多轮对话怎么写?保留消息历史并核对第二轮回答。本文的重点是核对追问的检索对象,可以把两项检查作为不同步骤保留。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/33463.html