LangChain 概述与环境准备:从框架定位到第一个应用
大语言模型(Large Language Model,LLM)提供了强大的文本理解、生成与推理能力,但一个可用的 LLM 应用通常不止包含一次模型调用。随着需求扩展,开发者还需要处理消息历史、提示词模板、工具调用、结构化输出、检索增强生成(RAG)、流式响应、异常重试以及运行过程追踪等问题。
LangChain 的价值正在于此:它不是一个新的大模型,而是一套面向 LLM 应用开发的开源框架。它通过标准化接口和可组合组件,帮助开发者把模型、数据、工具与业务流程组织成完整应用。
本文基于 LangChain 1.x 的模块划分与 Python 工具链展开。LangChain 更新较快,具体类名和导入路径应以项目锁定的版本及官方文档为准。
一、为什么需要 LangChain
直接调用模型 API 完全可行,而且对于一次性问答或简单原型,通常已经足够。问题出现在应用逐渐复杂之后。例如,一个企业知识库助手可能同时需要:
- 保存多轮对话上下文,并控制上下文窗口与 Token 消耗;
- 加载、切分并索引私有文档,通过检索获得相关片段;
- 调用搜索、数据库或业务 API 等外部工具;
- 将模型输出约束为满足业务接口要求的结构化数据;
- 记录每一步调用,以便调试延迟、费用和错误。
如果只使用底层模型 SDK,这些能力需要开发者自行设计和维护。LangChain 则提供了较为统一的抽象,使常见能力可以独立使用,也可以组合成完整流程。
下面是两种调用方式的简化对比。
python
# 直接使用 OpenAI SDK
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4.1",
messages=[{"role": "user", "content": "你好"}],
)
print(response.choices[0].message.content)
python
# 使用 LangChain 的 OpenAI 集成
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-4.1")
response = model.invoke("你好")
print(response.content)
第二段代码的关键不只是更短,而是 ChatOpenAI 遵循 LangChain 的模型接口,可以继续接入消息对象、提示词模板、输出解析器、工具和 Agent。需要强调的是,"统一接口"并不意味着不同模型提供商的能力完全等价;模型名称、鉴权方式、工具调用格式和特有参数仍可能需要适配。
二、LangChain 是什么
LangChain 由 Harrison Chase 于 2022 年发起,是一个用于构建 LLM 应用的开源框架。它的核心思想可以概括为三点:
- 标准化:用相对统一的接口访问聊天模型、嵌入模型、工具和检索器。
- 组件化:将提示词、模型、解析器、检索器等能力拆分为可独立复用的组件。
- 可组合:通过链或 Agent 将组件组织为面向业务目标的执行流程。
LangChain 常见的应用方向包括:
| 场景 | 关键能力 | 典型应用 |
|---|---|---|
| RAG | 文档加载、文本切分、向量存储与检索 | 企业知识库、文档问答 |
| 工具调用 | 将函数或 API 暴露给模型 | 天气查询、计算器、数据库操作 |
| Agent | 根据任务动态选择步骤和工具 | 研究助手、自动化工作流 |
| 结构化输出 | 使用 Schema 约束和验证返回结果 | 信息抽取、接口数据生成 |
| 多轮交互 | 管理会话状态和历史消息 | 客服、个人助理 |
LangChain 的目标不是替代模型提供商 SDK,也不是替代业务代码。它更适合承担模型能力与业务系统之间的应用编排层。
三、LangChain、LangGraph 与 Deep Agents
LangChain 生态中经常同时出现 LangChain、LangGraph 和 Deep Agents。三者并非简单的替代关系,而是处于不同抽象层级。
| 组件 | 定位 | 适合的任务 | 控制程度 |
|---|---|---|---|
| LangGraph | Agent 运行时与有状态工作流编排 | 分支、循环、检查点、人工审批、长时任务 | 高 |
| LangChain | 模型与 Agent 应用框架 | 模型调用、RAG、工具链、自定义 Agent | 中等至高 |
| Deep Agents | 构建复杂自主 Agent 的高层套件 | 规划、子 Agent、文件系统与上下文管理 | 相对较低 |
LangChain 的 Agent 能力建立在 LangGraph 运行时之上;Deep Agents 又复用了 LangChain 和 LangGraph 的能力。选型时可以按控制需求判断:
- 需要快速组合模型、提示词、工具或 RAG 流程时,优先使用 LangChain;
- 需要显式定义状态、节点、条件边、暂停恢复或人工审批时,使用 LangGraph;
- 需要较完整的自主任务执行能力,并愿意接受更高层抽象时,再考虑 Deep Agents。
抽象层越高,开发成本通常越低,但开发者能够直接控制的执行细节也会减少。生产系统的选型应同时评估可观测性、Token 成本、故障恢复和流程确定性。
四、LangChain 的核心架构
为了建立全局认识,可以把 LangChain 的主要模块理解为三层。
1. 基础层:定义如何与模型通信
- Models :包括聊天模型、传统文本 LLM 和 Embedding 模型。常用调用方式有
invoke、batch、stream及其异步版本。 - Messages :使用
SystemMessage、HumanMessage、AIMessage、ToolMessage等对象表示不同角色和用途的消息。 - Prompts:通过提示词模板注入变量,避免在业务代码中反复拼接字符串。
- Streaming:让模型以数据块形式逐步返回结果,降低用户感知到的首字延迟。
- Middleware:在 Agent 或模型调用前后插入鉴权、重试、日志、上下文处理等横切逻辑。
2. 能力层:扩展模型能够完成的工作
- Tools:把 Python 函数或外部 API 描述为模型可调用的工具。工具的名称、说明、参数 Schema 和异常处理会直接影响调用可靠性。
- Structured Output:借助 Pydantic 等 Schema 定义期望的数据结构,并对模型输出进行解析与验证。
- Short-term Memory:在 Agent 状态中维护当前线程的消息和上下文。跨会话、跨用户的长期记忆通常还需要外部存储与检索机制。
3. 应用层:将组件组织为业务流程
- Chains :将多个组件串联为确定性的处理流水线。LangChain Expression Language(LCEL)常用管道符
|表达组合关系。 - Retrieval / RAG :典型链路为
DocumentLoader → TextSplitter → Embeddings → VectorStore → Retriever,先检索外部知识,再将相关上下文交给模型生成答案。 - Agents:让模型在运行时决定调用哪些工具以及何时结束。Agent 适合步骤无法完全预先确定的任务,但也会带来额外的延迟、成本和不确定性。
以"查询公司年假政策"为例,一条基础 RAG 流程可以表示为:用户问题进入提示词模板,检索器从向量库中取回相关制度片段,模型结合问题与片段生成答案,最后由结构化输出模块整理结果。只有当系统需要自主判断是否检索或调用其他工具时,才有必要进一步引入 Agent。
五、使用 uv 准备 Python 环境
Python 项目通常需要解决两个问题:一是隔离不同项目的解释器和依赖,二是安装并锁定第三方包。venv + pip、Conda 和 uv 都能覆盖其中一部分或全部需求。
venv + pip是 Python 生态中的基础组合,通用且简单;- Conda 还能管理 CUDA、C/C++ 库等非 Python 依赖,适合科学计算和深度学习环境;
- uv 集成了 Python 版本、虚拟环境、依赖解析和锁文件管理,速度快,适合以 PyPI 依赖为主的 LangChain 项目。
1. 安装 uv
Windows PowerShell:
powershell
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
uv --version
macOS 或 Linux:
bash
curl -LsSf https://astral.sh/uv/install.sh | sh
uv --version
2. 初始化项目
bash
uv init langchain-demo
cd langchain-demo
uv python pin 3.12
uv add langchain langchain-openai python-dotenv
如果使用其他模型或基础设施,应按需安装对应集成包,例如:
bash
uv add langchain-anthropic # Anthropic
uv add langchain-google-genai # Google Gemini
uv add langchain-deepseek # DeepSeek
uv add langchain-ollama # Ollama 本地模型
uv add langchain-chroma # Chroma 向量数据库
LangChain 采用核心包与集成包分离的结构。langchain 提供框架能力,langchain-core 提供基础抽象,模型提供商与向量数据库通常位于独立包中。项目应遵循"按需安装"的原则,避免无意义地扩大依赖面。
3. 理解项目文件
初始化后,常见目录结构如下:
text
langchain-demo/
├── .venv/ # 本地虚拟环境,不提交到 Git
├── .python-version # 项目使用的 Python 版本
├── pyproject.toml # 项目元数据与直接依赖约束
├── uv.lock # 完整依赖图及精确版本
└── main.py # 程序入口
pyproject.toml 描述项目"需要什么",uv.lock 记录解析后"实际使用什么"。二者都应提交到版本控制;.venv 只属于本机环境,应加入 .gitignore。团队成员获取代码后执行以下命令即可同步环境:
bash
uv sync
添加依赖时优先使用 uv add,因为它会同时维护 pyproject.toml 和 uv.lock。uv pip install 更接近传统 pip install,不会以同样方式维护项目的直接依赖声明。
六、安全配置模型凭据
API Key 不应硬编码在源代码中,也不应提交到 Git。可以在项目根目录创建 .env:
dotenv
OPENAI_API_KEY=your-api-key
OPENAI_BASE_URL=https://api.openai.com/v1
同时在 .gitignore 中加入:
gitignore
.env
.venv/
代码通过 python-dotenv 加载配置:
python
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
load_dotenv()
model = ChatOpenAI(
model="gpt-4.1",
api_key=os.environ["OPENAI_API_KEY"],
base_url=os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1"),
)
这里安装的包名是 python-dotenv,导入路径却是 dotenv。不要误装名为 dotenv 的其他包。如果已经装错,可以执行:
bash
uv remove dotenv
uv add python-dotenv
生产环境还应使用部署平台的 Secret 管理能力,并对密钥实施最小权限、定期轮换和泄露吊销,而不是依赖本地 .env 文件。
七、第一个 LangChain 程序
创建 main.py:
python
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
load_dotenv()
model = ChatOpenAI(
model="gpt-4.1",
api_key=os.environ["OPENAI_API_KEY"],
base_url=os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1"),
)
response = model.invoke("你好,请用一句话介绍 Python。")
print(response.content)
运行程序:
bash
uv run python main.py
也可以先验证安装是否成功:
bash
uv run python -c "import langchain; print(langchain.__version__)"
如果调用失败,可以按以下顺序排查:
- 确认
uv run使用的是当前项目环境; - 检查
.env是否位于项目根目录,以及变量名是否正确; - 检查模型名称是否对当前账户和服务端点可用;
- 检查
base_url是否与所用服务商兼容; - 根据锁文件和官方 API 参考确认类名、参数名及导入路径。
八、合理的学习路径
LangChain 的模块很多,但不必一开始就学习 Agent。更稳妥的顺序是:
text
Models 与 Messages
↓
Prompts 与 Structured Output
↓
LCEL 与 Chains
↓
Tools 与会话状态
↓
RAG
↓
Agents
↓
LangGraph 与生产部署
这条路径先建立确定性的模型调用与数据处理能力,再逐步引入检索、工具和自主决策。对于可以用普通代码或固定链解决的问题,不必为了"智能化"而使用 Agent;只有当执行步骤确实需要模型在运行时动态判断时,Agent 才能体现价值。
结语
LangChain 解决的核心问题,不是"如何发送一次模型请求",而是"如何把模型稳定地接入一个完整应用"。它以标准接口连接不同模型,以组件化方式组织提示词、检索、工具和结构化输出,并在任务复杂度上升时通过 LangGraph 提供更细粒度的状态与流程控制。
完成环境准备后,最值得优先掌握的是模型接口、消息、提示词和结构化输出。理解这些基础抽象之后,再学习 LCEL、RAG、Agent 与 LangGraph,会更容易判断每一层工具真正解决的问题,也能避免为简单需求引入不必要的复杂度。