📋 摘要

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

扩展知识


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

扩展知识


6. LCEL 的引入动机是什么?

📋 回答重点
  • 早期 Chain 类继承体系问题:组合僵硬、接口不统一、难复用、难统一做流式/异步
  • LCEL 用 | 声明式组合 Runnable,接口统一 invoke/stream/batch
  • 自动获得流式、异步、批处理、重试、回退等能力

扩展知识


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 在透传同时追加新字段

扩展知识


9. with_fallbacks 是什么?如何做容错?

📋 回答重点
  • 给 Runnable 配多个备用实现,主实现失败自动降级到下一个
  • 触发条件:抛出指定的异常类型(如 RateLimitError、TimeoutError),按顺序尝试
  • 区别:with_fallbacks 是整链降级,with_retry 是单节点重试

扩展知识


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

扩展知识


12. bind_tools 是什么?如何绑定工具?

📋 回答重点
  • 把工具 schema(名称/描述/参数)绑定到 ChatModel,让模型能返回 tool_call
  • 模型只输出调用指令,真正执行仍在宿主,结果以 tool role 回传
  • 工具 description(docstring)质量决定选工具准确率

扩展知识


13. retriever 抽象是什么?如何自定义?

📋 回答重点
  • 统一接口:输入 query,输出 List[Document],屏蔽底层检索实现
  • 自定义:继承 BaseRetriever,重写 _get_relevant_documents
  • 内置:VectorStoreRetriever、MultiQuery、ParentDocument、SelfQuery、Ensemble

扩展知识


14. vector store 抽象是什么?如何接入?

📋 回答重点
  • 统一「写入 + 相似度检索」接口:add_documents / similarity_search / as_retriever
  • 接入:Chroma.from_documents(docs, embeddings) 后 as_retriever() 接进 chain
  • 实现:Chroma(原型)、FAISS、Milvus/Qdrant、pgvector

扩展知识


15. text splitter 有哪些类型?如何选择?

📋 回答重点
  • 类型:Character、RecursiveCharacter(默认首选)、Token、MarkdownHeader、Code、Semantic
  • 选择:通用 → 递归字符;Markdown → 按标题;代码 → CodeSplitter;精确 token → Token
  • 关键参数:chunk_size(256~1024 token)、chunk_overlap(10%~20%)

扩展知识


16. document loader 有哪些类型?

📋 回答重点
  • 作用:把各类数据源加载为 Document(page_content + metadata)
  • 类型:文件(Text/CSV/PDF/Markdown)、网页(WebBase)、数据库、企业(Notion/GitHub)、富媒体(OCR)
  • 加载后接 splitter → embedding → vector store 固定链路

扩展知识


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,用于调试、评估、成本分析

扩展知识


19. streaming(astream)如何实现?

📋 回答重点
  • stream/astream 逐 token/逐块返回,前端实时显示
  • LCEL 链自动透传流式(只要下游支持)
  • astream_events 提供更细粒度事件流(on_llm_start/on_token/on_tool_start)

扩展知识


20. batch 和 abatch 有什么区别?

📋 回答重点
  • batch:同步、内部并发处理多个输入;abatch:异步并发,适合高吞吐
  • batch 比循环 invoke 快(受 max_concurrency 限制)
  • 都是 Runnable 统一接口:invoke(单)/ batch(多)/ stream(流式)

扩展知识


21. RunnableWithMessageHistory 是什么?

📋 回答重点
  • 在链上自动管理对话历史:调用前加载、调用后写回
  • 用 session_id 定位会话,历史通过 MessagesPlaceholder 注入
  • 底层 BaseChatMessageHistory 可换内存 / Redis / 数据库

扩展知识


22. LangChain 的 caching 如何实现?

📋 回答重点
  • 用 set_llm_cache 配置:InMemoryCache(开发)、SQLiteCache/RedisCache(生产)
  • 缓存键 = 模型 + prompt,相同请求直接命中不调模型
  • 进阶:语义缓存按相似度命中(问法不同也能命中)

扩展知识


23. LangChain 有哪些优缺点?

