news 2026/2/7 2:36:19

LangChain v1.0 Agent中间件开发实战:SummarizationMiddleware详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LangChain v1.0 Agent中间件开发实战:SummarizationMiddleware详解

LangChain v1.0的SummarizationMiddleware是一种Agent中间件,用于自动压缩对话历史上下文,减少token消耗并提高系统性能。它通过智能摘要技术,在历史消息超过预设阈值时自动压缩,保留最近的几条消息并生成摘要。文章详细介绍了其工作原理、配置方法、代码实现和实际应用场景,帮助开发者快速上手这一功能,优化大模型对话系统的性能和效率。


1.引言

在AI应用开发领域,LangChain作为一款强大的开源框架,已成为构建智能代理(Agent)的首选工具。随着LangChain v1.0的发布,该框架引入了更模块化的设计和丰富的中间件(Middleware)支持,帮助开发者更高效地管理复杂对话系统。Agent中间件是LangChain v1.0的核心创新之一,它允许在Agent的生命周期中插入自定义逻辑,例如在模型调用前后进行数据处理、权限检查或优化操作。

其中,上下文压缩是处理长对话历史的关键挑战。在实际应用中,如聊天机器人或多轮交互系统,用户对话往往会积累大量历史消息,导致token消耗急剧增加。这不仅会提升API调用成本,还可能降低响应速度,甚至触发模型的上下文长度限制。SummarizationMiddleware正是针对这一痛点设计的官方中间件,它通过智能摘要技术自动压缩历史上下文,保留核心信息的同时减少token使用量。该中间件属于“before_model”类型,即在模型调用前执行,确保输入数据高效精炼。本文将从概念入手,逐步展开技术细节,并结合实战代码,帮助技术爱好者快速上手这一功能。

2.上下文压缩SummarizationMiddleware概述

SummarizationMiddleware是LangChain v1.0中一个内置的中间件,专为Agent设计,用于自动管理对话历史。通过集成摘要模型,它能将冗长的历史消息浓缩为简洁的摘要,从而优化token利用率。该中间件的核心在于“上下文压缩”,即在不丢失关键信息的前提下,减少输入模型的文本量。

根据官方文档,该中间件的关键特性包括:

  • 自动压缩:当历史消息超出预设阈值时,中间件会触发摘要过程,无需开发者手动干预。
  • 智能保留:它会优先保留最近的几条消息(默认或自定义数量),确保当前对话的连贯性,同时对较旧的消息进行摘要。
  • 官方集成支持:通过from langchain.agents.middleware import SummarizationMiddleware导入,并在创建Agent时通过middleware参数轻松集成。
  • 无需手动管理:开发者只需配置参数,中间件便会处理整个压缩逻辑,包括token计算和摘要生成。

这一设计特别适用于多轮对话场景,如客服系统或研究助手,能显著提高系统的可扩展性和性能。相比手动截断历史消息,SummarizationMiddleware更智能,避免了信息丢失的风险。

3.工作原理详解

SummarizationMiddleware的工作原理基于阈值触发和摘要生成机制。具体来说,当历史消息的token数量超过默认阈值(例如500 tokens)且消息条数超过保留数量(例如5条)时,中间件会自动介入。过程如下:

  1. 触发条件检查:中间件首先计算历史消息的总token量。如果超出max_tokens_before_summary(默认500),并消息数大于messages_to_keep,则启动压缩。
  2. 消息分割:将历史消息分为两部分——保留最近的N条消息(由messages_to_keep指定),以及较旧的消息。
  3. 摘要生成:将旧消息发送给指定的摘要模型(例如ChatDeepSeek),结合自定义的summary_prompt生成摘要。摘要结果作为一条新消息插入上下文。
  4. 上下文更新:最终输入模型的上下文为:摘要 + 最近N条消息,从而显著减少token使用。

从源码角度看,LangChain的中间件机制是基于Runnable接口实现的。以下是SummarizationMiddleware的核心逻辑片段:

from langchain_core.messages import BaseMessagefrom langchain_core.language_models import BaseLanguageModelclass SummarizationMiddleware: def __init__(self, model: BaseLanguageModel, max_tokens_before_summary: int = 500, messages_to_keep: int = 5, summary_prompt: str = "Summarize the following conversation history:\n\n{messages}\n\nSummary:"): self.model = model self.max_tokens_before_summary = max_tokens_before_summary self.messages_to_keep = messages_to_keep self.summary_prompt = summary_prompt asyncdef before_model(self, messages: list[BaseMessage], **kwargs) -> list[BaseMessage]: # 计算总tokens(简化假设,使用len作为代理) total_tokens = sum(len(msg.content) for msg in messages) # 实际中用tokenizer if total_tokens <= self.max_tokens_before_summary or len(messages) <= self.messages_to_keep: return messages # 分割消息 old_messages = messages[:-self.messages_to_keep] recent_messages = messages[-self.messages_to_keep:] # 生成摘要 prompt = self.summary_prompt.format(messages="\n".join([msg.content for msg in old_messages])) summary = await self.model.apredict(prompt) # 返回新上下文 return [BaseMessage(content=summary)] + recent_messages

