news 2026/4/16 15:30:34

AI开发新姿势|LangChain中间件机制:告别“鬼畜“AI Agent,构建稳定可控的智能助手!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AI开发新姿势|LangChain中间件机制:告别“鬼畜“AI Agent,构建稳定可控的智能助手!

用 LangChain 构建 AI Agent 的人应该都遇到过这种情况:测试阶段一切正常,部署到生产环境就开始出各种问题。上下文管理混乱,Agent 的行为变得难以预测,最后不得不写一堆自定义代码来控制信息流向。

这是因为在v1.0 之前的 LangChain 对上下文工程的支持不够系统化。上下文工程的本质其实就是信息管理——给 AI 多少信息、什么时候给、以什么方式给。信息过载会导致模型困惑,信息不足则无法完成任务。这个平衡点一直很难把握。

LangChain v1.0 引入的中间件机制就是为了解决这个问题。中间件的作用类似于一个信息协调层,在用户输入到达模型之前进行必要的处理:

  • 规范化输入格式
  • 注入相关背景知识
  • 过滤敏感信息
  • 限制工具调用权限

这种架构保证了模型接收到的始终是经过精心组织的上下文。

一、后端视角下的中间件模式

对于熟悉 FastAPI 的开发者来说,LangChain 中间件的概念几乎可以无缝迁移。FastAPI 的中间件拦截 HTTP 请求,LangChain 的中间件拦截 Agent 调用,底层逻辑完全一致。

FastAPI 中间件处理的典型任务:

  • 身份认证
  • 请求日志
  • CORS 配置

LangChain 中间件的对应场景:

  • 上下文管理
  • 安全控制
  • 工具调度
  • 运行时监控

执行流程也是相同的组合模式:

  • FastAPI:Request → Middleware Stack → Endpoint Handler → Response
  • LangChain:User Input → Middleware Stack → AI Model → Response

中间件按照注册顺序依次执行,这种模式让功能扩展变得很直观。

二、v1.0 之前的技术问题

Agent 失败往往不是模型能力的问题,而是上下文处理出了问题。主要体现在几个方面:

缺少灵活的上下文切换机制。不同场景需要不同的上下文策略,但实现起来很麻烦。长对话的上下文管理是个难题。Token 限制对话历史太长模型就处理不过来了。工具调用权限难以精确控制。有时候你只想让 Agent 使用特定的几个工具,但没有优雅的方式来实现这个需求。任何稍微复杂的需求都得写自定义代码,没有标准化的解决方案。

旧的实现方式充斥着大量配置参数:

from langchain.agents import AgentExecutor, create_openai_tools_agent from langchain_openai import ChatOpenAI tools = [search_tool, calculator_tool, database_tool] llm = ChatOpenAI(model="gpt-4") agent = create_openai_tools_agent(llm, tools, prompt) # Too many confusing settings! agent_executor = AgentExecutor( agent=agent, tools=tools, max_iterations=15, # How many times can it try? max_execution_time=300, # How long can it run? handle_parsing_errors=True, # What if something breaks? return_intermediate_steps=True, # Show me the steps? trim_intermediate_steps=10, # How much to remember? # and many more confusing options... )

更极端的情况是完全手写 Agent 循环:

def custom_agent_loop(user_input, tools, llm): messages = [{"role": "user", "content": user_input}] for iteration in range(10): # You have to manually do everything! if len(messages) > 20: messages = summarize_history(messages) # Clean up old messages available_tools = select_tools(messages, tools) # Pick which tools to use system_prompt = generate_prompt(iteration) # Create instructions response = llm.invoke(messages, tools=available_tools) # And more manual work...

这种实现方式的问题很明显:

代码可读性差,维护成本高。不同项目之间的实现各不相同,无法复用。新增功能需要大量重构,扩展性很受限。

三、中间件机制带来的改变

v1.0 的中间件设计借鉴了成熟的软件工程实践,把功能模块化,然后通过组合来实现复杂逻辑。

