杠精派
派聪明
0/512

热门评论

阿白 2026年01月27日 09:54
引用原文:首先,在检索这层,我们会给 Elasticsearch 设置一个相关性评分的门槛。比如我们会把低于 0.3 分的结果全部过滤掉。也就是说,如果一个文档跟用户的问题只有一点点关联关系,分数达不到要求,它就根本不会进入到下一步的上下文构建中。
@派聪明 我们不是相似性检索和关键词检索综合评分吗?这个最后的0.3过滤是根据什么分数过滤的?
点赞
回复3 取消回复
派聪明 2026年01月27日 09:54
根据参考资料,系统在Elasticsearch检索层采用**混合检索策略**(结合相似性检索和关键词检索),最终生成的相关性评分是一个**综合得分**。0.3分是系统设定的**最低相关性阈值**,具体依据如下: --- ### 1. **评分机制** - **混合检索评分**: 系统会同时进行**向量相似性检索**(如余弦相似度)和**关键词检索**(如BM25算法),并将两种结果按预设权重加权融合,生成一个0-1区间的综合相关性分数。 - **阈值过滤**: 低于0.3分的文档被视为与用户问题关联度不足,直接排除,避免低质量信息进入后续上下文构建。 --- ### 2. **0.3阈值的设定依据** - **经验性平衡**: 0.3是系统通过多轮测试确定的平衡点: - **查全率 vs. 查准率**: 过低阈值(如0.1)可能召回过多无关文档,导致LLM混淆;过高阈值(如0.5)可能遗漏有效信息,降低回答覆盖率。 - **业务场景需求**: 专业领域(如技术文档)要求更高相关性,而通用场景可适当放宽阈值。 - **动态调整可能性**: 阈值可根据不同知识库特性或用户反馈微调(如高敏感领域采用更高阈值)。 --- ### 3. **为什么过滤低分文档?** - **避免LLM“胡说八道”**: 参考资料明确要求,若上下文无足够信息,LLM需回答“无法回答”。低分文档可能包含错误或无关信息,干扰模型判断。 - **优化性能**: 减少冗余数据传递,降低大模型处理负担和响应延迟。 --- ### 总结: 0.3分是**混合检索后的综合相关性阈值**,用于筛选与问题强相关的文档。这一数值通过平衡查全率、查准率及业务需求确定,确保进入LLM的上下文信息既相关又可靠。
点赞
回复 取消回复
展开剩余 2 条回复

85 条评论

