banner
NEWS LETTER

LangChain

Scroll down

一、基础定位(必考)

1) 什么是 LangChain?核心定位

标准回答:
LangChain 是一个用于构建 LLM 应用的开发框架,提供一套通用抽象与可组合原语(Runnable 接口 + LCEL),把模型、提示、检索器、工具、代理(Agent)、记忆、回调与观测等能力统一在一起,支持同步/异步/批处理/流式等生产级特性。核心目标是:用声明式方式组合复杂的 LLM 流程,并与外部系统无缝集成。(LangChain)

2) 主要模块/能力

  • Prompt / ChatPromptTemplate:提示工程与变量插值

  • LLMs / ChatModels:模型接口

  • Chains(基于 LCEL 的 Runnables):声明式组合与并行/路由

  • Agents + Tools:调用工具的自治式工作流(ReAct、工具调用代理等)

  • Retrievers / VectorStores:检索与向量数据库抽象(RAG)

  • Memory / Message History:对话与应用状态管理(正逐步迁移到更通用的可组合范式)

  • Callbacks / Observability(LangSmith):可观测、调试、回放与评测 (LangChain, LangSmith)

3) 为什么用 LangChain,而不是直接调模型 API?

  • 抽象统一:一个 Runnable 接口打通模型、检索、解析、图编排与代理。

  • 可组合/可维护:LCEL 组合让复杂流程可读、可测、易演进。

  • 生产特性:原生支持 async/batch/streaming、回调、观测与评测。

  • 生态丰富:大量向量库、数据源、工具与存储集成。(LangChain)


二、机制与实现(进阶)

1) LCEL 与 Runnable:为什么重要,怎么用?

要义: LCEL(LangChain Expression Language)以声明式方式把 Runnables 组合成可生产的链,自动具备同步/异步/批/流等能力。
极简示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser

prompt = ChatPromptTemplate.from_messages([
("system", "You are a concise assistant."),
("human", "{question}")
])
llm = ChatOpenAI(model="gpt-4o-mini")
chain = prompt | llm | StrOutputParser() # LCEL 组合

# 同步/异步/批/流
resp = chain.invoke({"question": "What is LCEL?"})
# await chain.ainvoke(...); chain.batch([...]); chain.astream_events(...)

要点:可读、可测、可扩展;无需手写繁琐管线代码。(LangChain)

2) Memory:有哪些类型?现在推荐的做法?

  • 历史上常用 ConversationBufferMemory / Window / Summary / KG 等,但新版本对部分类已标注弃用,官方提供了迁移指南,鼓励在 LCEL 中用结构化的 Message History 与显式状态来管理上下文,更通用、可组合、可测试。

  • 实务中建议:将历史消息/关键信号作为链路显式输入;需要跨会话持久化时,使用相应的 ChatMessageHistory 后端(如 DB/云服务),或把状态落库。(LangChain)

面试要点:表明你了解旧记忆接口,但更推崇新式 LCEL/Message History做法;能解释迁移原因(可组合、可观测、一致性更好)。(LangChain)

3) Agents 与 Tools:工作机制与场景

  • ReAct 代理(create_react_agent):通过“思考→行动→观察”的文本模式驱动工具调用;文档已提示该实现较旧,不太适合生产。

  • 工具调用代理(create_tool_calling_agent):利用函数/工具 schema,让模型结构化地直接调用工具,更稳健。

  • 统一执行器 AgentExecutor 负责循环与中止策略(max steps、stop tokens 等)。

  • 决策安全:工具白名单、参数约束、评分器/对齐层(例如二次判别或门控)。(LangChain)

4) 回调与可观测(Callbacks / LangSmith)

  • 通过 callbacks 订阅链/模型事件,做日志、指标、流式、可视化回放

  • LangSmith 提供端到端追踪、对比实验、错误定位、延迟/成本分析与评测工作流。(LangChain, LangSmith)

5) 异步与流式

  • LCEL/Runanble 天然支持同步、异步、批处理与流;

  • astream / astream_events 可流式输出最终结果中间事件;在复杂链/代理中用于逐步可视化前端体验优化。(LangChain)


三、RAG 与向量生态(高级)

1) LangChain 在 RAG 中扮演什么角色?

  • 提供统一的 Retriever 接口、丰富的 VectorStore 集成(FAISS、Chroma、Milvus、Pinecone 等),以及基于 LCEL 的检索-重写-生成-解析可组合链路。

  • 推荐范式:retrieverpromptllmparser(替代旧的 RetrievalQA 黑盒,获得更高可控性与可观测性)。(LangChain)

极简 RAG 链:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

retriever = FAISS.from_texts(["doc1...", "doc2..."], OpenAIEmbeddings()).as_retriever()
prompt = ChatPromptTemplate.from_messages([
("system", "Use ONLY the context to answer.\n{context}"),
("human", "{question}")
])
llm = ChatOpenAI(model="gpt-4o-mini")

rag = {"context": retriever, "question": lambda x: x["question"]} | prompt | llm | StrOutputParser()
ans = rag.invoke({"question": "问:...?"})

2) VectorStores 与 Retrievers

  • VectorStores:FAISS(本地/内存友好)、Chroma(开源生态好)等,官方有对接与教程。

  • Retrievers:统一接口,支持向量/混合/图/SQL 等多种后端与策略(如多路召回、重排序)。(LangChain)


四、应用设计题(你需要举例落地)

