LangChain概述与环境准备:从框架定位到第一个应用

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 应用的开源框架。它的核心思想可以概括为三点:

  1. 标准化:用相对统一的接口访问聊天模型、嵌入模型、工具和检索器。
  2. 组件化:将提示词、模型、解析器、检索器等能力拆分为可独立复用的组件。
  3. 可组合:通过链或 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 模型。常用调用方式有 invokebatchstream 及其异步版本。
  • Messages :使用 SystemMessageHumanMessageAIMessageToolMessage 等对象表示不同角色和用途的消息。
  • 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.tomluv.lockuv 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__)"

如果调用失败,可以按以下顺序排查:

  1. 确认 uv run 使用的是当前项目环境;
  2. 检查 .env 是否位于项目根目录,以及变量名是否正确;
  3. 检查模型名称是否对当前账户和服务端点可用;
  4. 检查 base_url 是否与所用服务商兼容;
  5. 根据锁文件和官方 API 参考确认类名、参数名及导入路径。

八、合理的学习路径

LangChain 的模块很多,但不必一开始就学习 Agent。更稳妥的顺序是:

text 复制代码
Models 与 Messages
        ↓
Prompts 与 Structured Output
        ↓
LCEL 与 Chains
        ↓
Tools 与会话状态
        ↓
       RAG
        ↓
      Agents
        ↓
LangGraph 与生产部署

这条路径先建立确定性的模型调用与数据处理能力,再逐步引入检索、工具和自主决策。对于可以用普通代码或固定链解决的问题,不必为了"智能化"而使用 Agent;只有当执行步骤确实需要模型在运行时动态判断时,Agent 才能体现价值。

结语

LangChain 解决的核心问题,不是"如何发送一次模型请求",而是"如何把模型稳定地接入一个完整应用"。它以标准接口连接不同模型,以组件化方式组织提示词、检索、工具和结构化输出,并在任务复杂度上升时通过 LangGraph 提供更细粒度的状态与流程控制。

完成环境准备后,最值得优先掌握的是模型接口、消息、提示词和结构化输出。理解这些基础抽象之后,再学习 LCEL、RAG、Agent 与 LangGraph,会更容易判断每一层工具真正解决的问题,也能避免为简单需求引入不必要的复杂度。

参考资料

相关推荐
海上彼尚3 小时前
Nodejs也能写Agent - 17.LangGraph篇 - Checkpointer 与 Memory
前端·javascript·人工智能·langchain·node.js
丘丘用户思思澪4 小时前
LangChain Agent 完全指南
人工智能·langchain
BreezeJiang5 小时前
我从一个最小 LangChain Demo 里,重新理清了 RAG 的主链路
langchain
phltxy5 小时前
LangChain从模型调用到应用编排
人工智能·深度学习·语言模型·langchain
meilindehuzi_a14 小时前
从零理解并实现 RAG:用 LangChain.js 构建语义检索问答系统
开发语言·javascript·langchain
中微极客18 小时前
解锁LLM开发全栈能力:Python + LangChain + RAG 工程实战指南
人工智能·python·langchain
先吃饱再说20 小时前
从零构建 RAG:用 LangChain 实现检索增强生成
langchain·llm
Darling噜啦啦20 小时前
告别 AI 幻觉!LangChain RAG 完全实战:Document + MemoryVectorStore 打造轻量级语义知识库
langchain
呆瑜nuage21 小时前
LangChain 聊天模型 —— 结构化输出详解与实战
langchain·大模型应用开发·结构化输出·agent基础