丰富的胡萝卜 2026年04月09日 16:41
引用原文:WebSocket 是一种有状态、全双工的协议,一旦连接建立,前后端就可以随时互相发送消息。
@派聪明接受大模型的流式回复是单队列接收吗,怎么避免多线程会造成的前端输出乱序呢
点赞
回复 取消回复
违规名称 2026年04月07日 09:54
引用原文:第二,我们在 Prompt 的 System 指令里给出了明确的规则,“如果你发现上下文里没有足够信息来回答用户的问题,请直接说‘无法回答’或者‘没有找到相关资料’,而不是强行输出。”
评分低的时候为什么不直接返回固定拒答文案,为什么还要调用llm回答
点赞
回复 取消回复
Akaina 2026年04月06日 19:45
@派聪明 该项目 从用户输入 到 得到响应 需要多少时间
点赞
回复 取消回复
Akaina 2026年04月06日 19:42
该项目 从用户输入 到 得到响应 需要多少时间
点赞
回复 取消回复
借我 2026年04月03日 09:58
引用原文:然后在答案生成后还需要将新一轮的对话再次写入到历史记录中
每一次对话都会生成后直接写入还是在对话完全结束后再写入@派聪明
点赞
回复 取消回复
借我 2026年04月03日 09:03
引用原文:这一步是实现打字机效果的关键
智能对话时,到底是调用api还是本地Ollama部署呢@派聪明
点赞
回复 取消回复
过时的草莓 2026年04月01日 13:14
引用原文:前 N 个最相关
怎么确定这个N是多少
点赞
回复 取消回复
心已指南 2026年03月29日 15:04
@派聪明 怎么理解这句话:基于 Redis 实现会话管理,支持 7 天对话历史存储,并在向量 API 调用失败时自动降级至文本搜索保障可用。
点赞
回复1 取消回复
派聪明 2026年03月29日 15:04
这句话描述了一个智能对话系统的会话管理机制,核心要点如下: ### 1. **Redis 实现会话管理** - **存储方式**:使用 Redis 存储用户对话历史(参考资料第5、6、7节)。 - **数据结构**: - `user:{userId}:current_conversation_id` → 记录用户当前会话ID(UUID)。 - `conversation:{conversationId}` → 存储历史对话的JSON列表(包含用户消息和AI回复)。 - **优势**:Redis 内存读写速度快(微秒级),适合高频读写场景(参考资料第6节)。 ### 2. **7天对话历史存储** - **TTL 自动过期**:通过 Redis 的 `EXPIRE` 命令设置7天过期时间(参考资料第5节)。 - **数据清理**:过期后自动删除,无需手动维护(对比MySQL需定时任务)。 - **滑动窗口**:仅保留最近20条消息(参考资料第8节),避免上下文过长。 ### 3. **向量 API 失败时降级至文本搜索** - **正常流程**:优先调用向量 API 进行语义检索(如 Elasticsearch 向量搜索)。 - **降级机制**: - 当向量服务不可用时(如网络故障、服务宕机),自动切换到 **文本关键词搜索**(如 ES 的全文检索)。 - 确保核心功能(知识检索)仍可用,提升系统鲁棒性(参考资料第9节)。 --- ### 设计意图 - **性能与成本平衡**:Redis 高速读写支撑实时对话,7天TTL控制数据量。 - **容错能力**:降级机制保障服务可用性(参考资料第3、10节强调稳定性)。 - **上下文管理**:通过会话ID关联历史,实现多轮对话连贯性(参考资料第5节)。 > 示例流程: > 用户提问 → 检索知识(向量API → 失败 → 降级文本搜索) → 结合Redis历史 → 生成回答 → 存入Redis(7天后自动清除)。
点赞
回复 取消回复
小叮当 2026年03月25日 10:09
引用原文:将用户的原始问题,提示词和聊天记录一并发给 DeepSeek
@派聪明 聊天记录也发给deepseek是在哪一步做的呢?代码实现是什么
点赞
回复1 取消回复
派聪明 2026年03月25日 10:10
根据参考资料,聊天记录作为上下文信息是在**调用DeepSeek之前**,与用户问题和提示词一起被整合并发送的。具体实现步骤如下: --- ### **核心步骤** 1. **获取历史记录** 当用户发送新消息时,后端通过`conversationId`从Redis中读取最近20条对话记录(见参考资料第5节): ```java // 获取历史记录(JSON格式) String historyJson = getConversationHistory(conversationId); ``` 2. **构建提示词(Prompt)** 将历史记录、用户当前问题、知识库检索结果等组合成结构化的提示词(参考资料第11节): ```java // 示例:将历史记录拼接到System指令中 String systemPrompt = "历史对话记录:" + historyJson + "\n\n当前问题:" + userQuestion; ``` 3. **调用DeepSeek API** 将完整提示词(包含历史记录)通过流式API发送给DeepSeek(参考资料第1节): ```java // 使用WebClient发送流式请求 WebClient.create() .post() .bodyValue(promptWithHistory) // 包含历史记录的完整提示词 .retrieve() .bodyToFlux(String.class) // 流式接收响应 .subscribe(chunk -> { // 实时推送内容到前端 sendToFrontend(chunk); }); ``` --- ### **关键设计** - **数据来源**:历史记录存储在Redis中,通过`conversationId`关联(参考资料第5、7节)。 - **上下文管理**:仅保留最近20条消息,避免Token超限(参考资料第8节)。 - **实时传递**:历史记录与当前问题同时发送,确保DeepSeek理解对话上下文。 > **代码位置**:参考资料第5节的`updateConversationHistory`方法负责存储历史记录,而调用DeepSeek的流式请求逻辑在参考资料第1节的`WebClient`部分(具体代码片段未完全展示,但流程已明确)。
点赞
回复 取消回复
过时的草莓 2026年03月20日 17:29
引用原文:后端这边我们遵循的是“无状态连接”原则。比如用户重连后重新发一条消息,我们会通过消息中携带的会话 ID 去缓存中找回上下文,然后接着处理,就好像这条连接从来没断过一样。
消息中有携带会话id吗?@派聪明
点赞
回复1 取消回复
派聪明 2026年03月20日 17:30
是的,根据上下文描述,**用户重连后重新发送的消息中会携带会话ID**。具体实现逻辑如下: 1. **消息携带会话ID** 当用户因网络波动断开重连后,前端在重新发送消息时,会在消息中**包含会话ID**(`conversationId`)。这个ID用于标识当前对话的上下文(如历史记录、用户身份等)。 2. **后端恢复上下文** 后端收到消息后,会解析其中的会话ID,并以此作为键值从缓存(如Redis)中**检索对应的对话历史**: - 通过 `conversation:{conversationId}` 获取历史记录(JSON格式)。 - 将历史记录与当前问题拼接,重新构建Prompt发送给大模型。 3. **无状态连接的体现** 后端不依赖WebSocket连接本身保存状态,而是通过消息中的会话ID动态恢复上下文,实现“连接中断后无缝续接”的效果。 > ✅ **关键点**:会话ID是消息的**显式组成部分**,而非依赖连接属性。这样即使连接断开重连,只要消息携带正确的ID,后端仍能恢复对话状态。
点赞
回复 取消回复

目录