以下是ChatController.send 方法的全流程介绍。
阶段一:会话管理
1、接收前端传入的 userId、content(用户问题)、conversationId(可选) 2、若 conversationId 为空,则创建新会话:用用户问题前20字符作为临时标题,同步写入数据库 3、异步(虚拟线程)调用 LLM 生成摘要标题,完成后回写数据库更新标题 4、若 conversationId 已有,直接使用
阶段二:消息持久化 & 意图识别
1、将用户消息保存到数据库(chatMessageService.saveUserMessage) 2、调用 IntentRecognitionService 进行意图识别(基于 LLM + 结构化输出),判断用户问题是否与汽车领域相关,并提取实体信息(车型、订单号、故障描述等) 3、若 related=false(非汽车相关问题),走 CommonChatService 通用对话分支,直接返回流式结果 4、若 related=true,进入 RAG 增强检索分支
阶段三:RAG 增强检索(ChatApplicationService.chat)
1、查询改写(KnowEngineQueryTransformer):用 LLM 对用户问题进行改写优化(简洁改写、抽象改写、错别字纠正、车型标准化),返回改写查询 + 原始查询两个 Query,异步回写改写结果到数据库 2、查询路由(KnowEngineQueryRouter):用 LLM 判断查询应走哪个数据源: - relational_db → SqlDatabaseContentRetriever(关系型数据库,Text2SQL) - graph_db → Neo4jText2CypherRetriever(图数据库,Text2Cypher) - knowledge_base → ElasticsearchContentRetriever(ES 向量检索 + 全文检索) 3、内容检索:被路由到的 Retriever 执行检索,获取相关 Content 列表 4、内容聚合 + 重排序(ReRankingContentAggregator):用 BGE-RERANKER ONNX 模型对检索结果进行重排序,选取第一个查询作为重排序参考 5、内容注入(DefaultContentInjector):根据意图识别结果选择对应 Prompt 模板,将检索内容注入到 Prompt 中
阶段四:流式生成回复
1、构建 KnowEngineChatAiService(含 ChatMemory,窗口10条),调用 streamChat 进行流式对话
2、返回 Flux