当前位置: 首页 > article >正文

[LangChain Agent]Agent实战篇

LangChain Agent 详解本文详细介绍了 LangChain 中Agent智能体的核心概念、ReAct 推理模式、create_agent高级 API 的使用方法以及Agent-to-AgentA2A多智能体协作架构。通过电商助手、天气查询助手和出行规划三个实战案例帮助读者全面掌握 Agent 的开发流程。目录什么是 AgentAgent vs 传统链式调用ReAct 推理模式create_agent 高级 APIAgent 核心组件实战案例一ReAct 电商助手实战案例二结构化输出天气助手实战案例三A2A 多智能体协作A2A 协作架构设计工具封装规范常见问题与解决方案1. 什么是 Agent1.1 概念定义Agent智能体是一种能够自主决策、调用工具、执行复杂任务的 AI 系统。与传统固定流程的链式调用不同Agent 具有以下核心能力能力说明自主决策根据用户输入决定是否需要调用工具、调用哪些工具工具调用能够使用外部工具搜索、数据库、API 等完成特定任务推理思考采用 ReAct 等模式进行多步推理逐步接近目标答案动态规划根据中间结果调整下一步行动传统链式调用: 输入 → 固定流程 → 输出线性执行 Agent: 输入 → 推理(Reason) → 行动(Act) → 观察 → 推理... → 输出循环执行1.2 Agent 的工作流程用户提问: 查找最受欢迎的游戏鼠标检查是否有库存 │ ▼ ┌─────────────────────────────────────┐ │ Step 1: Reason推理 │ │ 用户想要找游戏鼠标需要先搜索产品 │ │ 然后检查库存 │ └─────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ Step 2: Act行动 │ │ 调用 search_products(游戏鼠标) │ └─────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ Step 3: Observe观察 │ │ 获得搜索结果罗技 G Pro 排名第一 │ └─────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ Step 4: Reason推理 │ │ 知道了用户还要求检查库存 │ │ 需要调用 check_inventory(GPW) │ └─────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ Step 5: Act行动 │ │ 调用 check_inventory(GPW) │ └─────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ Step 6: Final最终回答 │ │ 综合所有工具结果生成完整回答 │ └─────────────────────────────────────┘2. Agent vs 传统链式调用2.1 传统链式调用特点# 传统 LCEL 链式调用 rag_chain ( {context: retriever, question: RunnablePassthrough()} | prompt | llm )特性说明固定流程检索 → 组装 Prompt → 生成顺序固定无工具调用无法访问外部系统搜索、数据库等一次执行不支持循环推理和多步决策适合场景RAG 问答、简单文本处理2.2 Agent 的优势特性说明动态决策根据中间结果决定下一步行动工具调用支持任意数量和类型的外部工具循环推理支持ReAct 循环直到获得完整答案自适应根据问题复杂度自动调整调用次数适合场景复杂问答、多步骤任务、跨系统协作2.3 简单对比场景: 查询 北京今天天气如何 ​ 传统链式调用: → 直接回答模型自己的知识可能不准确或无最新数据 ​ Agent 方式: → 推理需要调用天气工具 → 行动调用 get_weather(Beijing) → 观察获取到 {temp: 25, condition: 晴} → 回答今天北京天气晴气温25°C3. ReAct 推理模式3.1 什么是 ReActReAct Reason Act是一种结合推理和行动的 AI 框架让模型能够像人类一样边想边做Reason推理: 分析当前状态决定下一步做什么Act行动: 执行具体动作调用工具Observe观察: 获取行动结果循环: 重复直到得到最终答案3.2 ReAct 工作流程图┌──────────────────────────────────────────────────────────────┐ │ ReAct 循环 │ ├──────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ 推理 │ → │ 行动 │ → │ 观察 │ │ │ │ Reason │ │ Act │ │ Observe │ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ ↑ │ │ │ └────────────────────────────────────────────┘ │ │ │ │ 循环直到得到完整答案 / 达到最大迭代次数 / 判定无法回答 │ │ │ └──────────────────────────────────────────────────────────────┘3.3 ReAct 示例解析用户问题: 查找当前最受欢迎的鼠标并检查是否有库存 步骤1: Reasoning Acting ️ 工具调用: search_products({query: 游戏鼠标}) 观察结果: 找到5个匹配产品: 1. 罗技 G Pro 无线 (GPW) - 受欢迎度: 90% ​ 步骤2: Reasoning Acting ️ 工具调用: check_inventory({product_id: GPW}) 观察结果: GPW: 有库存 (8件) ​ ✅ 最终回答: 当前最受欢迎的游戏鼠标是罗技 G Pro 无线GPW 受欢迎度达90%目前有库存8件。4. create_agent 高级 API4.1 API 概述create_agent是 LangChain 1.0 提供的高级 API用于快速创建 Agent 实例相比旧版create_tool_calling_agentAgentExecutor的方式更加简洁。from langchain.agents import create_agent ​ agent create_agent( model, # 大模型实例ChatOpenAI 等 tools, # 工具列表 system_prompt, # 系统提示词 response_format, # 可选结构化输出格式 **kwargs # 其他参数 )4.2 核心参数说明参数类型必填说明modelBaseChatModel是大模型实例支持 ChatOpenAI、DashScope 等toolsList[BaseTool]是Agent 可调用的工具列表system_promptstr是系统提示词定义 Agent 角色和行为response_formatTypedDict否结构化输出格式指定输出字段类型4.3 调用 Agent# 单轮对话 result agent.invoke({ input: 用户问题 }) ​ # 多轮对话 result agent.invoke({ messages: [{role: user, content: 用户问题}] })4.4 返回结果结构{ messages: [...], # 对话历史包含推理过程 structured_response: {...}, # 结构化输出如果指定了 response_format output: 最终回答内容 # 最终文本回答 }5. Agent 核心组件5.1 组件一览┌─────────────────────────────────────────────────────────┐ │ Agent │ ├─────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ Model │ │ Tools │ │ System │ │ │ │ (大模型) │ │ (工具集) │ │ Prompt │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ │ │ │ │ └────────────────┼────────────────┘ │ │ ▼ │ │ ┌─────────────────┐ │ │ │ ReAct 推理引擎 │ │ │ └─────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────┐ │ │ │ 执行结果 │ │ │ │ (文本/结构化) │ │ │ └─────────────────┘ │ │ │ └─────────────────────────────────────────────────────────┘5.2 Model模型Agent 的大脑负责推理和决策。通常使用功能强大的大语言模型from langchain_openai import ChatOpenAI ​ model ChatOpenAI( modelqwen-plus, api_keyos.getenv(aliQwen-api), base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1 )5.3 Tools工具Agent 的手脚通过tool装饰器定义from langchain_core.tools import tool ​ tool def search_products(query: str) - str: 搜索产品并返回按受欢迎度排序的结果 # 工具实现逻辑 return result5.4 System Prompt系统提示词Agent 的行为准则决定 Agent 的角色定位和执行策略system_prompt 你是电商助手遵循ReAct模式 1. 先推理用户需求 2. 选择合适的工具执行操作 3. 基于工具结果进行下一步推理 4. 重复直到获得完整答案 ​ 保持推理步骤简洁明了。6. 实战案例一ReAct 电商助手6.1 案例概述功能: 模拟电商场景用户可以搜索产品、检查库存Agent 自动决定调用顺序。核心工具:search_products: 搜索产品支持关键词映射check_inventory: 检查产品库存6.2 代码结构分析# 1. 环境配置 model ChatOpenAI( modelqwen-plus, api_keyos.getenv(aliQwen-api), base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1 ) ​ # 2. 数据模拟 PRODUCT_DATABASE {...} # 产品数据库 INVENTORY_DATABASE {...} # 库存数据库 ​ # 3. 工具定义 tool def search_products(query: str) - str: 搜索产品并返回按受欢迎度排序的结果 # 关键词映射支持多种中文表达 keyword_mapping { 无线耳机: [无线耳机, 蓝牙耳机, 头戴式耳机, 耳机], 游戏鼠标: [游戏鼠标, 电竞鼠标, 鼠标], ... } # 搜索并按受欢迎度排序 return result ​ tool def check_inventory(product_id: str) - str: 检查特定产品的库存状态 return result ​ # 4. 创建 Agent agent create_agent( model, tools[search_products, check_inventory], system_prompt你是电商助手遵循ReAct模式... ) ​ # 5. 调用 Agent result agent.invoke({ messages: [{role: user, content: 查找当前最受欢迎的鼠标并检查是否有库存}] })6.3 关键词映射机制为了让搜索更智能代码实现了关键词映射keyword_mapping { 无线耳机: [无线耳机, 蓝牙耳机, 头戴式耳机, 耳机], 游戏鼠标: [游戏鼠标, 电竞鼠标, 鼠标], 笔记本电脑: [笔记本电脑, 笔记本, 手提电脑, 电脑] } ​ # 用户输入 鼠标 → 匹配到 游戏鼠标 类别 → 返回游戏鼠标列表6.4 ReAct 循环追踪def track_react_cycle(messages): print(ReAct循环步骤分析:) step 1 for msg in messages: msg_type msg.__class__.__name__ if msg_type AIMessage and msg.tool_calls: print(f\n 步骤{step}: Reasoning Acting) for tool_call in msg.tool_calls: print(f ️ 工具调用: {tool_call[name]}({tool_call[args]})) step 1 elif msg_type ToolMessage: print(f 观察结果: {msg.content[:80]}...) elif msg_type AIMessage and not msg.tool_calls: print(f\n✅ 最终回答: {msg.content})6.5 运行结果示例 [工具调用] search_products(游戏鼠标) [工具调用] check_inventory(GPW) ​ 最终结果: AIMessage: 好的我来帮你查找最受欢迎的游戏鼠标并检查库存... ​ 步骤1: Reasoning Acting ️ 工具调用: search_products({query: 游戏鼠标}) 观察结果: 找到3个匹配 游戏鼠标 的产品: 1. 罗技 G Pro 无线 (ID: GPW) - 受欢迎度: 90% - 129 2. 雷蛇 Viper V2 Pro (ID: VIPER) - 受欢迎度: 87% - 149 3. 雷蛇 DeathAdder V3 (ID: DAV3) - 受欢迎度: 85% - 119 ​ 步骤2: Reasoning Acting ️ 工具调用: check_inventory({product_id: GPW}) 观察结果: 产品 GPW: 有库存 (8 件库存) - 位置: 仓库-C ​ ✅ 最终回答: 当前最受欢迎的游戏鼠标是罗技 G Pro 无线GPW 受欢迎度达90%目前有库存8件可以放心购买7. 实战案例二结构化输出天气助手7.1 案例概述功能: 查询多个城市的天气并进行对比分析支持结构化输出。核心工具:get_weather: 调用 OpenWeather API 查询天气7.2 结构化输出定义from typing_extensions import TypedDict ​ class WeatherCompareOutput(TypedDict): beijing_temp: float # 北京温度 shanghai_temp: float # 上海温度 hotter_city: str # 更热的城市 summary: str # 总结说明7.3 完整代码解析# 1. 工具定义 tool def get_weather(loc: str) - dict: 查询即时天气函数 ​ :param loc: 必要参数字符串类型用于表示查询天气的具体城市名称。 注意中国的城市需要用对应城市的英文名称代替 例如如果需要查询北京市天气则 loc 参数需要输入 Beijing/shanghai。 :return: OpenWeather API 查询即时天气的结果。 url https://api.openweathermap.org/data/2.5/weather params { q: loc, appid: os.getenv(OPENWEATHER_API_KEY), units: metric, lang: zh_cn } response httpx.get(url, paramsparams, timeout30) data response.json() return json.dumps(data, ensure_asciiFalse) ​ # 2. 创建 Agent带结构化输出 agent create_agent( modelmodel, tools[get_weather], system_prompt( 你是天气助手。 当用户询问多个城市天气时 你需要分别调用工具获取数据并进行比较分析。 ), response_formatWeatherCompareOutput, # 指定结构化输出格式 ) ​ # 3. 调用 Agent result agent.invoke( {input: 请问今天北京和上海的天气怎么样哪个城市更热} ) ​ # 4. 获取结构化结果 print(json.dumps(result[structured_response], ensure_asciiFalse, indent2))7.4 返回结果对比普通文本输出:今天北京天气晴气温25℃上海天气多云气温28℃。 上海比北京更热。结构化输出:{ beijing_temp: 25.0, shanghai_temp: 28.0, hotter_city: 上海, summary: 今天北京天气晴气温25℃上海天气多云气温28℃。综合比较上海更热。 }7.5 结构化输出的优势特性文本输出结构化输出解析难度需要正则解析直接使用字典/对象类型安全无有类型声明IDE 自动补全下游处理复杂简单直接访问字段适合场景对话式回答API 调用、程序处理8. 实战案例三A2A 多智能体协作8.1 案例概述文件:Agent2Agent.py功能: 模拟完整出行规划流程跨平台协作携程订机票 → 美团订酒店 → 滴滴打车核心设计: 一个总协调 Agent 调度三个专属业务 Agent8.2 业务流程图用户需求: 安排2026年5月5日北京飞上海的完整行程 ​ ┌─────────────────────────────────────────────────────────────┐ │ A2A 多智能体协作流程 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────┐ │ │ │ 总协调 Agent │ ← 用户入口接收需求 │ │ └────────┬────────┘ │ │ │ 调度 │ │ ┌─────┴─────┬───────────────┐ │ │ ▼ ▼ ▼ │ │ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │ 携程 │ │ 美团 │ │ 滴滴 │ │ │ │ 机票 │ │ 酒店 │ │ 打车 │ │ │ │ Agent │ │ Agent │ │ Agent │ │ │ └────┬───┘ └───┬────┘ └────┬───┘ │ │ │ │ │ │ │ └─────────┴──────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────┐ │ │ │ 整合最终报告 │ │ │ └─────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘8.3 三个专属 Agent 定义# 携程 Agent tool(CtripBookFlight, description预订机票的唯一工具...) def ctrip_book_flight(departure: str, arrival: str, date: str) - str: 携程订机票固定返回测试结果 return f【携程机票预订成功】\n航班号CA1885... ​ def create_ctrip_agent(llm): llm_with_tools llm.bind_tools([ctrip_book_flight]) prompt ChatPromptTemplate.from_messages([ (system, 你是专业的工具调用助手只能调用CtripBookFlight工具...), (human, {input}) ]) return prompt | llm_with_tools | output_parser ​ # 美团 Agent tool(MeituanBookHotel, description预订酒店的唯一工具...) def meituan_book_hotel(city: str, near_by: str, check_in: str, check_out: str) - str: 美团订酒店固定返回测试结果 return f【美团酒店预订成功】\n酒店名称上海浦东机场铂尔曼大酒店... ​ def create_meituan_agent(llm): llm_with_tools llm.bind_tools([meituan_book_hotel]) prompt ChatPromptTemplate.from_messages([...]) return prompt | llm_with_tools | output_parser ​ # 滴滴 Agent tool(DidiBookTaxi, description预约打车的唯一工具...) def didi_book_taxi(start: str, end: str, time: str) - str: 滴滴打车固定返回测试结果 return f【滴滴打车预约成功】\n车型滴滴快车舒适型... ​ def create_didi_agent(llm): llm_with_tools llm.bind_tools([didi_book_taxi]) prompt ChatPromptTemplate.from_messages([...]) return prompt | llm_with_tools | output_parser8.4 总协调 Agentdef create_travel_coordinator_agent(llm, ctrip_chain, meituan_chain, didi_chain): 总协调按顺序调用空值兜底打印详细测试 def a2a_schedule(input_dict): print( 开始执行A2A协作测试依次调用各业务Agent...\n) ​ # 1. 携程 Agent 调用 print(1. 调用【携程机票Agent】) try: ctrip_result ctrip_chain.invoke({input: 订机票}) except: ctrip_result if not ctrip_result.strip(): ctrip_result ctrip_book_flight(北京, 上海, 2026-05-05) # 兜底 print(f✅ 携程测试结果\n{ctrip_result}\n) ​ # 2. 美团 Agent 调用 print(2. 调用【美团酒店Agent】) try: meituan_result meituan_chain.invoke({input: 订酒店}) except: meituan_result if not meituan_result.strip(): meituan_result meituan_book_hotel(上海, 浦东机场, 2026-05-05, 2026-05-06) print(f✅ 美团测试结果\n{meituan_result}\n) ​ # 3. 滴滴 Agent 调用 print(3. 调用【滴滴打车Agent】) try: didi_result didi_chain.invoke({input: 预约打车}) except: didi_result if not didi_result.strip(): didi_result didi_book_taxi(上海浦东机场T2, 上海浦东机场铂尔曼大酒店, 2026-05-05 16:40) print(f✅ 滴滴测试结果\n{didi_result}\n) ​ # 整合最终报告 total_report f 【携程-美团-滴滴 A2A协作测试最终报告】 {*90} 测试状态本地运行成功所有Agent均返回完整结果含兜底保障 协作流程携程订机票 → 美团订酒店 → 滴滴打车按业务顺序执行 {*90} 【1. 携程机票预订结果】 {ctrip_result} 【2. 美团酒店预订结果】 {meituan_result} 【3. 滴滴打车预约结果】 {didi_result} {*90} 测试结论A2A协作逻辑正常tool装饰器集成成功无报错 return total_report ​ return RunnableLambda(a2a_schedule)8.5 运行结果 初始化携程/美团/滴滴专属Agent... ✅ 所有Agent初始化完成 ​ 初始化A2A总协调Agent调度核心... ✅ 总协调Agent初始化完成 ​ 携程-美团-滴滴 A2A协作测试正式开始 ​ 开始执行A2A协作测试依次调用各业务Agent... ​ 1. 调用【携程机票Agent】 ✅ 携程测试结果 【携程机票预订成功】 出发地北京 目的地上海 出行日期2026-05-05 航班号CA1885北京首都T3→上海浦东T2 起飞时间14:00 降落时间16:30 座位经济舱34A 电子客票号999-1234567890 ​ 2. 调用【美团酒店Agent】 ✅ 美团测试结果 【美团酒店预订成功】 城市上海 位置浦东机场附近 入住日期2026-05-05 离店日期2026-05-06 酒店名称上海浦东机场铂尔曼大酒店 房型豪华大床房含双人自助早餐 ​ 3. 调用【滴滴打车Agent】 ✅ 滴滴测试结果 【滴滴打车预约成功】 起点上海浦东机场T2 终点上海浦东机场铂尔曼大酒店 用车时间2026-05-05 16:40 车型滴滴快车舒适型 预估费用35元券后立减5元实付30元9.A2A 协作架构设计9.1 A2A 核心概念A2A (Agent-to-Agent)是一种多智能体协作架构多个专业 Agent 分工合作共同完成复杂任务。┌─────────────────────────────────────────────────────────────────┐ │ A2A 架构图 │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────┐ │ │ │ 用户入口 │ │ │ └──────┬──────┘ │ │ │ │ │ ┌──────▼──────┐ │ │ │ 总协调 │ ← 入口 Agent控制调度逻辑 │ │ │ Agent │ │ │ └──────┬──────┘ │ │ │ │ │ ┌──────┴──────┬──────────────┐ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │ 子Agent │ │ 子Agent │ │ 子Agent │ │ │ │ A │ │ B │ │ C │ │ │ └────────┘ └────────┘ └────────┘ │ │ ↑ ↑ ↑ │ │ └────────────┴──────────────┘ │ │ │ │ │ 只与总协调 Agent 通信 │ │ 子 Agent 之间不直接通信 │ │ │ └─────────────────────────────────────────────────────────────────┘9.2 A2A 设计原则原则说明单一职责每个子 Agent只负责一个业务领域统一接口所有子 Agent 都是 Runnable 链对外暴露invoke()方法总协调控制所有调度由总协调 Agent 控制子 Agent 之间不直接交互稳定保障每个子 Agent 调用加 try-except对空结果做兜底9.3 子 Agent 规范# ✅ 正确单一职责 统一接口 def create_ctrip_agent(llm): llm_with_tools llm.bind_tools([ctrip_book_flight]) # 只绑定一个工具 prompt ChatPromptTemplate.from_messages([ (system, 你是专业的...只能调用CtripBookFlight工具...), (human, {input}) ]) return prompt | llm_with_tools | output_parser # 统一 Runnable 接口 ​ # ❌ 错误一个 Agent 绑定多个不相关工具 def create_mixed_agent(llm): llm_with_tools llm.bind_tools([ctrip_book_flight, meituan_book_hotel, didi_book_taxi]) ...9.4 兜底机制def a2a_schedule(input_dict): try: ctrip_result ctrip_chain.invoke({input: 订机票}) except: ctrip_result ​ # 空结果兜底调用原始函数 if not ctrip_result.strip(): ctrip_result ctrip_book_flight(北京, 上海, 2026-05-05) ​ return ctrip_result兜底原因: 大模型有时无法正确调用工具直接返回空字符串。兜底机制确保系统稳定运行。10. 工具封装规范10.1 tool 装饰器LangChain 1.0 推荐使用tool装饰器封装业务函数from langchain.core.tools import tool ​ tool(工具名称, description工具描述说明参数和用途) def my_tool(param1: str, param2: int) - str: 工具的详细说明文档 # 实现逻辑 return result10.2 工具描述规范工具的description必须清晰因为大模型通过描述识别参数# ✅ 好的描述明确参数名、参数类型、说明 tool(CtripBookFlight, description预订机票的唯一工具必须调用参数是departure出发地、arrival目的地、date出行日期格式2026-02-01) ​ # ❌ 差的描述参数模糊 tool(CtripBookFlight, description预订机票的工具)10.3 参数类型提示必须为参数添加类型提示否则结构化调用可能失败# ✅ 正确 tool def get_weather(loc: str, units: str metric) - dict: ... ​ # ❌ 错误 tool def get_weather(loc, unitsmetric): ...10.4 工具返回格式建议返回结构化的字符串或字典便于解析# ✅ 结构化返回 tool def search_products(query: str) - str: return f找到 {len(results)} 个产品:\n \n.join([f{i}. {p[name]} for i, p in enumerate(results, 1)]) ​ # ✅ 字典返回配合结构化输出 tool def get_weather(loc: str) - dict: return {temp: 25, condition: 晴, humidity: 60}11. 常见问题与解决方案11.1 工具调用失败问题原因解决方案工具未被调用Prompt 未明确要求在 system_prompt 中强调必须调用工具调用参数错误description 不清晰完善 description明确参数格式多次重复调用Agent 无法判断结束添加重复直到获得完整答案后停止11.2 Agent 无响应问题原因解决方案死循环无法判断结束条件设置max_iterations限制超时工具执行时间过长设置timeout或增加超时时间空返回模型拒绝调用工具添加兜底逻辑11.3 结构化输出问题问题解决方案response_format报错确保typing_extensions.TypedDict已安装输出格式不匹配检查 TypedDict 字段类型是否与大模型输出匹配部分字段缺失在 system_prompt 中强调必须填充所有字段11.4 A2A 协作问题问题解决方案子 Agent 不执行检查总协调 Agent 的调用逻辑结果丢失添加 try-except 和兜底机制执行顺序混乱使用顺序调用而非并行确保依赖关系11.5 调试技巧# 1. 打印完整消息历史 for msg in result[messages]: print(f{msg.__class__.__name__}: {msg.content}) # 2. 追踪 ReAct 循环 track_react_cycle(result[messages]) # 3. 检查工具调用 for msg in result[messages]: if hasattr(msg, tool_calls): print(f工具调用: {msg.tool_calls}) # 4. 结构化输出调试 print(result.get(structured_response, {}))附录关键概念速查表概念说明Agent能够自主决策、调用工具、执行复杂任务的 AI 系统ReActReason Act 推理模式边推理边行动create_agentLangChain 1.0 高级 API快速创建 Agenttool装饰器用于封装业务函数为 Agent 工具A2AAgent-to-Agent多智能体协作架构总协调 Agent控制多个子 Agent 调度逻辑的入口 Agent子 Agent专注于单一业务领域的专属 Agent结构化输出使用 TypedDict 定义输出格式确保类型安全RunnableLambda将普通函数转换为 Runnable 接口兜底机制当 Agent 调用失败时使用原始函数保证系统稳定

