岷县城乡建设局网站建展公司
2026/4/5 19:06:44 网站建设 项目流程
岷县城乡建设局网站,建展公司,美区下载的app怎么更新,呼和浩特市城乡建设保障局网站AIContextProvider 实战#xff1a;用户信息记忆组件一句话简介从零实现完整的 UserInfoMemory 类#xff0c;支持自动提取用户信息、序列化持久化和跨 Thread 共享。#x1f3af; 核心功能✅ 自动提取#xff1a;从对话中提取用户姓名和年龄✅ 智能询问#xff1a;未知信…AIContextProvider 实战用户信息记忆组件一句话简介从零实现完整的 UserInfoMemory 类支持自动提取用户信息、序列化持久化和跨 Thread 共享。 核心功能✅自动提取从对话中提取用户姓名和年龄✅智能询问未知信息时主动询问已知时直接使用✅状态持久化支持序列化和反序列化✅跨 Thread 共享在不同对话线程间共享记忆 完整实现步骤 1定义数据模型public class UserInfo { public string? UserName { get; set; } public int? UserAge { get; set; } }步骤 2实现 UserInfoMemorypublic 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.DeserializeUserInfo() ?? new UserInfo(); } // 调用前注入用户信息到上下文 public override ValueTaskAIContext InvokingAsync( InvokingContext context, CancellationToken ct default) { var instructions new StringBuilder(); instructions.AppendLine(UserInfo.UserName isnull ? Ask the user for their name. : $The users name is {UserInfo.UserName}.); instructions.AppendLine(UserInfo.UserAge isnull ? Ask the user for their age. : $The users age is {UserInfo.UserAge}.); returnnew ValueTaskAIContext(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.GetResponseAsyncUserInfo( context.RequestMessages, new ChatOptions { Instructions Extract users 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); } } 注册到 Agentvar 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.GetServiceUserInfoMemory(); Console.WriteLine(memory.UserInfo.UserName); // 张三跨 Thread 共享// 从原 Thread 提取用户信息 var userInfo oldThread.GetServiceUserInfoMemory()?.UserInfo; // 注入到新 Thread var newMemory newThread.GetServiceUserInfoMemory(); newMemory.UserInfo userInfo; // 新 Thread 直接拥有用户信息无需重新询问 最佳实践技术要点说明两个构造函数首次创建 反序列化恢复使用 ?? 运算符仅更新未知信息不覆盖已知异常处理InvokedAsync 中的异常不影响主流程只序列化数据不序列化服务依赖如 IChatClient验证记忆恢复反序列化后通过对话测试验证 总结✅完整实现InvokingAsync注入 InvokedAsync提取 Serialize持久化✅智能询问根据记忆状态动态生成 Instructions✅序列化支持保存和恢复对话状态✅跨 Thread 共享通过直接赋值实现记忆共享如需获取文章配套完整代码可扫码咨询领取。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询