一、定位与动机:LangChain 是什么?为何重要?
在大语言模型 (LLM) 被应用于各类环境的时代,组合 LLM 能力和外部系统已成为基础需求。LangChain 作为这样一个专业的编程框架,提供了构建、运行、调用、调试和异常处理所需的 LLM 应用开发全栈能力。
它不仅是"抽象 LLM API 类",而是一个支持运行时模块组合与执行流程组织的框架。旨在为 AI 应用提供:
- 组合化的扩展组件(接口、工具、内存)
- 声明式、可绘图、可观测的执行流程
- 简化 Agent 决策、展示和调试
二、LangChain 最新版本包结构
LangChain 已于 2024年后期完全分离为多个包,同时实现了一套精密的核心设计模式:
核心包结构
包名 | 功能定位 |
---|---|
langchain-core |
核心设计:进程模型接口,Runnable 表达式模型,基础 Prompt/内存 |
langchain |
高级组合:Chain/Agent 高层抽象 |
langchain-community |
社区扩展:不同模型/向量库/文档加载器 |
langgraph |
图形性设计:长期有状态 Agent 图网组合 |
langserve |
应用部署:将任何 Runnable 部署为服务 |
langsmith |
可观测化:分段、日志、评估 Agent/链性能 |

三、核心模型:Runnable + LCEL
LangChain 最核心的设计是 LCEL (LangChain Expression Language),将全部组件抽象为 可执行单元(Runnable):
- 每个 Prompt/链/模型/内存/工具 都是 Runnable
- 支持
.invoke()
/.stream()
/.batch()
/.map()
/.with_fallbacks()
- 支持模块组合、流式调用、异常传递、回退与重试等机制,具备强大的运行时灵活性
LCEL 将各类模块统一抽象为 Runnable,对外提供声明式语法,支持将多个执行单元组合成数据驱动的流程链,并可通过图形化工具对执行路径进行可视化追踪与调试。
- 源代码:
libs/core/langchain_core/runnables/base.py
python
class Runnable(ABC, Generic[Input, Output]):
"""A unit of work that can be invoked, batched, streamed, transformed and composed.
可调用、批处理、流式处理、转换和组合的工作单元。
Key Methods
===========
- **invoke/ainvoke**: Transforms a single input into an output.(将单个输入转换为输出)
- **batch/abatch**: Efficiently transforms multiple inputs into outputs.(高效地将多个输入转换为输出)
- **stream/astream**: Streams output from a single input as it's produced.(在单个输入生成时,流式处理输出)
- **astream_log**: Streams output and selected intermediate results from an input.(流式处理输入的输出和选定的中间结果)
...
LCEL and Composition
====================
The LangChain Expression Language (LCEL) is a declarative way to compose Runnables
into chains. Any chain constructed this way will automatically have sync, async,
batch, and streaming support.
LangChain 表达式语言 (LCEL) 是一种将 Runnable 组合成链的声明式方法。任何以这种方式构建的链都将自动支持同步、异步、批处理和流式传输。
...
"""
- 示例
python
from langchain_core.runnables import RunnableLambda, RunnableMap
chain = RunnableMap({"name": lambda _: "LangChain"}) \
| RunnableLambda(lambda d: f"Hello, {d['name']}!")
print(chain.invoke({})) # 输出:Hello, LangChain!
四、模块分层规划
-
Model I/O (模型调用)
- ChatModel 接口
- EmbeddingModel
- Tokenizer 进行 prompt length 预算
-
Prompt/Memory (输入/内存)
- PromptTemplate
- ConversationMemory, BufferMemory
-
Chains 链式构造
- LLMChain
- SequentialChain / RouterChain / RetrievalQA
-
Agents
- initialize_agent
- AgentExecutor + Tools + ReAct loop
-
Retriever & VectorStore
- FAISS / Chroma / Weaviate
- Retriever 调用
.get_relevant_documents()
-
LangGraph
- 设计有状态/多步驱动/异步任务
五、设计模式攻略
- 抽象层 (Abstract BaseClass) 如 ChatModel/Tool
- 工厂方法 :通过
from_config
和.from_chain_type
快捷构造 - 组合模式 :用 chain 连接各组件
- 策略模式 :agent 根据 prompt 生成出所需工具调用路径
六、后续系列路线规划
这篇文章是全系列的开篇,我们将逐步揭示其核心模块,包括:
- Runnable 实现
- 自定义 Prompt + Memory
- Agent 决策 + Tool 扩展
- RetrievalQA 与向量库管理
- LangGraph 有状态图网
- LangServe / LangSmith 实际部署
结论
LangChain 已不是一个简单调用 LLM API 的 SDK,而是一套有系统设计、可维护、可实践、可扩展的 LLM 应用平台架构。
理解 LangChain 的设计原则,是我们在复杂工程环境中有效构建和优化 AI 应用性能的关键起点。
接下来我们将逐步手工构造一个 Runnable 扩展,从源码解析它是如何实现"演化型进程"。