知识库问答源码解析
后端入口
AiChatController.msg 是整个聊天流程的入口点,它接收前端传来的消息 key,并建立 Server-Sent Events (SSE) 连接,实现服务器向客户端的实时推送。
这个端点依赖于之前的 createConnection 调用,即使接口设置为公开,没有有效的 message key 也无法调用。
消息预处理
当 msg 端点接收到请求后,会调用 AiChatServiceImpl.chatList 方法进行消息处理:
- 首先根据 key 查询聊天记录
- 如果记录不存在,返回”链接已失效”
- 构建 ChatMessageDTO 对象,填充必要信息
- 执行风控逻辑
风控逻辑:flowRisk
风控逻辑通过规则引擎实现,遵循以下流程:
风控逻辑主要包括:
- 敏感词检测:检测用户输入是否包含敏感词
- 限流控制:根据调用方式不同采取不同的限流策略
- 内部调用:按用户名 + 总量控制
- 外部调用:按 IP+ 总量控制
根据请求类型匹配处理规则
系统根据 datasetId 确定请求消息类型,主要包括:
Chat Type | Code | Description |
---|---|---|
FUNCTION_CHAT | -1L | 功能聊天 |
SIMPLE_CHAT | 0L | 简单聊天 |
DATABASE_CHAT | -2L | 数据库聊天 |
IMAGE_CHAT | -3L | 生成图片 |
MARKMAP_CHAT | -4L | 生成脑图 |
FLOW_CHAT | -5L | 编排 |
JSON_CHAT | -6L | JSON 聊天 |
REASON_CHAT | -7L | 推理聊天 |
VECTOR_CHAT | 1L | 知识库聊天 |
聊天类型枚举
知识库聊天处理流程 (VectorChatRule)
当请求类型为知识库聊天时,系统会调用 VectorChatRule 进行处理:
处理流程包括:
- 获取知识库数据集信息
- 获取嵌入模型并将用户问题转换为向量
- 根据知识库配置决定处理方式:
- 如果启用了标准问答(standardFlag=YES),先尝试问题匹配(Q2QStandardRagChatHandler)
- 如果问题匹配无结果,或未启用标准问答,则使用答案匹配(Q2AVectorRagChatHandler)
向量搜索处理 (Q2AVectorRagChatHandler)
向量搜索处理流程:
- 根据知识库配置设置最小相似度分数
- 构建向量搜索请求,包括:
- 查询向量
- 最大结果数
- 过滤条件(数据集 ID 和文档类型)
- 最小分数
- 执行向量搜索
- 处理搜索结果:
- 如果没有匹配结果,返回知识库配置的空结果描述
- 如果有匹配结果,更新命中次数
- 调用大模型对搜索结果进行总结(summaryResult)
- 构建参考资料链接
- 返回总结结果和参考资料
结果总结处理
结果总结处理流程:
- 创建提示模板,加载系统提示(knowledge-system.st)
- 向模板添加参数:
- 搜索结果内容
- 用户问题
- 空结果描述
- 获取大模型服务
- 调用大模型进行聊天,生成总结
- 将总结结果转换为 AiMessageResultDTO 对象并返回
summaryResult 方法代码
总结处理流程