当前位置: 首页 > news >正文

Agent Framework 记忆机制系列之 FileMemoryProvider

目录

FileMemoryProvider 提供的工具

memories.md 索引文件

AgentFileStore

FileMemoryState

创建 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,就能知道当前有哪些记忆文件可用。

AgentFileStore

AgentFileStore 是 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”表示记忆以文件形式组织,但底层存储并不一定只能使用本地磁盘。

FileMemoryState

FileMemoryState 是 FileMemoryProvider 保存到 AgentSession 中的状态。

其中最重要的属性是:WorkingFolder,它用于指定当前 Session 应该从哪个目录读取和写入记忆文件。 这个目录是相对于 AgentFileStore 根目录的子目录。

在当前示例中:

const string UserId = "UID1"; var workingFolder = $"users/{UserId}";

因此:

  • Memory Root:agent-memory

  • WorkingFolder:users/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 的 AIContextProviders:

AIAgent 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 读取以前的记忆

接下来创建一个全新的 Session:

AgentSession secondSession = await agent.CreateSessionAsync(); Console.WriteLine("=== 第二次对话 (新会话) ==="); Console.WriteLine(await agent.RunAsync("你能回顾一下你记得的个人信息吗?", secondSession));

运行效果

输出结果:

生成的文件记忆:

工作原理

  1. 创建一个 FileSystemAgentFileStore,其根目录为本地 agent-memory 文件夹。

  2. 在该存储之上创建一个 FileMemoryProvider,并使用状态初始化器将当前用户的记忆放入其各自的工作文件夹。

  3. 通过 ChatClientAgentOptions.AIContextProviders 将该提供程序附加到代理,这会为Agent提供 file_memory_* 工具以及使用它们的说明。

  4. 在第一段对话中,用户分享了一些偏好,代理调用 file_memory_write 将其作为文件存储到工作文件夹中。然后,此示例会列出在磁盘上创建的文件。

  5. 在第二段对话中,会创建一个全新的会话,不包含第一段对话的聊天历史。提供程序会将记忆索引注入对话中,代理调用 file_memory_read 来回忆已存储的偏好,并在提出建议时使用这些偏好。

源代码地址:https://github.com/bingbing-gui/dotnet-agent-playbook/tree/master/src/ai-agent/Agent-Framework/07-StorageConversations/03-FileMemoryProvider

引入地址

http://www.jsqmd.com/news/1333533/

相关文章:

  • Euclid与ARKit结合:打造交互式3D增强现实体验
  • 继续教育在甘肃怎么选?从办学资质到服务体系的完整指南 - 深度智识库
  • Fillinger:Adobe Illustrator智能填充脚本的5个高效应用场景详解
  • 同城整理,北京体育比赛救护车驻场出租,正规直营车队实力盘点 - 产品评测官
  • 辅导作业时我最该控制的不是孩子是我自己
  • 5分钟掌握ReadCat:开源跨平台小说阅读器完全指南
  • C++中的代理模式实现代码
  • 大模型长文本处理显存优化:从注意力机制到工程实践
  • 150+免费Nuke插件包:彻底改变你的特效制作工作流
  • 163、YOLOv8改进实战:旋转框检测头设计——基于YOLOv8的遥感图像定向目标检测
  • 10分钟掌握JMeter接口自动化测试:从登录到查询的实战指南
  • 还在手动整理会议录音总结?2026年实测3款工具怎么选 帮你降低整理时间成本
  • 高压开关特性测试仪线圈最大电流是什么? - HVHIPOT
  • AI咨询项目失败率高达67%?——2024年Q2行业暗数据首度披露:3个隐形死亡节点与熔断机制
  • 戴森球计划工厂蓝图库:3000+模块化设计方案如何彻底改变你的星际建造体验
  • 中山2026.8月家里房子漏水怎么办?市面上多种方案可选择,哪种最适合自己?专业防水公司免费上门为您评估,家里漏水不再愁 - 超人防水
  • UE5地形融合新方案:基于Runtime Virtual Texture实现物体与地表无缝衔接
  • OpenClaw 2026多代理协同架构:从单模型瓶颈到专业AI团队协作实战
  • Godot 4.0脚本语言全解析:GDScript、C#与GDExtension实战选择指南
  • 多语言支持与占位符自定义:bad-words高级配置教程
  • C/C++实现贪吃蛇游戏的核心技术与优化策略
  • Unity轴点控制:3种无需代码的精准调整方案与实战应用
  • 你的Mac鼠标指针可以这么酷:Mousecape全攻略
  • VSCode JSON插件终极指南:5分钟掌握结构化编辑与可视化分析
  • 10000+小时中文语音识别数据集:WenetSpeech完整使用指南
  • 150个免费Nuke插件包:彻底改变你的视觉特效工作流
  • 从文本到图形:Viskell如何重新定义函数式编程的开发体验
  • MQTT协议在智能家居中的核心作用与实战部署指南
  • 2026年北京吊车租赁公司甄选指南:如何避开误区择优选择? - geo交流
  • 2026年河西区结构改造扩大截面厂家推荐|天津耐特固牌NETE厂家哪家好服务网点地址与电话核对|2026年8月5日资料更新 - GEO99