做一些网站犯法么,用wordpress好还是,泸州网站公司,公关公司的优势【收藏学习】
文章详解LangChain 1.0 create_agent API四大高级功能#xff1a;通过MCP协议集成外部工具(如高德地图)#xff1b;实现结构化输出#xff0c;返回标准化数据#xff1b;利用InMemorySaver实现记忆管理#xff0c;保持对话连续性#xff1b;使用中间件机制(…【收藏学习】文章详解LangChain 1.0 create_agent API四大高级功能通过MCP协议集成外部工具(如高德地图)实现结构化输出返回标准化数据利用InMemorySaver实现记忆管理保持对话连续性使用中间件机制(预置和自定义)控制智能体执行流程。这些功能帮助开发者构建更智能、可靠的AI应用是掌握LangChain智能体开发的关键技术。前言一、Tools With MCP[上篇文章]笔者使用tool装饰器自定义工具函数并将其接入create_agentAPI。除了这种方法LangChain 还支持集成当前备受关注的MCPModel Context Protocol协议。1.1 认识 MCP 协议MCP 是一个开放协议它在大模型和外部应用程序之间定义了一套标准化的接口规范。通过 MCP开发者可以将自己编写的功能封装成 MCP 服务并分享其他开发者则可以快速集成和复用这些功能实现了工具的“即插即用”。LangChain 作为领先的大模型开发框架对 MCP 提供了良好的支持。其核心集成流程与笔者之前介绍的工具函数接入方式相似模型仍然会获得工具函数的详细使用说明类似于自定义函数的文档字符串但这些描述信息是通过与 MCP 服务器的协议通信获取的。不同的是工具的执行不再发生在本地函数节点而是在代理请求时由 MCP 服务器执行并返回结果。1.2 实战构建高德地图智能规划助手下面笔者通过使用create_agent接入高德地图 MCP 服务的完整案例来学习如何在 LangChain 中使用 MCP。1. 环境安装与配置首先确保 LangChain 环境已激活然后安装 MCP 适配器依赖conda activate langchainenvnew pip install langchain-mcp-adapters2. 安装 Node.js由于高德地图 MCP 服务基于 Node.js 开发你需要在本地安装 Node.js 运行时环境。3. 代码实现与解析引入相关依赖并编写连接代码。通过MultiServerMCPClient类初始化 MCP 客户端配置高德地图 MCP 服务连接参数然后使用get_tools方法获取服务端提供的所有工具函数。特别注意与 MCP 服务器的交互都是异步的需要使用 Python 的asyncio库来异步获取服务器方法。对 Python 协程不熟悉的读者推荐先学习 廖雪峰的协程教程https://liaoxuefeng.com/books/python/async-io/asyncio/index.html。import asyncio from langchain.chat_models import init_chat_model from langchain_mcp_adapters.client import MultiServerMCPClient from langchain.agents import create_agent model init_chat_model( modeldeepseek-chat, base_urlhttps://api.deepseek.com, api_key你注册的deepseek api key ) mcp_client MultiServerMCPClient( { amap-maps: { command: cmd, args: [ /c, npx, -y, amap/amap-maps-mcp-server ], env: { AMAP_MAPS_API_KEY: 你注册的高德地图api key }, transport: stdio } } ) async def get_server_tools(): tools await mcp_client.get_tools() print(f加载了{len(tools)}: {[t.name for t in tools]}) asyncio.run(get_server_tools())运行上述代码你会看到终端输出类似以下内容表明已成功连接 MCP 服务。现在利用create_agent构建集成高德地图能力的智能体。同样使用异步方法ainvoke来调用代理改写代码如下:async def get_server_tools(): mcp_tools await mcp_client.get_tools() print(f加载了{len(mcp_tools)}: {[t.name for t in mcp_tools]}) agent_with_mcp create_agent( model, toolsmcp_tools, system_prompt 你是一个高德地图规划助手能帮我规划形成和获得地图基本信息 ) result await agent_with_mcp.ainvoke( { messages:{ role: user, content: 请告诉我北京圆明园到北京西北旺地铁站距离 } } ) for msg in result[messages]: msg.pretty_print() asyncio.run(get_server_tools())执行结果会显示完整的推理过程首先调用maps_geo工具获取北京圆明园和西北旺地铁站的经纬度坐标然后调用maps_distance工具计算两地之间的距离最终输出自然语言形式的回答上述示例的工作原理是在本地使用 npx 启动高德地图 MCP 服务端进程该服务端封装了调用高德地图 API 的方法。LangChain 客户端作为 MCP 协议的客户端通过标准输入输出stdio与本地服务端通信获取并调用这些方法。同样的大家能够发现LangChain 集成 MCP 服务的过程非常简单高效。二、结构化输出在[《LangChain 1.0 速通指南一——LangChain 1.0 核心升级》])中曾提到create_agentAPI 的一个重要特性是支持结构化输出。这一功能极大地方便了后续的数据处理与系统集成。本节将基于前面高德地图 MCP 的示例演示如何让智能体返回标准化的距离信息格式如下{ loc1: 地址1 loc2: 地址2 distance: 两地址间距离 }2.1 实战LangChain结构化输出定义输出数据结构 首先引入必要的依赖并使用pydantic库定义期望的输出格式。这里笔者创建一个Result类明确指定需要返回的字段名称和类型。关于pydantic的使用大家可以参考笔者的文章 [深入浅出LangGraph AI Agent智能体开发教程六—LangGraph 底层API入门]from langchain.agents.structured_output import AutoStrategy from pydantic import BaseModel class Result(BaseModel): loc1: str loc2: str distance: float配置智能体的结构化输出修改create_agent的调用参数通过AutoStrategy包装定义的Result类并将其传递给response_format参数智能体在获得原始结果后会自动按照Result中定义的格式进行转换和封装agent_with_mcp create_agent( model, toolsmcp_tools, system_prompt 你是一个高德地图规划助手能帮我规划形成和获得地图基本信息, response_formatAutoStrategy(Result) )查看执行结果运行代码后可以看到智能体成功返回了符合预定结构的数据2.2 结构化输出策略解析LangChain 提供了三种主要的结构化输出策略各自适用于不同的场景ToolStrategy利用模型本身的任务分解与工具调用能力来生成结构化输出。这种方法通用性强适用于任何支持工具调用的模型但依赖于模型自身的推理能力。ProviderStrategy直接使用模型提供商如 OpenAI原生的结构化输出功能。这种方法更加稳定可靠但仅限于支持该特性的模型提供商。AutoStrategy智能选择最合适的结构化策略。它会自动检测当前使用的模型能力优先选择ProviderStrategy如果可用否则回退到ToolStrategy为开发者提供了最佳的兼容性和易用性。在实际开发中推荐优先使用AutoStrategy它能够在保证功能的前提下最大化地简化配置流程让开发者更专注于业务逻辑的实现。三、Memory记忆管理现在一起来探讨一个关键问题当我们在同一个程序中连续向大模型提问两次模型能够记住之前的对话内容吗让我们通过一个简单的实验来验证3.1 问题验证智能体是否拥有记忆首先编写以下测试代码from langchain.agents import create_agent from langchain.agents.middleware import HumanInTheLoopMiddleware from langchain.chat_models import init_chat_model model init_chat_model( modeldeepseek-chat, base_urlhttps://api.deepseek.com, api_key你注册的deepseek api key ) agent create_agent( modelmodel, ) result agent.invoke( { messages: 你好我叫苍进空? } ) for msg in result[messages]: msg.pretty_print() result agent.invoke( { messages: 你好我叫什么名字? } ) for msg in result[messages]: msg.pretty_print()执行结果如下大家可能已经注意到了在使用智能体时默认情况下智能体不会记住过去的请求。第二次提问时模型完全忘记了之前提到的姓名信息。如何解决这个问题呢这就需要用到create_agent的memory机制了。3.2 记忆解决方案langgraph记忆管理要解决这个问题我们需要利用create_agent的memory机制。create_agent创建的智能体会将所有消息保存在一个messages列表中可以通过将对话历史存储到系统内存中来维持对话的连续性(在打印的时候通过result[messages]取出列表中的数据)。存储对话历史到内存中需要利用langchain的InMemorySaver()功能它通过线程 IDthread_id来区分不同的对话会话。这类似于我们在使用 DeepSeek 等聊天服务时创建新对话的功能本质上就是开启了一个新的线程会话。因此在传递参数时必须通过configurable参数明确指定thread_id这样智能体才能找到对应的历史对话记录。编写如下代码赋予智能体管理历史记录的能力from langchain.agents import create_agent from langchain.agents.middleware import HumanInTheLoopMiddleware from langchain.chat_models import init_chat_model from langgraph.checkpoint.memory import InMemorySaver model init_chat_model( modeldeepseek-chat, base_urlhttps://api.deepseek.com, api_key你注册的deepseek api key ) agent create_agent( modelmodel, checkpointerInMemorySaver() ) result agent.invoke( { messages: 你好我叫苍进空? }, { configurable: { thread_id: 1 } } ) for msg in result[messages]: msg.pretty_print() result agent.invoke( { messages: 你好我叫什么名字? }, { configurable: { thread_id: 1 } } ) for msg in result[messages]: msg.pretty_print()执行结果如下现在智能体能够准确记住用户的名字是苍进空实现了真正的多轮对话能力。3.3 LangChain记忆管理架构解析从导入的包langgraph.checkpoint.memory可以看出LangChain 1.0 的记忆管理实际上是基于 LangGraph 的内置功能实现的。这种设计体现了 LangChain 架构的模块化思想将核心能力委托给专门的组件处理。多轮对话历史对于用户体验至关重要。只有当智能体能够记住之前的对话状态时用户才能与之进行自然、连贯的互动这也是构建真正智能对话系统的核心要素之一。四、中间件机制中间件机制是create_agentAPI 的核心特性之一它为开发者提供了在智能体执行关键节点进行干预和定制的能力。智能体在执行过程中会经历多个关键生命周期阶段LangChain 在这些关键节点为开发者提供了高度定制化的入口。通过中间件开发者可以实现动态提示词控制、对话历史摘要、选择性工具调用、状态管理及安全护栏等重要功能从而大幅提升智能体的功能上限和可靠性。钩子函数触发时机应用场景before_agent在调用代理之前加载记忆数据、验证输入before_model在每次大模型调用之前更新提示词、精简消息历史wrap_model_call围绕每次大模型调用可拦截拦截并修改请求/响应wrap_tool_call围绕每次工具调用可拦截拦截并修改工具执行过程after_model在每次大模型返回响应之后验证输出内容、应用安全护栏after_agent在代理完成运行之后保存结果、执行清理操作4.1 LangChain预置中间件LangChain为常见场景提供了以下预置中间件PIIMiddleware在发送至模型前自动屏蔽敏感信息SummarizationMiddleware当对话历史过长时自动进行内容浓缩HumanInTheLoopMiddleware敏感工具调用需经人工审批4.1.1HumanInTheLoopMiddleware实战演示在某些关键业务场景中智能体需要人工干预来确保操作的安全性。例如在执行数据库写入操作前必须经过人工确认否则可能因误操作导致数据丢失或系统崩溃。下面笔者基于上篇内容中的天气助手案例演示如何使用HumanInTheLoopMiddleware实现人工审批机制。环境初始化首先引入相关依赖定义工具函数、模型和系统提示词三件套from langchain.agents import create_agent from langchain.agents.middleware import HumanInTheLoopMiddleware from langchain.chat_models import init_chat_model from langchain.tools import tool from langgraph.checkpoint.memory import InMemorySaver from langgraph.types import Command tool def get_weather(loc:str)-str: 根据地点参数可以返回该地点的天气情况 return f{loc} 天气是晴气温23° SYSTEM_PROMPT 你是一个天气助手具备调用get_weather天气函数获取指定地点天气的能力 model init_chat_model( modeldeepseek-chat, base_urlhttps://api.deepseek.com, api_key你注册的deepseek api key )2. 配置人工审批中间件: 在create_agent中传入HumanInTheLoopMiddleware配置在执行get_weather函数前需要用户确认。用户输入approve表示允许执行输入reject表示拒绝执行。(HumanInTheLoopMiddleWare需要记忆管理参与毕竟中间会中断执行相当于多轮对话)agent create_agent( modelmodel, tools[get_weather], system_promptSYSTEM_PROMPT, middleware[HumanInTheLoopMiddleware( interrupt_on{ get_weather: { allowed_decisions: [approve, reject] } } )], checkpointerInMemorySaver() )3. 测试审批通过场景: 传入线程id, 如果检测到__interrupt__表示程序在这里阻塞了需要人类确认结果这里使用Command指令通过resume模拟人类反馈结果为同意查看输出config { configurable: { thread_id: 1 } } result agent.invoke( { messages: 今天北京天气怎么样? }, config ) if __interrupt__ in result: result agent.invoke( Command( resume{decisions: [{type: approve}]} ), config ) for msg in result[messages]: msg.pretty_print()执行结果显示工具函数成功执行返回了北京的天气信息。4. 测试审批拒绝场景: 现在测试用户拒绝工具执行的情况并向消息流中添加拒绝说明result agent.invoke( { messages: 今天北京天气怎么样? }, config ) if __interrupt__ in result: result agent.invoke( Command( resume{decisions: [{type: reject, message: 用户拒绝执行}]} ), config ) for msg in result[messages]: msg.pretty_print()执行结果显示工具调用被拒绝智能体根据拒绝信息生成了相应的回复。4.1.2HumanInTheLoopMiddleware中间件原理通过查看HumanInTheLoopMiddleware中间件的源码我们发现它继承了AgentMiddleware基类。主要通过重写after_model方法来实现审批机制。其核心工作原理是调用拦截在模型输出信息后工具执行前进行拦截暂停智能体的正常执行流程状态挂起将当前执行状态保存到检查点等待外部输入决策处理根据用户的审批决定批准/拒绝决定是否执行工具流程恢复基于审批结果恢复执行流程并注入相应的上下文信息这种机制确保了关键操作始终在人工监督下进行为构建安全可靠的AI应用提供了重要保障。4.2 自定义中间件理解了预置中间件的实现逻辑后笔者现在来动手实现一个自定义中间件。随着智能体处理任务的复杂度不断提升不仅需要在初始阶段设置模型的总体角色还需要在任务执行的不同阶段、步骤和异常情况下动态调整模型行为。接下来笔者完成一个实用示例基于用户专业级别的动态模型选择。如果用户被识别为专业人员我们使用 Deepseek 模型否则使用 Qwen3-8b模型。这种策略可以在保证服务质量的同时优化资源使用效率。我们将使用硅基流动的 Qwen3-8B 模型和 DeepSeek 模型进行演示。1. 环境初始化与上下文格式定义: 首先引入相关依赖定义两个大模型和上下文格式。使用dataclasses定义的Context类格式可以理解为智能体执行时的全局变量容器。在智能体执行流程中工具函数、中间件等组件可以通过.context.变量名的方式访问这些全局变量。下面代码定义了一个包含user_level字段的上下文结构。from dataclasses import dataclass from typing import Callable from langchain.agents import create_agent from langchain.agents.middleware import AgentMiddleware, ModelRequest, ModelResponse from langchain.chat_models import init_chat_model dataclass class Context: user_level: str expert deepseek_model init_chat_model( modeldeepseek-reasoner, base_urlhttps://api.deepseek.com, api_key你注册的deepseek api key ) Qwen3_model init_chat_model( modelQwen/Qwen3-8B, model_provideropenai, base_urlhttps://api.siliconflow.cn/v1/, api_key你注册的硅基流动 api key, )2. 实现自定义中间件定义ExpertiseBasedToolMiddleware中间件它继承自AgentMiddleware类并重写wrap_model_call方法。该中间件在模型调用前根据上下文中的用户级别信息动态选择模型class ExpertiseBasedToolMiddleware(AgentMiddleware): def wrap_model_call( self, request: ModelRequest, handler: Callable[[ModelRequest], ModelResponse] ) - ModelResponse: user_level request.runtime.context.user_level if user_level expert: model deepseek_model tools [] else: # Less powerful model model Qwen3_model tools [] request.model model request.tools tools return handler(request) agent create_agent( modelQwen3_model, tools[], middleware[ExpertiseBasedToolMiddleware()], context_schemaContext, )3. 测试专家用户场景首先测试user_level为专业用户的情况传入上下文全局变量首先尝试user_level为专业用户,查看执行结果question 你好请问你是? for step in agent.stream( {messages: {role:user, content:question}}, contextContext(user_levelexpert), stream_modevalues, ): step[messages][-1].pretty_print()执行结果显示智能体使用了 DeepSeek 模型进行响应这表明中间件成功根据用户级别动态选择了模型。4. 测试普通用户场景: 现在测试非专业用户场景修改 user_level为普通用户for step in agent.stream( {messages: {role:user, content:question}}, contextContext(user_levelstudent), stream_modevalues, ): step[messages][-1].pretty_print()执行结果显示智能体使用了 Qwen3-8B 模型进行响应这表明中间件成功根据用户级别动态选择了模型。以上就是自定义中间件的简单实现是不是很强大更多中间件的使用技巧笔者这里不再赘述大家详细参考官方文档满血教程(https://docs.langchain.com/oss/python/langchain/middleware)~五、总结本篇内容深入分享了 LangChain 1.0create_agentAPI 的高阶功能涵盖 MCP 协议工具集成、结构化输出、记忆管理和中间件机制四大核心能力。通过高德地图 MCP 接入、动态模型选择等实战案例展示了如何构建具备外部工具调用、记忆保持和流程可控的智能体应用。这两期内容系统讲解了create_agentAPI 的核心功能体系为掌握 LangChain 1.0 智能体开发奠定了坚实基础。LangChain1.0 核心组件和生态真正的熟练运用仍需在实际项目中不断实践。接下来笔者将推出基于 LangChain 1.0 构建的多模态知识库系统实战该系统采用前后端分离架构基本复刻了当前企业级多模态知识库的完整技术方案大家敬请期待最后我在一线科技企业深耕十二载见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事早已在效率与薪资上形成代际优势我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我整理出这套 AI 大模型突围资料包✅AI大模型学习路线图✅Agent行业报告✅100集大模型视频教程✅大模型书籍PDF✅DeepSeek教程✅AI产品经理入门资料完整的大模型学习和面试资料已经上传带到CSDN的官方了有需要的朋友可以扫描下方二维码免费领取【保证100%免费】为什么说现在普通人就业/升职加薪的首选是AI大模型人工智能技术的爆发式增长正以不可逆转之势重塑就业市场版图。从DeepSeek等国产大模型引发的科技圈热议到全国两会关于AI产业发展的政策聚焦再到招聘会上排起的长队AI的热度已从技术领域渗透到就业市场的每一个角落。智联招聘的最新数据给出了最直观的印证2025年2月AI领域求职人数同比增幅突破200%远超其他行业平均水平整个人工智能行业的求职增速达到33.4%位居各行业榜首其中人工智能工程师岗位的求职热度更是飙升69.6%。AI产业的快速扩张也让人才供需矛盾愈发突出。麦肯锡报告明确预测到2030年中国AI专业人才需求将达600万人人才缺口可能高达400万人这一缺口不仅存在于核心技术领域更蔓延至产业应用的各个环节。资料包有什么①从入门到精通的全套视频教程⑤⑥包含提示词工程、RAG、Agent等技术点② AI大模型学习路线图还有视频解说全过程AI大模型学习路线③学习电子书籍和技术文档市面上的大模型书籍确实太多了这些是我精选出来的④各大厂大模型面试题目详解⑤ 这些资料真的有用吗?这份资料由我和鲁为民博士共同整理鲁为民博士先后获得了北京清华大学学士和美国加州理工学院博士学位在包括IEEE Transactions等学术期刊和诸多国际会议上发表了超过50篇学术论文、取得了多项美国和中国发明专利同时还斩获了吴文俊人工智能科学技术奖。目前我正在和鲁博士共同进行人工智能的研究。所有的视频教程由智泊AI老师录制且资料与智泊AI共享相互补充。这份学习大礼包应该算是现在最全面的大模型学习资料了。资料内容涵盖了从入门到进阶的各类视频教程和实战项目无论你是小白还是有些技术基础的这份资料都绝对能帮助你提升薪资待遇转行大模型岗位。智泊AI始终秉持着“让每个人平等享受到优质教育资源”的育人理念通过动态追踪大模型开发、数据标注伦理等前沿技术趋势构建起前沿课程智能实训精准就业的高效培养体系。课堂上不光教理论还带着学员做了十多个真实项目。学员要亲自上手搞数据清洗、模型调优这些硬核操作把课本知识变成真本事如果说你是以下人群中的其中一类都可以来智泊AI学习人工智能找到高薪工作一次小小的“投资”换来的是终身受益应届毕业生无工作经验但想要系统学习AI大模型技术期待通过实战项目掌握核心技术。零基础转型非技术背景但关注AI应用场景计划通过低代码工具实现“AI行业”跨界。业务赋能 突破瓶颈传统开发者Java/前端等学习Transformer架构与LangChain框架向AI全栈工程师转型。获取方式有需要的小伙伴可以保存图片到wx扫描二v码免费领取【保证100%免费】**