🎯 LangSmith 学习与面试全攻略:从 Agent「盲盒」到全链路观测与量化评估

78 阅读8分钟

🎯 LangSmith 学习与面试全攻略:从 Agent「盲盒」到全链路观测与量化评估

摘要:用 LangChain/LangGraph 写 Agent 时,最怕的就是「盲盒感」——调用了哪个工具、每步耗时多少、流式输出了多少 Token、总共烧了多少钱,全是一团黑。LangSmith 就是把这团黑照亮的仪表盘。本文梳理 LangSmith 的核心概念、接入方式、四大功能,并结合两个真实 Demo(错误追踪 + RAG 量化评估),最后附上面试高频考点。


Demo gitee链接

📌 前言:为什么你必须学 LangSmith

写 Agent 的人都有过这种崩溃瞬间:昨天还答得好好的,今天就乱说。你想定位问题,却发现自己面对的是一个黑盒:

  • 它到底调用了哪个工具?
  • 每一步耗时多少?Token 消耗多少?成本多少?
  • 哪个节点把答案带偏了?

管理学里有句话:「如果你无法度量它,你就无法管理它」。LLM 应用的度量工具,就是 LangSmith。

LangSmith 是 LangChain 团队推出的 LLMOps 平台,定位是「可观测性 + 评估」,与生态里其他组件的分工如下:

组件职责一句话理解
LangChain开发框架用来「搭」应用(prompt、chain、RAG)
LangGraph状态机编排用来「编」多步 Agent 流程
LangSmith可观测/评估用来「看」和「考」应用
LangServe部署用来「上线」

简单说:LangChain/LangGraph 负责生产 Agent,LangSmith 负责给 Agent 装监控和出考卷。


image.png

image.png

image.png

🗺️ 一、学习脉络:一张地图理清 LangSmith

结合我自己的学习路径,LangSmith 可以拆成 一条主线 + 四大功能:

         ┌─────────────────────────────────────────┐
         │         LangSmith(可观测 + 评估)          │
         └─────────────────────────────────────────┘
             │                                        │
      ┌──────┴───────┐                        ┌──────┴───────┐
      │   观测侧       │                        │   评估侧       │
      │ Tracing       │                        │ Datasets      │
      │ Monitoring    │                        │ Evaluators    │
      └──────────────┘                        └──────────────┘
        调试 Agent、看链路                          出考卷、自动化打分

四大功能对应四个问题:

功能解决的痛点我的理解
Tracing(追踪)「Agent 执行过程看不到」每次运行都能回放完整调用链,debug 利器
Monitoring(监控)「线上 Agent 跑飞了不知道」Token 开销、耗时、错误率的实时仪表盘
Datasets(数据集)「没有标准答案怎么测试」统一存放「问题 - 标准答案」对
Evaluators(评估器)「改完 prompt 不知道变好变坏」批量自动打分,量化回答质量

学习顺序建议:先 Tracing 建立「看得见」的能力,再用 Datasets + Evaluators 建立「考得准」的闭环。下面会分别用两个 Demo 演示这两条线。


📚 二、核心概念:面试必背的术语

LangSmith 的概念模型是一个层级树结构,这是理解它的一切基础:

Project(项目)
 └── Trace(一次完整运行 = 根 Run)
      ├── Run / Span(LLM 调用)
      ├── Run / Span(Tool 调用)
      │     └── Run / Span(内部 HTTP 请求)
      └── Run / Span(输出解析器)
概念定义记忆点
ProjectTrace 的集合容器通常按应用/环境划分,如 rag-demo
Trace一次端到端运行的全部记录含 prompt、中间输出、工具参数、token、延迟、错误
Run最小执行单元一次 LLM 调用 / 一次工具调用 / 一次节点执行
SpanTrace 树中的某个节点与 Run 基本等价,强调树状父子关系
Dataset测试用例集合输入 + 期望输出(reference)
Evaluator打分函数给某次运行打 0~1 分

💡 一句话区分:Project > Trace > Run/Span,Trace 是一棵树,Run/Span 是树上的节点,树根叫 Root Run。


