news 2026/9/3 7:14:08

.NET+AI | Agent | 自定义上下文记忆-示例(16)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
.NET+AI | Agent | 自定义上下文记忆-示例(16)

AIContextProvider 实战:用户信息记忆组件

一句话简介

从零实现完整的 UserInfoMemory 类,支持自动提取用户信息、序列化持久化和跨 Thread 共享。


🎯 核心功能

  • 自动提取:从对话中提取用户姓名和年龄

  • 智能询问:未知信息时主动询问,已知时直接使用

  • 状态持久化:支持序列化和反序列化

  • 跨 Thread 共享:在不同对话线程间共享记忆


💻 完整实现

步骤 1:定义数据模型

public class UserInfo { public string? UserName { get; set; } public int? UserAge { get; set; } }

步骤 2:实现 UserInfoMemory

public sealedclassUserInfoMemory : AIContextProvider { privatereadonly IChatClient _chatClient; public UserInfo UserInfo { get; set; } // 构造函数1:首次创建 public UserInfoMemory(IChatClient chatClient, UserInfo? userInfo = null) { _chatClient = chatClient; UserInfo = userInfo ?? new UserInfo(); } // 构造函数2:反序列化恢复 public UserInfoMemory(IChatClient chatClient, JsonElement serializedState, ...) { _chatClient = chatClient; UserInfo = serializedState.Deserialize<UserInfo>() ?? new UserInfo(); } // 调用前:注入用户信息到上下文 public override ValueTask<AIContext> InvokingAsync( InvokingContext context, CancellationToken ct = default) { var instructions = new StringBuilder(); instructions.AppendLine(UserInfo.UserName isnull ? "Ask the user for their name." : $"The user's name is {UserInfo.UserName}."); instructions.AppendLine(UserInfo.UserAge isnull ? "Ask the user for their age." : $"The user's age is {UserInfo.UserAge}."); returnnew ValueTask<AIContext>(new AIContext { Instructions = instructions.ToString() }); } // 调用后:从对话中提取用户信息 public override async ValueTask InvokedAsync( InvokedContext context, CancellationToken ct = default) { if ((UserInfo.UserName isnull || UserInfo.UserAge isnull) && context.RequestMessages.Any(x => x.Role == ChatRole.User)) { try { var result = await _chatClient.GetResponseAsync<UserInfo>( context.RequestMessages, new ChatOptions { Instructions = "Extract user's name and age if present." }, ct); // 仅更新未知信息 UserInfo.UserName ??= result.Result.UserName; UserInfo.UserAge ??= result.Result.UserAge; } catch { /* 提取失败不影响主流程 */ } } } // 序列化:只保存数据状态 public override JsonElement Serialize(JsonSerializerOptions? options = null) { return JsonSerializer.SerializeToElement(UserInfo, options); } }

💻 注册到 Agent

var chatClient = AIClientHelper.GetDefaultChatClient(); var options = new ChatClientAgentOptions { Instructions = "You are a friendly assistant.", AIContextProviderFactory = ctx => new UserInfoMemory( chatClient, ctx.SerializedState, ctx.JsonSerializerOptions) }; var agent = chatClient.CreateAIAgent(options);

🧪 测试效果

4 轮对话流程

第 1 轮:用户说"你好" → Agent 询问姓名和年龄 第 2 轮:用户说"我叫张三" → Agent 确认姓名,继续询问年龄 第 3 轮:用户说"25岁" → Agent 确认年龄,信息收集完成 第 4 轮:用户说"天气怎么样?" → Agent 记住用户是张三(记忆生效)

序列化与恢复

// 序列化当前状态 var serialized = thread.Serialize(); // 恢复对话 var restored = agent.DeserializeThread(serialized); var memory = restored.GetService<UserInfoMemory>(); Console.WriteLine(memory.UserInfo.UserName); // "张三"

跨 Thread 共享

// 从原 Thread 提取用户信息 var userInfo = oldThread.GetService<UserInfoMemory>()?.UserInfo; // 注入到新 Thread var newMemory = newThread.GetService<UserInfoMemory>(); newMemory.UserInfo = userInfo; // 新 Thread 直接拥有用户信息(无需重新询问)

🏢 最佳实践

技术要点

说明

两个构造函数

首次创建 + 反序列化恢复

使用 ??= 运算符

仅更新未知信息,不覆盖已知

异常处理

InvokedAsync 中的异常不影响主流程

只序列化数据

不序列化服务依赖(如 IChatClient)

验证记忆恢复

反序列化后通过对话测试验证


🎯 总结

  • 完整实现:InvokingAsync(注入)+ InvokedAsync(提取)+ Serialize(持久化)

  • 智能询问:根据记忆状态动态生成 Instructions

  • 序列化支持:保存和恢复对话状态

  • 跨 Thread 共享:通过直接赋值实现记忆共享


如需获取文章配套完整代码,可扫码咨询领取。👇

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 3:57:58

Unity UniRx Observable 类详解及使用

一、Observable 概述1.1 什么是 ObservableObservable 是 UniRx 中的核心概念&#xff0c;代表一个可观察的数据流。它可以发射多个值&#xff08;异步或同步&#xff09;&#xff0c;订阅者可以监听这些值。1.2 Observable 的特点可观察&#xff1a;数据源可以被订阅可组合&am…

作者头像 李华
网站建设 2026/9/2 23:24:27

GPT-SoVITS端到端训练流程图解:从数据到语音输出

GPT-SoVITS端到端训练流程图解&#xff1a;从数据到语音输出 在内容创作、虚拟交互和个性化服务日益普及的今天&#xff0c;如何让机器“说人话”已经不再局限于标准播报。用户开始期待更自然、更具情感色彩的声音体验——而这一切的核心&#xff0c;正是个性化语音合成。 传统…

作者头像 李华
网站建设 2026/9/3 3:53:23

Java毕设项目推荐-基于SpringBoot+Vue的医院管理系统设计与实现基于SpringBoot+Vue技术的医院运营管理系统的设计与实现【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/9/2 14:10:52

某手深夜直播沦陷!黑灰产疯狂搞事的下场,给所有技术人提个醒

最近某手深夜“崩盘”的瓜&#xff0c;估计圈里圈外都刷到了吧&#xff1f;22点刚过&#xff0c;一群黑灰产带着海量僵尸号直接猛冲平台&#xff0c;直播区全被违规垃圾内容霸占&#xff0c;还疯狂刷礼物控屏引导&#xff0c;评论区瞬间炸锅。最后某手被逼得没办法&#xff0c;…

作者头像 李华