1) 智能客服机器人(或内部知识问答)

  • 设计:输入规范化 → 意图解析/工具选择 → RAG(检索公司知识库)→ 答案草拟 → 结构化解析 → 质检/安全审查 → 回复/记录。

  • 要点:对话状态显式化;困难问答走检索;故障与越权有兜底(规则/人审);LangSmith 观测与评测闭环。

2) AI for Science 场景

  • 实验/仿真编排:前处理 → 参数搜索 → 运行 → 结果解析 → 交叉验证 → 汇总报告;

  • 工具位:数值计算、数据库查询、绘图与可视化;

  • 安全性:强约束工具 schema、结果校验与不确定性估计(LLM 判别或启发式门控)。


五、思考/取舍(专家视角)

1) LangChain 的优势与局限

  • 优势:可组合(LCEL)、生态广、生产特性完备(async/stream/observability)、跨语言(Python/JS)。

  • 局限:抽象层带来学习曲线与一定开销;Agent 类在复杂任务上需谨慎设计控制与评估;版本演进较快需跟进迁移指引(如 Memory)。(LangChain)

2) 何时直接用原生 API(不用 LangChain)?

  • 超轻量脚本/一次性实验

  • 超低延迟/成本敏感且流程极简单(单次补全+极少 Glue 逻辑);

  • 你已有稳定内部基建,LangChain 带来的抽象收益有限。

3) LangChain vs LangGraph,如何选择?

  • LangChain(LCEL/Runnables):适合清晰直线/小分支的链路、RAG 主流程、快速迭代;

  • LangGraph:当你需要复杂条件、循环、并发、多智能体协作、长对话持久化与人审时,用“图/状态机”表达更稳健。注意:LangChain 文档已提示 ReAct agent 的旧实现不太适合生产,复杂代理推荐用 LangGraph 的预构建代理或自定义图路由。(LangChain)

4) 如果要改进 LangChain?

  • 提升 文档一致性与迁移引导(特别是 Memory/Streaming API 的版本差异);

  • 强化 评测与数据飞轮(LangSmith 已很好,但可进一步把“观测-优化”打通到链级 A/B 与质量门控);

  • 更标准化的工具生态与安全沙箱(参数/权限/审计一体)。


六、追问速答(细节拉扯)

  • 异步/并发怎么做?
    直接用 Runnable 的 ainvoke/abatch/astream/astream_events;批处理/并行可用 RunnableParallel 或在 LCEL 中以字典/并行分支组织。(LangChain)

  • 如何持久化记忆/历史?
    ChatMessageHistory 对接 DB/云后端,或把中间状态落库;避免把业务状态塞进黑盒 Memory,优先显式状态+可观测。(LangChain)

  • 回调能做什么?
    订阅模型/链事件,做日志、token 级流式、指标、告警;配合 LangSmith 实现全链路追踪与回放。(LangChain, LangSmith)

  • 输出解析怎么做?
    Output Parsers(如 StructuredOutputParser)把文本解析成结构化对象;也可直接让模型走工具调用返回结构化数据。(LangChain)

  • RAG 质量不稳怎么控?
    加强召回(多路/扩展查询)+ 重排序,对生成加引用约束事实校验;用 LangSmith 做对话/问题集评测、回溯与调参。(LangChain)


七、30 秒口播版(面试开场可直接说)

“我把 LangChain 当作可组合的 LLM 基础设施:以 Runnable/LCEL 为核心,把模型、检索、解析、工具与代理统一起来,并且原生支持 async/batch/stream可观测/评测(LangSmith)。RAG 我会用 retriever → prompt → llm → parser 的 LCEL 范式来写,代理上偏向结构化工具调用,复杂智能体编排会交给 LangGraph 来显式管理分支与持久化。对记忆,我更推崇显式状态 + Message History 的做法,避免旧式黑盒化 Memory 的不可控。”

Support me with a coffee?

其他文章
目录导航 置顶
  1. 1. 一、基础定位(必考)
    1. 1.1. 1) 什么是 LangChain?核心定位
    2. 1.2. 2) 主要模块/能力
    3. 1.3. 3) 为什么用 LangChain,而不是直接调模型 API?
  2. 2. 二、机制与实现(进阶)
    1. 2.1. 1) LCEL 与 Runnable:为什么重要,怎么用?
    2. 2.2. 2) Memory:有哪些类型?现在推荐的做法?
    3. 2.3. 3) Agents 与 Tools:工作机制与场景
    4. 2.4. 4) 回调与可观测(Callbacks / LangSmith)
    5. 2.5. 5) 异步与流式
  3. 3. 三、RAG 与向量生态(高级)
    1. 3.1. 1) LangChain 在 RAG 中扮演什么角色?
    2. 3.2. 2) VectorStores 与 Retrievers
  4. 4. 四、应用设计题(你需要举例落地)
    1. 4.1. 1) 智能客服机器人(或内部知识问答)
    2. 4.2. 2) AI for Science 场景
  5. 5. 五、思考/取舍(专家视角)
    1. 5.1. 1) LangChain 的优势与局限
    2. 5.2. 2) 何时直接用原生 API(不用 LangChain)?
    3. 5.3. 3) LangChain vs LangGraph,如何选择?
    4. 5.4. 4) 如果要改进 LangChain?
  6. 6. 六、追问速答(细节拉扯)
  7. 7. 七、30 秒口播版(面试开场可直接说)