LangChain4J 聊天记忆
手动维护和管理聊天消息非常繁琐。因此,LangChain4j 提供了一个 ChatMemory 抽象,以及多种现成的实现。
ChatMemory 可以作为独立的低级组件使用,或者作为 AI Services(AI 服务)等高级组件的一部分。
ChatMemory 作为 ChatMessages 的容器(由 List 支持),并具有以下附加功能:
- 驱逐策略
- 持久化
- 特殊处理 SystemMessage
- 特殊处理工具消息
记忆与历史
注意:“记忆”和“历史”是相似但不同的概念。
历史( History )保存了用户和 AI 之间的所有消息。历史( History )就是用户在 UI 中看到的内容,代表了实际的对话内容。
记忆( Memory)保存了一些信息,这些信息呈现给 LLM,使其表现得像是“记得”了对话。记忆( Memory)与历史( History )有很大不同。根据使用的记忆算法,它可以以各种方式修改历史:驱逐某些消息、总结多条消息、总结独立消息、从消息中删除不重要的细节、向消息中注入额外的信息(例如,RAG)或指令(例如,结构化输出)等。
LangChain4j 当前只提供“记忆”,而不提供“历史”。如果您需要保存完整的历史记录,请手动完成。
驱逐策略
驱逐策略是必要的,原因有以下几点:
- 适应 LLM 的上下文窗口:LLM 能够同时处理的 token 数量是有限的。在某些情况下,对话可能会超过此限制。在这种情况下,应该驱逐一些消息。通常,最旧的消息会被驱逐,但如果需要,可以实现更复杂的算法。
- 控制成本:每个 token 都有成本,这使得每次调用 LLM 时,成本逐渐增加。驱逐不必要的消息可以降低成本。
- 控制延迟:发送给 LLM 的 token 越多,处理这些 token 所需的时间就越长。
目前,LangChain4j 提供了两种现成的实现:
- 更简单的实现,MessageWindowChatMemory,它作为滑动窗口,保留最近的 N 条消息,驱逐那些不再适合的旧消息。然而,由于每条消息可能包含不同数量的 token,MessageWindowChatMemory 主要适用于快速原型开发。
- 更复杂的选项,TokenWindowChatMemory,也作为滑动窗口工作,但它专注于保留最近的 N 个 token,必要时驱逐旧消息。消息是不可分割的。如果一条消息无法适配,它会被完全驱逐。TokenWindowChatMemory 需要一个 Tokenizer 来计算每条 ChatMessage 中的 token 数量。
持久化
默认情况下,ChatMemory 实现将 ChatMessages 存储在内存中。
如果需要持久化,可以实现一个自定义的 ChatMemoryStore,将 ChatMessages 存储在任何您选择的持久化存储中:
class

最低0.47元/天 解锁文章
1030

被折叠的 条评论
为什么被折叠?