📋 回答重点
  • 优点:抽象统一、生态丰富、LCEL 可组合、可观测、社区大
  • 缺点:抽象过度、API 变动大、复杂流程力不从心、性能开销、调试难
  • 结论:原型快、生产要谨慎

扩展知识


24. 为什么 LangChain 被批评「抽象过度」?

📋 回答重点
  • 封装层次多 → 报错栈深、定位难
  • 隐藏关键细节 → 黑盒、不可预期
  • 魔法配置 + API 频繁变动 → 概念膨胀
  • 简单任务被复杂化,抽象收益与成本不匹配

扩展知识


25. LangChain 适用和不适用于哪些场景?

📋 回答重点
  • 适用:快速原型、标准 RAG、多模型切换、简单链式、需现成组件
  • 不适用:复杂状态机/多步 Agent、性能敏感、需完全可控底层、高度定制工作流
  • 法则:原型/标准 RAG 用 LangChain,复杂 Agent 用 LangGraph

扩展知识


26. LangGraph 解决什么问题?和 chain 有什么区别?

📋 回答重点
  • chain 是静态 DAG,难表达循环、分支、动态路由、人工介入、持久化
  • LangGraph 用「图 + 状态」建模,原生支持循环/分支/checkpoint/人工介入
  • 关系:互补——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 的图

扩展知识


29. 条件边(conditional edge)是什么?

📋 回答重点
  • 从节点出发,根据当前状态/输出动态决定下一个节点
  • 实现:route(state) -> 字符串 + 映射表 {返回值: 目标节点}
  • 用途:ReAct 判断「继续工具 vs 结束」、supervisor 路由 worker

扩展知识


30. LangGraph 如何支持循环?

📋 回答重点
  • 图允许有环:agent ⇄ tools 形成循环,靠条件边控制退出
  • 结构:START → agent →(条件边)tools → agent → … → END
  • 防死循环:条件边返回 END、recursion_limit 兜底、节点内检测超限

扩展知识


31. checkpoint 持久化是什么?如何实现?

📋 回答重点
  • 每个节点执行后保存的 State 快照
  • 实现:compile 挂 checkpointer=MemorySaver()/PostgresSaver(),调用带 thread_id
  • 作用:崩溃恢复、多轮会话、人工介入、时间旅行

扩展知识


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

扩展知识


34. subgraph 如何复用?

📋 回答重点
  • 把编译好的图封装成节点嵌入主图,实现模块化复用
  • main_builder.add_node("sub", subgraph) 即可
  • State 字段不同用 input/output 做映射转换

扩展知识


35. LangGraph 如何实现多 Agent(supervisor/swarm)?

📋 回答重点
  • supervisor:中央节点 + 条件边分发到 worker,worker 完成后回到 supervisor 汇总
  • swarm:去中心化,agent 间直接 handoff 交接
  • 区别:supervisor 集中星形控制,swarm 网形交接

扩展知识


36. LangGraph 的 memory(checkpointer + Store)如何设计?

📋 回答重点
  • checkpointer:线程内短期状态,按 thread_id 隔离
  • Store:跨线程长期记忆,键值 + 命名空间 + 语义检索
  • 分工:短期靠 checkpointer,跨会话可复用知识靠 Store

扩展知识


37. LangGraph 的 pregel 执行模型是什么?

📋 回答重点
  • 借鉴 Google Pregel 的 BSP(批量同步并行)图计算模型
  • 每轮:找就绪节点 → 并行执行 → reducer 合并状态 → 下一轮
  • 特点:消息驱动、批量同步、状态聚合、每轮是天然 checkpoint 点

扩展知识


38. time-travel 是什么?如何实现?

📋 回答重点
  • 回到某个历史 checkpoint 查看或重新执行/分支
  • 实现:get_state_history(config) 拿快照列表,指定 checkpoint_id 重新 invoke
  • 可 fork 新分支(换 thread_id/checkpoint_ns)保留原轨迹

扩展知识


39. LangGraph 和旧的 AgentExecutor 有什么区别?

