)
目录一句话简介 核心价值 核心概念 访问消息存储获取 ChatMessageStore查看存储的消息️ ChatMessageStore 抽象基类核心方法扩展实现示例 InMemoryChatMessageStore 默认实现核心特性构造函数选项⚠️ 内存存储的特性对比优势与局限适用场景 企业级最佳实践1. 根据场景选择存储方式2. 监控消息存储状态3. 实现持久化方案 总结上一篇一句话简介AgentThread 通过ChatMessageStore抽象基类管理对话消息默认使用InMemoryChatMessageStore实现内存存储支持扩展为数据库、Redis 等持久化方案。 核心价值✅统一抽象ChatMessageStore定义标准接口支持多种存储实现✅开箱即用InMemoryChatMessageStore提供高性能默认实现✅灵活扩展可自定义存储方案数据库/Redis/文件 核心概念AgentThread 内部使用ChatMessageStore管理所有对话消息核心特性抽象设计ChatMessageStore定义核心接口内存实现InMemoryChatMessageStore使用ListChatMessage存储集合接口实现IListChatMessage支持直接操作 访问消息存储获取 ChatMessageStore通过GetServiceT()方法获取 Thread 内部的消息存储// 创建 Thread AgentThread thread agent.GetNewThread(); // 方式1: 通过抽象接口访问 ChatMessageStore? messageStore thread.GetServiceChatMessageStore(); // 方式2: 通过集合接口访问直接操作 IListChatMessage? messageList thread.GetServiceIListChatMessage();查看存储的消息// 获取所有历史消息 var messages await messageStore.GetMessagesAsync(); var messageList messages.ToList(); Console.WriteLine($ 消息统计:); new { 总消息数 messageList.Count, User消息 messageList.Count(m m.Role ChatRole.User), Assistant消息 messageList.Count(m m.Role ChatRole.Assistant) }.Display(); // 遍历消息 foreach (var message in messageList) { Console.WriteLine($[{message.Role}]: {message.Text}); }️ ChatMessageStore 抽象基类ChatMessageStore定义了消息存储的标准接口核心方法方法功能返回类型GetMessagesAsync()获取所有历史消息TaskIEnumerableChatMessageAddMessagesAsync(messages)添加新消息TaskSerialize(options)序列化存储状态持久化JsonElement扩展实现示例// 自定义数据库存储 publicclassSqlChatMessageStore : ChatMessageStore { privatereadonly DbContext _dbContext; publicoverrideasync TaskIEnumerableChatMessage GetMessagesAsync(...) { returnawait _dbContext.Messages .Where(m m.ThreadId threadId) .ToListAsync(); } public override async Task AddMessagesAsync(IEnumerableChatMessage messages, ...) { await _dbContext.Messages.AddRangeAsync(messages); await _dbContext.SaveChangesAsync(); } }支持的实现方式 InMemoryChatMessageStore 默认实现MAF 提供的默认内存存储实现核心特性public sealed class InMemoryChatMessageStore : ChatMessageStore, IListChatMessage { private ListChatMessage _messages; // 内部使用 List 存储 }关键特点 使用ListChatMessage内存存储⚡ 读写性能极高无 I/O 开销 实现IListChatMessage接口 支持 ChatReducer 消息裁剪构造函数选项构造函数使用场景InMemoryChatMessageStore()默认空存储最常用InMemoryChatMessageStore(chatReducer)配置消息裁剪策略InMemoryChatMessageStore(serializedState)从序列化状态恢复⚠️ 内存存储的特性对比优势与局限特性内存存储数据库存储性能⚡ 极高无 I/O⚠️ 一般有 I/O持久化❌ 程序重启丢失✅ 永久保存扩展性❌ 单机限制✅ 多服务器共享内存占用⚠️ 长对话占用大✅ 无限制复杂度✅ 简单即用⚠️ 需配置服务适用场景✅ 适合内存存储短期对话几轮到几十轮开发测试环境原型验证和 Demo单用户桌面应用❌ 需要持久化存储长期对话需历史记录生产环境需可靠性多服务器部署大规模用户场景 企业级最佳实践1. 根据场景选择存储方式// 开发环境使用内存存储 var devThread agent.GetNewThread(); // 生产环境使用自定义持久化存储 var prodMessageStore new SqlChatMessageStore(dbContext); var prodThread new AgentThread(prodMessageStore);2. 监控消息存储状态var messages await messageStore.GetMessagesAsync(); var messageCount messages.Count(); if (messageCount 100) { Console.WriteLine(⚠️ 消息数量过多建议启用 ChatReducer); }3. 实现持久化方案// 序列化当前状态 var serializedState messageStore.Serialize(); // 保存到数据库或文件 await SaveToDatabase(serializedState); // 恢复对话 var restoredStore new InMemoryChatMessageStore(serializedState); 总结✅抽象设计ChatMessageStore提供统一接口支持多种存储实现✅默认实现InMemoryChatMessageStore提供高性能内存存储✅灵活扩展可通过继承ChatMessageStore实现自定义存储数据库/Redis/文件✅两种访问GetServiceChatMessageStore()或GetServiceIListChatMessage()⚠️注意场景内存存储适合开发测试生产环境建议使用持久化方案下一步学习如何使用手动保存并恢复会话。引入地址