资讯中心

LangChain、LangGraph与LangSmith:构建复杂AI智能体的完整技术栈解析

📅 2026/7/28 11:43:07
LangChain、LangGraph与LangSmith:构建复杂AI智能体的完整技术栈解析
在实际 AI 应用开发中构建一个能处理复杂、多步骤任务的智能体Agent是核心挑战。一个简单的问答链Chain无法应对需要动态决策、状态管理和工具调用的场景比如一个模拟真实流程的医疗问诊系统。这个系统需要理解用户症状、决定是否需要分诊、调用不同的医学知识库工具、管理对话历史并在必要时将复杂问题拆解。这正是 LangChain、LangGraph 和 LangSmith 这三个工具组合起来要解决的问题。本文将从一个具体的“医疗问诊 Agent”项目出发为你拆解这三个核心框架的分工、协作方式以及如何将它们串联成一个可运行、可调试的生产级应用。无论你是希望从零开始理解 Agent 开发还是已经使用过 LangChain 但对 LangGraph 和 LangSmith 感到陌生这篇文章都将提供一个从概念到代码的完整路径。1. 理解核心框架LangChain、LangGraph 与 LangSmith 的分工在开始编码之前必须厘清这三个工具各自的角色和边界。混淆它们的概念会导致项目结构混乱难以维护和调试。1.1 LangChain构建智能体的“工具箱”与“积木”LangChain 的核心价值在于标准化和模块化。它不是一个单一的“Agent”而是一个提供了构建 Agent 所需各种标准化组件的框架。通俗理解想象你要组装一台电脑。LangChain 不直接给你一台整机而是提供了标准化的主板插槽LLM 接口、内存条Memory、硬盘Vector Store、各种外设接口Tools以及组装说明书Chains。它确保你的 CPU大模型能通过标准方式与内存、硬盘通信。技术定义LangChain 是一个用于开发由语言模型驱动的应用程序的框架。它通过提供一系列抽象如 Models, Prompts, Indexes, Chains, Agents和实现降低了构建复杂 LLM 应用的门槛。在医疗问诊 Agent 中的作用Models: 连接 OpenAI GPT-4、通义千问Qwen或本地部署的模型。Tools: 定义问诊 Agent 可以使用的“工具”例如symptom_checker_tool: 根据症状描述从知识库中检索可能的疾病。drug_interaction_checker_tool: 检查患者现有药物与新处方药的相互作用。medical_literature_search_tool: 搜索最新的医学文献摘要。Memory: 管理对话历史让 Agent 记住患者之前提到的症状、过敏史等信息。可以是简单的ConversationBufferMemory也可以是更复杂的、将记忆存储到数据库如 SQLite的长期记忆方案。Chains: 将上述组件按固定顺序组合起来。例如一个“预问诊链”可以固定先收集基本信息年龄、性别再询问主诉。关键点LangChain 能构建出简单的、线性流程的 Agent。但对于需要循环、条件分支、并行执行等复杂控制流的场景它显得力不从心。这时就需要 LangGraph。1.2 LangGraph绘制智能体的“工作流程图”LangGraph 建立在 LangChain 之上引入了**图Graph和状态State**的概念专门用于构建有状态、多步骤的智能体工作流。通俗理解继续电脑的比喻LangGraph 就是那个定义电脑启动流程的“固件”。按下电源键用户输入后先自检硬件调用工具1再加载操作系统调用工具2如果检测到硬盘错误条件判断则进入修复模式跳转到不同节点。它定义了各个组件节点的执行顺序和跳转逻辑。技术定义LangGraph 是一个用于构建有状态、多参与者Agent应用程序的库。开发者通过定义节点函数或LCEL Runnable和边决定下一个节点的条件来创建一个有向图从而精确控制执行流程。在医疗问诊 Agent 中的作用节点Nodes可以是调用一个 LangChain Tool调用一次 LLM 进行推理或者执行一段自定义逻辑如更新数据库。triage_node: 分诊节点根据用户主诉决定去哪个科室。general_qa_node: 全科问答节点处理一般性健康咨询。specialist_consult_node: 专科会诊节点调用特定的医学工具。边Edges连接节点决定流程走向。通常是条件边。从triage_node出来后如果判断为“急诊”则指向emergency_protocol_node如果判断为“皮肤科问题”则指向dermatology_tool_node。状态State一个在所有节点间共享的字典。例如{patient_info: {...}, symptoms: [...], current_department: general, conversation_history: [...]}。每个节点都可以读取和修改这个状态。关键点LangGraph 让你能以“流程图”的方式可视化并实现复杂的 Agent 逻辑这是构建可靠、可维护的复杂 Agent 的关键。1.3 LangSmith智能体开发的“调试器”与“监控中心”LangSmith 是一个平台用于跟踪、评估、调试和监控基于 LLM 的应用程序。通俗理解你的电脑Agent组装好并刷入了固件LangGraph后终于可以开机了。LangSmith 就是连接在主板上的调试接口和监控屏幕。它能记录每一次按键输入、每一次屏幕输出输出、CPU 的每一步计算LLM调用和思考过程、以及内存的访问记录Tool调用。当电脑死机Agent出错时你可以回放所有记录精准定位是哪个零件Tool或哪行代码Prompt出了问题。技术定义LangSmith 提供了全链路的可观测性Observability包括追踪Tracing、评估Evaluation、版本管理Versioning和监控Monitoring。在医疗问诊 Agent 中的作用调试开发记录每一次 Agent 运行的完整链条查看 LLM 接收的精确 Prompt、生成的思考过程、调用了哪个 Tool、输入输出是什么。这对于优化 Prompt 和 Tool 逻辑至关重要。评估与测试可以导入一批测试用例如不同的患者问诊对话批量运行 Agent并自动或人工评估其回答的准确性、安全性和完整性。生产监控监控生产环境中 Agent 的延迟、成本Token 消耗、错误率并设置警报。三者关系总结LangChain提供了零件Tools, Memory, LLM 接口。LangGraph定义了组装图纸和流水线用图定义工作流和状态流转。LangSmith提供了质检和运维工具调试、测试、监控。下表清晰地对比了三者的核心职责组件核心角色类比在医疗问诊项目中的关键产出LangChain模块化与集成标准化零件库与接口Tools (症状检查器)、Memory (病历记忆)、LLM (问诊模型)LangGraph流程编排与状态管理工厂流水线图纸与控制程序问诊流程图 (分诊-专科-检查-总结)、共享状态 (患者会话数据)LangSmith可观测性与生命周期管理调试器、测试仪与监控大屏每次问诊的完整调用链追踪、Prompt效果评估、生产环境性能监控2. 环境准备与项目初始化我们将构建一个简化但完整的医疗问诊 Agent。这个 Agent 能进行基础分诊针对不同症状调用相应的知识检索工具并管理对话历史。2.1 环境与依赖配置首先确保你的 Python 环境建议 3.10并安装必要的包。我们将使用 OpenAI 的 GPT 模型作为 LLM 驱动但你完全可以替换为 Qwen 或其他兼容 API 的模型。# 创建项目目录并进入 mkdir medical-agent-tutorial cd medical-agent-tutorial # 创建虚拟环境可选但推荐 python -m venv venv # 激活虚拟环境 # Windows: venv\Scripts\activate # macOS/Linux: source venv/bin/activate # 安装核心依赖 pip install langchain langchain-openai langgraph langsmith # 安装用于向量检索的工具示例使用Chroma轻量级 pip install chromadb langchain-chroma # 安装用于Web服务的框架可选用于暴露API pip install fastapi uvicorn关键依赖说明langchain: 核心框架。langchain-openai: 官方维护的 OpenAI 集成。langgraph: 用于构建图工作流。langsmith: 用于追踪和调试。chromadblangchain-chroma: 用于构建本地向量知识库模拟医学知识检索工具。在生产中你可能需要更强大的向量数据库如 Pinecone, Weaviate。2.2 设置 API 密钥与环境变量为了使用 OpenAI 和 LangSmith你需要设置 API 密钥。强烈建议使用环境变量管理密钥避免硬编码在代码中。# 在命令行中设置临时重启终端后失效 export OPENAI_API_KEYyour-openai-api-key export LANGCHAIN_API_KEYyour-langsmith-api-key export LANGCHAIN_TRACING_V2true export LANGCHAIN_PROJECTmedical-agent-tutorial # 指定LangSmith中的项目名如果你使用的是 Windows PowerShell命令如下$env:OPENAI_API_KEYyour-openai-api-key $env:LANGCHAIN_API_KEYyour-langsmith-api-key $env:LANGCHAIN_TRACING_V2true $env:LANGCHAIN_PROJECTmedical-agent-tutorial注意LANGCHAIN_TRACING_V2true会开启自动追踪所有通过 LangChain/LangGraph 的调用都会被记录到 LangSmith 平台。在开发阶段这极其有用但在生产环境需注意成本和控制采样率。2.3 项目结构规划一个清晰的项目结构有助于管理复杂度。建议如下medical-agent-tutorial/ ├── app.py # 主应用入口包含LangGraph定义和运行逻辑 ├── tools/ # 自定义工具目录 │ ├── __init__.py │ ├── symptom_checker.py # 症状检查工具 │ └── knowledge_base.py # 医学知识库检索工具示例 ├── knowledge/ # 存放知识库文档用于构建向量库 │ └── medical_guidelines.txt ├── state.py # 定义LangGraph的共享状态Schema └── requirements.txt # 项目依赖3. 构建医疗问诊 Agent 的核心组件我们将自底向上构建先创建工具Tools再定义状态State最后用 LangGraph 将它们组装起来。3.1 使用 LangChain 创建工具Tools工具是 Agent 与环境交互的手段。这里我们创建两个模拟工具。文件tools/symptom_checker.pyfrom langchain.tools import tool from typing import Dict, Any tool def symptom_checker(symptom_description: str) - str: 根据患者的症状描述从知识库中检索可能的疾病和相关建议。 输入应为清晰的中文症状描述如‘发烧、咳嗽三天喉咙痛’。 # 这里是一个模拟实现。真实场景应接入医学知识图谱或向量数据库。 # 例如可以预先将疾病指南嵌入向量库在此进行相似性检索。 symptom_keywords symptom_description.lower() if 发烧 in symptom_keywords and 咳嗽 in symptom_keywords: return 可能疾病上呼吸道感染感冒、流感、肺炎需警惕。建议多休息、多喝水若高烧不退或呼吸困难请立即就医。 elif 腹痛 in symptom_keywords and 腹泻 in symptom_keywords: return 可能疾病急性胃肠炎。建议补充电解质避免油腻食物若严重脱水或便血请就医。 elif 头痛 in symptom_keywords and 眩晕 in symptom_keywords: return 可能疾病偏头痛、血压异常、颈椎问题。建议测量血压注意休息若头痛剧烈或伴有呕吐、视物模糊请立即就医。 else: return 根据症状描述可能涉及多种情况。建议提供更详细的信息如症状部位、持续时间、疼痛性质或直接前往医院就诊。文件tools/knowledge_base.pyfrom langchain.tools import tool from langchain_chroma import Chroma from langchain_openai import OpenAIEmbeddings from langchain.schema import Document import os # 一个简单的全局向量库缓存避免每次调用都重建 _vector_db None def get_vector_db(): 获取或创建向量数据库实例 global _vector_db if _vector_db is None: # 初始化嵌入模型 embeddings OpenAIEmbeddings(modeltext-embedding-3-small) # 模拟一些医学知识文档 docs [ Document(page_content普通感冒通常由病毒引起症状包括鼻塞、流涕、喉咙痛、咳嗽通常不发烧或低烧。病程约7-10天。), Document(page_content流感由流感病毒引起症状突发且严重包括高烧、全身肌肉酸痛、乏力、头痛。可能引发肺炎等并发症。), Document(page_content高血压患者需定期监测血压低盐饮食规律服药。常见症状可能包括头痛、眩晕、耳鸣。), Document(page_content急性胃肠炎多因不洁饮食引起主要症状为腹痛、腹泻、恶心、呕吐。治疗以补液、休息为主。), ] # 创建内存中的向量库 _vector_db Chroma.from_documents(docs, embeddings, collection_namemedical_kb) return _vector_db tool def medical_knowledge_search(query: str) - str: 从医学知识库中检索与查询最相关的信息。 用于回答具体的医学概念、疾病定义、用药原则等问题。 db get_vector_db() # 执行相似性搜索 results db.similarity_search(query, k2) if results: # 将检索到的文档内容合并返回 return \n\n.join([doc.page_content for doc in results]) else: return 知识库中未找到相关信息。工具创建要点使用tool装饰器将函数转换为 LangChain 可识别的 Tool。务必编写清晰的文档字符串这会被 LangChain 用于自动构建给 LLM 的提示告诉它何时以及如何使用该工具。工具函数应专注于单一职责输入输出类型明确。3.2 定义 LangGraph 的状态State状态是工作流中各个节点共享的数据结构。我们使用TypedDict来定义确保类型安全。文件state.pyfrom typing import TypedDict, List, Annotated import operator class AgentState(TypedDict): 定义医疗问诊Agent的共享状态。 # 用户输入的最新问题 input: str # 整个对话的历史记录每个元素是一条消息 conversation_history: Annotated[List[str], operator.add] # 由AgentLLM生成的最新输出 output: str # 分诊结果例如 general全科, emergency急诊, specialist专科 triage: str # 从工具调用中获得的知识或数据 tool_outputs: Annotated[List[str], operator.add]状态字段解释input: 每次运行图时用户的当前输入。conversation_history: 对话历史。Annotated[List[str], operator.add]是 LangGraph 的语法表示这个字段是一个列表且当多个节点修改它时采用追加add操作进行合并而不是覆盖。这确保了历史消息能正确累积。output: Agent 的最终回复会返回给用户。triage: 用于在不同节点间路由的关键决策变量。tool_outputs: 记录工具调用的结果方便后续节点或最终输出使用。3.3 使用 LangGraph 组装工作流这是最核心的部分。我们将创建一个包含分诊、工具调用和回复生成三个主要节点的图。文件app.pyfrom typing import Literal from langgraph.graph import StateGraph, END from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage, SystemMessage from tools.symptom_checker import symptom_checker from tools.knowledge_base import medical_knowledge_search from state import AgentState # 1. 初始化LLM llm ChatOpenAI(modelgpt-4o-mini, temperature0) # 使用一个较小的模型控制成本 # 2. 定义图的工作节点 def triage_node(state: AgentState) - AgentState: 分诊节点根据用户输入判断问题类型。 # 构建系统提示指导LLM进行分诊决策 system_prompt SystemMessage(content你是一个医疗分诊助手。请根据患者的描述将其问题分类为以下之一general一般健康咨询、symptom_check需要症状检查、knowledge_query医学知识查询。只返回分类标签不要解释。) user_input state[input] # 调用LLM进行判断 response llm.invoke([system_prompt, HumanMessage(contentuser_input)]) triage_decision response.content.strip().lower() # 更新状态 state[triage] triage_decision # 也可以将这次交互加入历史 state[conversation_history].append(fUser: {user_input}) state[conversation_history].append(fTriage Assistant: 已将您的问题分类为 [{triage_decision}]。) return state def tool_router_node(state: AgentState) - AgentState: 工具路由节点根据分诊结果调用相应的工具。 triage state[triage] user_input state[input] tool_result if triage symptom_check: tool_result symptom_checker.invoke(user_input) state[tool_outputs].append(f[症状检查工具]{tool_result}) elif triage knowledge_query: tool_result medical_knowledge_search.invoke(user_input) state[tool_outputs].append(f[知识库工具]{tool_result}) else: # general 或其他情况 # 对于一般咨询可以不调用工具或调用一个通用工具 tool_result 此问题属于一般健康咨询将由AI直接回答。 state[tool_outputs].append(tool_result) # 将工具结果也存入状态供后续节点使用 state[tool_outputs_for_llm] tool_result return state def response_generator_node(state: AgentState) - AgentState: 回复生成节点综合对话历史、用户输入和工具结果生成友好、专业的最终回复。 user_input state[input] tool_output state.get(tool_outputs_for_llm, ) # 获取最近的几轮对话历史避免上下文过长 recent_history state[conversation_history][-6:] if len(state[conversation_history]) 6 else state[conversation_history] history_str \n.join(recent_history) # 构建给LLM的最终提示 prompt f 你是一个专业的医疗助手请基于以下信息为用户提供清晰、谨慎、有帮助的回复。 对话历史 {history_str} 用户当前问题{user_input} 工具查询结果供参考 {tool_output} 请生成最终回复。注意 1. 如果工具结果中包含了明确的医学建议请整合到回复中。 2. 强调“我不是医生此信息不能替代专业医疗诊断”。 3. 如果症状严重或持续务必建议用户寻求线下医疗帮助。 4. 回复使用中文语气温和专业。 final_response llm.invoke([HumanMessage(contentprompt)]) state[output] final_response.content # 将最终回复也加入历史 state[conversation_history].append(fMedical Assistant: {state[output]}) return state # 3. 构建图 workflow StateGraph(AgentState) # 添加节点 workflow.add_node(triage, triage_node) workflow.add_node(route_to_tool, tool_router_node) workflow.add_node(generate_response, response_generator_node) # 设置入口点 workflow.set_entry_point(triage) # 定义边路由逻辑 def decide_next_step(state: AgentState) - Literal[route_to_tool, __end__]: 在分诊后决定下一步是去调用工具还是直接结束。 这是一个条件边函数。 # 如果分诊结果是需要工具处理的类型则去工具节点 if state[triage] in [symptom_check, knowledge_query, general]: return route_to_tool # 理论上如果分诊结果是未知或无效可以直接结束。这里简化处理。 else: return __end__ # 添加条件边 workflow.add_conditional_edges( triage, decide_next_step, { route_to_tool: route_to_tool, __end__: END } ) # 添加固定边从工具节点到回复生成节点再到结束 workflow.add_edge(route_to_tool, generate_response) workflow.add_edge(generate_response, END) # 4. 编译图得到可执行的应用 app workflow.compile() # 5. 运行图的辅助函数 def run_medical_agent(user_input: str, conversation_history: list None): 运行医疗问诊Agent。 initial_state: AgentState { input: user_input, conversation_history: conversation_history if conversation_history else [], output: , triage: , tool_outputs: [], tool_outputs_for_llm: # 初始化一个字段用于传递工具结果 } # 执行编译好的图应用 final_state app.invoke(initial_state) return { response: final_state[output], updated_history: final_state[conversation_history], triage_result: final_state[triage], tool_calls: final_state[tool_outputs] } # 6. 简单的主循环用于测试 if __name__ __main__: print(医疗问诊Agent已启动。输入 退出 或 quit 结束。) history [] while True: try: user_query input(\n患者: ) if user_query.lower() in [退出, quit, exit]: print(问诊结束。) break result run_medical_agent(user_query, history) print(f\n助手: {result[response]}) history result[updated_history] # 更新本地历史记录 # 可选打印调试信息 # print(f[调试] 分诊: {result[triage_result]}, 工具调用: {result[tool_calls]}) except KeyboardInterrupt: break except Exception as e: print(f系统出错: {e})4. 运行、验证与 LangSmith 调试4.1 运行与交互测试确保你的 API 密钥环境变量已设置然后在项目根目录运行python app.py你将进入一个简单的命令行交互界面。尝试输入不同的问题观察 Agent 的行为患者: 我有点发烧还咳嗽浑身没力气。 助手: 根据您描述的症状发烧、咳嗽、乏力这可能是上呼吸道感染如普通感冒或流感的迹象。请注意休息多补充水分并监测体温。如果出现高烧超过38.5℃持续不退、呼吸困难、胸痛或症状在几天内加重请务必及时前往医院就诊。请注意我不是医生此信息不能替代专业医疗诊断。 患者: 高血压平时要注意什么 助手: 高血压患者的管理主要包括生活方式干预和规律服药。在生活上建议采取低盐饮食每日食盐摄入量低于5克规律进行适度的有氧运动如快走、游泳保持健康体重限制饮酒避免吸烟并管理好精神压力。您需要定期监测血压并遵医嘱坚持服用降压药物切勿自行停药或改量。如果血压控制不理想或出现剧烈头痛、眩晕、视物模糊等症状应及时就医。我不是医生具体治疗方案请咨询您的专科医师。4.2 通过 LangSmith 追踪与调试当你设置了LANGCHAIN_TRACING_V2true后每次调用app.invoke()都会在 LangSmith 平台生成一次追踪记录。登录 LangSmith 平台(https://smith.langchain.com)。在左侧菜单进入你设置的项目medical-agent-tutorial。你会看到每次对话的追踪记录Trace。点击进入任意一次 Trace。关键洞察完整链路可视化你可以清晰地看到执行流triage_node-route_to_tool-generate_response。查看输入输出点击每个节点可以查看输入给 LLM 的精确 Prompt、LLM 的原始响应、工具调用的输入参数和返回结果。调试 Prompt如果 Agent 的分诊或回复不准确你可以直接查看triage_node或response_generator_node中 LLM 收到的 Prompt并据此优化提示词。分析耗时与成本LangSmith 会记录每个步骤的耗时和 Token 使用量帮助你进行性能分析和成本优化。下图展示了在 LangSmith 中可能看到的追踪详情这在实际调试中至关重要Trace: medical_agent_invoke_abc123 ├── Node: triage │ ├── Input (State): {input: 我发烧咳嗽, ...} │ ├── LLM Call (OpenAI: gpt-4o-mini) │ │ ├── Prompt: [System: 你是一个医疗分诊助手...] │ │ └── Response: symptom_check │ └── Output (State): {triage: symptom_check, ...} ├── Node: route_to_tool │ ├── Tool Call: symptom_checker │ │ ├── Args: {symptom_description: 我发烧咳嗽} │ │ └── Result: 可能疾病上呼吸道感染... │ └── Output (State): {tool_outputs_for_llm: 可能疾病...} └── Node: generate_response ├── LLM Call (OpenAI: gpt-4o-mini) │ ├── Prompt: [你是一个专业的医疗助手...] │ └── Response: 根据您描述的症状... └── Final Output: {output: 根据您描述的症状..., ...}5. 常见问题排查与优化在开发和运行此类 Agent 时你会遇到一些典型问题。以下是排查清单问题现象可能原因检查与解决步骤Agent 不调用工具直接由 LLM 回答1. 工具描述不清晰。2. LLM 分诊逻辑不准未路由到工具节点。3. 给 LLM 的 Prompt 未明确要求使用工具。1. 检查tool装饰器下的文档字符串是否清晰描述了工具功能。2. 在 LangSmith 中查看triage_node的 LLM 输出确认分类是否正确。优化分诊提示词。3. 确保工作流逻辑正确decide_next_step函数根据triage结果正确路由到了route_to_tool节点。LangSmith 看不到追踪记录1. 环境变量未正确设置。2. 未正确初始化 LangSmith。3. 项目名冲突或权限问题。1. 确认LANGCHAIN_API_KEY和LANGCHAIN_TRACING_V2已设置并生效可print(os.environ.get(LANGCHAIN_TRACING_V2))验证。2. 确保代码中未主动关闭追踪。3. 登录 LangSmith 网站检查对应项目名下是否有数据。图编译或执行时报错1. 状态StateSchema 定义与节点返回值不匹配。2. 节点函数返回值不是字典或缺少必需键。3. 边Edge指向不存在的节点。1. 检查AgentState的TypedDict定义确保所有节点返回的字典都兼容此类型。2. 每个节点函数必须返回一个字典且是state的更新版本。使用print或日志调试节点返回值。3. 检查add_edge和add_conditional_edges中引用的节点名是否都已通过add_node添加。对话历史过长导致 LLM 响应慢或出错每次都将全部历史传入 Prompt消耗大量 Token 且可能超出上下文窗口。1. 在response_generator_node中只截取最近 N 轮对话如代码中的recent_history。2. 考虑使用 LangChain 的ConversationSummaryMemory或ConversationBufferWindowMemory来更智能地管理历史。工具调用结果未被有效利用工具输出没有正确传递到生成回复的 Prompt 中。1. 确保工具节点将结果存入state如state[“tool_outputs_for_llm”]。2. 在response_generator_node中从state中正确读取该字段并拼接到 Prompt 里。6. 生产环境最佳实践与扩展方向将上述原型发展为生产可用的系统还需要考虑以下方面6.1 安全与合规性免责声明必须在每次交互中明确提示 AI 的辅助性质不能替代专业医疗诊断。内容过滤在 LLM 调用前后加入内容安全过滤器防止生成或响应有害、不实信息。数据脱敏用户输入中可能包含姓名、身份证号等个人信息在存储和发送给外部 API 前必须进行脱敏处理。审核日志所有问诊记录需加密存储并建立审核机制。6.2 性能与可靠性超时与重试为 LLM 调用和工具调用设置合理的超时时间并实现重试逻辑特别是对于网络不稳定的外部 API。限流与降级对用户请求进行限流防止滥用。在核心工具如知识库检索不可用时应有降级方案如返回缓存结果或通用提示。异步处理对于耗时的工具调用如复杂的文献检索可以考虑使用 LangGraph 的异步节点或将其放入任务队列避免阻塞主响应线程。6.3 扩展工作流复杂度多专家会诊可以扩展 LangGraph实现并行节点。例如triage_node后同时启动symptom_checker和patient_history_analyzer分析历史对话两个节点然后由一个synthesizer_node汇总结果并生成回复。外部系统集成在图中加入与医院挂号系统、电子病历系统集成的节点实现更真实的问诊-导诊-预约流程。人工接管增加一个human_review_node当 Agent 置信度低或用户要求转人工时将状态路由到人工坐席处理队列。6.4 模型与知识优化模型微调使用领域内的医患对话数据对基础 LLM 进行监督微调SFT使其更擅长医学对话理解和生成。增强检索RAG用更全面的医学教科书、指南、药品说明书构建高质量的向量知识库替换示例中的简单工具并实现引用溯源让回答更有依据。智能体Agent技能定义更精细的工具如calculate_bmi_tool、drug_dosage_calculator_tool、side_effect_lookup_tool并通过更复杂的 Agent 规划逻辑如 ReAct 模式来动态组合使用它们。通过这个从零构建的医疗问诊 Agent 项目你应该能清晰地看到 LangChain、LangGraph 和 LangSmith 是如何各司其职又紧密协作的。LangChain 提供了构建模块LangGraph 像粘合剂和控制器一样将它们组织成灵活、有状态的业务流程而 LangSmith 则像飞机的黑匣子和仪表盘让整个开发和运行过程变得透明、可调试、可优化。掌握这三者你就掌握了开发现代复杂 AI 智能体的核心方法论。下一步你可以尝试用更强大的本地模型如 Qwen替换 OpenAI API或者将向量数据库升级为生产级方案来构建属于你自己的专业领域智能体。