多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Haystack 实验性 ChatMessage Store 实战:用 InMemoryChatMessageStore 管理多会话对话历史

Haystack 实验性 ChatMessage Store 实战:用 InMemoryChatMessageStore 管理多会话对话历史 Haystack 实验性 ChatMessage Store 实战用 InMemoryChatMessageStore 管理多会话对话历史【免费下载链接】haystackOpen-source AI orchestration framework for building context-engineered, production-ready LLM applications. Design modular pipelines and agent workflows with explicit control over retrieval, routing, memory, and generation. Built for scalable agents, RAG, multimodal applications, semantic search, and conversational systems.项目地址: https://gitcode.com/GitHub_Trending/ha/haystack在构建多轮对话与 Agent 应用时如何按会话隔离、写入、检索和清理聊天消息是记忆管理的核心问题。本文基于 Haystack 2.24 版本参考文档中记录的实验性 APIhaystack_experimental.chat_message_stores.in_memory系统讲解InMemoryChatMessageStore的设计思路、初始化参数、完整方法签名与典型使用方式并结合仓库源码说明其与ChatMessage数据类的协作关系。读完本文你将掌握一套可直接落地的、以chat_history_id为命名空间的内存对话历史读写方案。为什么需要 ChatMessage Store在 RAG 与 Agent 流水线中多轮对话的消息通常需要跨多次调用被持续读写。若直接把消息散落在业务代码里不同会话、不同用户之间的历史极易互相污染。InMemoryChatMessageStore正是为此设计它把对话历史作为一个独立存储抽象通过chat_history_id作为唯一标识为每条会话提供独立的消息列表命名空间。从源码结构看该 API 属于实验性模块haystack_experimental与 Haystack 主库的ChatMessage数据类定义于 haystack/dataclasses/chat_message.py配合使用。ChatMessage提供了from_user、from_system、from_assistant、from_tool等类方法用于构造不同类型消息是写入 Store 的基本单位。核心概念chat_history_id 命名空间根据参考文档experimental_chatmessage_store_api.md的说明InMemoryChatMessageStore在内存中存储聊天消息其关键设计是chat_history_id用作每次对话/会话的唯一标识符它扮演命名空间namespace角色将不同会话的消息彼此隔离每个chat_history_id值对应内存中独立的一份ChatMessage对象列表典型的用法是每次写入、读取或删除消息时都提供唯一的chat_history_id例如 session ID 或 conversation ID确保不同会话的聊天消息不会重叠。这意味着同一个 Store 实例可以同时服务大量并发会话——只要每个会话使用不同的chat_history_id消息就会被正确分区。快速上手最小可用示例参考文档给出了完整的入门示例写入与读取两行调用即可完成一个会话的存取闭环from haystack.dataclasses import ChatMessage from haystack_experimental.chat_message_stores.in_memory import InMemoryChatMessageStore message_store InMemoryChatMessageStore() messages [ ChatMessage.from_assistant(Hello, how can I help you?), ChatMessage.from_user(Hi, I have a question about Python. What is a Protocol?), ] message_store.write_messages(chat_history_iduser_456_session_123, messagesmessages) retrieved_messages message_store.retrieve_messages(chat_history_iduser_456_session_123) print(retrieved_messages)运行结果会打印出刚写入的两条ChatMessage对象列表。这里user_456_session_123就是我们为该会话指定的chat_history_id后续所有针对该会话的操作都要复用这个 ID。初始化参数详解InMemoryChatMessageStore的构造函数签名如下来自参考文档def __init__(skip_system_messages: bool True, last_k: int | None 10) - None参数类型默认值说明skip_system_messagesboolTrue是否跳过存储系统消息system messageslast_kint \| None10未显式指定时默认检索最近 10 条消息两个参数对行为的影响skip_system_messagesTrue默认不落盘 system 类型的消息。系统提示通常在每个回合都会由 PromptBuilder 等组件动态注入无需持久化因此默认跳过可避免历史中出现重复的系统指令若你的应用需要完整保留系统消息例如记录提示词演变可显式设为False。last_k10作为retrieve_messages未传参时的兜底窗口大小。窗口机制用于限制注入上下文的消息数量防止对话历史无限膨胀导致超出 LLM 上下文长度。方法 API 全解析参考文档为每个方法给出了签名、参数、返回值和异常约定逐一展开如下。write_messages写入消息def write_messages(chat_history_id: str, messages: list[ChatMessage]) - intchat_history_id消息要写入的会话历史 IDmessages要写入的ChatMessage列表异常如果messages不是ChatMessage的列表抛出ValueError返回实际写入的消息数量。写入是追加语义还是覆盖语义文档未作强制规定从内存列表存储的实现意图看多次写入会在该会话的列表上继续累积消息。调用后可通过返回值确认落盘条数是否符合预期。retrieve_messages检索消息def retrieve_messages(chat_history_id: str, last_k: int | None None) - list[ChatMessage]chat_history_id要检索的会话历史 IDlast_k返回最近多少条消息。若为None则使用构造函数传入的last_k默认 10作为窗口大小异常如果last_k不为None且小于 0抛出ValueError返回ChatMessage列表。这是与 Agent/对话流水线衔接最频繁的方法每轮生成前先按会话 ID 取回最近若干条历史再与当前用户输入一起拼装成上下文。count_messages统计消息数def count_messages(chat_history_id: str) - intchat_history_id要统计的会话历史 ID返回该会话下存储的消息数量。适合用于判断会话是否为空、是否首次交互以及估算历史规模。delete_messages删除单会话消息def delete_messages(chat_history_id: str) - Nonechat_history_id要从哪个会话删除全部消息。用于单个会话的生命周期终结如用户登出、会话过期、任务完成后的清理。delete_all_messages清空所有会话def delete_all_messages() - None删除所有chat_history_id下存储的全部消息。适用于整体重置场景如测试环境清理、应用重启前的内存释放使用时需谨慎因为该操作不可恢复。序列化to_dict / from_dictdef to_dict() - dict[str, Any]将组件序列化为字典返回包含序列化数据的字典。可用于把 Store 配置持久化或随流水线Pipeline一起保存。classmethod def from_dict(cls, data: dict[str, Any]) - InMemoryChatMessageStore从字典反序列化组件data为待反序列化的字典返回反序列化后的InMemoryChatMessageStore实例。这组方法遵循 Haystack 组件的序列化惯例使InMemoryChatMessageStore可以被嵌入 Pipeline 的 YAML 配置 或通过Pipeline.to_dict()/Pipeline.from_dict()保存与重建。与 ChatMessage 数据类的协作InMemoryChatMessageStore存储的对象是ChatMessage。在 haystack/dataclasses/chat_message.py 中ChatMessage提供了四类构造方法from_user(text, metaNone, nameNone)用户消息from_system(text, metaNone, nameNone)系统指令from_assistant(text, ...)助手回复可携带 tool_callsfrom_tool(...)工具调用结果。结合skip_system_messages参数可以推断Store 内部会根据消息的role区分类型在写入时决定是否跳过 system 消息。因此实际使用中应统一用ChatMessage的类方法构造消息后写入避免直接操作原始字符串。与 Agent 结合一个完整的会话记忆循环虽然参考文档聚焦 Store 本身但结合其typical usage说明可以组织出在 Agent/对话应用中的典型模式会话初始化为每个新会话生成唯一 ID如user_456_session_123并count_messages判断是否首次交互每轮生成前retrieve_messages(chat_history_id, last_kN)取回最近 N 条历史与当前输入拼装后送入生成组件生成结束后把新增的 assistant 回复与 user 输入一起write_messages写回会话结束delete_messages(chat_history_id)清理需要整体重置时用delete_all_messages()。这套循环天然支持多用户、多会话并存且与 Agent 的上下文窗口控制通过last_k限流解耦。使用注意事项实验性 API该模块位于haystack_experimental包接口可能随版本演进发生变化生产使用前应关注后续版本的迁移说明内存存储的边界InMemoryChatMessageStore将消息保存在进程内存中数据不跨进程、不落盘、重启即失适合原型验证、单进程服务与测试场景需要持久化时应改用基于数据库/向量库的 MemoryStore 实现参见 docs-website/docs/memory-stores 中的存储方案last_k的校验retrieve_messages对负数last_k会抛出ValueError调用方应保证窗口大小为非负系统消息策略默认跳过 system 消息若你的 Prompt 结构依赖历史中的系统指令需在初始化时显式关闭该行为。本文所有 API 签名、默认值与异常行为均以 version-2.24 实验性 ChatMessage Store 参考文档 为准可结合 ChatMessage 源码 进一步深入理解消息模型。【免费下载链接】haystackOpen-source AI orchestration framework for building context-engineered, production-ready LLM applications. Design modular pipelines and agent workflows with explicit control over retrieval, routing, memory, and generation. Built for scalable agents, RAG, multimodal applications, semantic search, and conversational systems.项目地址: https://gitcode.com/GitHub_Trending/ha/haystack创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表