相关文章:

[LangChain Agent]Agent实战篇

LangChain Agent 详解 本文详细介绍了 LangChain 中 Agent(智能体)的核心概念、ReAct 推理模式、create_agent 高级 API 的使用方法,以及 Agent-to-Agent(A2A)多智能体协作架构。通过电商助手、天气查询助手和出行规划…...

新手无需纠结cursor价格:在快马用一句话生成你的第一个ai辅助编程项目

作为一个刚接触编程的新手,我最近一直在寻找合适的工具来学习AI辅助开发。之前听说Cursor很火,但看到订阅价格后有点犹豫——毕竟作为初学者,我还不确定自己是否需要这么专业的工具。直到发现了InsCode(快马)平台,才发现原来用自然…...

别再只会插卡了!用示波器实测SIM卡上电时序与通信波形(附故障排查)

示波器实战:SIM卡通信波形全解析与故障诊断指南 当物联网设备的SIM卡突然无法识别时,大多数工程师的第一反应是重新插拔卡片。但真正的硬件高手会拿起示波器探头——因为电气信号从不说谎。本文将带您深入SIM卡通信的微观世界,通过实测波形揭…...

数学推理轨迹评估:从算法到教学实践

1. 数学推理轨迹评估的核心价值数学推理过程的评估一直是教育测量和认知科学领域的难点问题。传统评分方式往往只关注最终答案的正确性,却忽视了思维过程中的关键信息。这就好比两位学生都解出了正确答案,但一位是胡乱猜测,另一位则是通过严谨…...

