.NET+AI | Agent | 自定义文件存储(8)

发布时间:2026/6/30 2:20:52

.NET+AI | Agent | 自定义文件存储(8) 目录一句话简介 核心价值️ 架构解析 实现自定义文件存储1. 定义 FileChatMessageStore2. 在 Agent 中使用 进阶断点恢复与序列化序列化与恢复流程 企业级存储策略 总结上一篇一句话简介深入解析 MAF 消息存储机制教你实现自定义ChatMessageStore结合ChatReducer打造支持持久化、自动裁剪和断点恢复的企业级对话系统。 核心价值在构建生产级 AI Agent 时默认的内存存储往往无法满足需求。自定义消息存储能为你带来✅数据持久化对话记录保存到文件、数据库或 Redis防止进程重启丢失。✅状态恢复支持从序列化状态恢复对话上下文实现长程记忆。✅自动裁剪无缝集成IChatReducer自动管理上下文窗口控制 Token 消耗。✅分布式共享通过 Redis 等外部存储支持多实例间的状态共享。️ 架构解析MAF 提供了ChatMessageStore抽象基类作为所有存储实现的契约。核心职责AddMessagesAsync: 添加消息并自动应用 Reducer。GetMessagesAsync: 获取当前对话历史。ClearAsync: 清空对话记录。 实现自定义文件存储下面是一个基于 JSON 文件的自定义存储实现支持持久化和线程安全。1. 定义 FileChatMessageStorepublic classFileChatMessageStore : ChatMessageStore { privatereadonlystring _filePath; privatereadonly SemaphoreSlim _lock new(1, 1); // 确保线程安全 public FileChatMessageStore(string filePath, IChatReducer? reducer null) { _filePath filePath; ChatReducer reducer; // 集成 Reducer } public override async Task AddMessagesAsync(IEnumerableChatMessage messages, CancellationToken ct default) { await _lock.WaitAsync(ct); try { // 1. 加载现有消息 var allMessages (await LoadFromFileAsync(ct)).ToList(); allMessages.AddRange(messages); // 2. 应用 Reducer (自动裁剪) if (ChatReducer ! null) { var reduced await ChatReducer.ReduceAsync(allMessages, ct); allMessages reduced.ToList(); } // 3. 持久化保存 await SaveToFileAsync(allMessages, ct); } finally { _lock.Release(); } } publicoverrideasync TaskIEnumerableChatMessage GetMessagesAsync(CancellationToken ct default) { await _lock.WaitAsync(ct); try { returnawait LoadFromFileAsync(ct); } finally { _lock.Release(); } } // ... LoadFromFileAsync 和 SaveToFileAsync 的具体实现略 }关键点线程锁使用SemaphoreSlim防止并发写入冲突。Reducer 集成在保存前调用ChatReducer.ReduceAsync优化上下文。持久化每次更新都同步写入物理存储。2. 在 Agent 中使用通过ChatMessageStoreFactory将自定义存储注入到 Agent 中。var options new ChatClientAgentOptions { Name 旅游助手, Instructions 你是一个专业的旅游顾问。, // 配置自定义存储工厂 ChatMessageStoreFactory ctx new FileChatMessageStore( filePath: chat-history.json, // 集成 Reducer仅保留最近 10 条消息 reducer: new MessageCountingChatReducer(10) ) }; var agent chatClient.CreateAIAgent(options); 进阶断点恢复与序列化MAF 的设计允许我们将 Agent 的状态包括对话历史序列化并在需要时恢复这对于无状态服务如 Web API非常重要。序列化与恢复流程序列化将当前 Thread 状态转为 JSON。存储保存到数据库或缓存。恢复重建 Agent 并加载状态。// 1. 序列化当前会话状态 var serializedState thread.Serialize(); // 模拟保存到数据库... // 2. 进程重启后恢复会话 var newAgent chatClient.CreateAIAgent(options); var restoredThread newAgent.DeserializeThread(serializedState); // 3. 继续对话 var response await newAgent.RunAsync(刚才推荐的餐厅在哪里, restoredThread); 企业级存储策略在生产环境中根据业务规模选择合适的存储方案至关重要。场景推荐方案优势劣势原型/测试InMemory 极速、零依赖❌ 重启即失单机工具File 简单持久化⚠️ I/O 瓶颈分布式服务Redis⚡ 高性能、共享状态 需维护 Redis审计/合规Database️ 数据可靠、可查询 读写较慢混合策略最佳实践使用Redis Database。Redis 作为热数据缓存提供高性能读写Database 异步归档历史记录用于审计和分析。 总结✅抽象统一ChatMessageStore提供了标准的存储扩展点。✅自动优化在存储层集成IChatReducer确保持久化的数据始终是优化过的。✅灵活扩展从简单的文件存储到复杂的分布式 Redis 集群按需实现。✅状态管理结合序列化机制实现真正的无状态服务和长程记忆。下一步探索 Function Calling让 Agent 具备与外部世界交互的能力。引入地址

相关新闻