news 2026/9/1 4:11:27

使用 IChatReducer 进行聊天记录缩减

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用 IChatReducer 进行聊天记录缩减

序言

在多轮对话场景中,随着聊天次数增加,发送给大语言模型(LLM)的上下文会持续膨胀,带来 Token 成本上升与上下文溢出风险。 Microsoft Agent Framework 将这一问题抽象为 Chat Reduction(聊天记录缩减),并通过IChatReducer策略对聊天历史进行统一治理,而不是在业务代码中零散地裁剪或拼接历史消息。

本文基于“客户端本地存储聊天记录(Client-side history)”的典型场景,演示如何使用MessageCountingChatReducer自动限制历史长度,防止上下文无限增长,并观察在“历史被遗忘”后 Agent 行为的变化。


1. 代码关键实现步骤

引入必要的依赖

  • Microsoft.Extensions.AI:提供统一的 AI 抽象(ChatMessageReducer等)

  • Azure.AI.OpenAI:用于连接 Azure OpenAI 服务

  • Microsoft.Agents.AI:Agent Framework 核心能力

配置 Agent 与缩减策略(Reducer)

AIAgent agent = new AzureOpenAIClient( new Uri(endpoint), new AzureCliCredential()) .GetChatClient(deploymentName) .CreateAIAgent(new ChatClientAgentOptions { ChatOptions = new() { Instructions = "你是一位江湖说书人,擅长用幽默、接地气的方式讲笑话和故事。" }, Name = "Joker", // 关键点:自定义 ChatMessageStoreFactory ChatMessageStoreFactory = ctx => new InMemoryChatMessageStore( new MessageCountingChatReducer(2), // 仅保留最近 2 条 非 System 的 ChatMessage ctx.SerializedState, ctx.JsonSerializerOptions) });

组件说明

  • InMemoryChatMessageStore

    • 聊天记录保存在客户端内存中

    • 适用于 Chat Completion / 本地上下文管理场景

  • MessageCountingChatReducer(2)

    • 基于“消息数量”的缩减策略

    • 参数 2 表示仅保留最近 2 条非系统消息( 非 System 的 ChatMessage)

    • 超出部分的历史消息会被自动移除,而不是无限累积


2. 验证缩减效果

通过多轮连续对话,观察聊天记录在 Reducer 作用下的变化。在每一轮调用agent.RunAsync(...)后,读取当前线程中实际保留的聊天历史数量:

AgentThread thread = agent.GetNewThread(); Console.WriteLine(await agent.RunAsync("给我讲一个发生在茶馆里的段子,轻松一点的那种。", thread)); IList<ChatMessage>? chatHistory = thread.GetService<IList<ChatMessage>>(); Console.WriteLine($"\n 聊天有 {chatHistory?.Count} 消息.\n"); // Invoke the agent a few more times. Console.WriteLine(await agent.RunAsync("现在把这个段子加上一些表情符号,并用说书人的语气再讲一遍。", thread)); Console.WriteLine($"\n 聊天有 {chatHistory?.Count} 消息.\n"); Console.WriteLine(await agent.RunAsync("保持刚才的语气,讲一个关于健忘冒险者的轻松小故事,像是在讲笑话一样。", thread)); Console.WriteLine($"\n 聊天有 {chatHistory?.Count} 消息.\n"); // At this point, the chat history has exceeded the limit and the original message will not exist anymore, // so asking a follow up question about it will not work as expected. Console.WriteLine(await agent.RunAsync("接着刚才的氛围,讲一个发生在日常生活里的小乌龙事件,轻松随意一点。", thread)); Console.WriteLine($"\n 聊天有 {chatHistory?.Count} 消息.\n");

对话过程说明

  • 第一轮对话:「给我讲一个发生在茶馆里的段子,轻松一点的那种。」

    • 聊天历史较短,Reducer 尚未触发,历史消息正常累积

  • 第二轮对话:「现在把这个段子加上一些表情符号,并用说书人的语气再讲一遍。」

    • 新消息加入,历史仍在阈值范围内,早期消息仍可访问

  • 第三轮及之后:「保持刚才的语气,讲一个关于健忘冒险者的轻松小故事。」

    • 聊天记录达到缩减条件,MessageCountingChatReducer开始生效

    • 最早的消息被自动移除,chatHistory.Count保持在稳定范围内


3. 演示结果

结果一

结果二

结果三

结果四


4. 技术总结与适用场景

适用场景

  • Client-side history:聊天历史由客户端或应用自身维护(如 OpenAI / Azure OpenAI Chat Completion API)

不适用场景

  • Server-side history(如 Azure Foundry Agents):聊天历史由服务端统一管理,客户端无法直接干预裁剪策略

可扩展性

IChatReducer只是一个策略接口,可扩展更复杂的上下文治理逻辑:

  • TokenCountingChatReducer:按 Token 数量而非消息条数进行缩减

  • SummaryChatReducer:将旧消息压缩为摘要,而非直接删除

小结

  • 聊天历史不应无限增长

  • “遗忘”是一种主动、可控的系统设计

  • 上下文治理应以策略形式存在,而非散落在业务代码中

  • 合理使用 Chat Reduction,可在成本、稳定性与对话效果之间取得更好平衡

源代码地址

https://github.com/bingbing-gui/aspnetcore-developer/tree/master/src/09-AI-Agent/Agent-Framework/15-ChatReduction

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

12. SELinux 加固 Linux 安全

SELinux 介绍 基本原理SELinux默认策略允许apache进程访问在/var/www/html文件夹下的文件和文件夹&#xff0c;以及其 他一些具有httpd_sys_content_t上下文的文件夹&#xff0c;禁止访问具有其他不匹配标签的目录。在 SELinux 的保护下&#xff0c;apache进程不允许访问/tmp和…

作者头像 李华
网站建设 2026/8/29 7:27:44

互补投影哈希(CPH)编码过程详解

互补投影哈希(Complementary Projection Hashing,简称CPH)是一种高效的无监督哈希方法,通过核化映射与互补投影学习,在保持数据局部结构的同时生成紧凑的二进制码。相比传统线性哈希方法,CPH引入高斯核将数据隐式映射到高维空间,再通过线性投影和阈值量化实现快速编码,…

作者头像 李华
网站建设 2026/8/26 11:43:50

L298N驱动直流电机PWM调速项目应用详解

从零开始玩转L298N&#xff1a;如何用PWM精准控制直流电机你有没有遇到过这样的情况&#xff1f;精心写好代码&#xff0c;接上电机&#xff0c;结果一通电——电机不动、芯片发烫、嗡嗡作响……最后只能无奈地盯着那块小小的L298N模块发呆。别急&#xff0c;这几乎是每个嵌入式…

作者头像 李华
网站建设 2026/8/29 6:38:07

【企业白皮书定制解决方案】专知智库:将技术资产,转化为行业定义权

【企业白皮书定制解决方案】专知智库&#xff1a;将技术资产&#xff0c;转化为行业定义权 当您搜索“企业白皮书定制”时&#xff0c;您寻找的绝非一份模板化的文档代写服务。您潜在的诉求&#xff0c;是如何将企业内在的复杂价值——那些尖端的技术、庞大的数据、独到的认知…

作者头像 李华