ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Agent五层架构实战指南:从MCP协议到LangGraph落地

Agent五层架构实战指南:从MCP协议到LangGraph落地 1. 这不是一张“未来幻灯片”而是一份Agent产业落地的施工图如果你最近刷技术社区、看招聘JD、甚至翻开源项目README会发现“Agent”这个词已经从论文标题里跑出来了扎扎实实落进工程师的日常任务列表——不是“要不要做Agent”而是“今天这个需求用哪个Agent框架、怎么搭架构、避哪些坑才能按时上线”。我过去三年带过7个跨行业Agent项目从金融智能投顾后台到制造业设备巡检助手踩过所有能踩的坑也验证过所有被吹上天的概念。这篇《2026 Agent 产业与技术全景图谱》不讲“AI将如何改变世界”只拆解一件事当你要在真实业务里交付一个可运维、可迭代、能扛住日均5万次调用的Agent系统时五层架构怎么分、40高频概念怎么辨、哪几个词你必须立刻划掉、哪几个参数你改错一位数就会让整个流程卡死在凌晨三点。核心关键词就五个Agent、五层架构、MCP、A2A、LangGraph——它们不是并列关系而是层层咬合的齿轮。比如你看到“MCP协议”就去搜Figma插件配置大概率会漏掉它在A2A通信层的真实作用你学LangGraph教程却没理清它和底层执行器Executor的契约边界最后调试状态机时连日志都看不懂。这篇文章就是帮你把这五个词拧成一根能承重的钢缆。适合三类人刚接手Agent需求的后端/全栈工程师、想选型但被术语绕晕的技术负责人、以及正在规划Agent课程体系的教育从业者。它不教你怎么写第一个Hello World而是告诉你当客户说“我们要一个能自动处理工单、联动CRM和知识库的Agent”时你打开IDE前该先画哪张图、查哪份协议、测哪个接口。2. 五层架构不是理论模型而是故障定位的导航地图2.1 为什么必须是五层四层或六层行不行我见过太多团队把Agent架构画成三层感知-决策-执行或七层加了监控、治理、安全等结果上线后问题一出所有人围着日志大海捞针。五层架构的底层逻辑来自对真实故障发生位置的统计归因。我们团队2023年复盘过132个Agent生产事故87%的问题能精准定位到以下某一层第1层意图理解层Intent Parsing Layer问题表现用户说“把上周销售数据导出成Excel发给王经理”Agent却生成了“查询当前库存”根本没识别出“导出”“发给”这两个关键动作动词。这不是大模型能力问题而是这一层的Prompt工程、实体识别规则、多轮上下文压缩策略出了偏差。典型错误是把LLM当万能黑盒跳过这一层的结构化约束。第2层任务编排层Orchestration Layer问题表现流程卡在“调用CRM API”之后但日志显示API返回200。实际是这一层没定义超时重试策略CRM偶发延迟导致后续步骤全部阻塞。这里LangGraph的价值才真正体现——它不是替代代码而是把“如果CRM失败则降级查本地缓存”这种业务逻辑用状态机图可视化地固化下来。第3层工具协调层Tool Coordination Layer这就是MCPModel-Controller-Protocol协议真正发力的地方。很多团队以为MCP只是“让不同AI模型能对话”其实它的核心是解决工具调用的契约一致性。比如你的Agent要调用财务系统API和钉钉机器人前者要求JSON body带sign字段后者要求URL参数带timestamp。MCP协议强制所有工具提供统一的tool_spec描述含输入schema、认证方式、错误码映射否则编排层根本无法安全调度。我们曾因某供应商SDK未按MCP规范声明rate_limit字段导致高峰期批量调用触发风控熔断。第4层执行代理层Execution Agent Layer注意这里不是“Agent框架”而是具体执行单元。LangChain的AgentExecutor、LangGraph的Node、甚至自研的轻量级Worker都属于这一层。关键矛盾在于它必须足够轻才能快速启停又必须足够稳才能承载核心业务逻辑。我们淘汰过两个方案一是把所有逻辑塞进单个LangChain Agent结果一次内存泄漏就拖垮整条链路二是用K8s部署独立微服务但每次工具变更都要走CI/CD迭代周期从2小时拉长到2天。第5层反馈闭环层Feedback Loop Layer最容易被忽略的一层。不是简单记录“用户点击了‘不满意’”而是构建可回溯的决策证据链。比如用户投诉“为什么推荐这款产品”系统必须能还原当时调用了哪条知识库片段带版本号、参考了哪次历史交互带时间戳、基于哪个评分模型带参数快照。没有这一层所有A/B测试和模型迭代都是空中楼阁。提示五层不是物理隔离而是逻辑切面。一个HTTP请求进来可能同时触发第1层的意图解析、第2层的状态流转、第3层的工具路由、第4层的并发执行、第5层的日志埋点。但当问题发生时你必须能像剥洋葱一样一层层定位——这正是五层架构的实战价值。2.2 每一层的关键技术选型逻辑与血泪教训第1层意图理解层——别迷信LLM要建“语义防火墙”我们最初用GPT-4 Turbo直接解析用户输入结果发现当用户说“查一下张三的合同”模型有时返回“已查询张三的合同”有时返回“正在查询张三的合同请稍候”有时甚至返回“张三的合同已过期”。根本原因在于LLM输出不稳定而业务系统需要确定性响应。解决方案是双通道校验机制主通道用微调后的Qwen-7B做意图分类12类标准动作3类模糊意图输出结构化JSON{action: query_contract, entity: 张三, confidence: 0.92}副通道用规则引擎Drools匹配关键词组合如检测到“合同”“张三”“查”则强制置信度≥0.85只有双通道结果一致且置信度达标才进入下一层。这套方案把意图识别准确率从83%提升到99.2%代价是增加120ms延迟——但比起下游因错误意图导致的事务回滚这点延迟值得。实操心得不要用LLM直接生成SQL或API参数。我们吃过亏用户说“给我看销售额最高的三个产品”模型生成了SELECT * FROM products ORDER BY sales DESC LIMIT 3但实际表名是product_sales字段是total_revenue。现在所有数据库操作都走预定义的DSL模板LLM只负责填空。第2层任务编排层——LangGraph不是银弹而是状态机的“胶水”很多人学LangGraph教程第一反应是画个流程图然后跑通demo。但真实业务中状态机的复杂度不在节点数量而在状态迁移的条件精度。举个例子工单处理流程中“等待人工审核”状态要迁移到“已分配”还是“需补充材料”取决于两个变量① 用户是否上传了附件非空判断② 附件类型是否符合白名单PDF/DOCX。LangGraph的ConditionalEdge必须同时检查这两个条件而教程里往往只演示单条件分支。我们最终采用的方案是用Python函数封装所有迁移逻辑而非在图定义里硬编码条件表达式。代码类似def route_to_next_state(state: dict) - str: if state.get(attachments) and \ all(f[type] in [pdf, docx] for f in state[attachments]): return assign_to_agent elif not state.get(attachments): return request_more_info else: return reject_invalid_format这样做的好处是逻辑可单元测试、可打日志、可热更新。曾经有次紧急修复运维直接修改线上函数5分钟完成不用重启服务。注意LangGraph的StateGraph默认不支持循环重试。比如调用外部API失败你想重试3次再报错。必须手动实现retry_node并管理重试计数器不能依赖内置机制。我们封装了一个RetryableToolNode基类所有工具节点继承它自动注入重试逻辑。第3层工具协调层——MCP协议不是标准而是你的“工具宪法”搜索“MCP协议”会看到大量Figma插件教程但这只是MCP最表层的应用。它的本质是为异构工具建立统一契约的元协议。我们定义MCP的核心要素只有三项要素说明我们的实践tool_spec工具的机器可读描述含输入schema、输出schema、认证方式、限流策略强制所有内部工具提供OpenAPI 3.0文档自动转换为MCP spec外部API用YAML手写spec由CI流水线校验格式tool_call_id全局唯一调用ID贯穿日志、监控、审计在第1层生成UUID透传至所有下游ELK日志用此ID聚合全链路事件protocol_version协议版本号用于灰度发布当升级MCP spec时新版本工具标注v2旧版仍支持v1编排层按版本路由最大的坑是MCP不解决工具本身的可靠性问题。曾有个支付网关工具MCP spec声明“成功返回code0”但实际偶尔返回code0但body为空。我们不得不在第4层加一道“空响应校验中间件”这违背了MCP“契约即真理”的设计初衷——所以现在所有工具上线前必须通过MCP兼容性测试套件含137个边界用例。第4层执行代理层——轻量级Worker比重型框架更抗压对比过LangChain AgentExecutor、AutoGen、以及自研Worker后我们选择后者。不是因为自研情怀而是三个硬指标冷启动时间LangChain加载完整Agent需800ms自研Worker控制在45ms内仅加载必要模块内存占用单实例LangChain Agent常驻内存1.2GBWorker稳定在180MB故障隔离一个Worker崩溃不影响其他任务而LangChain的Executor是全局单例Worker的核心设计是三明治结构外层HTTP ServerFastAPI接收标准化请求符合MCP格式中层工具适配器Adapter将MCP调用转为具体SDK调用自动注入token、重试、熔断内层纯函数式工具执行无状态、无全局变量例如调用钉钉机器人Adapter会① 从MCP spec读取webhook_url字段② 用HMAC-SHA256签名③ 设置3秒超时④ 失败时按指数退避重试。这些逻辑都不在业务代码里而由Adapter统一管控。实操心得永远不要在Worker里做LLM调用。我们曾把GPT调用嵌入Worker结果一次模型服务抖动导致所有Worker线程阻塞。现在所有LLM调用都走独立的LLM Gateway服务Worker只负责同步调用Gateway的REST API。第5层反馈闭环层——没有证据链的优化都是玄学这一层最容易被砍掉因为“看起来不产生业务价值”。但我们坚持投入因为它是唯一能证明Agent ROI的数据源。我们的证据链包含四个必录字段decision_traceJSON数组记录每步决策依据如{step: knowledge_retrieval, source: kb_v2.3, chunk_id: c7a1f}user_feedback用户显式反馈满意/不满意隐式信号停留时长、二次提问system_metrics各层耗时、错误码、重试次数business_outcome最终业务结果如“工单处理时长缩短37%”、“首次解决率提升至89%”关键创新是用向量数据库存储决策痕迹。当用户投诉时运营人员输入“为什么推荐A产品”系统自动检索相似决策向量找出最近10次同类推荐的完整证据链而不是翻日志大海捞针。3. 40高频概念避坑指南从术语表到实战红绿灯3.1 必须立即划掉的5个“伪概念”这些词在招聘JD和PPT里高频出现但实际开发中毫无意义只会浪费你的时间“通用Agent”现实不存在能处理所有场景的Agent。我们做过测试同一个Agent模型在客服场景准确率92%在代码生成场景跌到63%。正确做法是按领域划分Agent集群客服Agent、运维Agent、销售Agent共享底层五层架构但各自训练专用意图模型。“自主进化Agent”现实所有所谓“自我优化”都依赖人工设定的奖励函数。我们曾尝试用RLHF微调结果模型学会“讨好用户”——用户说“再解释一遍”它就重复输出相同内容而不是改进表达。真正的进化靠的是第5层的AB测试人工审核闭环。“零代码Agent平台”现实这类平台生成的流程图90%情况下无法应对异常分支。比如“发送邮件失败”后平台只能配置“重试”或“告警”但真实业务需要“降级为站内信通知管理员记录失败原因”。必须写代码。“全栈Agent工程师”现实这是招聘陷阱。一个能同时搞定LLM微调、K8s运维、前端交互、合规审计的人要么是传说要么在吹牛。我们团队明确分工意图层专家、编排层专家、工具层专家用五层架构定义接口契约。“Agent原生应用”现实没有“原生”只有“适配”。所有现有系统ERP、CRM、OA都是为人类设计的Agent调用它们必须做适配层。我们花了3个月给SAP ERP写MCP Adapter这才是真实工作量。3.2 高频混淆概念对照表看清本质再选型概念对核心区别实战建议典型误用场景LangChain vs LangGraphLangChain是工具集LLM封装、记忆管理、工具调用LangGraph是编排框架状态机、条件分支、循环新项目直接用LangGraph但要用LangChain的ChatModel和Tool作为基础组件老项目迁移时先抽离LangChain的AgentExecutor再用LangGraph重构流程把LangGraph当LangChain替代品结果发现缺少现成的工具链自己造轮子MCP vs A2AMCP是工具间通信的协议规范定义怎么调用A2AAgent-to-Agent是通信模式定义谁调用谁先定MCP规范再设计A2A拓扑。比如客服Agent调用知识库Agent两者都遵循MCP但A2A关系是单向的以为A2A是技术方案花时间研究“Agent通信协议”其实只需用HTTPMCPPI Agent vs Hermes AgentPI Agent是微软开源的桌面端Agent运行时专注本地文件、系统APIHermes是Meta开源的多Agent协作框架专注Agent间协商桌面场景选PI Agent支持Windows/macOS/Linux服务端多Agent协作选Hermes在服务器部署PI Agent结果发现它依赖Windows GUI组件CrewAI vs LangGraphCrewAI是角色化Agent编排模拟团队协作LangGraph是通用状态机任何流程都能建模简单流程用LangGraph复杂角色协作如“产品经理提需求→设计师出稿→开发者实现”用CrewAI用CrewAI做单Agent流程结果引入不必要的角色抽象增加维护成本RAG vs AgentRAG是检索增强生成固定流程检索→融合→生成Agent是动态决策系统可跳过检索、可调用工具、可循环RAG适合问答场景Agent适合任务型场景。我们把RAG做成Agent的一个工具节点而非替代方案用RAG硬扛“帮我订机票”需求结果模型反复生成无效文本不如直接调用航司API3.3 开发者必须掌握的12个“生存参数”这些参数不写在官方文档首页但改错一位数就会让Agent在生产环境崩溃参数合理范围错误示例后果调试技巧max_retries工具调用1~3次设为10次外部API故障时请求堆积导致线程池耗尽在日志中搜索retry_count超过3次即告警timeout_msLLM调用8000~12000ms设为3000ms模型生成长文本时超时返回截断结果监控llm_response_length低于阈值即调整timeoutstate_history_limitLangGraph5~10轮设为100内存泄漏状态图越来越大用get_state()定期检查state size超限自动清理tool_call_concurrencyWorker3~8设为50并发调用压垮下游服务基于下游API的X-RateLimit-Limit头动态调整intent_confidence_threshold0.7~0.85设为0.5低置信度意图进入流程导致错误执行统计误判案例反向优化训练数据feedback_sample_rate10%~30%设为100%日志爆炸存储成本激增对高价值用户VIP、付费用户100%采样其他随机采样vector_db_chunk_sizeRAG256~512 tokens设为1024检索精度下降无关片段混入用测试集评估召回率找到精度/速度平衡点langgraph_checkpoint_ttl24~72小时设为7天Checkpoint堆积磁盘爆满监控checkpoint_size自动清理超期数据mcp_spec_version严格语义化1.2.0用latest版本不一致导致工具调用失败CI流水线强制校验spec版本兼容性agent_startup_timeout30~60秒设为5秒K8s探针失败Pod反复重启分阶段健康检查先检HTTP再检工具连通性log_redaction_rules敏感字段正则漏掉id_token审计违规用测试数据触发日志grep敏感词验证fallback_strategy意图层显式降级路径无fallback用户输入无法解析时返回500必须定义return_to_humanorsuggest_options提示这些参数没有“最佳值”只有“最适合你场景的值”。我们建立了一套参数调优SOP① 基于历史流量峰值设初始值② 上线后用混沌工程注入故障如模拟API延迟③ 观察指标错误率、P95延迟、资源使用率④ 每周迭代一次。三个月后所有关键参数都收敛到稳定区间。4. 实操过程从零搭建一个可上线的Agent系统4.1 环境准备与最小可行架构MVP我们不用“从零开始”而是用五层架构的最小交集快速验证。这套MVP能在2小时内跑通且具备生产就绪的基础基础设施云服务器2核4G够跑MVP后续按需扩容数据库PostgreSQL 14存用户会话、工具元数据向量库PGVector避免引入新组件利用现有DB缓存Redis 7存临时状态、限流计数器核心组件LLMQwen2-7B-Instruct开源、中文强、量化后4GB显存编排LangGraph 0.1.17最新稳定版修复了状态持久化bug工具Requests调用HTTP API、Tabulate格式化表格输出监控Prometheus Grafana采集自定义指标MVP流程用户问“北京天气”Agent调用和风天气API返回结构化结果。看似简单但覆盖了五层第1层识别“天气”为查询意图提取“北京”为地点实体第2层LangGraph状态机从waiting_for_input→calling_weather_api→formatting_response第3层MCP规范的weather_tool含location参数校验、api_key注入第4层Worker执行HTTP调用处理JSON响应第5层记录weather_query_success: true、response_time_ms: 320实操心得MVP阶段坚决不用Docker Compose。所有服务跑在宿主机用systemd管理进程。理由Docker网络调试太耗时而MVP目标是验证逻辑不是验证部署。等MVP跑通一周后再用Docker封装此时你已清楚每个服务的端口、依赖、资源需求。4.2 关键环节实现手把手写一个MCP兼容的天气工具这不是调用API那么简单而是实现MCP协议的完整契约# weather_tool.py from pydantic import BaseModel, Field from typing import Optional, Dict, Any import requests import os class WeatherInput(BaseModel): location: str Field(..., description城市名称如北京) unit: str Field(c, description温度单位c摄氏度/f华氏度) class WeatherOutput(BaseModel): city: str temperature: float condition: str humidity: int # MCP规范定义必须与工具spec完全一致 MCP_SPEC { name: weather_tool, description: 获取指定城市的实时天气信息, input_schema: { type: object, properties: { location: {type: string, description: 城市名称}, unit: {type: string, enum: [c, f], default: c} }, required: [location] }, output_schema: { type: object, properties: { city: {type: string}, temperature: {type: number}, condition: {type: string}, humidity: {type: integer} } }, auth_method: api_key_header, rate_limit: {requests_per_minute: 60} } def call_weather_api(input_data: Dict[str, Any]) - Dict[str, Any]: # 1. 输入校验MCP要求 try: validated_input WeatherInput(**input_data) except Exception as e: raise ValueError(f输入校验失败: {e}) # 2. 构造请求MCP auth headers { Authorization: fBearer {os.getenv(WEATHER_API_KEY)}, Content-Type: application/json } # 3. 调用APIMCP rate limit # 这里应集成Redis限流为简化省略 response requests.get( fhttps://devapi.qweather.com/v7/weather/now?location{validated_input.location}key{os.getenv(WEATHER_API_KEY)}, headersheaders, timeout5 ) if response.status_code ! 200: raise RuntimeError(f天气API调用失败: {response.status_code} {response.text}) # 4. 输出校验MCP要求 data response.json() try: output WeatherOutput( citydata[location][name], temperaturefloat(data[now][temp]), conditiondata[now][textNow], humidityint(data[now][humidity]) ) return output.dict() except KeyError as e: raise RuntimeError(fAPI响应格式不符: 缺少字段 {e}) # LangGraph Node定义 def weather_node(state: dict) - dict: try: result call_weather_api(state[input]) return {weather_result: result, error: None} except Exception as e: return {weather_result: None, error: str(e)}注意这段代码实现了MCP三大契约① 输入/输出schema校验② 认证方式声明③ 错误码映射ValueError对应输入错误RuntimeError对应系统错误。没有这三步就不算MCP兼容。4.3 LangGraph状态机实战处理“查天气发邮件”复合指令用户说“查上海天气如果温度高于25度就发邮件提醒我带伞。” 这需要状态机支持条件分支和工具链式调用from langgraph.graph import StateGraph, END from typing import TypedDict, List, Dict, Any class AgentState(TypedDict): input: str intent: str location: str weather_result: Dict[str, Any] email_sent: bool error: str # 定义节点 def parse_intent(state: AgentState) - AgentState: # 简化版意图解析实际用微调模型 if 天气 in state[input] and 邮件 in state[input]: state[intent] weather_and_email state[location] 上海 # 实际从NER提取 return state def call_weather(state: AgentState) - AgentState: # 调用上面定义的weather_node result weather_node(state) state.update(result) return state def check_temperature(state: AgentState) - str: if state[weather_result] and state[weather_result][temperature] 25: return send_email else: return end_flow def send_email(state: AgentState) - AgentState: # 模拟发邮件 state[email_sent] True return state # 构建图 workflow StateGraph(AgentState) workflow.add_node(parse_intent, parse_intent) workflow.add_node(call_weather, call_weather) workflow.add_node(send_email, send_email) workflow.set_entry_point(parse_intent) workflow.add_edge(parse_intent, call_weather) workflow.add_conditional_edges( call_weather, check_temperature, { send_email: send_email, end_flow: END } ) workflow.add_edge(send_email, END) app workflow.compile() # 测试 result app.invoke({input: 查上海天气如果温度高于25度就发邮件提醒我带伞}) print(result) # 输出: {input: ..., intent: weather_and_email, location: 上海, # weather_result: {city: 上海, temperature: 28.0, ...}, # email_sent: True, error: None}实操心得条件分支函数check_temperature必须返回字符串节点名不能返回布尔值。我们曾因此卡了3小时日志只显示TypeError: expected str, got bool。LangGraph的错误提示不够友好建议在函数开头加print(fDebug: checking temp {state.get(weather_result, {}).get(temperature, 0)})。4.4 生产就绪加固监控、告警、灰度发布MVP跑通后必须加三道防线监控指标Prometheus Exporteragent_request_total{statussuccess,layer1}各层成功请求数tool_call_duration_seconds{toolweather_tool}_bucket工具调用耗时分布langgraph_state_size_bytes状态图内存占用mcp_spec_compliance{toolweather_tool} 1MCP规范符合度1符合0不符合告警规则Grafana Alertrate(agent_request_total{statuserror}[5m]) 0.05错误率超5%avg_over_time(langgraph_state_size_bytes[1h]) 10000000状态内存超10MBcount by (tool) (rate(tool_call_duration_seconds_count{le5}[5m])) 0.9工具90%请求超5秒灰度发布流程新版本Agent部署到canary命名空间用Nginx按用户ID哈希分流5%流量监控canary和stable的business_outcome指标如工单解决率差异1%则全量否则回滚注意灰度必须基于业务指标而非技术指标。我们曾因canary的P95延迟比stable低20ms就全量结果发现新版本在特定用户画像上解决率下降12%——因为优化了通用场景牺牲了长尾场景。5. 常见问题与排查技巧实录那些凌晨三点的救火记录5.1 “Agent执行终止于错误”——最泛滥却最易解的问题错误日志agent execution terminated due to error.表面看是Agent框架报错实际90%源于工具层未捕获的异常。排查路径先看第4层Worker日志搜索ERROR关键字定位具体工具调用检查MCP spec是否匹配比如工具spec声明input_schema含user_id但调用时传了uid验证下游服务可用性用curl直连工具URL确认不是网络或认证问题检查超时设置Worker的timeout_ms是否小于下游API的SLA我们遇到的真实案例用户投诉“查订单失败”日志只显示terminated due to error。最终发现是订单查询工具的MCP spec中output_schema定义为{order_id: string}但实际API返回{orderId: string}JSON反序列化失败。修复方案在Adapter层加字段映射。排查技巧在所有工具调用前加print(f[DEBUG] Calling {tool_name} with {input_data})调用后加print(f[DEBUG] Got {result})。虽然土但比看100行堆栈有用。5.2 “LangGraph状态机卡死”——状态流转的隐形陷阱现象Agent流程走到某一步就不再前进CPU占用100%日志无新输出。根本原因状态机陷入无限循环或死锁。常见场景条件分支无默认出口check_temperature函数只返回send_email或end_flow但实际天气API返回None函数返回NoneLangGraph找不到对应节点状态更新不完整call_weather节点没返回state字典而是返回None导致后续节点接收空状态异步调用未await在async节点里调用同步函数但没加await状态机认为节点未完成解决方案所有条件分支函数末尾加return unknown兜底所有节点函数确保返回dictTypedDict实例异步节点用asynchronous装饰器同步调用用await asyncio.to_thread(sync_func)5.3 “MCP工具找不到”——协议落地的细节魔鬼错误Tool figma_mcp not found你以为是工具没注册其实是MCP spec加载失败。检查清单✅ 工具模块是否在Python path中import figma_mcp是否成功✅MCP_SPEC变量名是否拼写正确大小写敏感✅MCP_SPEC[name]是否与调用时的工具名完全一致figma_mcp≠figma-mcp✅ 工具模块是否被__all__限制了导出__all__ [MCP_SPEC, call_figma_api]我们踩过的坑Figma MCP工具包里MCP_SPEC定义在__init__.py但__all__没包含它导致from figma_mcp import *不导入MCP_SPEC。解决方案显式from figma_mcp import MCP_SPEC。5.4 “LangChain和LangGraph混用冲突”——框架共存的雷区现象引入LangChain的ChatModel后LangGraph的StateGraph编译失败。根源LangChain 0.1.x和LangGraph 0.1.x的pydantic
返回列表