🔌 三、接入方式:一行代码都不用改

LangSmith 最爽的一点:如果你用的是 LangChain/LangGraph,配几个环境变量就能自动追踪,零侵入。

# .env
LANGCHAIN_TRACING_V2=true        # 开启追踪
LANGCHAIN_API_KEY=lsv2_xxxx      # API Key(示例占位,勿泄露真实 key)
LANGCHAIN_PROJECT=smith-demo     # 项目名,trace 会归到这个项目下

配置后,graph.invoke() 执行时,所有 LLM 调用、节点跳转、工具调用会被自动上报,无需手动埋点。

如果你不用 LangChain 生态(比如裸调 OpenAI SDK),则用 @traceable 装饰器手动标记:

// 示意(Python 同理)
import { traceable } from "langsmith";

const generate = traceable(async (question) => {
    return await llm.invoke(question);
}, { name: "generate_answer" });

这也是面试常考点:「LangSmith 怎么做到零代码接入?」 答案就是——LangChain/LangGraph 内部已经集成了 LangSmith 的回调钩子,环境变量一开就自动埋点。


🧪 四、实战 Demo 1:用 LangGraph「故意抛错」看 Trace

第一个 Demo 演示 Tracing 的调试价值:搭一个 LangGraph 图,第二个节点故意抛异常,看 LangSmith 如何帮你定位。

import "dotenv/config"; // 自动读取 .env 中的 LangSmith 配置
import { Annotation, END, START, StateGraph } from "@langchain/langgraph";

const StateAnnotation = Annotation.Root({
    text: Annotation({ reducer: (_prev, next) => next, default: () => "" }),
});

const stepOk = (state) => ({ text: `${state.text}[ok]` });  // 正常节点
const stepThrow = () => {
    throw new Error("DemoError: 节点内故意跑错");            // 抛错节点
};

const graph = new StateGraph(StateAnnotation)
    .addNode("step_ok", stepOk)
    .addNode("step_throw", stepThrow)
    .addEdge(START, "step_ok")
    .addEdge("step_ok", "step_throw")
    .addEdge("step_throw", END)
    .compile();

try {
    await graph.invoke({ text: "start" });
} catch (err) {
    console.error("已捕获:", err?.message ?? err);
    process.exitCode = 1;
}

这个 Demo 想说明什么?

  1. 代码里只写了业务逻辑,没有任何 LangSmith 相关代码,但 trace 已经自动上报了。
  2. 打开 LangSmith 控制台,能看到一条 trace 树:step_ok 成功 → step_throw 抛错,错误信息、堆栈、耗时一目了然。
  3. 这就是「盲盒」到「透明」的转变:以前靠 console.log 猜,现在直接看调用链回放。

📊 五、实战 Demo 2:RAG 的量化评估(召回 + 回答)

第二个 Demo 更进阶,演示 Datasets + Evaluators 的评估闭环,这也是 RAG 项目最容易踩坑、也最需要客观度量的地方。

5.1 评估什么?两个维度

RAG 质量 = 召回质量(检索到的文档对不对) + 回答质量(基于文档的答案好不好)
  • 召回质量:检索节点 retrieve 从向量库拿回的文档,是否命中正确答案。
  • 回答质量:生成节点 generate 输出的答案,是否准确、有没有幻觉。

5.2 Demo 的技术栈

这个 RAG Agent 用 LangGraph 编排两个节点,配合 Milvus 向量库:

// rag_agent.mjs(核心链路)
import { Milvus } from "@langchain/community/vectorstores/milvus";
import { ChatOpenAI, OpenAIEmbeddings } from "@langchain/openai";

const embeddings = new OpenAIEmbeddings({ model: "text-embedding-v3" });
const llm = new ChatOpenAI({ model: "qwen-plus", temperature: 0 });

// 已有集合直接挂载,返回 retriever
const vectorStore = await Milvus.fromExistingCollection(embeddings, {
    collectionName: "rag_docs",
    url: "http://127.0.0.1:19530",
});
const retriever = vectorStore.asRetriever({ k: 4 });

