文档问答配置检查与问题改写入口
上一篇讲了开放式问答的快速路由,如果 chatMode 不是 OPEN_CHAT,那就说明要走文档问答链路了。在真正开始检索之前,系统要先做两件事:
- 检查 RAG 配置是否正确
- 对用户问题做"检索友好型改写"
文档问答模式的配置检查
第一步:检查 RAG 是否开启
// 到这里说明进入的是文档知识问答链路;若 RAG 未开启,则直接报配置错误。
if (!properties.isEnabled()) {
throw new IllegalStateException("当前文档问答模式未启用,请先开启聊天侧 RAG 编排");
}
这段代码很简单,就是检查 properties.isEnabled() 是否为 true。这个 properties 是 ChatRagProperties 类型的配置对象,里面有个 enabled 字段,用来控制整个 RAG 功能的开关。
为什么要这个检查?
如果用户选择了文档问答模式,但是系统配置里 RAG 功能是关闭的,那后续的检索、路由等操作都无法进行。与其让程序在后面某个环节报错,不如在这里就直接抛出异常,告诉用户"你得先开启 RAG 功能"。
第二步:检查文档范围是否明确
if (chatMode == ChatQueryMode.DOCUMENT && (selectedDocumentId == null || selectedTaskId == null)) {
// 当前文档问答模式必须具备明确文档范围,否则无法继续往下路由。
throw new IllegalArgumentException("当前文档问答模式缺少有效的文档范围");
}
这个检查只针对 DOCUMENT 模式(单文档问答)。在这个模式下,用户必须先选择一个具体的文档,系统才知道去哪里检索。如果 selectedDocumentId 或 selectedTaskId 为空,说明用户没有选择文档,那就没法继续了。
| 聊天模式 | 是否需要明确文档范围 | 说明 |
|---|---|---|
DOCUMENT | ✅ 必须 | 单文档问答,必须指定文档 ID 和任务 ID |
KNOWLEDGE | ❌ 不必须 | 知识库问答,可以跨多个文档检索 |
OPEN_CHAT | ❌ 不需要 | 开放式问答,不涉及文档检索 |
注意
KNOWLEDGE 模式不需要这个检查,因为知识库问答可以跨多个文档检索,不需要用户提前指定某个文档。
问题改写的入口
通过了配置检查之后,系统就要开始准备检索了。但是用户的原始问题往往不适合直接拿去检索,原因有这么几个:
- 上下文省略 - "它是什么?"、"再详细点",这种问题脱离了上下文就没法理解
- 指代不明 - "这个功能怎么用?","这个"指的是什么?
- 口语化表达 - "能不能给我讲讲那个啥来着",太随意了
- 多问题混在一起 - "A 是什么?B 怎么用?C 和 D 有什么区别?",一次问了好几个问题
所以系统要先把用户问题"整理"一下,变成更适合检索的表达。这个过程就叫问题改写(Query Rewrite)。
付费内容提示
该文档的全部内容仅对「JavaUp项目实战&技术讲解」知识星球用户开放
加入星球后,你可以获得:
- 超级八股文:100万+字的全栈技术知识库,涵盖技术核心、数据库、中间件、分布式等深度剖析的讲解
- 讲解文档:超级AI智能体、黑马点评Plus、大麦、大麦pro、大麦AI、流量切换、数据中台的从0到1的详细文档
- 讲解视频:超级AI智能体、黑马点评Plus、大麦、大麦pro、大麦AI、流量切换、数据中台的核心业务详细讲解
- 1 对 1 解答:可以对我进行1对1的问题提问,而不仅仅只限于项目
- 针对性服务:有没理解的地方,文档或者视频还没有讲到可以提出,本人会补充
- 面试与简历指导:提供面试回答技巧,项目怎样写才能在简历中具有独特的亮点
- 中间件环境:对于项目中需要使用的中间件,可直接替换成我提供的云环境
- 面试后复盘:小伙伴去面试后,如果哪里被面试官问住了,可以再找我解答
- 远程的解决:如果在启动项目遇到问题,本人可以帮你远程解决
进入星球后,即可享受上述所有服务,保证不会再有其他隐藏费用。
