.NET+AI | Agent | 自定义上下文记忆-进阶(17)

.NET+AI | Agent | 自定义上下文记忆-进阶(17) 目录一句话简介 核心功能 个性化配置维度 实现 PersonalizationProvider数据模型核心实现 动态学习偏好在 InvokedAsync 中学习 测试效果对比 最佳实践✅ DO❌ DONT 总结上一篇一句话简介实现电商智能客服的个性化配置根据会员等级和用户偏好动态调整服务策略和语言风格。 核心功能✅会员等级配置VIP/普通/新用户差异化服务✅语言风格调整正式/随和/简洁风格切换✅动态学习偏好根据用户行为自动调整✅序列化与恢复持久化个性化配置 个性化配置维度配置维度说明示例值会员等级VIP/普通/新用户影响称呼和服务优先级语言风格正式/标准/随和/简洁影响回复语气响应长度简洁/标准/详细影响回复详细程度专业度技术型/非技术型影响术语使用 实现 PersonalizationProvider数据模型public enum MemberLevel { New, Regular, VIP } publicenum CommunicationStyle { Formal, Standard, Casual, Concise } publicenum DetailLevel { Brief, Standard, Detailed } publicclassUserProfile { publicstring? Name { get; set; } public MemberLevel MemberLevel { get; set; } MemberLevel.Regular; public CommunicationStyle CommunicationStyle { get; set; } CommunicationStyle.Standard; public DetailLevel ResponseDetailLevel { get; set; } DetailLevel.Standard; publicbool IsTechnicalUser { get; set; } false; publicint InteractionCount { get; set; } 0; }核心实现public sealedclassPersonalizationProvider : AIContextProvider { privatereadonly IChatClient _chatClient; public UserProfile UserProfile { get; set; } // 调用前注入个性化 Instructions public override ValueTaskAIContext InvokingAsync(...) { var instructions BuildPersonalizedInstructions(); returnnew ValueTaskAIContext(new AIContext { Instructions instructions }); } private string BuildPersonalizedInstructions() { var sb new StringBuilder(); // 会员等级配置 switch (UserProfile.MemberLevel) { case MemberLevel.VIP: sb.AppendLine($User is VIP. Use respectful title: 尊敬的{UserProfile.Name}); sb.AppendLine(Prioritize their requests and provide premium service); break; case MemberLevel.New: sb.AppendLine(User is new. Provide warm welcome and detailed guidance); break; } // 语言风格配置 switch (UserProfile.CommunicationStyle) { case CommunicationStyle.Concise: sb.AppendLine(Keep responses brief. Maximum 2-3 sentences.); break; case CommunicationStyle.Formal: sb.AppendLine(Use formal and professional language. Avoid emojis.); break; } return sb.ToString(); } } 动态学习偏好在 InvokedAsync 中学习public override async ValueTask InvokedAsync(InvokedContext context, ...) { UserProfile.InteractionCount; var userMessage context.RequestMessages.Last().Text ?? ; // 1️⃣ 分析消息长度判断简洁偏好 if (userMessage.Length 50) { UserProfile.CommunicationStyle CommunicationStyle.Concise; } // 2️⃣ 检测用户反馈调整详细程度 if (userMessage.Contains(太详细) || userMessage.Contains(简短)) { UserProfile.ResponseDetailLevel DetailLevel.Brief; } // 3️⃣ 根据交互次数升级会员等级 if (UserProfile.InteractionCount 15 UserProfile.MemberLevel MemberLevel.Regular) { UserProfile.MemberLevel MemberLevel.VIP; } // 4️⃣ 检测技术术语标记技术用户 if (userMessage.Contains(api) || userMessage.Contains(代码)) { UserProfile.IsTechnicalUser true; } } 测试效果对比用户类型称呼语气Emoji VIP尊敬的王总正式专业❌ 普通小李好友好随和✅ 新用户您好耐心引导✅⚡ 简洁张工简洁直接❌ 最佳实践✅ DO分离数据UserProfile和逻辑Provider两个构造函数支持首次创建和反序列化异常保护InvokedAsync 中的异常不影响主流程引用共享跨 Thread 时传入同一个对象引用❌ DONT不要在 InvokingAsync 中执行耗时操作不要直接修改 Agent.Instructions通过 AIContext 注入不要序列化服务依赖如 IChatClient 总结✅多维度配置会员等级、语言风格、响应长度、专业度✅动态学习根据用户行为自动调整偏好✅职责分离数据模型 Provider 逻辑✅企业应用智能客服、学习助手、医疗问诊下一篇引入地址