// 检索节点
async function retrieve(state) {
    const docs = await retriever.invoke(state.question);
    return { context: docs };
}

// 生成节点(用 prompt + llm + 输出解析器组成链)
async function generate(state) {
    const contextText = state.context.map(d => d.pageContent).join("\n\n");
    const answer = await chain.invoke({ context: contextText, question: state.question });
    return { answer };
}

const workflow = new StateGraph(GraphState)
    .addNode("retrieve", retrieve)
    .addNode("generate", generate)
    .addEdge(START, "retrieve")
    .addEdge("retrieve", "generate")
    .addEdge("generate", END);

export const ragApp = workflow.compile();

数据侧,milvus_insert.mjs 负责把 data/ 下的商品文档(售后、物流、支付、质保等)切块 → 向量化 → 写入 Milvus。

5.3 评估闭环怎么跑

graph LR
    A[上传问答对 Dataset] --> B[配置 Evaluator 打分]
    B --> C[批量跑 evaluate]
    C --> D[对比召回质量/回答质量分数]
    D --> E[优化 prompt / 调 top_k / 换 chunk]
    E --> A

这个闭环的价值在于:以前改 prompt 靠感觉,现在改完跑一遍评估,分数涨没涨一目了然。Demo 的 package.json 里引入了 langsmith 和 openevals(LangChain 官方的评估器框架),正是用来做自动打分的。


🎤 六、面试高频考点

⚠️ 这部分不是机械罗列,而是把最可能被问到的点整理成「怎么答」。

Q1:LangChain、LangGraph、LangSmith 分别是什么?区别?

  • LangChain 是开发框架(搭 chain、RAG);LangGraph 是编排框架(用状态图编多步 Agent);LangSmith 是可观测 + 评估平台(看、考)。三者分工:构建、编排、观测评估。

Q2:Trace、Run、Span 的区别?

  • Trace 是一次完整运行的树;Run 是最小执行单元(一次 LLM/工具调用);Span 是树中节点,与 Run 等价、强调父子关系。层级:Project > Trace > Run/Span。

Q3:LangSmith 怎么做到「零代码」接入追踪?

  • 靠 LangChain/LangGraph 内置的回调集成:只要设 LANGCHAIN_TRACING_V2、LANGCHAIN_API_KEY、LANGCHAIN_PROJECT 环境变量,调用链自动上报。非 LangChain 场景用 @traceable 装饰器手动埋点。

Q4:评估器(Evaluator)有哪几类?

  • 四类:人工审核(human)、代码规则(heuristic)、LLM 打分(LLM-as-judge)、两两对比(pairwise)。其中 LLM-as-judge 有位置偏见、冗长偏见等局限,需配合人工抽样。

Q5:RAG 怎么评估?

  • 两个维度:召回质量(检索命中率,如 context_recall、context_precision)+ 回答质量(准确性、忠实度,如 faithfulness、correctness)。用 Dataset 存标准问答对,用 Evaluator 批量打分。

Q6:离线评估 vs 在线评估?

  • 离线评估:上线前在数据集上跑,做基准/回归测试,可接 CI/CD 卡质量门禁;在线评估:生产流量实时打分 + 监控,发现问题早告警。

💡 七、总结

回顾这条学习脉络,LangSmith 的核心价值就是一句话:把 LLM 应用从「盲盒」变成「透明 + 可量化」。

  1. 先观测:Tracing 让你「看得见」Agent 每一步在干什么(Demo 1)。
  2. 再评估:Datasets + Evaluators 让你「考得准」回答质量(Demo 2)。
  3. 后监控:Monitoring 让你「守得住」线上运行状态。

面试时记住三个关键词:Trace(看)、Dataset(考题)、Evaluator(打分),再配上你亲手跑过的 LangGraph + RAG Demo,基本就能把 LangSmith 讲透了。


🔗 参考资料


觉得有用?点个赞 👍 收藏 ⭐ 关注 👆,下一篇聊聊 LangGraph 的多步 Agent 编排实战!