第11章 LangSmith 调试与综合项目1. 本章目标前面章节已经完成了 LangChain 的核心能力调用 DeepSeek使用 Prompt 模板结构化输出LCEL 链式调用文档加载与切分Embedding 和向量数据库RAG 知识库问答Tool 和 Agent应用能跑起来之后如何调试、观察和评估效果学完本章后你应该能够理解 LangSmith 的作用开启 LangChain 调用追踪在 LangSmith 中查看模型调用、Prompt、Token 和耗时给不同项目设置追踪名称给运行过程添加标签和元数据编写简单的测试集评估 RAG 效果编写简单的测试集评估 Agent 工具调用完成一个课程综合项目理解上线前应该检查哪些关键问题2. 为什么需要 LangSmith在简单案例中我们通常只看终端输出你需要知道用户原始问题是什么Retriever 检索到了哪些文档Prompt 最终长什么样模型输入了多少 Token模型输出了什么哪一步耗时最长Agent 有没有调用工具工具参数是否正确工具返回了什么LangSmith 就是用来观察、调试和评估大模型应用的平台。它可以把一次 LangChain 调用记录成完整链路。3. LangSmith 能看到什么开启追踪后LangSmith 中可以看到内容作用Trace一次完整调用链路Run链路中的一个步骤Input当前步骤输入Output当前步骤输出Prompt发送给模型的提示词Tool CallAgent 调用工具的记录Token模型输入和输出消耗Latency每一步耗时Error报错信息Metadata自定义业务信息对于 RAG 项目重点看检索问题是否正确检索结果是否相关上下文是否传给模型模型是否根据资料回答对于 Agent 项目重点看是否调用了工具调用了哪个工具工具参数是否正确工具结果是否被模型正确使用4. 开通和配置 LangSmith访问https://smith.langchain.com登录后创建 API Key。在项目根目录创建.envDEEPSEEK_API_KEY你的DeepSeek API Key DEEPSEEK_BASE_URLhttps://api.deepseek.com LANGSMITH_TRACINGtrue LANGSMITH_API_KEY你的LangSmith API Key LANGSMITH_PROJECTlangchain-work-demo环境变量说明变量作用LANGSMITH_TRACING是否开启追踪LANGSMITH_API_KEYLangSmith API KeyLANGSMITH_PROJECT追踪记录所属项目DEEPSEEK_API_KEYDeepSeek API KeyDEEPSEEK_BASE_URLDeepSeek OpenAI 兼容接口地址如果暂时不想开启 LangSmith可以改成LANGSMITH_TRACINGfalse5. 安装依赖安装本章依赖pip install langsmith6. 案例一追踪一次普通模型调用创建01_trace_chat.pyfrom utils.model_factory import get_deepSeek_model modelget_deepSeek_model() responemodel.invoke(帅哥为什么这么帅) print(respone.content)运行结果如下终端界面如果.env中配置了LANGSMITH_TRACINGtrue LANGSMITH_API_KEY... LANGSMITH_PROJECTlangchain-course-demo运行后就可以在 LangSmith 项目中看到这次调用。你可以重点查看输入内容模型输出调用耗时Token 消耗模型名称langsmith界面打开这个项目可以看到7. 案例二追踪 LCEL Chain创建02_trace_chain.pyfrom langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate from utils.model_factory import get_deepSeek_model model get_deepSeek_model() prompt_template ChatPromptTemplate.from_messages( [ ( system, 你是一名编程课程讲师回答要适合初学者。, ), ( human, 请用不超过 150 字解释{topic}, ) ] ) chain prompt_template | model | StrOutputParser() result chain.invoke( { topic:RAG检索增强生成 }, config { run_name:concept_explain_chain, tags:[chapter10,lcel], metadata:{ course:langChain, chapter:10 } } ) print(result)这里的config可以给本次运行增加信息config{ run_name: concept_explain_chain, tags: [chapter10, lcel], metadata: { course: LangChain, chapter: 10, }, }在 LangSmith 中run_name、tags和metadata可以帮助你筛选和定位调用记录。这些都是我们配置的信息过滤8. 案例三追踪 Agent 工具调用创建03_trace_agent.pyfrom langchain.agents import create_agent from langchain_core.tools import tool from utils.model_factory import get_deepSeek_model tool def get_order_status(order_id:str) - str: 根据订单号查询订单状态包括是否付款、是否发货、快递单号和签收状态。 fake_orders { A1001: 已付款等待发货, A1002: 已发货快递单号 SF123456, A1003: 已签收, } return fake_orders.get(order_id, 没有查询到该订单) model get_deepSeek_model() agent create_agent( model model, tools [get_order_status], system_prompt 你是一名电商客服助手必须根据工具结果回答订单问题。 ) result agent.invoke( { messages:[ { role:user, content:帮我查一下订单A1002发货了么 } ] }, config { run_name:order_agent_demo_run, # trace的名字 tags:[chapter10,agent,tool], metadata:{ name:order_agent_demo_meta, #Metadata_name biz: ecommerce }, } ) print(result[messages][-1].content)在 LangSmith 中可以看到用户问题 - 模型请求调用 get_order_status - 工具返回订单状态 - 模型生成最终回答用户提问 → 大模型识别需要调用工具 → 调用查询订单接口 → 获取接口数据 → 大模型把原始数据整理成自然语言回答用户这对调试 Agent 非常有用。如果 Agent 没有调用工具可以在 Trace 中检查工具描述是否传给模型用户问题是否包含订单号模型是否直接生成了答案工具调用参数是否错误