LangChain+LangGraph+LangSmith 面试题 - 2026-06-15 00:17
【面试题】1. 请讲一下LangChain中Chain和LangGraph中Graph的本质区别,各自适合什么场景?
【标准答案】Chain是线性流水线,数据单向流动,适合确定性的顺序任务,比如"先检索再生成"这种固定步骤。Graph是状态机,节点之间可以任意跳转、循环、条件分支,适合复杂决策流程,比如多轮对话里根据用户输入动态决定下一步做什么。简单说:Chain是管道,Graph是流程图。实际项目中,简单问答用Chain,需要多步推理、人工审批节点、循环重试的用Graph。
【面试题】2. LangGraph的State设计有什么最佳实践?为什么不能用随便一个dict?
【标准答案】State必须用TypedDict或Pydantic Model定义,原因是LangGraph框架依赖类型声明来做状态合并(reduce)和节点间数据传递。如果随便用dict,框架不知道怎么合并多个节点的输出,会导致状态覆盖而不是累加。最佳实践:把"会累加"的字段(比如消息历史)用Annotated加reduce函数,把"只取最新"的字段直接声明类型。这样每个节点只改自己关心的部分,不会互相踩踏。
【面试题】3. 用LangSmith排查一个线上Prompt突然输出质量下降的问题,你的完整排查路径是什么?
【标准答案】第一步:LangSmith Trace里按时间筛选,对比出问题前后的trace,看token消耗、延迟、最终输出有没有明显变化。第二步:检查Prompt版本——LangSmith有Prompt版本管理,确认是不是有人悄悄改了提示词。第三步:看LLM响应内容,是不是模型返回格式变了(比如JSON缺字段)。第四步:如果是RAG链路,检查Retriever拿回来的文档质量,可能向量库数据变了。第五步:用LangSmith的Playground复现问题,锁定是Prompt问题还是模型问题,再针对性修复。
【面试题】4. LangGraph如何实现"人工审批节点"(Human-in-the-loop),生产环境怎么落地?
【标准答案】核心是用interrupt()函数暂停图执行,把当前状态持久化到checkpointer(PostgreSQL或Redis),然后等待外部信号。审批人通过API或前端触发continue执行,传入审批结果。生产落地三个要点:①checkpointer必须用外部存储,不能内存,否则服务重启状态丢失;②中断状态要能查询,方便做审批队列;③要设超时,防止图永远卡住。Code层面就是在节点里调用interrupt({"question": "确认发送?"}),外层用Command(resume=...)恢复。
【面试题】5. LangChain的Memory有哪几种?ConversationalMemory和MessageHistory有什么区别,怎么选?
【标准答案】Memory主要分两类:基于链的ConversationBufferMemory(老API,不推荐)和基于消息列表的ChatMessageHistory(新API,推荐)。区别:ConversationBufferMemory是字符串拼接,丢上下文结构;ChatMessageHistory保留完整的HumanMessage/AIMessage对象,支持按token裁剪、按消息条数裁剪。现在官方推荐用history来注入对话历史,配合trim_messages做上下文窗口管理。实际项目直接用ChatMessageHistory + trim_messages,别用老的BufferMemory。
【面试题】6. LangGraph的checkpointer持久化,SQLite和PostgreSQL怎么选?什么场景用哪个?
【标准答案】SQLite适合单机、开发测试、小规模生产,配置简单,文件级存储,但并发能力差,服务重启需要重新连接。PostgreSQL适合多实例部署、高并发、需要水平扩展的场景,支持异步、连接池、更可靠的事务。经验法则:一天跑不到1万次对话用SQLite完全够;如果是ToC产品、有多个Graph实例、或者需要跨进程恢复状态,必须用PostgreSQL。还有一个方案是用Redis做checkpointer,适合超高并发但对持久化要求不极端的场景。
【面试题】7. 用LangSmith做自动化评估,怎么设计一个靠谱的评估数据集?只靠"看起来对"行不行?
【标准答案】不行,"看起来对"是主观的,无法规模化。靠谱的评估数据集设计:①每个用例包含:输入、标准答案(或评分标准)、上下文(如果是RAG)。②用LangSmith的Dataset功能批量导入,支持CSV或手动录入。③评估指标要分层:正确性用StringEvaluator或LLM-as-judge;格式合规性用JSON解析校验;RAG场景还要评估召回率(Retrieved vs Ground Truth)。④定期跑回归:新版本Prompt跑同一数据集,指标下降就报警。只靠肉眼看,永远发现不了3%的性能退化。
【面试题】8. LangChain Tools工具封装,@tool装饰器和Tool类直接实例化,有什么区别?推荐哪种?
【标准答案】@tool装饰器是推荐写法,优点是代码更简洁,函数的docstring自动变成tool的描述(给LLM看的,非常重要),参数类型注解自动映射成tool的schema。Tool类直接实例化更灵活,适合动态生成tool的场景(比如从配置文件读取tool定义)。实际开发中90%的场景用@tool就够了。一个常见坑:docstring写得太敷衍,LLM不知道什么时候用这个tool,导致tool调用失败或不调用。docstring要写清楚:这个tool干什么、什么时候用、参数含义、返回什么。
【面试题】9. LangGraph流式输出(stream_mode="messages")和LangChain的stream()有什么区别?前端怎么接?
【标准答案】LangChain的stream()是按Chain输出的完整chunk流式返回,适合线性链。LangGraph的stream_mode="messages"是只流式返回LLM生成的token,过滤掉中间节点的输出,前端体验更干净。还有一个stream_mode="updates"是返回每个节点执行完的状态增量,适合调试。前端接入:用EventSource或fetch + ReadableStream接SSE,拿到token增量直接append到UI上。注意要处理中断——如果Graph里有interrupt,流会停,前端要能识别并展示审批界面。
【面试题】10. 一个LangGraph项目从0到1上线,你会怎么规划技术选型和时间分配?
【标准答案】分四个阶段。第一阶段(1-2周):跑通最小闭环,用LangGraph把核心决策逻辑画出来,用内存checkpointer,LangSmith接入做追踪,别急着优化。第二阶段(1周):接外部存储(PostgreSQL checkpointer)、接真实数据源(RAG或API工具)、把Prompt版本管理起来。第三阶段(1周):用LangSmith建评估数据集,跑自动化评估,调Prompt和Graph结构,盯住核心指标。第四阶段(上线前后):加监控告警(LangSmith Alerts),做A/B对比(新老Prompt同时跑),保留回滚能力。最容易被忽略的是评估数据集,很多人上线前根本没有,出了问题只能靠用户反馈,太被动。