ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

LangChain、LangGraph与MCP协议:构建生产级AI Agent的架构指南

LangChain、LangGraph与MCP协议:构建生产级AI Agent的架构指南 如果你正在尝试用 LangChain、LangGraph 和 MCP 来构建一个真正能用的 AI Agent却总在“环境配置报错”、“Agent 逻辑混乱”和“工具调用失败”这几个地方反复踩坑那么这篇文章就是为你准备的。这不是一篇简单的概念介绍。市面上很多教程只告诉你“Agent 是未来的方向”却很少说清楚为什么你的 Agent 总是执行到一半就崩溃为什么明明集成了工具却调用不起来为什么简单的任务流用 LangGraph 写出来反而更复杂了问题的核心往往不在于代码语法而在于对这几个框架职责边界和协作模式的理解偏差。本文将基于 2026 年的技术栈视角为你彻底厘清 LangChain、MCP (Model Context Protocol) 和 LangGraph 在构建生产级 Agent 时的正确角色。你会看到一套从零开始、可落地的实战方案重点不是复述 API而是剖析那些导致 99% 项目失败的典型误区并提供经过验证的最佳实践。无论你是想快速搭建一个原型还是为复杂业务设计一个可靠的智能体本文都将帮你避开那些教科书里不会写的“坑”。1. 重新定义“正确使用”Agent 工具链的核心误区与正解在开始写代码之前我们必须先达成一个共识LangChain、MCP、LangGraph 不是三选一而是各司其职的“铁三角”。很多初学者失败的第一步就是混淆了它们的职责。LangChain你的“粘合剂”与“工具箱”。它的核心价值在于提供了大量预构建的组件LLM 调用、文本分割、向量存储、记忆管理等和一套标准的连接方式。你应该用它来快速集成各种大模型、文档加载器和工具而不是用它来编写复杂的、有状态的任务流程。误区试图用 LangChain 的原生 Agent 执行多步骤、带循环或复杂状态转移的任务结果代码变得难以维护。LangGraph你的“流程大脑”与“状态机”。它专为描述复杂、有状态的工作流而生。如果你的 Agent 需要根据上一步的结果决定下一步或者需要在多个工具间循环调用直到满足条件那么 LangGraph 是你的不二之选。正解用 LangGraph 来清晰定义 Agent 的决策逻辑和状态流转让 LangChain 的组件作为图中的“节点”。MCP (Model Context Protocol)你的“工具接入标准”。这是最容易让人困惑的部分。MCP 不是一个具体的库而是一个协议。它定义了大模型或 Agent如何以标准化、安全的方式发现、调用外部工具如数据库、API、文件系统。你可以把它理解为工具的“USB-C 接口”。误区认为 MCP 是 LangChain 的替代品。正解MCP 用于规范工具的定义和暴露而 LangChain 或 LangGraph 可以作为 MCP 服务器的消费者Client来调用这些工具。一个典型的失败架构是用 LangChain 硬编码一个冗长的顺序执行链里面混着工具调用、条件判断和记忆更新代码像一团乱麻。而一个成功的架构是用 LangGraph 绘制清晰的工作流图图中的每个节点使用 LangChain 的标准化组件来执行具体操作如调用 LLM、检索记忆同时通过 MCP 协议来安全、灵活地接入外部工具。接下来的内容我们将围绕这个“铁三角”架构一步步构建一个实战项目。2. 环境准备避开依赖地狱的现代 Python 工作流假设我们基于 Python 环境。2026 年Python 的包管理和环境隔离已是必备技能。强烈建议使用uv或pdm这类现代、快速的工具替代pip但为了通用性这里仍以pip配合venv演示。核心在于锁定版本避免依赖冲突。步骤 1创建并激活虚拟环境这是避免系统 Python 环境被污染的第一步。# 创建项目目录并进入 mkdir ai-agent-tutorial cd ai-agent-tutorial # 创建虚拟环境 python -m venv .venv # 激活虚拟环境 # Windows .venv\Scripts\activate # Linux/macOS source .venv/bin/activate步骤 2创建并编辑requirements.txt文件版本是关键。以下是一个经过验证的、兼容性较好的版本组合涵盖了核心框架和常用工具。# 核心框架 langchain0.2.0 langchain-core0.2.0 langgraph0.0.52 # 用于演示的MCP服务器与客户端库 # 注意MCP协议本身有多种实现这里使用一个流行的社区实现作为示例 mcp0.1.0 # OpenAI 模型调用也可替换为其他供应商 openai1.12.0 # 用于示例工具如计算、搜索 requests2.31.0 duckduckgo-search5.0.0 # 环境变量管理 python-dotenv1.0.0重要提示mcp包名可能因具体实现而异。本文以概念和协议讲解为主实操部分会模拟 MCP 的交互模式。在实际项目中请根据你选择的 MCP 服务器实现如mcp-server-framework来安装对应的客户端库。步骤 3安装依赖pip install -r requirements.txt步骤 4配置 API 密钥在项目根目录创建.env文件存放敏感信息。# .env 文件内容 OPENAI_API_KEYsk-your-openai-api-key-here # 其他API密钥...在代码中通过dotenv加载# config.py import os from dotenv import load_dotenv load_dotenv() OPENAI_API_KEY os.getenv(OPENAI_API_KEY) if not OPENAI_API_KEY: raise ValueError(请在 .env 文件中设置 OPENAI_API_KEY)完成以上四步一个干净、可控的开发环境就准备好了。这能解决未来 50% 的“莫名其妙”的错误。3. 核心概念精讲LangChain、LangGraph、MCP 到底在做什么让我们用更形象的比喻和对比来深化理解。3.1 LangChain乐高积木箱LangChain 提供了丰富的基础“积木块”LLM各种大模型的调用封装。PromptTemplate提示词模板。OutputParser解析模型输出。Memory对话记忆管理。Retriever检索器。Tool工具抽象。你可以用这些积木快速拼出一个简单的机器人比如“问答机器人”。但当你想要拼一个能自己走路、遇到障碍会转弯、还能回家充电的“智能机器人”时只用积木堆砌结构会非常脆弱。这就是 LangChain 的边界——它擅长提供零件和简单的组装但不擅长定义复杂的“行为逻辑”。3.2 LangGraph机器人行为流程图LangGraph 让你可以画一张“行为流程图”。这张图定义了状态State机器人当前知道的所有信息位置、电量、任务列表。节点Nodes机器人可以执行的动作前进、转向、检查电量。边Edges根据动作结果决定下一个动作是什么如果碰到墙则转向如果电量低则回家。这个“图”是可执行的。LangGraph 的核心是StateGraph你定义好状态结构、节点函数和路由逻辑它就能帮你管理整个工作流的执行和状态流转。它让复杂的、有状态的逻辑变得可视化和可维护。3.3 MCP工具世界的“插座标准”想象你的机器人需要用电钻、螺丝刀、吸尘器等多种工具。如果没有标准每个工具都需要特制的接口接线会非常混乱。MCP 就是工具的“插座标准”。它规定工具服务器Server任何工具如数据库、日历 API、文件系统都可以按照 MCP 协议实现一个服务器对外宣告“我这里有哪些工具list_tools每个工具怎么用call_tool。”客户端Client你的 Agent通过 LangChain 或 LangGraph可以作为 MCP 客户端连接到这些服务器动态地发现并调用工具而无需在代码里硬编码每个工具的调用细节。这样做的好处解耦工具开发和 Agent 开发可以独立进行。安全工具服务器可以控制访问权限和输入验证。动态性Agent 可以在运行时发现新的可用工具。3.4 三者关系总结组件角色核心产出适用场景LangChain组件供应商LLM,Tool,Memory等可复用对象快速构建简单链为复杂图提供标准化节点LangGraph流程设计师有向图管理复杂、有状态的工作流多步骤决策、循环、条件分支、长期任务MCP工具接口标准协议规范实现工具的动态发现与安全调用需要集成大量外部服务或工具追求架构灵活性理解了这些你就知道在项目的不同部分该用哪个工具了。4. 实战项目构建一个“研究助手”Agent现在我们构建一个“研究助手”Agent。它的任务是根据用户提出的一个复杂问题例如“对比 LangChain 和 LangGraph 的优缺点”自动进行网络搜索、总结信息并最终生成一份结构化的报告。需求分析这是一个多步骤任务理解问题 - 规划搜索词 - 执行搜索 - 分析结果 - 生成报告。步骤间有依赖生成报告需要搜索和分析的结果。可能需要迭代如果第一次搜索结果不理想需要调整搜索词重新搜索。 这正是 LangGraph 发挥作用的场景。我们将用 LangGraph 定义流程用 LangChain 的组件处理 LLM 交互和搜索并模拟 MCP 的思想来管理工具。4.1 定义 Agent 的状态首先我们需要定义工作流在整个执行过程中需要维护哪些信息。这是 LangGraph 的起点。# state.py from typing import TypedDict, List, Optional, Annotated import operator class AgentState(TypedDict): Agent 的全局状态定义 # 用户输入的原问题 original_question: str # 由LLM生成的搜索查询词列表 search_queries: List[str] # 从网络搜索得到的结果列表 search_results: List[str] # 对搜索结果进行分析后的摘要 analysis: Optional[str] # 最终生成的报告 final_report: Optional[str] # 一个通用字段用于在节点间传递临时信息或错误信息 scratchpad: Annotated[str, operator.add]解释TypedDict清晰地定义了状态的“形状”。Annotated[str, operator.add]是 LangGraph 的一个高级特性表示scratchpad字段是一个字符串当多个节点写入它时内容会被追加add而不是覆盖。这对于记录思维链或中间步骤非常有用。4.2 构建 LangGraph 工作流我们将工作流分解为以下几个节点并定义它们之间的流转逻辑。# graph.py from langgraph.graph import StateGraph, END from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate from langchain_community.tools import DuckDuckGoSearchRun from .state import AgentState import json # 初始化核心组件 llm ChatOpenAI(modelgpt-4o-mini, temperature0) # 使用一个较小、较快的模型 search_tool DuckDuckGoSearchRun() # 一个简单的搜索工具 # 1. 节点规划搜索词 def plan_search_queries(state: AgentState) - AgentState: 根据用户问题规划出几个有效的搜索关键词。 prompt ChatPromptTemplate.from_messages([ (system, 你是一个善于信息检索的助手。请将用户复杂的问题分解成2-3个最有效的网络搜索关键词。只返回一个JSON数组不要任何解释。), (human, 用户的问题是{question}) ]) chain prompt | llm response chain.invoke({question: state[original_question]}) try: queries json.loads(response.content) if isinstance(queries, list): state[search_queries] queries state[scratchpad] f\n[规划节点] 已生成搜索词{queries} else: state[search_queries] [state[original_question]] state[scratchpad] f\n[规划节点] LLM返回格式错误使用原问题作为搜索词。 except json.JSONDecodeError: state[search_queries] [state[original_question]] state[scratchpad] f\n[规划节点] 解析JSON失败使用原问题作为搜索词。 return state # 2. 节点执行网络搜索 def execute_web_search(state: AgentState) - AgentState: 使用搜索工具执行规划好的搜索查询。 all_results [] for query in state.get(search_queries, []): try: result search_tool.run(query) all_results.append(f## 搜索词{query}\n结果{result}\n) except Exception as e: all_results.append(f## 搜索词{query}\n搜索失败{str(e)}\n) state[search_results] all_results state[scratchpad] f\n[搜索节点] 已完成 {len(all_results)} 次搜索。 return state # 3. 节点分析与总结 def analyze_results(state: AgentState) - AgentState: 对搜索结果进行综合分析与总结。 if not state.get(search_results): state[analysis] 未获取到有效的搜索结果。 return state results_text \n---\n.join(state[search_results]) prompt ChatPromptTemplate.from_messages([ (system, 你是一个分析专家。请基于以下网络搜索结果提炼出核心观点、事实和不同来源间的异同。请用清晰、有条理的段落进行总结。), (human, 用户原问题{question}\n\n搜索结果\n{results}) ]) chain prompt | llm response chain.invoke({ question: state[original_question], results: results_text[:4000] # 防止上下文过长 }) state[analysis] response.content state[scratchpad] f\n[分析节点] 已完成信息提炼。 return state # 4. 节点生成最终报告 def generate_final_report(state: AgentState) - AgentState: 基于分析结果生成结构化的最终报告。 if not state.get(analysis): state[final_report] 无法生成报告分析内容为空。 return state prompt ChatPromptTemplate.from_messages([ (system, 你是一个专业的报告撰写者。请根据以下分析摘要生成一份结构完整、易于阅读的最终报告。报告应包含概述、主要发现、细节论述、总结。), (human, 分析摘要{analysis}) ]) chain prompt | llm response chain.invoke({analysis: state[analysis]}) state[final_report] response.content state[scratchpad] f\n[报告节点] 报告已生成。 return state # 5. 构建图 def create_research_agent_graph(): 创建并返回研究助手的工作流图 workflow StateGraph(AgentState) # 添加节点 workflow.add_node(plan, plan_search_queries) workflow.add_node(search, execute_web_search) workflow.add_node(analyze, analyze_results) workflow.add_node(report, generate_final_report) # 定义边流程 workflow.set_entry_point(plan) workflow.add_edge(plan, search) workflow.add_edge(search, analyze) workflow.add_edge(analyze, report) workflow.add_edge(report, END) # 结束 # 编译图 return workflow.compile()这个图是一个简单的线性流程规划 - 搜索 - 分析 - 报告。在更复杂的场景中你可以在analyze节点后增加一个“判断”节点如果分析结果不充分可以路由回plan节点生成新的搜索词形成循环。4.3 模拟 MCP 思想工具的动态化管理在上面的例子中我们直接实例化了DuckDuckGoSearchRun工具。在一个更符合 MCP 理念的架构中工具应该被独立管理。下面我们模拟一个简单的“工具注册中心”它类似于一个本地的、简化的 MCP 服务器角色。# tool_manager.py class ToolManager: 一个简单的工具管理器模拟MCP服务器的部分理念。 def __init__(self): self._tools {} def register_tool(self, name: str, tool_func, description: str): 注册一个工具。 self._tools[name] { func: tool_func, description: description } print(f[ToolManager] 工具 {name} 已注册。) def list_tools(self): 列出所有可用工具。 return {name: info[description] for name, info in self._tools.items()} def call_tool(self, name: str, **kwargs): 调用指定工具。 if name not in self._tools: raise ValueError(f工具 {name} 未注册。) print(f[ToolManager] 正在调用工具: {name}参数: {kwargs}) return self._tools[name][func](**kwargs) # 在主程序中初始化并使用 def main(): from graph import create_research_agent_graph # 初始化工具管理器 tool_manager ToolManager() # 注册工具这里注册一个计算器工具和一个搜索工具 import requests from duckduckgo_search import DDGS def search_web(query: str) - str: with DDGS() as ddgs: results list(ddgs.text(query, max_results3)) return \n.join([f{r[title]}: {r[body]} for r in results]) def calculate(expression: str) - str: try: # 这是一个非常简单的计算生产环境请使用更安全的eval或库 result eval(expression, {__builtins__: {}}, {}) return str(result) except Exception as e: return f计算错误: {e} tool_manager.register_tool(web_search, search_web, 执行网络搜索返回摘要。) tool_manager.register_tool(calculator, calculate, 计算数学表达式。) # 现在我们的Agent节点可以通过tool_manager来调用工具而不是硬编码。 # 这为未来替换或动态添加工具提供了灵活性。 print(可用工具:, tool_manager.list_tools()) # 测试工具调用 # search_result tool_manager.call_tool(web_search, queryLangGraph 教程) # print(search_result[:200]) # 创建并运行Agent图 app create_research_agent_graph() # 注意为了简化我们上面的graph.py中仍直接使用了search_tool。 # 在实际项目中应将tool_manager注入到节点函数中或通过状态传递。 initial_state: AgentState { original_question: LangChain 和 LangGraph 的主要区别和各自适用场景是什么, search_queries: [], search_results: [], analysis: None, final_report: None, scratchpad: 开始执行...\n } print(\n--- 开始执行研究助手Agent ---) final_state app.invoke(initial_state) print(\n--- 执行完成 ---) print(f最终报告预览:\n{final_state[final_report][:500]}...) print(f\n完整执行记录 (scratchpad):\n{final_state[scratchpad]}) if __name__ __main__: main()这个ToolManager类模拟了 MCP 的核心思想集中注册、统一调用。在实际项目中你可以将其替换为真正的 MCP 客户端连接到独立的 MCP 服务器如一个提供数据库查询、内部 API 调用的服务器。5. 运行与验证观察 Agent 的思考与行动将以上代码模块 (state.py,graph.py,tool_manager.py) 放在同一目录下并确保.env文件中的OPENAI_API_KEY已正确设置。运行tool_manager.py中的main()函数。预期输出与观察点工具注册成功控制台会打印[ToolManager] 工具 web_search 已注册。等信息。图执行流程观察scratchpad字段的输出它会清晰地记录 Agent 每一步做了什么“[规划节点] 已生成搜索词...”、“[搜索节点] 已完成 X 次搜索。”等。最终结果你会看到生成的一份关于“LangChain 和 LangGraph 区别”的报告预览。报告内容应该结构清晰基于真实的网络搜索结果如果搜索工具可用。如何验证成功流程完整性scratchpad记录了所有预设节点的执行。状态流转final_state字典中的search_queries,search_results,analysis,final_report字段都应有合理的内容填充。结果质量final_report的内容应直接回答初始问题并且不是简单的模型臆测而是体现了对搜索结果的整合分析。6. 进阶引入条件循环与人工审核一个真正智能的 Agent 不应该只是线性执行。让我们改进上面的图增加一个“判断”节点如果分析结果的内容长度太短模拟信息不足则重新规划搜索词再次搜索。我们需要修改graph.py中的图定义部分# graph.py (进阶部分) from langgraph.graph import StateGraph, END from langgraph.graph import START # ... 其他导入和节点函数定义保持不变 ... def should_continue(state: AgentState) - str: 判断节点分析结果是否足够好决定下一步是生成报告还是重新搜索。 analysis state.get(analysis, ) # 一个简单的判断逻辑如果分析结果少于100个字符则认为信息不足 if len(analysis) 100: state[scratchpad] f\n[判断节点] 分析内容过短 ({len(analysis)} 字符)需要重新搜索。 return plan # 返回plan节点重新规划搜索词注意这会导致循环 else: state[scratchpad] f\n[判断节点] 分析内容充足 ({len(analysis)} 字符)继续生成报告。 return report def create_research_agent_graph_with_loop(): 创建带循环判断的研究助手工作流图 workflow StateGraph(AgentState) # 添加节点 (同上) workflow.add_node(plan, plan_search_queries) workflow.add_node(search, execute_web_search) workflow.add_node(analyze, analyze_results) workflow.add_node(report, generate_final_report) # 定义流程 workflow.set_entry_point(plan) workflow.add_edge(plan, search) workflow.add_edge(search, analyze) # 关键变化analyze 之后不直接连 report而是连接到一个判断函数 workflow.add_conditional_edges( analyze, should_continue, # 这个函数返回下一个节点的名字 { plan: plan, # 如果返回plan则跳回plan节点 report: report, # 如果返回report则前往report节点 } ) workflow.add_edge(report, END) # 重要防止无限循环可以设置最大迭代次数。 # LangGraph 提供了 interrupt_before 或 interrupt_after 机制也可以在状态中加计数器。 # 这里为了演示我们依赖简单的长度判断实际项目需更健壮的逻辑。 return workflow.compile()在这个进阶图中analyze节点之后的工作流不再是固定的。should_continue函数像一个调度员检查analysis的质量并决定是去生成报告还是回去重新规划搜索。这就构成了一个简单的循环直到满足条件为止。这是 LangGraph 相比简单链的核心优势轻松处理非线性、有条件的工作流。7. 常见问题与排查思路在开发过程中你几乎一定会遇到以下问题。这里提供排查思路。问题现象可能原因排查方式解决方案导入 LangChain/LangGraph 模块失败1. 未安装包。2. 虚拟环境未激活。3. 包版本冲突。1.pip list | grep langchain检查。2. 确认终端提示符前有(.venv)。3. 查看错误信息通常是某个依赖版本不兼容。1. 重新安装指定版本。2. 激活虚拟环境。3. 创建全新的虚拟环境严格按照requirements.txt安装。运行时报OpenAI API错误1. API 密钥未设置或错误。2. 网络问题。3. 额度不足或模型不可用。1. 检查.env文件变量名和值是否正确。2. 在代码中打印os.getenv(“OPENAI_API_KEY”)的前几位验证。3. 尝试在 OpenAI 平台进行简单测试。1. 修正.env文件。2. 确保网络通畅。3. 检查账单和模型权限。Agent 执行卡住或陷入死循环1. 图中存在未正确终止的循环。2. 条件判断函数逻辑有误始终返回同一个节点。3. 工具调用超时或失败。1. 打印scratchpad或状态观察在哪一步循环。2. 检查should_continue类函数的返回值逻辑。3. 查看工具调用是否有异常被吞没。1. 在状态中添加iteration_count字段在判断函数中限制最大次数。2. 修正条件逻辑确保有出口。3. 为工具调用添加超时和异常捕获。搜索工具返回空或错误1. 搜索工具 API 变更或失效。2. 查询词格式问题。3. 网络限制。1. 单独写一个脚本测试搜索工具。2. 打印出实际发送的查询词。3. 尝试更换搜索工具如SerpAPI。1. 查看对应工具库的文档和 issue。2. 对查询词进行清洗或编码。3. 考虑使用代理或更换工具提供商。生成的报告质量差1. 搜索到的信息质量低。2. LLM 的提示词Prompt不够精确。3. 上下文过长丢失关键信息。1. 检查search_results的内容。2. 审查plan_search_queries和analyze_results节点的提示词。3. 打印传递给 LLM 的最终消息长度。1. 优化搜索词生成逻辑或使用更精准的搜索源。2. 迭代优化提示词加入更明确的指令和示例。3. 对搜索结果进行筛选、去重和摘要再喂给分析节点。MCP 服务器连接失败1. 服务器未启动或地址错误。2. 协议版本不兼容。3. 认证失败。1. 使用curl或客户端测试连接。2. 检查服务器和客户端的日志。3. 验证认证信息如令牌。1. 确认服务器运行状态和端口。2. 统一服务器和客户端的 MCP 实现版本。3. 检查并配置正确的认证头或参数。8. 最佳实践与工程建议遵循这些建议能让你的 Agent 项目从“玩具”进阶到“可用的工具”。状态设计要精简而充分State是 LangGraph 的核心。字段太少信息不够用字段太多难以维护且影响性能。只存储工作流真正需要流转和更新的数据。节点函数保持纯净与可测试每个节点函数应尽量只做一件事并且副作用小。理想情况下它只读取和修改State不依赖全局变量。这样便于单元测试和复用。善用scratchpad进行调试就像上面的例子在状态中预留一个scratchpad字段让每个节点都把关键操作和结果追加进去。这是追踪 Agent “思考过程”最直观的方式。为循环设置安全阀任何带有循环或条件分支的图都必须有明确的退出机制。可以通过状态中的计数器或者在条件函数中判断超时来避免无限循环。将工具调用与业务逻辑分离采用ToolManager或直接集成 MCP 客户端来管理工具。不要让工具调用的细节如 API 密钥、请求参数构造污染你的节点业务逻辑。提示词Prompt是另一门工程Agent 的智能程度很大程度上取决于提示词。将提示词模板化、外部化如放在prompts/目录的.txt文件中方便迭代优化和 A/B 测试。考虑持久化与可视化对于复杂的工作流考虑将State序列化存储到数据库以便中断后恢复。LangGraph 也支持将图导出为可视化格式如 PNG这对于团队理解和调试流程至关重要。生产环境部署注意将 Agent 作为服务部署时需要处理并发、超时、限流、监控和日志。考虑使用像FastAPI封装图并加入 Prometheus 指标和结构化日志如structlog。9. 总结从项目到架构的思维转变通过这个完整的“研究助手”项目你应该能清晰地感受到 LangChain、LangGraph 和 MCP 协议在构建 AI Agent 时所扮演的不同角色。正确的使用方式是让它们协同工作而不是孤立地选择其中一个。起步时用 LangChain 快速搭建原型验证想法。当逻辑变复杂时毫不犹豫地引入 LangGraph 来管理状态和流程。它会迫使你更清晰地思考 Agent 的决策逻辑。当需要集成大量外部能力时研究并引入 MCP 协议。它带来的解耦和灵活性在长期项目维护中价值巨大。这篇文章带你避开了“混淆框架职责”、“硬编码复杂流程”、“工具管理混乱”这几个最大的弯路。剩下的路需要你在具体的业务场景中不断优化提示词、完善工具集、设计更鲁棒的状态流转逻辑。记住构建一个可靠的 Agent 是一个迭代过程从简单可用的线性流程开始逐步增加智能和复杂性并用扎实的工程实践为其护航。
返回列表