LangChain、LangGraph与LangSmith:构建生产级AI Agent的完整技术栈实战

LangChain、LangGraph与LangSmith:构建生产级AI Agent的完整技术栈实战
30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度在构建一个能真正理解用户意图、执行复杂任务并可靠运行的 AI Agent 时很多开发者都曾面临过这样的困境用 LangChain 快速搭建的原型一旦涉及多步骤决策、状态管理或需要人工干预的复杂流程代码就会变得难以维护和调试。本文将从一个具体的“医疗问诊 Agent”项目出发完整拆解如何利用 LangChain、LangGraph 和 LangSmith 三大工具构建一个从零到一、从原型到生产级的智能体系统。无论你是刚接触 Agent 概念的新手还是希望将现有 LangChain 项目升级为更健壮、可控系统的开发者都能从本文获得一套可直接复用的实战方案。1. 背景与核心概念为什么需要这套组合拳在深入代码之前我们首先要厘清 LangChain、LangGraph 和 LangSmith 各自扮演的角色以及它们如何协同工作解决 AI Agent 开发中的核心痛点。1.1 什么是 AI AgentAI Agent智能体不仅仅是一个聊天机器人。它是一个能够感知环境、进行推理、制定计划并执行行动以实现特定目标的软件实体。在我们的“医疗问诊”场景中一个理想的 Agent 应该能够理解用户描述的症状如“我头痛、发烧三天了”。规划问诊流程例如先询问病史再询问具体症状细节最后根据知识库给出初步建议。执行具体动作如调用工具查询药品信息、检索医学知识库、或在不确定时请求人工审核。记忆整个对话历史和用户状态以提供连贯的个性化服务。1.2 LangChain、LangGraph 与 LangSmith 的分工这三者构成了 LangChain 生态中构建生产级 Agent 的完整技术栈。LangChain 应用构建的“脚手架”与“粘合剂”。定位一个用于开发由语言模型驱动的应用程序的框架。它提供了大量的标准化组件如提示词模板、文档加载器、向量存储接口、链式调用等让你能快速连接 LLM、外部数据和工具。在医疗问诊中的作用快速集成医学知识库通过VectorStoreRetriever定义与用户对话的提示词模板以及封装调用外部 API如药品数据库查询的工具Tool。痛点对于需要复杂状态流转、循环、条件分支或多人协作的 Agent仅用 LangChain 的Chain或AgentExecutor会显得力不从心代码可读性和可控性下降。LangGraph 复杂 Agent 工作流的“编排引擎”与“状态机”。定位一个基于图的编排框架专门用于构建有状态、多参与者的 Agent 应用。它将工作流建模为一张由节点Node和边Edge组成的有向图每个节点执行特定功能边决定了执行流向。在医疗问诊中的作用清晰地定义问诊流程。例如可以设计节点“症状收集节点” - “病史询问节点” - “知识库检索节点” - “诊断建议节点”。LangGraph 负责管理整个对话的“状态”State比如当前已收集的症状列表、用户ID、对话轮次等并根据节点执行结果如“信息不足”决定下一步是跳转到“病史询问节点”还是进入“人工审核节点”。核心价值提供了对 Agent 决策流程的细粒度控制和可视化能力使得复杂、可靠的 Agent 成为可能。LangSmith Agent 的“开发调试平台”与“性能监控中心”。定位一个用于构建、调试、测试、评估和监控 LLM 应用的平台。在医疗问诊中的作用开发调试记录每一次 Agent 运行的完整轨迹Trace你可以看到 LLM 的输入/输出、被调用的工具、图节点的执行顺序和耗时快速定位是提示词问题、工具调用失败还是逻辑错误。评估与优化可以批量测试不同提示词或模型对问诊准确率的影响用数据驱动迭代。生产监控上线后持续监控 Agent 的延迟、成本和异常确保服务稳定。核心价值解决了 LLM 应用“黑盒”调试难、评估主观、线上问题排查慢的痛点。简单总结LangChain 帮你快速造出 Agent 的“零件”工具、记忆、检索器LangGraph 帮你把这些零件组装成一台能精密运转的“机器”有状态的工作流而 LangSmith 则是这台机器的“设计图纸、调试仪表盘和运行监控系统”。2. 环境准备与项目初始化我们将构建一个简化的医疗问诊 Agent它具备以下能力与用户进行多轮对话收集症状和病史。根据症状检索内部医学知识库。在信息不足或涉及严重疾病时触发“人工审核”环节。最终给出初步的健康建议或就医指导。2.1 环境与依赖确保你的 Python 版本在 3.8 以上。我们使用pip安装核心库。# 创建项目目录并进入 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 langgraph langsmith # 安装 OpenAI 库本文以 OpenAI 模型为例 pip install openai # 可选安装用于知识库检索的向量数据库库这里以Chroma为例 pip install chromadb langchain-community版本说明本文基于langchain0.1.0,langgraph0.0.50,langsmith0.1.0版本编写。LangChain 生态迭代较快如果遇到 API 变更请以官方文档为准。2.2 设置 API 密钥与环境变量你需要准备 OpenAI API Key 和 LangSmith API KeyLangSmith 提供免费额度。# 在命令行中设置环境变量临时 # 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 # 指定LangSmith中的项目名 # macOS/Linux: export OPENAI_API_KEYyour-openai-api-key export LANGCHAIN_API_KEYyour-langsmith-api-key export LANGCHAIN_TRACING_V2true export LANGCHAIN_PROJECTMedical-Agent-Tutorial也可以在代码中通过os.environ设置但更推荐使用.env文件管理。3. 核心组件构建用 LangChain 打造 Agent 的“零件”我们先利用 LangChain 构建 Agent 所需的基础组件。3.1 构建医学知识库检索工具我们模拟一个简单的医学知识库用于根据症状检索相关的疾病信息和护理建议。# file: knowledge_base.py from langchain.vectorstores import Chroma from langchain.embeddings import OpenAIEmbeddings from langchain.schema import Document from langchain.retrievers import VectorStoreRetriever # 1. 模拟一些医学知识文档 medical_docs [ Document(page_content普通感冒症状包括打喷嚏、流鼻涕、喉咙痛、轻微咳嗽。通常无需抗生素建议多休息、多喝水可服用非处方感冒药缓解症状。, metadata{disease: 感冒, severity: 低}), Document(page_content流行性感冒症状包括高烧、全身肌肉酸痛、乏力、头痛、咳嗽。建议卧床休息补充水分可使用奥司他韦等抗病毒药物需医生指导高危人群建议接种疫苗。, metadata{disease: 流感, severity: 中}), Document(page_content急性肠胃炎症状包括腹泻、呕吐、腹痛、恶心。建议禁食数小时然后少量多次补充电解质水。避免油腻食物。若脱水严重需就医。, metadata{disease: 肠胃炎, severity: 中}), Document(page_content偏头痛症状多为单侧搏动性头痛可能伴有恶心、呕吐、畏光。发作时可于安静黑暗处休息可使用布洛芬等止痛药。频繁发作者需神经内科就诊。, metadata{disease: 偏头痛, severity: 低}), Document(page_content胸痛伴呼吸困难可能是心绞痛、心肌梗死或肺栓塞的征兆。这是医疗急症需立即拨打急救电话或前往急诊室切勿自行用药或拖延。, metadata{disease: 胸痛急症, severity: 高}), ] # 2. 创建向量存储并持久化这里为了示例使用内存存储 embeddings OpenAIEmbeddings() vectorstore Chroma.from_documents(documentsmedical_docs, embeddingembeddings, persist_directory./med_chroma_db) vectorstore.persist() # 持久化到磁盘 # 3. 创建检索器 retriever VectorStoreRetriever(vectorstorevectorstore, search_kwargs{k: 2}) # 返回最相关的2条 # 测试检索 if __name__ __main__: results retriever.invoke(我头痛还想吐) for doc in results: print(f内容: {doc.page_content[:100]}...) print(f元数据: {doc.metadata}) print(- * 50)3.2 定义 Agent 可用的工具Tools工具是 Agent 与外界交互的“手”。我们将知识库检索和一个人工审核模拟工具封装起来。# file: agent_tools.py from langchain.tools import tool from knowledge_base import retriever # 导入上面创建的检索器 tool def search_medical_knowledge(symptom: str) - str: 根据症状描述检索医学知识库返回相关的疾病信息和护理建议。 docs retriever.invoke(symptom) if not docs: return 知识库中未找到与当前症状高度匹配的信息。 result 根据知识库以下信息可能相关\n for i, doc in enumerate(docs, 1): result f{i}. {doc.page_content}\n return result tool def request_human_review(question: str, context: str) - str: 当Agent不确定或遇到高风险情况时请求人工审核。 参数: question: 需要人工审核的具体问题。 context: 当前对话和诊断的上下文信息。 # 在实际系统中这里会触发一个工单、发送通知到后台或挂起流程。 # 此处我们模拟一个固定响应。 print(f[模拟] 已创建人工审核工单。问题: {question}) print(f[模拟] 上下文: {context[:200]}...) return 您的情况已提交给专业医生进行审核预计30分钟内会有反馈。在此期间请保持电话畅通。3.3 初始化 LLM 与提示词我们使用 LangChain 的ChatOpenAI来调用 GPT 模型。# file: llm_setup.py from langchain_openai import ChatOpenAI from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder # 初始化LLM使用gpt-3.5-turbo以控制成本生产环境可考虑gpt-4 llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) # 定义系统提示词塑造Agent的角色和行为 system_prompt 你是一位专业的AI医疗助手。你的目标是帮助用户初步分析症状提供可能的疾病方向和非处方护理建议并识别需要紧急就医的情况。 你必须遵守以下规则 1. 始终保持专业、谨慎和同理心。 2. 你**不能**提供正式的医疗诊断、开具处方或推荐处方药。 3. 对于严重症状如剧烈胸痛、呼吸困难、严重出血、意识障碍必须立即建议用户拨打急救电话或前往急诊室并触发request_human_review工具。 4. 积极询问关键信息以辅助判断如症状持续时间、部位、性质、加重缓解因素、既往病史等。 5. 充分利用search_medical_knowledge工具查询知识库。 6. 如果你对信息没有把握或用户情况复杂使用request_human_review工具。 7. 所有建议都应注明“仅供参考不能替代专业医疗意见”。 当前对话历史、用户症状和你的思考过程将作为上下文。 # 构建提示词模板预留存储对话历史和多轮交互消息的位置 prompt ChatPromptTemplate.from_messages([ (system, system_prompt), MessagesPlaceholder(variable_namemessages), # 存储历史对话消息 (system, 请根据以上对话历史和知识进行下一步的回应或行动。), ])4. 工作流编排用 LangGraph 构建问诊状态机这是核心部分。我们将把问诊流程建模为一个有状态图。4.1 定义状态State状态是一个字典包含了整个对话过程中需要持久化和传递的所有信息。我们使用TypedDict来定义结构。# file: graph_state.py from typing import TypedDict, Annotated, List from langgraph.graph.message import add_messages import operator class State(TypedDict): # 消息历史LangGraph 内置的 add_messages 操作符会处理它 messages: Annotated[List, add_messages] # 用户当前描述的症状 current_symptoms: str # 已收集的详细信息列表 collected_info: List[str] # 知识库检索结果 knowledge_result: str # 标记是否需要人工审核 needs_human_review: bool # 标记问诊是否结束 is_finished: bool4.2 定义图节点Nodes每个节点是图中的一个步骤接收状态执行逻辑并返回更新后的状态。# file: graph_nodes.py from langchain_core.messages import HumanMessage, AIMessage, ToolMessage from .graph_state import State from .llm_setup import llm, prompt from .agent_tools import search_medical_knowledge, request_human_review from langchain.tools.render import render_text_description from langchain.agents.format_scratchpad import format_log_to_str from langchain.agents import AgentExecutor # 节点1症状接收与解析节点 def receive_symptoms(state: State): 接收用户输入并解析出核心症状。 messages state[messages] last_message messages[-1] if isinstance(last_message, HumanMessage): user_input last_message.content # 这里可以加入更复杂的NLP解析此处简单赋值 new_state { current_symptoms: user_input, collected_info: [f主诉: {user_input}], knowledge_result: , needs_human_review: False, is_finished: False, } print(f[节点: receive_symptoms] 收到症状: {user_input}) return new_state return state # 节点2知识库检索节点 def retrieve_knowledge(state: State): 根据当前症状检索医学知识库。 symptoms state[current_symptoms] if symptoms: print(f[节点: retrieve_knowledge] 正在检索症状: {symptoms}) result search_medical_knowledge.invoke(symptoms) return {knowledge_result: result} return {knowledge_result: 未提供症状无法检索。} # 节点3AI 分析与决策节点核心 def ai_analysis_and_decide(state: State): 让LLM分析当前信息决定下一步继续提问、给出建议还是请求人工审核。 这个节点集成了类似传统Agent的“思考-行动”循环。 messages state[messages] collected_info state[collected_info] knowledge state[knowledge_result] # 构建给LLM的上下文 context f 当前已收集的用户信息 {chr(10).join(collected_info)} 知识库检索结果 {knowledge} # 将工具绑定给LLM tools [search_medical_knowledge, request_human_review] llm_with_tools llm.bind_tools(tools) # 构建包含上下文的提示消息 analysis_prompt f请基于以下上下文进行分析和决策 {context} 请思考 1. 信息是否足够给出初步的、安全的护理建议 2. 症状是否提示严重或紧急情况如胸痛、呼吸困难、大出血 3. 是否需要进一步询问细节如持续时间、疼痛程度、既往病史 你的输出必须是以下三种之一 A) 如果信息足够且无紧急情况直接给出你的**最终建议**。 B) 如果需要更多信息提出一个**具体的澄清问题**。 C) 如果存在紧急情况或你非常不确定请**调用request_human_review工具**。 # 这里我们简化处理实际应用中可能需要更复杂的提示工程来让LLM稳定输出结构化决策。 # 我们让LLM直接生成自然语言响应然后在路由逻辑中判断。 ai_message llm_with_tools.invoke([HumanMessage(contentanalysis_prompt)]) # 将AI的响应添加到消息历史中 new_messages messages [ai_message] # 简单决策逻辑实际项目需要更鲁棒的逻辑例如解析AI消息中的工具调用 ai_response_text ai_message.content.lower() needs_review request_human_review in str(ai_message.tool_calls) or any(word in ai_response_text for word in [紧急, 立刻就医, 拨打120, 不确定, 人工审核]) is_finished not needs_review and (建议 in ai_response_text or 综上所述 in ai_response_text) and ? not in ai_response_text new_state { messages: new_messages, needs_human_review: needs_review, is_finished: is_finished, } # 如果AI在响应中提出了新问题则将其添加到收集信息中 if not is_finished and not needs_review and ? in ai_message.content: new_state[collected_info] collected_info [fAI提问: {ai_message.content}] print(f[节点: ai_analysis_and_decide] AI回复: {ai_message.content[:100]}...) print(f[节点: ai_analysis_and_decide] 需要人工审核: {needs_review}, 是否结束: {is_finished}) return new_state # 节点4人工审核处理节点 def human_review_process(state: State): 模拟人工审核流程。 print([节点: human_review_process] 进入人工审核流程...) # 在实际中这里可能等待外部系统返回结果。 # 我们模拟一个最终建议。 review_result 【医生审核意见】根据您描述的症状头痛、发烧考虑上呼吸道感染可能性大但需警惕颅内感染等严重情况。建议您尽快前往附近医院发热门诊就诊进行血常规等检查以明确诊断。 new_message AIMessage(contentreview_result) new_messages state[messages] [new_message] return { messages: new_messages, is_finished: True, # 人工审核后结束问诊 } # 节点5结束节点 def finalize(state: State): 问诊结束生成总结。 print([节点: finalize] 问诊流程结束。) # 可以在这里添加日志记录、满意度调查触发等逻辑 final_message AIMessage(content感谢您的咨询。请记住我的建议仅供参考如有不适请及时就医。祝您早日康复) new_messages state[messages] [final_message] return {messages: new_messages}4.3 定义边Edges与条件路由边决定了节点执行完毕后下一个该执行哪个节点。我们使用条件路由来实现复杂的逻辑流。# file: graph_edges.py from .graph_state import State def route_after_analysis(state: State) - str: 在AI分析决策后决定下一步走向哪个节点。 if state[needs_human_review]: return human_review elif state[is_finished]: return finalize else: # 既不结束也不需要人工审核说明AI提出了新问题流程回到起点等待用户回答 return __end__ # 实际上应该回到一个等待用户输入的节点。这里简化在图中用循环实现。 # 注意在LangGraph中__end__ 是一个特殊节点表示工作流结束。4.4 组装成图Graph现在我们将所有节点和边组合起来构建完整的工作流。# file: medical_agent_graph.py from langgraph.graph import StateGraph, END from .graph_state import State from .graph_nodes import receive_symptoms, retrieve_knowledge, ai_analysis_and_decide, human_review_process, finalize from .graph_edges import route_after_analysis # 1. 创建图并指定状态结构 workflow StateGraph(State) # 2. 添加节点 workflow.add_node(receive_symptoms, receive_symptoms) workflow.add_node(retrieve_knowledge, retrieve_knowledge) workflow.add_node(ai_analysis, ai_analysis_and_decide) workflow.add_node(human_review, human_review_process) workflow.add_node(finalize, finalize) # 3. 设置入口点 workflow.set_entry_point(receive_symptoms) # 4. 添加边定义节点间的流转 workflow.add_edge(receive_symptoms, retrieve_knowledge) workflow.add_edge(retrieve_knowledge, ai_analysis) # 根据 ai_analysis 节点的输出结果条件路由 workflow.add_conditional_edges( ai_analysis, route_after_analysis, # 路由判断函数 { human_review: human_review, # 如果返回human_review则跳转到human_review节点 finalize: finalize, # 如果返回finalize则跳转到finalize节点 __end__: END, # 如果返回__end__则直接结束工作流等待下一轮用户输入 } ) workflow.add_edge(human_review, finalize) workflow.add_edge(finalize, END) # 5. 编译图 app workflow.compile() # 可选可视化图需要安装graphviz # from langchain_core.runnables.graph import MermaidDrawer # drawer MermaidDrawer() # drawer.draw(app).save(medical_agent_graph.png)5. 运行与调试启动 Agent 并利用 LangSmith5.1 运行医疗问诊 Agent创建一个主程序来运行我们构建的图。# file: main.py from medical_agent_graph import app from langchain_core.messages import HumanMessage def run_medical_agent(): 运行医疗问诊Agent的交互循环。 print( AI医疗问诊助手启动 ) print(描述您的症状输入退出结束) # 初始化状态 initial_state { messages: [], current_symptoms: , collected_info: [], knowledge_result: , needs_human_review: False, is_finished: False, } config {configurable: {thread_id: user_123}} # 使用thread_id来区分不同会话 while True: user_input input(\n您: ) if user_input.lower() in [退出, exit, quit]: print(问诊结束。) break # 将用户输入添加到消息历史 initial_state[messages].append(HumanMessage(contentuser_input)) # 执行图工作流 try: # 注意我们每次都将更新后的状态传入。LangGraph会基于当前状态执行。 # 更常见的模式是使用app.invoke并传入包含新消息的增量状态。 # 这里为了简化我们重新设置整个状态。生产环境应使用LangGraph的流式或增量调用。 final_state app.invoke(initial_state, config) # 获取AI的最后一条回复并显示 ai_messages [msg for msg in final_state[messages] if isinstance(msg, AIMessage)] if ai_messages: last_ai_msg ai_messages[-1] print(f\n助手: {last_ai_msg.content}) # 更新状态为下一轮对话准备 initial_state final_state # 如果流程标记为结束则退出循环 if final_state.get(is_finished): print(本次问诊流程已结束。) break except Exception as e: print(f运行出错: {e}) break if __name__ __main__: run_medical_agent()运行python main.py你就可以开始与你的医疗问诊 Agent 对话了。由于我们设置了LANGCHAIN_TRACING_V2true所有的交互都会被自动记录到 LangSmith。5.2 使用 LangSmith 进行调试与观察访问 LangSmith 平台打开 https://smith.langchain.com 并使用你的 API Key 登录。查看项目在左侧菜单找到你设置的项目Medical-Agent-Tutorial。分析运行轨迹Trace在项目中你会看到每一次app.invoke的运行记录。点击任意一次运行你将看到完整的可视化执行图。节点执行顺序清晰地展示了receive_symptoms-retrieve_knowledge-ai_analysis- ... 的流程。输入/输出点击每个节点可以查看其输入的状态State和输出的状态。LLM 调用详情展开ai_analysis节点中 LLM 调用的部分你可以看到发送给模型的完整提示词Prompt、模型的原始响应Response以及任何工具调用Tool Calls。这是调试提示词效果和工具使用逻辑的黄金位置。耗时与 Token每个步骤的耗时和 Token 使用量一目了然有助于性能优化。发现问题例如如果 Agent 没有按预期调用request_human_review工具你可以在 LangSmith 中检查ai_analysis节点的输出看 LLM 是否生成了工具调用请求或者你的路由逻辑route_after_analysis是否判断有误。6. 常见问题与排查思路在构建和运行此类 Agent 时你可能会遇到以下典型问题问题现象可能原因排查思路与解决方案LangSmith 无追踪记录1. 环境变量未正确设置。2. API Key 无效或额度不足。3. 项目名包含特殊字符。1. 使用os.environ.get(LANGCHAIN_TRACING_V2)在代码中打印确认。2. 登录 LangSmith 检查 API Key 状态和用量。3. 使用简单的英文项目名。Agent 不调用工具1. 工具未正确绑定到 LLM。2. 提示词未明确指示使用工具。3. LLM 的temperature过高输出不稳定。1. 检查llm.bind_tools(tools)调用。2. 在系统提示词中强调工具的使用条件和格式。3. 在 LangSmith 中查看 LLM 的完整输入输出调整提示词。将temperature设为 0 进行测试。图工作流陷入死循环或提前结束1. 条件路由逻辑 (route_after_analysis) 有误。2. 状态 (is_finished,needs_human_review) 更新不正确。1. 在 LangSmith 中逐步检查每个节点后的状态变化。2. 在ai_analysis节点中打印决策逻辑的中间变量。3. 确保__end__和END的使用符合预期。知识库检索结果不相关1. 嵌入模型不适合医学领域。2. 文档切分或元数据设置不合理。3. 检索参数k值不合适。1. 尝试领域专用的嵌入模型如text-embedding-3-large。2. 优化文档的预处理分块、清洗。3. 调整search_kwargs如{k: 3, score_threshold: 0.7}。多轮对话记忆丢失1. 状态中的messages列表未正确传递。2. 每次调用都使用了全新的初始状态。1. 确保使用Annotated[List, add_messages]来正确累加消息。2. 在交互循环中将上一次的final_state作为下一次app.invoke的输入状态。使用configurable的thread_id来管理不同会话。处理速度慢1. LLM 调用耗时。2. 检索器或工具调用慢。3. 图节点串行执行过多。1. 在 LangSmith 中定位耗时最长的节点。2. 考虑缓存检索结果。3. 对于可并行的节点研究 LangGraph 的异步或并行执行能力。7. 最佳实践与进阶建议将原型 Agent 推向生产环境还需要考虑以下方面提示词工程结构化输出让 LLM 输出 JSON 等结构化数据而非自然语言便于程序化路由。可以使用 LangChain 的PydanticOutputParser。少样本学习Few-shot在提示词中提供几个高质量的问诊对话示例能显著提升 Agent 的决策质量。对抗性提示在系统提示词中加入对用户可能提供的错误或恶意信息的处理指引。状态管理持久化使用 LangGraph 的Checkpointer将状态持久化到数据库如 Redis、PostgreSQL支持长时间运行和恢复的会话。状态精简避免在状态中存储过大的对象如长文本只保留必要的引用 ID 或摘要。图的健壮性错误处理为每个节点添加try...catch将错误信息捕获并存入状态并设计专门的错误处理节点和边。超时控制为 LLM 调用和工具调用设置超时防止单个步骤卡死整个工作流。人工接管Human-in-the-loop我们的例子中包含了审核节点。可以扩展此节点集成更复杂的工单系统、即时通讯通知等实现无缝的人机协作。利用 LangSmith 进行迭代数据集与测试在 LangSmith 中创建包含各种症状描述和期望 Agent 行为的数据集用于回归测试。评估与评分编写评估函数如判断建议是否安全、是否在关键时刻请求了人工审核对大量运行结果进行自动评分量化 Agent 的改进效果。版本对比当你修改提示词或图结构后在 LangSmith 中并行运行新旧版本直观对比性能和输出差异。安全与合规对医疗类应用至关重要输入输出过滤对用户输入和 Agent 输出进行内容安全过滤防止生成有害建议。审计日志确保所有交互尤其是触发人工审核和最终建议的交互都有完整的、不可篡改的日志。明确免责声明在每一次交互的开始和结束都应清晰提示 AI 的局限性。通过本文的实践你已经掌握了使用 LangChain 构建组件、用 LangGraph 编排复杂有状态工作流、并借助 LangSmith 实现可观测与迭代的完整闭环。这套方法论不仅适用于医疗问诊场景可以平移到客服、教育、金融风控等任何需要多步骤、有条件判断和人工干预的复杂 Agent 场景中。 30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度