这一机制确保了压缩的透明性和可控性。预期效果显著:例如,从20条消息(约1000+ tokens)压缩到5-6条(约300-500 tokens),大大提升效率。

4.配置与集成实践

要使用SummarizationMiddleware,首先需导入相关模块并配置参数。核心参数包括:

  • model:用于生成摘要的语言模型实例,例如ChatDeepSeek。
  • max_tokens_before_summary:触发压缩的token阈值,默认500。建议根据模型上下文长度调整(如GPT-4的128k tokens,可设更高)。
  • messages_to_keep:保留最近消息的数量,默认5。过多会降低压缩效果,过少可能丢失上下文。
  • summary_prompt:自定义提示词,用于指导模型生成摘要。最佳实践是强调保留“关键决策点和技术细节”,以匹配应用场景。

集成时,在create_agent函数中添加middleware=[summarization_middleware]。自定义提示词时,确保其简洁且针对性强,例如:“请将以下对话历史进行摘要,保留关键决策点和技术细节:\n\n{messages}\n\n摘要:”。在实际项目中,测试不同阈值以平衡准确性和性能;如果使用自定义tokenizer,确保token计算准确。

5.完整代码示例与测试

以下是一个完整的实战示例,展示了如何构建一个带有SummarizationMiddleware的Agent,用于专利搜索和技术分析场景。代码包括工具定义、上下文配置、Agent创建和测试函数。

# ==================== SummarizationMiddleware 完整实现示例 ====================from langchain.agents import create_agentfrom langchain.agents.middleware import SummarizationMiddlewarefrom langchain_deepseek import ChatDeepSeekfrom langchain_core.tools import toolfrom langchain_core.messages import HumanMessagefrom langchain_core.runnables import ensure_configfrom pydantic import BaseModel, Fieldfrom typing import Optionalfrom dotenv import load_dotenvimport logging# ==================== 1. 配置日志 ====================logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')logger = logging.getLogger(__name__)load_dotenv(override=True)# ==================== 2. 定义工具 ====================@tooldef search_patent(query: str) -> str: """搜索专利数据库""" returnf"专利搜索结果: 找到与 '{query}' 相关的 3 项专利..."@tooldef analyze_technology(tech_desc: str) -> str: """分析技术可行性""" returnf"技术分析: '{tech_desc}' 的实现可行性评估完成..."tools = [search_patent, analyze_technology]# ==================== 3. 定义上下文 ====================class UserContext(BaseModel): user_id: str = Field(..., description="用户唯一标识") department: str = Field(..., description="所属部门") max_history_tokens: Optional[int] = Field(default=1000, description="历史消息 token 阈值")# ==================== 4. 配置中间件 ====================summarization_middleware = SummarizationMiddleware( model=ChatDeepSeek(model="deepseek-chat", temperature=0.1), # max_tokens_before_summary=200, # 历史消息 token 数量超过 500 时触发压缩 messages_to_keep=5, # 保留最近 5 条消息 summary_prompt="请将以下对话历史进行摘要,保留关键决策点和技术细节:\n\n{messages}\n\n摘要:"# 摘要提示词)# ==================== 5. 创建 Agent ====================agent = create_agent( model=ChatDeepSeek(model="deepseek-chat", temperature=0.2), tools=tools, middleware=[summarization_middleware], context_schema=UserContext, debug=True,)# ==================== 6. 执行测试 ====================def run_summarization_test(): logger.info("开始 SummarizationMiddleware 测试") # 创建长对话历史 long_history = [HumanMessage(content=f"问题 {i+1}: 如何评估某项技术的专利风险?") for i in range(20)] logger.info(f"创建了 {len(long_history)} 条消息") # 执行 result = agent.invoke( {"messages": long_history}, context=UserContext(user_id="engineer_001", department="研发部"), config=ensure_config({"configurable": {"thread_id": "session_001"}}) ) result_messages = result.get("messages", []) logger.info(f"执行后消息数: {len(result_messages)}") if len(result_messages) < len(long_history): logger.info(f"中间件已触发!压缩了 {len(long_history) - len(result_messages)} 条消息") return result# ==================== 7. 运行测试 ====================result = run_summarization_test()logger.info("测试完成")

在这一示例中,测试函数创建了20条模拟消息,触发中间件压缩。运行后,日志会显示消息数从20减少到约6(摘要+5条最近消息),证明压缩有效。开发者可根据需要调整参数,并在生产环境中监控token使用。

6.高级应用与注意事项

