news 2026/4/16 21:31:13

.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/4/16 13:29:50

JLink下载在工业控制中的应用:实战案例解析

JLink下载在工业控制中的实战应用&#xff1a;从调试到量产的全链路解析你有没有遇到过这样的场景&#xff1f;一台部署在工厂角落的PLC突然宕机&#xff0c;产线停摆&#xff1b;工程师赶过去&#xff0c;手头只有一台笔记本和一个老旧的ST-LINK&#xff0c;结果烧录固件花了十…

作者头像 李华
网站建设 2026/4/16 10:42:47

GPT-SoVITS语音节奏控制方法:调节语速与停顿技巧

GPT-SoVITS语音节奏控制方法&#xff1a;调节语速与停顿技巧 在短视频、播客和虚拟人内容爆发式增长的今天&#xff0c;个性化语音合成不再只是科技公司的专利。越来越多的内容创作者希望用“自己的声音”讲述故事&#xff0c;但传统TTS系统要么机械生硬&#xff0c;要么需要数…

作者头像 李华
网站建设 2026/4/16 12:27:20

用AI取代初级开发者?AWS CEO:这是“最愚蠢的想法之一”

作者 | Kaustubh Saini 责编 | 苏宓出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;AI 的快速发展&#xff0c;让整个科技行业既兴奋又焦虑。效率和生产力在飞速提升&#xff0c;但与此同时&#xff0c;关于哪些岗位可能被 AI 替代的讨论也越来越热烈。初级软…

作者头像 李华
网站建设 2026/4/16 14:01:48

GPT-SoVITS能否用于历史人物声音复原?学术探讨

GPT-SoVITS能否用于历史人物声音复原&#xff1f;学术探讨 在数字人文与人工智能交汇的今天&#xff0c;一个引人深思的问题逐渐浮现&#xff1a;我们是否能让那些只存在于文献、影像和回忆中的历史人物“重新开口说话”&#xff1f;尤其当原始音频资料寥寥无几——可能仅有一段…

作者头像 李华
网站建设 2026/4/16 18:18:47

2025 最新!10个AI论文平台测评:本科生写论文还能这么快?

2025 最新&#xff01;10个AI论文平台测评&#xff1a;本科生写论文还能这么快&#xff1f; 2025年AI论文平台测评&#xff1a;为什么你需要这份指南&#xff1f; 在学术研究日益数字化的今天&#xff0c;AI写作工具已成为本科生撰写论文的重要辅助。然而&#xff0c;面对市场上…

作者头像 李华