
目录FileMemoryProvider 提供的工具memories.md 索引文件AgentFileStoreFileMemoryState创建 FileMemoryProvider将 FileMemoryProvider 添加到 Agent第一次对话写入记忆查看磁盘上的记忆文件新 Session 读取以前的记忆运行效果工作原理上一节介绍了 FoundryMemoryProvider。它由 Microsoft Foundry 托管能够从对话中自动提取长期记忆并将其保存到云端的 Memory Store 中。这一节介绍另一种记忆实现FileMemoryProvider。FileMemoryProvider是一个AIContextProvider。它会向 Agent 提供一组用于管理记忆文件的工具由 Agent 自己判断哪些信息值得保存、什么时候读取以及是否需要修改或删除已有记忆。记忆会以独立文件的形式保存在 AgentFileStore 中Agent 可以根据需要创建、读取或更新这些文件。后续创建的新 Session 仍然可以继续读取这些信息。FileMemoryProvider 提供的工具将FileMemoryProvider添加到 Agent 后Agent 可以使用以下记忆工具工具说明file_memory_write创建或写入一个记忆文件并指定文件名、内容和可选说明file_memory_read根据文件名读取记忆文件的内容file_memory_delete根据文件名删除记忆文件file_memory_ls列出当前工作目录中的所有记忆文件及其说明file_memory_grep使用正则表达式搜索记忆文件内容file_memory_replace替换记忆文件中出现的指定字符串file_memory_replace_lines替换记忆文件中的整行内容这些工具并不是由应用代码直接调用而是由Agent根据当前对话自主决定是否调用Agent 可以调用 file_memory_write将这项偏好写入一个记忆文件。当用户在后续会话中询问旅行建议时Agent 可以调用 file_memory_read读取此前保存的旅行偏好。memories.md 索引文件FileMemoryProvider 还会维护一个名为 memories.md 的索引文件。FileMemoryProvider 会将该索引注入当前对话使 Agent 不需要先调用 file_memory_ls就能知道当前有哪些记忆文件可用。AgentFileStoreAgentFileStore 是 FileMemoryProvider 使用的文件存储抽象。FileMemoryProvider 负责提供记忆工具和管理逻辑真正的数据保存位置则由 AgentFileStore 的具体实现决定。我们使用FileSystemAgentFileStore它会将记忆保存到本地磁盘。代码如下var memoryRoot Path.Combine( AppContext.BaseDirectory, agent-memory); var fileStore new FileSystemAgentFileStore(memoryRoot);这里将应用程序基目录下的 agent-memory 文件夹设置为记忆存储根目录。除了FileSystemAgentFileStore还可以使用InMemoryAgentFileStore将记忆保存在内存中。不过内存存储只适合测试或临时演示应用程序退出后数据就会丢失。在实际项目中也可以自定义 AgentFileStore将记忆保存到 Azure Blob Storage、共享文件系统或其他持久化存储中。因此FileMemoryProvider 中的“File”表示记忆以文件形式组织但底层存储并不一定只能使用本地磁盘。FileMemoryStateFileMemoryState 是 FileMemoryProvider 保存到 AgentSession 中的状态。其中最重要的属性是WorkingFolder它用于指定当前 Session 应该从哪个目录读取和写入记忆文件。 这个目录是相对于 AgentFileStore 根目录的子目录。在当前示例中const string UserId UID1; var workingFolder $users/{UserId};因此Memory Rootagent-memoryWorkingFolderusers/UID1最终的记忆文件保存位置为agent-memory/users/UID1实际目录Console.WriteLine( $记忆文件被写入到: ${Path.Combine(memoryRoot, workingFolder)});创建 FileMemoryProvider完整的 Provider 创建代码如下using var fileMemoryProvider new FileMemoryProvider( fileStore, session new FileMemoryState { WorkingFolder $users/{userId} });将 FileMemoryProvider 添加到 Agent创建 Provider 后将其添加到 Agent 的 AIContextProvidersAIAgent agent new AIProjectClient( new Uri(endpoint), new DefaultAzureCredential()) .AsAIAgent(new ChatClientAgentOptions { ChatOptions new() { ModelId deploymentName, Instructions 你是一个乐于助人的旅行助手。记住用户告诉你的关于他们自己的信息以便以后提供更好的建议。 }, Name TravelAssistant, AIContextProviders [fileMemoryProvider], });第一次对话写入记忆首先创建第一次会话然后向 Agent 提供用户资料和旅行计划AgentSession firstSession await agent.CreateSessionAsync(); Console.WriteLine( 第一次对话 ); Console.WriteLine(await agent.RunAsync( 你好我的名字是桂兵兵我计划去北海道旅游我和朋友去旅游帮我找风景优美的景点。, firstSession)); Console.WriteLine();在这一轮对话结束之后Agent 可以调用 file_memory_write将这些信息写入一个或多个记忆文件。查看磁盘上的记忆文件第一次对话结束后示例通过下面的代码列出磁盘上生成的文件Console.WriteLine( 磁盘文件); foreach (var file in Directory.EnumerateFiles(Path.Combine(memoryRoot, workingFolder))) { Console.WriteLine(Path.GetFileName(file)); } Console.WriteLine();新 Session 读取以前的记忆接下来创建一个全新的 SessionAgentSession secondSession await agent.CreateSessionAsync(); Console.WriteLine( 第二次对话 (新会话) ); Console.WriteLine(await agent.RunAsync(你能回顾一下你记得的个人信息吗, secondSession));运行效果输出结果生成的文件记忆工作原理创建一个 FileSystemAgentFileStore其根目录为本地 agent-memory 文件夹。在该存储之上创建一个 FileMemoryProvider并使用状态初始化器将当前用户的记忆放入其各自的工作文件夹。通过 ChatClientAgentOptions.AIContextProviders 将该提供程序附加到代理这会为Agent提供 file_memory_* 工具以及使用它们的说明。在第一段对话中用户分享了一些偏好代理调用 file_memory_write 将其作为文件存储到工作文件夹中。然后此示例会列出在磁盘上创建的文件。在第二段对话中会创建一个全新的会话不包含第一段对话的聊天历史。提供程序会将记忆索引注入对话中代理调用 file_memory_read 来回忆已存储的偏好并在提出建议时使用这些偏好。源代码地址https://github.com/bingbing-gui/dotnet-agent-playbook/tree/master/src/ai-agent/Agent-Framework/07-StorageConversations/03-FileMemoryProvider引入地址