中间件可以在 Agent 执行流程的不同阶段介入:

before_model在模型调用前执行,通常用于输入预处理,比如文本清洗或格式标准化。

wrap_model_call包裹模型调用过程,可以修改传递给模型的参数,比如动态调整可用工具列表。

wrap_tool_call拦截工具调用,实现权限控制或者参数验证。

after_model在模型返回后执行,用于输出验证或者安全检查。

LangChain v1.0 提供了一些常用的中间件实现,开箱即用。create_agent函数的设计就是围绕中间件展开的,这是个很重要的架构决策。

from langchain.agents import create_agent from langchain.agents.middleware import ( PIIMiddleware, SummarizationMiddleware, HumanInTheLoopMiddleware ) agent = create_agent( model="claude-sonnet-4-5-20250929", tools=[read_email, send_email], middleware=[ # Hide email addresses automatically (privacy protection) PIIMiddleware("email", strategy="redact"), # Block phone numbers completely (extra privacy) PIIMiddleware("phone_number", strategy="block"), # When conversation gets long, make a short summary # (like creating a highlight reel of a long movie) SummarizationMiddleware( model="claude-sonnet-4-5-20250929", max_tokens_before_summary=500 ), # Before sending emails, ask a human "Is this okay?" # (like a safety check before hitting send) HumanInTheLoopMiddleware( interrupt_on={ "send_email": { "allowed_decisions": ["approve", "edit", "reject"] } } ), ] )

这段代码实现了几个关键功能:

PIIMiddleware 处理个人敏感信息,邮箱地址会被脱敏处理,电话号码直接阻断,确保隐私数据不会泄露给模型。

SummarizationMiddleware 解决长对话的上下文管理问题。Token 数超过阈值后自动生成摘要,保持上下文简洁的同时不丢失关键信息。

HumanInTheLoopMiddleware 在关键操作前加入人工审核。比如发送邮件这种操作,必须经过人类批准才能执行。

每个中间件负责一个具体的功能,想添加新能力直接往列表里加就行,代码结构很清晰。

除了这几个以外,v1.0 还提供了其他常用中间件:

Token 统计和预算控制、响应缓存机制、错误处理和重试逻辑、自定义日志记录等等。

官方的文档文档写得比较详细,查起来也方便。

四、自定义中间件的实现

内置中间件覆盖了常见场景,但真正体现灵活性的是自定义中间件的能力。

我们举个例子,假设需要根据用户的技术水平动态调整 Agent 的能力:

from dataclasses import dataclass from typing import Callable from langchain_openai import ChatOpenAI from langchain.agents.middleware import AgentMiddleware, ModelRequest from langchain.agents.middleware.types import ModelResponse # First, define what you want to track about users @dataclass class Context: user_expertise: str = "beginner" # Is user a beginner or expert? # Create your custom middleware class ExpertiseBasedToolMiddleware(AgentMiddleware): def wrap_model_call( self, request: ModelRequest, handler: Callable[[ModelRequest], ModelResponse] ) -> ModelResponse: # Check: Is this user a beginner or expert? user_level = request.runtime.context.user_expertise if user_level == "expert": # Experts get powerful AI and advanced tools model = ChatOpenAI(model="gpt-5") tools = [advanced_search, data_analysis] else: # Beginners get simpler AI and basic tools model = ChatOpenAI(model="gpt-5-nano") tools = [simple_search, basic_calculator] # Update what the AI sees request.model = model request.tools = tools # Send it forward to the AI return handler(request) # Now use your custom middleware (just like the built-in ones!) agent = create_agent( model="claude-sonnet-4-5-20250929", tools=[simple_search, advanced_search, basic_calculator, data_analysis], middleware=[ExpertiseBasedToolMiddleware()], # Your custom middleware here! context_schema=Context )

这个中间件实现了能力分级:

先从运行时上下文读取用户的技术水平标识。

如果是专家用户,分配更强的模型(gpt-5)和高级工具(advanced_search、data_analysis)。如果是初学者,使用轻量模型(gpt-5-nano)和基础工具(simple_search、basic_calculator)。

每次模型调用前这个逻辑都会自动执行,根据用户身份动态调整 Agent 配置。

这种模式类似游戏的难度调节——新手和老手面对的是不同的游戏环境,但切换过程是无感的。只不过这里调整的不是游戏难度,而是 AI 的能力边界和可用资源。

五、中间件架构优势

中间件系统提供了多个介入点,覆盖 Agent 执行的全流程:

带来的改进是系统性的:

代码组织更规范。每个中间件都是独立模块,功能边界清晰,不会出现逻辑耦合的问题。

复用性大幅提升。写好的中间件可以在不同项目间共享,不用每次都重新实现。

组合灵活性很高。像搭积木一样组合不同的中间件,快速实现复杂功能。

测试和调试简化了。每个中间件可以单独测试,出问题也容易定位。

生产环境的适配性更好。常见的生产需求都有对应的模式,不需要从零开始摸索。

六、总结

v1.0 之前,上下文控制基本靠手写代码,没有统一的抽象层。中间件机制把上下文工程变成了系统化的工程实践。无论是使用现成的中间件处理通用场景,还是开发自定义中间件满足特定需求,这套机制都提供了足够的灵活性和控制力。这对构建可靠的生产级 Agent 来说很关键。

create_agent以中间件为核心的设计不只是功能上的补充,更像是对 Agent 构建范式的重新定义——把上下文工程提升到和模型选择、工具设计同等重要的位置。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

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

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

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

Kubernetes上的测试:挑战与解决方案

测试范式的转变 Kubernetes已成为云原生应用事实上的部署与运行标准。其带来的自动扩缩容、滚动更新、声明式配置等特性,在提升运维效率和资源利用率的同时,也彻底改变了应用的运行态。对于测试团队而言,这意味着测试对象从一个相对静态的“…

作者头像 李华
网站建设 2026/4/16 11:02:33

如何在个人电脑部署Open-AutoGLM:从环境配置到成功运行全记录

第一章:Open-AutoGLM 本地部署概述Open-AutoGLM 是一个开源的自动化代码生成与推理框架,基于 GLM 架构实现本地化智能编程辅助。该系统支持代码补全、函数生成、错误修复等功能,适用于开发者在隔离环境中构建智能化开发流程。通过本地部署&am…

作者头像 李华
网站建设 2026/4/16 13:05:40

RRT*算法与三次 B 样条函数在机械臂轨迹避障中的应用

一种采用RRT*机械臂轨迹避障算法,然后采用三次B 样条函数对 所 规 划 路 径 进 行 拟 合 优 化。 带有较为详细的注视 rrt路径规划结合机械臂仿真 基于matlab,6自由度,机械臂rrt算法路径规划,输出如下效果,直接运行即可…

作者头像 李华
网站建设 2026/4/13 2:58:44

如何利用有限的数据发表更多的SCI论文?——利用ArcGIS探究环境和生态因子对水体、土壤和大气污染物的影响

SCI的写作和发表是科研人提升自身实力和实现自己价值的必要途径。“如何利用有限的数据发表更多的SCI论文?”是我们需要解决的关键问题。一:ARCGIS软件的基本介绍和如何获取空间数据1. ArcGIS软件初识与如何获取空间数据:1.1 ArcCatalog、Arc…

作者头像 李华
网站建设 2026/4/16 13:07:46

uni-app 项目在 iOS 上架过程中常见的问题与应对方式

在 uni-app 项目里,开发阶段通常推进得很顺。页面逻辑、接口对接、跨端兼容,一旦跑通,团队很容易形成一种判断:“剩下的就是打包和上架了。” 但真正进入 App Store 上架流程后,很多问题才开始出现,而且这些…

作者头像 李华