📋 摘要
- LangChain 与 LangGraph 面试高频问答,每题只保留回答重点与扩展知识
- 详细原理解析见 LangChain 与 LangGraph
- 相关主题:AI Agent(面试版)、RAG(面试版)、大模型基础(面试版)、大模型训练与微调(面试版)、大模型推理与部署(面试版)
1. LangChain 的核心抽象有哪些?解决了什么问题?
📋 回答重点
- 抽象:Model、Prompt Template、Output Parser、Retriever、Vector Store、Embedding、Tool、Memory、Runnable/Chain
- 解决:统一接口(换模型不改代码)、组合编排(Runnable 可组合)、生态复用、可观测
- 核心思想:一切皆 Runnable,统一
invoke/stream/batch接口
扩展知识
- 换模型(OpenAI → Claude → 本地)只改配置,业务代码不变
- 详细讲解:LangChain 与 LangGraph
2. Prompt Template 是什么?有哪些类型?
📋 回答重点
- 把 prompt 中变化部分用占位变量表示,运行时填充,复用 prompt 结构
- 类型:StringPromptTemplate、ChatPromptTemplate(角色区分)、MessagesPlaceholder(动态消息)、FewShot、Pipeline
- 关键特性:partial(部分填充)、变量校验
扩展知识
- 生产最常用
ChatPromptTemplate.from_messages([("system", ...), ("human", ...)]) - 详细讲解:LangChain 与 LangGraph
3. LLM 和 ChatModel 有什么区别?
📋 回答重点
- LLM:纯字符串输入输出,文本补全(老模型)
- ChatModel:消息列表输入输出(system/human/ai/tool),现代对话/Agent 主流
- 二者都实现 Runnable 接口,可互换进 chain
扩展知识
- 现代模型基本都是 ChatModel(messages 接口)
- 详细讲解:LangChain 与 LangGraph
4. output parser 是什么?如何做结构化输出?
📋 回答重点
- Output Parser 把 LLM 文本输出解析成结构化对象(dict/Pydantic)
- 流程:prompt 约束格式 → 模型生成 → parser 解析
- 常见:StrOutputParser、JsonOutputParser、PydanticOutputParser(带 schema 校验)
扩展知识
- 更可靠做法:
with_structured_output用 function calling 直接产出合法结构 - 详细讲解:LangChain 与 LangGraph
5. chain 是如何组合的?有哪些组合方式?
📋 回答重点
- 组合方式:顺序(Sequential)、路由(Router)、MapReduce/MapRerank、条件分支
- 新范式用 LCEL 管道符
prompt | model | parser组合,替代旧 Chain 类 - chain 本质是 DAG:节点是 Runnable,边是数据流;组合结果仍是 Runnable
扩展知识
- 组合后仍可继续嵌套、复用
- 详细讲解:LangChain 与 LangGraph
6. LCEL 的引入动机是什么?
📋 回答重点
- 早期 Chain 类继承体系问题:组合僵硬、接口不统一、难复用、难统一做流式/异步
- LCEL 用
|声明式组合 Runnable,接口统一invoke/stream/batch - 自动获得流式、异步、批处理、重试、回退等能力
扩展知识
- 从「继承 + 配置对象」变成「函数式组合」,更可测试
- 详细讲解:LangChain 与 LangGraph
7. 管道符 | 和 Runnable 是什么关系?
📋 回答重点
|是 LCEL 组合操作符,Runnable 是被组合的单元- 所有组件(prompt/model/parser)都实现 Runnable 协议,都能用
|串起来 a | b内部生成 RunnableSequence,a 的输出传给 b;结果仍是 Runnable
扩展知识
- Runnable 接口:
invoke / ainvoke / stream / batch - 详细讲解:[[LangChain 与 LangGraph#管道符
|和 Runnable 是什么关系?]]
8. RunnableParallel、RunnableLambda、RunnablePassthrough 分别是什么?
📋 回答重点
- Parallel:并行执行多个分支,结果合并成 dict
- Lambda:把任意 Python 函数包装成 Runnable,插入链中做自定义处理
- Passthrough:原样透传输入/抽取字段,
assign在透传同时追加新字段
扩展知识
- Parallel 一次请求产出多路结果,降多轮串行延迟
- 详细讲解:LangChain 与 LangGraph
9. with_fallbacks 是什么?如何做容错?
📋 回答重点
- 给 Runnable 配多个备用实现,主实现失败自动降级到下一个
- 触发条件:抛出指定的异常类型(如 RateLimitError、TimeoutError),按顺序尝试
- 区别:
with_fallbacks是整链降级,with_retry是单节点重试
扩展知识
- 备用链要保证输入输出接口一致
- 详细讲解:LangChain 与 LangGraph
10. LangChain 0.1、0.2、1.0 版本有哪些变化?
📋 回答重点
- 0.1(2024.1):首个稳定版,包模块化拆分(langchain-core / langchain-community / langchain-openai)
- 0.2:LCEL 成为组合主范式,移除弃用 API
- 1.0:聚焦稳定性,Agent 与状态编排转向 LangGraph
扩展知识
- 趋势:单体包 → 模块化、LLMChain → LCEL、Agent 编排 → LangGraph
- 详细讲解:LangChain 与 LangGraph
11. memory(BufferMemory)是如何工作的?有哪些类型?
📋 回答重点
- 原理:调用前把历史消息注入 prompt,调用后把本轮交互写回
- 类型:Buffer(全量)、BufferWindow(最近 K 轮)、Summary(摘要)、TokenBuffer(按 token 截断)、VectorStore(长期)
- 传统 BufferMemory 已弃用,新范式用 RunnableWithMessageHistory
扩展知识
- Buffer 全量保存会爆上下文窗口
- 详细讲解:LangChain 与 LangGraph
12. bind_tools 是什么?如何绑定工具?
📋 回答重点
- 把工具 schema(名称/描述/参数)绑定到 ChatModel,让模型能返回 tool_call
- 模型只输出调用指令,真正执行仍在宿主,结果以 tool role 回传
- 工具 description(docstring)质量决定选工具准确率
扩展知识
- 多工具一次绑定,支持选择 + 参数抽取,可并行调用
- 详细讲解:LangChain 与 LangGraph
13. retriever 抽象是什么?如何自定义?
📋 回答重点
- 统一接口:输入 query,输出 List[Document],屏蔽底层检索实现
- 自定义:继承
BaseRetriever,重写_get_relevant_documents - 内置:VectorStoreRetriever、MultiQuery、ParentDocument、SelfQuery、Ensemble
扩展知识
- 换检索实现,上层 chain 无感切换
- 详细讲解:LangChain 与 LangGraph
14. vector store 抽象是什么?如何接入?
📋 回答重点
- 统一「写入 + 相似度检索」接口:add_documents / similarity_search / as_retriever
- 接入:
Chroma.from_documents(docs, embeddings)后as_retriever()接进 chain - 实现:Chroma(原型)、FAISS、Milvus/Qdrant、pgvector
扩展知识
- 换实现类,
as_retriever()后上层代码不变 - 详细讲解:LangChain 与 LangGraph
15. text splitter 有哪些类型?如何选择?
📋 回答重点
- 类型:Character、RecursiveCharacter(默认首选)、Token、MarkdownHeader、Code、Semantic
- 选择:通用 → 递归字符;Markdown → 按标题;代码 → CodeSplitter;精确 token → Token
- 关键参数:chunk_size(256~1024 token)、chunk_overlap(10%~20%)
扩展知识
- 块大检索噪声多、块小语义破碎
- 详细讲解:LangChain 与 LangGraph
16. document loader 有哪些类型?
📋 回答重点
- 作用:把各类数据源加载为 Document(page_content + metadata)
- 类型:文件(Text/CSV/PDF/Markdown)、网页(WebBase)、数据库、企业(Notion/GitHub)、富媒体(OCR)
- 加载后接 splitter → embedding → vector store 固定链路
扩展知识
- 复杂 PDF 表格/扫描件用 Unstructured 生态
- 详细讲解:LangChain 与 LangGraph
17. embedding 抽象是什么?如何接入不同的 embedding?
📋 回答重点
- 统一「文本 → 向量」接口:
embed_documents(文档侧)、embed_query(查询侧) - 接入:换实现类即可(OpenAIEmbeddings / HuggingFaceEmbeddings / Google)
- 关键点:换实现不改上层;query 与 doc 可不对称
扩展知识
- 选择看语言、维度、检索专用性、成本;维度须与建索引一致
- 详细讲解:LangChain 与 LangGraph
18. callbacks 和 tracing 如何工作?
📋 回答重点
- callbacks:在生命周期事件挂钩子(on_llm_start/on_chain_end/on_tool_start…)
- tracing 是 callbacks 高级应用:记录 trace/span 调用树
- 通过 config 或环境变量上报到 LangSmith/Langfuse,用于调试、评估、成本分析
扩展知识
- 自定义 handler 继承 BaseCallbackHandler 重写事件方法
- 详细讲解:LangChain 与 LangGraph
19. streaming(astream)如何实现?
📋 回答重点
stream/astream逐 token/逐块返回,前端实时显示- LCEL 链自动透传流式(只要下游支持)
astream_events提供更细粒度事件流(on_llm_start/on_token/on_tool_start)
扩展知识
- JSON 类 parser 需等完整输出才能解析,会破坏纯 token 流
- 详细讲解:LangChain 与 LangGraph
20. batch 和 abatch 有什么区别?
📋 回答重点
- batch:同步、内部并发处理多个输入;abatch:异步并发,适合高吞吐
- batch 比循环 invoke 快(受 max_concurrency 限制)
- 都是 Runnable 统一接口:invoke(单)/ batch(多)/ stream(流式)
扩展知识
- abatch 适合 asyncio 服务里高并发调用
- 详细讲解:LangChain 与 LangGraph
21. RunnableWithMessageHistory 是什么?
📋 回答重点
- 在链上自动管理对话历史:调用前加载、调用后写回
- 用 session_id 定位会话,历史通过 MessagesPlaceholder 注入
- 底层 BaseChatMessageHistory 可换内存 / Redis / 数据库
扩展知识
- 是替代旧 ConversationBufferMemory 的新范式
- 详细讲解:LangChain 与 LangGraph
22. LangChain 的 caching 如何实现?
📋 回答重点
- 用
set_llm_cache配置:InMemoryCache(开发)、SQLiteCache/RedisCache(生产) - 缓存键 = 模型 + prompt,相同请求直接命中不调模型
- 进阶:语义缓存按相似度命中(问法不同也能命中)
扩展知识
- 语义缓存命中率高,但需阈值控制防语义偏差
- 详细讲解:LangChain 与 LangGraph
23. LangChain 有哪些优缺点?
📋 回答重点
- 优点:抽象统一、生态丰富、LCEL 可组合、可观测、社区大
- 缺点:抽象过度、API 变动大、复杂流程力不从心、性能开销、调试难
- 结论:原型快、生产要谨慎
扩展知识
- 深度定制/复杂 Agent 时反而要绕开抽象
- 详细讲解:LangChain 与 LangGraph
24. 为什么 LangChain 被批评「抽象过度」?
📋 回答重点
- 封装层次多 → 报错栈深、定位难
- 隐藏关键细节 → 黑盒、不可预期
- 魔法配置 + API 频繁变动 → 概念膨胀
- 简单任务被复杂化,抽象收益与成本不匹配
扩展知识
- 反方:抽象带来可移植性与可组合性,1.0 后收敛
- 详细讲解:LangChain 与 LangGraph
25. LangChain 适用和不适用于哪些场景?
📋 回答重点
- 适用:快速原型、标准 RAG、多模型切换、简单链式、需现成组件
- 不适用:复杂状态机/多步 Agent、性能敏感、需完全可控底层、高度定制工作流
- 法则:原型/标准 RAG 用 LangChain,复杂 Agent 用 LangGraph
扩展知识
- 长期稳定 API 要求高时也要谨慎(1.0 后改善)
- 详细讲解:LangChain 与 LangGraph
26. LangGraph 解决什么问题?和 chain 有什么区别?
📋 回答重点
- chain 是静态 DAG,难表达循环、分支、动态路由、人工介入、持久化
- LangGraph 用「图 + 状态」建模,原生支持循环/分支/checkpoint/人工介入
- 关系:互补——LangChain 供积木,LangGraph 做编排
扩展知识
- LangGraph 节点内部常用 LangChain 组件
- 详细讲解:LangChain 与 LangGraph
27. StateGraph 和 State 是什么?
📋 回答重点
- State:图执行中的共享状态对象(TypedDict/Pydantic),节点读写它
- StateGraph:以 State 为中心的图构建器,定义节点 + 边 + 状态更新
- 状态更新用 reducer 合并(默认覆盖、add_messages 累加)
扩展知识
- State 是显式共享内存,比 chain 隐式数据流更可控可持久化
- 详细讲解:LangChain 与 LangGraph
28. node 和 edge 是什么?如何定义?
📋 回答重点
- node:执行单元,函数接收 State、返回状态更新片段
- edge:执行顺序,普通边固定、条件边按状态路由
- compile() 后得到可 invoke/stream 的图
扩展知识
- 入口 set_entry_point,出口可多个 set_finish_point
- 详细讲解:LangChain 与 LangGraph
29. 条件边(conditional edge)是什么?
📋 回答重点
- 从节点出发,根据当前状态/输出动态决定下一个节点
- 实现:
route(state) -> 字符串+ 映射表{返回值: 目标节点} - 用途:ReAct 判断「继续工具 vs 结束」、supervisor 路由 worker
扩展知识
- 也可用于异常/兜底分支
- 详细讲解:LangChain 与 LangGraph
30. LangGraph 如何支持循环?
📋 回答重点
- 图允许有环:agent ⇄ tools 形成循环,靠条件边控制退出
- 结构:START → agent →(条件边)tools → agent → … → END
- 防死循环:条件边返回 END、
recursion_limit兜底、节点内检测超限
扩展知识
- ReAct 循环靠「条件边判断是否还有 tool_calls」
- 详细讲解:LangChain 与 LangGraph
31. checkpoint 持久化是什么?如何实现?
📋 回答重点
- 每个节点执行后保存的 State 快照
- 实现:compile 挂
checkpointer=MemorySaver()/PostgresSaver(),调用带 thread_id - 作用:崩溃恢复、多轮会话、人工介入、时间旅行
扩展知识
- 生产用 PostgresSaver,开发用 MemorySaver
- 详细讲解:LangChain 与 LangGraph
32. human-in-the-loop(interrupt)如何实现?
📋 回答重点
- 在关键节点暂停,等人工批准/补输入后
resume继续 - 方式:
interrupt_before/after指定节点,或节点内interrupt()动态暂停 - 人工可改 State 后再 resume,也可拒绝操作
扩展知识
- 场景:高危操作(支付/删除)审批、补充信息、人工接管
- 详细讲解:LangChain 与 LangGraph
33. LangGraph 有哪些 streaming modes?
📋 回答重点
- values(完整 State)、updates(增量更新)、messages(token 流)
- custom(节点内自定义事件)、debug(调试细节)
- 选择:看最终回答 token 用 messages,看节点进度用 updates
扩展知识
- 一次可传多模式 stream_mode=[“updates”, “messages”]
- 详细讲解:LangChain 与 LangGraph
34. subgraph 如何复用?
📋 回答重点
- 把编译好的图封装成节点嵌入主图,实现模块化复用
main_builder.add_node("sub", subgraph)即可- State 字段不同用 input/output 做映射转换
扩展知识
- checkpoint 可用 namespace 下钻到子图内部状态
- 详细讲解:LangChain 与 LangGraph
35. LangGraph 如何实现多 Agent(supervisor/swarm)?
📋 回答重点
- supervisor:中央节点 + 条件边分发到 worker,worker 完成后回到 supervisor 汇总
- swarm:去中心化,agent 间直接 handoff 交接
- 区别:supervisor 集中星形控制,swarm 网形交接
扩展知识
- supervisor 用 tool call / 结构化输出决定 next 节点
- 详细讲解:LangChain 与 LangGraph
36. LangGraph 的 memory(checkpointer + Store)如何设计?
📋 回答重点
- checkpointer:线程内短期状态,按 thread_id 隔离
- Store:跨线程长期记忆,键值 + 命名空间 + 语义检索
- 分工:短期靠 checkpointer,跨会话可复用知识靠 Store
扩展知识
- Store 生产可接 Postgres/Redis
- 详细讲解:LangChain 与 LangGraph
37. LangGraph 的 pregel 执行模型是什么?
📋 回答重点
- 借鉴 Google Pregel 的 BSP(批量同步并行)图计算模型
- 每轮:找就绪节点 → 并行执行 → reducer 合并状态 → 下一轮
- 特点:消息驱动、批量同步、状态聚合、每轮是天然 checkpoint 点
扩展知识
- 让 LangGraph 能表达循环/并行/动态路由且状态可检查
- 详细讲解:LangChain 与 LangGraph
38. time-travel 是什么?如何实现?
📋 回答重点
- 回到某个历史 checkpoint 查看或重新执行/分支
- 实现:
get_state_history(config)拿快照列表,指定 checkpoint_id 重新 invoke - 可 fork 新分支(换 thread_id/checkpoint_ns)保留原轨迹
扩展知识
- 用于调试「哪步跑偏」、回放复现、A/B 后续策略
- 详细讲解:LangChain 与 LangGraph
39. LangGraph 和旧的 AgentExecutor 有什么区别?
📋 回答重点
- AgentExecutor:黑盒内置「模型→工具→循环」,难定制
- LangGraph:显式节点 + 边,循环/路由可见可控
- LangGraph 原生补上 checkpoint、人工介入、可观测
扩展知识
create_react_agent(LangGraph 版)取代旧 AgentExecutor- 详细讲解:LangChain 与 LangGraph
40. send 和 MapReduce 是什么?
📋 回答重点
- send:用
Send把节点多个输出动态扇出到多个目标,实现动态并行 - MapReduce:Map 拆分成子任务并行处理,Reduce 合并最终结果
- send 是实现 MapReduce 并行 Map 扇出的机制
扩展知识
- 典型:问题 → 拆子问题 → 并行处理 → 汇总答案
- 详细讲解:LangChain 与 LangGraph
41. @tool 装饰器是什么?如何自定义工具?
📋 回答重点
@tool把普通函数转成工具,自动生成 JSON Schema- 读取函数签名(类型注解)+ docstring(作为描述)
- docstring 写清「何时用 + 返回什么」决定调用准确率
扩展知识
- 参数用类型注解,可加 Annotated 描述、enum 限制
- 详细讲解:LangChain 与 LangGraph
42. structured tool(Pydantic)是什么?如何定义?
📋 回答重点
- 用 Pydantic 模型精确定义参数 schema,参数被校验成类型化对象
StructuredTool.from_function(func, args_schema=WeatherInput, ...)- 优势:参数校验、字段级 description/约束进 schema、宿主执行更安全
扩展知识
- vs @tool:@tool 用类型注解自动生成,structured tool 更精细
- 详细讲解:LangChain 与 LangGraph
43. BaseChatModel 抽象是什么?
📋 回答重点
- 对话模型的统一抽象基类,屏蔽厂商 API 差异
- 接口:invoke/stream/batch + bind_tools + with_structured_output
- 输入输出是消息:System/Human/AI/Tool 消息
扩展知识
- 继承 BaseChatModel 实现 _generate/_stream 即可接入任意模型
- 详细讲解:LangChain 与 LangGraph
44. bind 和 config 是什么?如何传递配置?
📋 回答重点
- bind:运行时绑定固定参数(temperature/tools/response_format),生成新 Runnable
- config:调用时传入的运行上下文(RunnableConfig),沿链自动透传
- config 含 callbacks、metadata、configurable(session_id/thread_id 等)
扩展知识
- 子组件可读 configurable 里的自定义值
- 详细讲解:LangChain 与 LangGraph
45. LangSmith 是什么?有什么用?
📋 回答重点
- LangChain 官方 LLM 应用可观测与评估平台
- 能力:tracing、调试回放、评估、监控、Prompt 管理、人工标注
- 设环境变量即自动上报,也可 SDK 记录任意 LLM 调用
扩展知识
- 开源替代:Langfuse、Phoenix(Arize)、OpenLLMetry
- 详细讲解:LangChain 与 LangGraph
46. LangServe 是什么?如何部署?
📋 回答重点
- 把 chain/agent 一键部署为 REST API(基于 FastAPI)
add_routes(app, chain, path="/my_chain")后 uvicorn 启动- 自动生成 invoke/stream/batch 端点 + OpenAPI + playground + SSE 流式
扩展知识
- 生产:接网关/鉴权/限流、容器化水平扩容
- 详细讲解:LangChain 与 LangGraph
47. LangChain 和 LangGraph 如何选型?
📋 回答重点
- 直线数据流(原型、标准 RAG、多模型切换)→ LangChain
- 带循环/状态/人工介入/多 Agent(状态机)→ LangGraph
- 判断依据:是否需要循环/状态/人工介入
扩展知识
- 多数项目两者并用:LangChain 供积木、LangGraph 做编排
- 详细讲解:LangChain 与 LangGraph
48. 如何用 LangGraph 实现一个 ReAct agent?
📋 回答重点
- 结构:START → agent ⇄ tools + 条件边 → END
- agent 节点用 bind_tools 模型产出 tool_calls;tools 节点执行并回写 ToolMessage
- 条件边判断「继续调工具 or 结束」;
create_react_agent一行封装
扩展知识
- 消息用 add_messages reducer 累加
- 详细讲解:LangChain 与 LangGraph
49. 如何用 LangChain 实现一个 RAG 应用?
📋 回答重点
- 七步:加载 → 分块 → embedding → 入库 → 检索 → 拼 prompt → 生成
- 链:
{"context": retriever, "question": RunnablePassthrough()} | prompt | model | parser - 索引离线、检索生成在线;检索质量决定 RAG 上限
扩展知识
- 可加 rerank、query 改写优化召回
- 详细讲解:LangChain 与 LangGraph
50. LangChain/LangGraph 生产部署有哪些注意事项?
📋 回答重点
- 状态外置:checkpoint 用 Postgres,才能水平扩容
- 可观测先行:接 LangSmith/Langfuse,记录 trace/成本/错误
- 成本控制:caching、prompt caching、小模型分工、限步数
- 安全:工具最小权限、沙箱、提示注入防护、高危人工确认
- 可靠性:with_fallbacks、重试、限流、超时、死循环检测
扩展知识
- 模型/prompt 版本化支持回滚;数据集 + evaluator 上线前回归
- 详细讲解:LangChain 与 LangGraph