前端焦虑?收藏这份AI转型指南,助你从程序员变身AI产品经理!

文章分析了AI对前端编程领域的冲击,指出前端业务逻辑简单且GitHub语料丰富,适合转型AI工程师或产品经理。文章还探讨了AI在前端开发中的实际应用,如Cursor工具在需求分析、UI还原、业务逻辑实现等环节的效率提升,并指出AI完全替代…...

用ALV动态单元格编辑实现采购订单审批流:基于采购数量控制字段可编辑性

基于ALV动态单元格编辑的采购订单审批流设计与实现 在SAP MM模块的日常运营中,采购订单审批流程的效率直接影响企业采购成本和供应链响应速度。传统审批方式往往需要开发复杂的增强程序或依赖多级工作流系统,而利用ALV(ABAP List Viewer&…...

实战应用:开发一款用户可自助解决vcruntime140.dll错误的桌面工具

今天想和大家分享一个实战项目:开发一款帮助用户自助解决vcruntime140.dll错误的桌面工具。这个需求来源于实际工作中频繁遇到用户反馈"程序启动报错vcruntime140.dll缺失"的问题,每次都需要远程指导操作,效率很低。于是决定用InsC…...

Taotoken用量看板如何清晰展示各项目模型消耗占比

Taotoken 用量看板如何清晰展示各项目模型消耗占比 1. 用量看板的核心功能 Taotoken 用量看板为项目管理者提供了多维度的 API 调用数据可视化能力。通过聚合不同项目、功能模块的 token 消耗数据,帮助管理者快速掌握资源分配情况。看板默认展示最近 30 天的累计用…...

AI编码代理执行力插件:反偷懒机制与多Agent协作优化

1. 项目概述:一个让AI编码代理“卷起来”的执行力插件如果你用过Claude Code、Cursor或者OpenClaw这类AI编码助手,肯定遇到过这种情况:让它修个bug,试了两三次不行,它就开始摆烂,跟你说“建议您手动检查一下…...

ARM NEON技术:SIMD加速与优化实践

1. ARM NEON技术概述 NEON是ARM架构中的SIMD(单指令多数据)扩展技术,作为Cortex-A系列处理器的标准功能模块,它通过并行数据处理能力显著提升了多媒体编解码、数字信号处理等计算密集型任务的执行效率。这项技术最早在ARMv7架构中…...

从零搭建AI智能助手:基于LangChain与Ollama的模块化架构实践

1. 项目概述:从零构建一个AI驱动的智能助手最近在GitHub上看到一个挺有意思的项目,叫openclaw-setup。光看名字,可能有点摸不着头脑,但点进去研究了一下,发现这是一个关于如何搭建和配置一个名为“OpenClaw”的AI智能助…...

RAB7传感器扩展板:多源数据融合与物联网应用实战

1. RAB7传感器融合扩展板概述Rutronik RAB7是一款专为Arduino生态系统设计的开源硬件传感器扩展板,集成了来自Bosch、Infineon和Sensirion三大厂商的七种高性能环境与惯性传感器。作为从事嵌入式开发十余年的工程师,我首次接触这款扩展板时就被其精妙的传…...

初次使用Taotoken从注册到完成第一次API调用的全过程

初次使用Taotoken从注册到完成第一次API调用的全过程 1. 注册Taotoken账号 访问Taotoken官网完成账号注册是使用服务的第一步。在浏览器地址栏输入https://taotoken.net进入官网首页,点击右上角的"注册"按钮。按照页面提示填写邮箱、设置密码并完成验证…...

视频理解与多模态推理技术解析与应用实践

1. 视频理解与多模态推理技术概述视频理解与多模态推理是当前计算机视觉领域最前沿的研究方向之一。简单来说,这项技术让机器能够像人类一样"看懂"视频内容,并结合文本、语音等多种信息进行综合判断。我在实际项目中发现,这项技术正…...

避坑指南:在Ubuntu 20.04上从零搭建OpenPCDet+ROS的PointPillars可视化环境

避坑指南:Ubuntu 20.04下OpenPCDetROS可视化环境全流程实战 在3D目标检测领域,PointPillars作为平衡效率与精度的经典算法,常被用于自动驾驶和机器人感知系统开发。但当开发者尝试将OpenPCDet检测框架与ROS可视化工具链集成时,往往…...

UniPercept框架:大语言模型的多模态视觉理解突破

1. 项目概述:当大语言模型学会"看"世界去年我在调试一个视觉问答系统时,发现传统模型对"图片里左侧穿红衣服的人手里拿的是什么?"这类需要空间关系和细粒度理解的问题束手无策。这正是UniPercept要解决的痛点——让大语言…...

基于Ansible与Tmux构建云端AI开发环境:实现24/7远程编程

1. 项目概述:为什么需要一个“永不关机”的远程开发代理? 作为一名常年与代码打交道的开发者,我经常遇到一个尴尬的场景:本地电脑上跑着一个耗时漫长的构建、测试或者数据同步任务,而我却不得不合上笔记本去开会、通勤…...

基于Next.js与Prisma的SaaS应用样板工程:快速构建用户认证与支付系统

1. 项目概述与核心价值如果你正在筹划一个SaaS产品,无论是AI工具、内容平台还是企业服务,在真正开始构建核心业务逻辑之前,有一堆“脏活累活”是绕不开的:用户怎么注册登录?怎么管理个人资料?怎么安全地收钱…...

保姆级教程:用BLIP-2模型(OPT-2.7B)为你的图片自动生成描述,从环境配置到跑通第一个Demo

零门槛玩转BLIP-2:三小时从环境配置到图片描述生成实战指南 当你面对手机里堆积如山的照片却懒得手动整理时,有没有幻想过AI能自动帮你写图说?BLIP-2作为当前最强大的开源多模态模型之一,只需一张显卡就能让这个幻想成真。不同于…...

Dify检索模块深度调优:为什么92%的工业客户首配失败?(工业协议适配+非结构化文档解析全拆解)

更多请点击: https://intelliparadigm.com 第一章:Dify工业检索配置失败率的真相洞察 在实际工业场景中,Dify 的 RAG 检索模块配置失败率常被低估——某汽车零部件制造商的部署数据显示,**37.2% 的检索失败源于嵌入模型与向量库元…...

uni-app项目manifest.json配置详解:除了AppID,这些设置直接影响你的安卓包

uni-app项目manifest.json配置详解:安卓打包的核心艺术 第一次在HBuilderX里点击"发行到安卓"时,看着生成的APK文件从3MB突然膨胀到20MB,我盯着manifest.json里那个被忽略的"useAndroidX": true配置陷入了沉思。这个看似…...

视频生成模型评估标准UniVBench解析与应用

1. 项目概述:视频生成模型评估的痛点与突破在AIGC技术爆发的当下,视频生成模型如Runway、Pika、Sora等层出不穷,但行业长期缺乏统一的评估标准。开发者常陷入"生成效果看似不错但难以量化比较"的困境,而传统人工评估又存…...

Docker Compose启动Jumpserver报错?手把手教你解决‘mkdir /host_mnt/opt: permission denied‘

Docker Compose部署Jumpserver权限问题深度解析与实战指南 在容器化技术普及的今天,Docker Compose因其便捷性成为部署复杂应用的首选工具。然而,当我们在Mac或Windows系统上使用Docker Desktop部署Jumpserver这类企业级堡垒机时,经常会遇到一…...

爬虫进化论:用 asyncio.gather 把 Python 协程并发推向极致——从单线程阻塞到毫秒级万页抓取的实战之路

目录 从零开始:什么是 asyncio.gather? 第一个真正的异步爬虫:不会有人再笑你慢了 实战案例:爬取 500 个新闻页面,看看到底能快多少 同步版本(requests + for) 异步版本(asyncio.gather + httpx) 核心进阶:你一定会踩的三个坑(以及怎么优雅地爬出来) 坑一:…...

VLA-4D:4D视觉与语言融合的智能机器人操作框架

1. 项目概述VLA-4D是一个将4D视觉感知与语言指令相结合的机器人操作框架,它解决了传统机器人系统在动态环境中执行复杂任务时面临的三大核心挑战:时空连续性理解、多模态信息融合和动作序列生成。我在工业机器人应用领域工作多年,亲眼见证了从…...

手把手教你CNVD漏洞挖掘 + 资产收集(看完你也可以轻松做到!)网络安全实战教程分享

文章目录前言2、信息收集——github自动化工具——GitDorker3、资产收集4 漏洞猎杀漏洞一:弱口令漏洞漏洞二:垂直越权漏洞5 垂直越权漏洞通杀6 总结前言 挖掘CNVD漏洞有时候其实比一般的edusrc还好挖,但是一般要挖证书的话,还是需…...

别再死记硬背公式了!用面包板和555定时器,10分钟亲手搭一个Boost升压电路

别再死记硬背公式了!用面包板和555定时器,10分钟亲手搭一个Boost升压电路 周末的工作台上散落着几枚电子元件,阳光透过窗户洒在面包板的金属插孔上——这可能是理解开关电源原理最浪漫的方式。当大多数教材还在用微分方程解释Boost电路时&…...

LLM与Three.js结合实现高效3D虚拟场景生成

1. 项目概述:当代码生成遇见虚拟世界构建去年在开发一个教育类VR项目时,我遇到了一个棘手问题:手工构建3D场景的效率完全跟不上内容需求。正当团队焦头烂额之际,GPT-4的代码生成能力让我们看到了新可能——用自然语言描述直接生成…...

WebSailor-V2:基于强化学习的智能浏览器操作框架解析

1. 项目概述:当浏览器遇上强化学习最近在GitHub上发现一个有意思的开源项目WebSailor-V2,它本质上是一个能自主操作浏览器的AI智能体。不同于传统爬虫需要预设规则,这个项目通过合成数据训练强化学习的组合拳,让AI学会像人类一样探…...

从月均3个询盘到66+!揭秘一家TOB环保企业如何用短视频打破“冷启动”

作为一家深耕室内环境健康的ToB服务商,他们手握专业的治理技术和CMA认证资质,但在抖音和视频号的推广上却碰了一鼻子灰。在找到正确路径前,他们的账号像大多数传统B端企业一样,陷入了典型的“自嗨”陷阱。 😫 至暗时刻…...