在实际项目中,SummarizationMiddleware适用于长时序对话系统,如企业知识库助手或多用户协作工具。例如,在法律咨询Agent中,它可压缩历史案例讨论,保留核心论点。潜在优化包括:动态调整阈值基于用户上下文(例如UserContext中的max_history_tokens);自定义提示词以适应领域特定术语;或结合其他中间件,如权限检查Middleware,实现多层管道。

注意事项:确保摘要模型的温度(temperature)较低(如0.1)以生成确定性摘要;监控压缩准确性,避免关键信息丢失(可通过A/B测试验证);如果历史包含敏感数据,考虑隐私合规。常见问题排查:如果未触发压缩,检查token计算逻辑;模型API限速时,可添加重试机制。与其他中间件的结合(如CachingMiddleware)可进一步提升性能。

7.总结

SummarizationMiddleware作为LangChain v1.0的强大工具,通过自动上下文压缩显著降低了token消耗和响应延迟,同时保持了对话的完整性。本文从背景到实战,详解了其原理、配置和应用,帮助开发者快速集成这一功能。在AI应用日益复杂的今天,掌握此类中间件是提升系统效率的关键。建议大家基于示例代码动手实验,探索更多自定义场景,让LangChain在实际项目中尽快落地。

AI大模型从0到精通全套学习大礼包

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

只要你是真心想学AI大模型,我这份资料就可以无偿共享给你学习。大模型行业确实也需要更多的有志之士加入进来,我也真心希望帮助大家学好这门技术,如果日后有什么学习上的问题,欢迎找我交流,有技术上面的问题,我是很愿意去帮助大家的!

如果你也想通过学大模型技术去帮助就业和转行,可以扫描下方链接👇👇
大模型重磅福利:入门进阶全套104G学习资源包免费分享!

01.从入门到精通的全套视频教程

包含提示词工程、RAG、Agent等技术点

02.AI大模型学习路线图(还有视频解说)

全过程AI大模型学习路线


03.学习电子书籍和技术文档

市面上的大模型书籍确实太多了,这些是我精选出来的


04.大模型面试题目详解

05.这些资料真的有用吗?

这份资料由我和鲁为民博士共同整理,鲁为民博士先后获得了北京清华大学学士和美国加州理工学院博士学位,在包括IEEE Transactions等学术期刊和诸多国际会议上发表了超过50篇学术论文、取得了多项美国和中国发明专利,同时还斩获了吴文俊人工智能科学技术奖。目前我正在和鲁博士共同进行人工智能的研究。

所有的视频由智泊AI老师录制,且资料与智泊AI共享,相互补充。这份学习大礼包应该算是现在最全面的大模型学习资料了。

资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。


智泊AI始终秉持着“让每个人平等享受到优质教育资源”的育人理念‌,通过动态追踪大模型开发、数据标注伦理等前沿技术趋势‌,构建起"前沿课程+智能实训+精准就业"的高效培养体系。

课堂上不光教理论,还带着学员做了十多个真实项目。学员要亲自上手搞数据清洗、模型调优这些硬核操作,把课本知识变成真本事‌!


如果说你是以下人群中的其中一类,都可以来智泊AI学习人工智能,找到高薪工作,一次小小的“投资”换来的是终身受益!

应届毕业生‌:无工作经验但想要系统学习AI大模型技术,期待通过实战项目掌握核心技术。

零基础转型‌:非技术背景但关注AI应用场景,计划通过低代码工具实现“AI+行业”跨界‌。

业务赋能 ‌突破瓶颈:传统开发者(Java/前端等)学习Transformer架构与LangChain框架,向AI全栈工程师转型‌。

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

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

传统ChatBot四大瓶颈与AgenticRAG完整认知闭环:工业级开发实践

传统ChatBot因架构认知局限难以实现生产级可靠性。AgenticRAG通过理解推理验证实现完整认知闭环&#xff0c;Agent作为AI应用层操作系统决定应用可靠性与复杂度上限。深蓝学院开设工业级RAG系统与Agent应用开发实战课程&#xff0c;由商汤科技专家授课&#xff0c;帮助学员从Pr…

作者头像 李华
网站建设 2026/2/5 3:45:47

【柔性作业车间调度问题FJSP】基于部落竞争与成员合作算法CTCM求解柔性作业车间调度问题(FJSP)研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

作者头像 李华
网站建设 2026/2/2 4:51:11

SpringBoot - yml配置文件

SpringBoot使用一个全局配置文件&#xff0c;配置文件名固定&#xff1a; application.propertiesapplication.yml application.properties端口设置8081&#xff0c;application.yml端口设置8082&#xff0c;运行启动类&#xff0c;优先走8081。 两个配置文件互补&#xff0c;a…

作者头像 李华
网站建设 2026/2/3 13:48:04

【课程设计/毕业设计】 基于Spring Boot的智能养老服务平台基于springboot的社会养老平台的设计与实现【附源码、数据库、万字文档】

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

作者头像 李华