📋 回答重点
  • AgentExecutor:黑盒内置「模型→工具→循环」,难定制
  • LangGraph:显式节点 + 边,循环/路由可见可控
  • LangGraph 原生补上 checkpoint、人工介入、可观测

扩展知识


40. send 和 MapReduce 是什么?

📋 回答重点
  • send:用 Send 把节点多个输出动态扇出到多个目标,实现动态并行
  • MapReduce:Map 拆分成子任务并行处理,Reduce 合并最终结果
  • send 是实现 MapReduce 并行 Map 扇出的机制

扩展知识


41. @tool 装饰器是什么?如何自定义工具?

📋 回答重点
  • @tool 把普通函数转成工具,自动生成 JSON Schema
  • 读取函数签名(类型注解)+ docstring(作为描述)
  • docstring 写清「何时用 + 返回什么」决定调用准确率

扩展知识


42. structured tool(Pydantic)是什么?如何定义?

📋 回答重点
  • 用 Pydantic 模型精确定义参数 schema,参数被校验成类型化对象
  • StructuredTool.from_function(func, args_schema=WeatherInput, ...)
  • 优势:参数校验、字段级 description/约束进 schema、宿主执行更安全

扩展知识


43. BaseChatModel 抽象是什么?

📋 回答重点
  • 对话模型的统一抽象基类,屏蔽厂商 API 差异
  • 接口:invoke/stream/batch + bind_tools + with_structured_output
  • 输入输出是消息:System/Human/AI/Tool 消息

扩展知识


44. bind 和 config 是什么?如何传递配置?

📋 回答重点
  • bind:运行时绑定固定参数(temperature/tools/response_format),生成新 Runnable
  • config:调用时传入的运行上下文(RunnableConfig),沿链自动透传
  • config 含 callbacks、metadata、configurable(session_id/thread_id 等)

扩展知识


45. LangSmith 是什么?有什么用?

📋 回答重点
  • LangChain 官方 LLM 应用可观测与评估平台
  • 能力:tracing、调试回放、评估、监控、Prompt 管理、人工标注
  • 设环境变量即自动上报,也可 SDK 记录任意 LLM 调用

扩展知识


46. LangServe 是什么?如何部署?

📋 回答重点
  • 把 chain/agent 一键部署为 REST API(基于 FastAPI)
  • add_routes(app, chain, path="/my_chain") 后 uvicorn 启动
  • 自动生成 invoke/stream/batch 端点 + OpenAPI + playground + SSE 流式

扩展知识


47. LangChain 和 LangGraph 如何选型?

📋 回答重点
  • 直线数据流(原型、标准 RAG、多模型切换)→ LangChain
  • 带循环/状态/人工介入/多 Agent(状态机)→ LangGraph
  • 判断依据:是否需要循环/状态/人工介入

扩展知识


48. 如何用 LangGraph 实现一个 ReAct agent?

📋 回答重点
  • 结构:START → agent ⇄ tools + 条件边 → END
  • agent 节点用 bind_tools 模型产出 tool_calls;tools 节点执行并回写 ToolMessage
  • 条件边判断「继续调工具 or 结束」;create_react_agent 一行封装

扩展知识


49. 如何用 LangChain 实现一个 RAG 应用?

📋 回答重点
  • 七步:加载 → 分块 → embedding → 入库 → 检索 → 拼 prompt → 生成
  • 链:{"context": retriever, "question": RunnablePassthrough()} | prompt | model | parser
  • 索引离线、检索生成在线;检索质量决定 RAG 上限

扩展知识


50. LangChain/LangGraph 生产部署有哪些注意事项?

📋 回答重点
  • 状态外置:checkpoint 用 Postgres,才能水平扩容
  • 可观测先行:接 LangSmith/Langfuse,记录 trace/成本/错误
  • 成本控制:caching、prompt caching、小模型分工、限步数
  • 安全:工具最小权限、沙箱、提示注入防护、高危人工确认
  • 可靠性:with_fallbacks、重试、限流、超时、死循环检测

扩展知识

  • 模型/prompt 版本化支持回滚;数据集 + evaluator 上线前回归
  • 详细讲解:LangChain 与 LangGraph