LangChain 学习笔记:大模型应用开发的“万能钥匙”

从零开始认识 LangChain,搞懂它解决了什么问题、怎么用、环境怎么搭


一、我为什么要了解 LangChain?

这事得从我第一次用大模型 API 说起。

当时我想做一个简单的“聊天机器人”,想着直接调 OpenAI 的 API 不就完了吗?确实,调个接口返回回答,几行代码就搞定了。但后来需求慢慢变多了——要记住上下文、要能联网搜索、要能查本地文档、输出格式还得是固定的 JSON……

每加一个功能,代码就膨胀一圈。对话历史得自己维护、token 超了得自己截断、模型返回的格式不对得自己写正则去修、换一个模型几乎要重写大半代码。我发现自己 80% 的时间都在处理这些“杂活”,真正写业务逻辑的时间少得可怜。

这时候我才明白:调用 API 和做产品之间,隔着一条很宽的路。

后来我遇到了 LangChain,才算是找到了正确的打开方式。


二、LangChain 是什么?

简单说,LangChain 是一个专门用来开发大模型应用的框架。它把开发过程中那些重复性的、通用的工作都封装好了,让你不用每次都从零开始写。

打个比方:如果你想开发一个 Web 网站,你不会从写 HTTP 服务器开始,而是会用 Spring Boot、Django、Express 这样的框架。LangChain 干的也是同样的事——只不过它服务的对象是大语言模型。

LangChain 是 2022 年 10 月由哈佛大学的 Harrison Chase 发起的开源项目。注意一个有意思的时间点:ChatGPT 是 2022 年 11 月才问世的,LangChain 比 ChatGPT 还早一个月。创始人能在这个时间点就布局大模型应用框架,眼光确实挺准的。


三、LangChain 能帮我省掉哪些麻烦?

对比一下直接调用 API 和使用 LangChain 的区别,你就明白了:

直接调用 API 做一件事,你可以想象一个场景:你想让模型根据你的知识库回答问题。你需要自己去把文档加载进来、切成小块、存到向量数据库、写检索逻辑、拼 prompt、调 API、解析输出……每一步都得自己写代码,还得处理各种边界情况。

用 LangChain,这些事情基本上都是现成的。文档加载有 DocumentLoader,文本切分有 TextSplitter,向量化存贮有 VectorStore,检索有 Retriever,拼接 prompt 有 PromptTemplate……你只需要把这些组件串起来,十几行代码就能搞定。

说白了就是:你可以把精力放在“做什么产品”上,而不是“怎么调接口”上。

具体来说,LangChain 帮我省掉了这些事:

  • 对话管理:不用自己维护消息列表、控制 token 上限、做摘要压缩
  • 工具调用:不用自己定义函数 schema、解析模型返回的 JSON、处理异常
  • RAG(检索增强生成) :整个流程从加载文档到检索到生成答案,一条链搞定
  • 模型切换:从 OpenAI 换到 Claude 换到 DeepSeek,改一行配置就行
  • 结构化输出:用 Pydantic 定义好格式,框架自动帮你解析和校验

四、LangChain 生态:不只一个包

刚开始接触 LangChain 的时候,我光看文档就有点晕——怎么又是 LangChain 又是 LangGraph 又是 Deep Agents?后来才搞明白,这其实是三层结构,从底层到上层层层构建的关系

用最简单的话说:

LangGraph 是最底层,它负责“精确控制每一步流程”。你可以把它想象成一个流程图,每个节点做什么、节点之间怎么流转,都由你说了算。适合企业级复杂应用,比如需要审批节点、人工审核、回滚等场景。

LangChain 是中间层,它提供了标准化的抽象组件。你不需要关心底层怎么流转的,只需要把组件组合起来用就行。大部分通用开发场景用这一层就够了。

Deep Agents 是最上层,开箱即用。你只需要告诉它“我要干什么”,它自己规划步骤、调用工具、完成任务。适合快速原型验证。

这三层是层层依赖的:Deep Agents 建立在 LangChain 之上,LangChain 又建立在 LangGraph 之上。你不需要全部掌握,用哪层取决于你的需求有多复杂。


五、核心模块速览

LangChain 的模块分成三层:

基础层(用什么说话)

这一层定义了和模型之间怎么“对话”。包括:

  • Messages:标准化的消息格式,比如 SystemMessage(系统指令)、HumanMessage(用户输入)、AIMessage(模型回复)、ToolMessage(工具返回结果)
  • Prompts:提示词模板,支持变量插入和复用,比如 "请用{language}介绍{topic}"
  • Streaming:流式输出,让结果一个字一个字地蹦出来,体验更好

能力层(怎么做)

这一层提供了核心能力组件:

  • Models:统一的模型调用接口,所有模型都用 invokebatchstream 三种方法,换模型不用改代码
  • Tools:用 @tool 装饰器定义一个函数,模型就能自动识别和调用它
  • Memory:管理对话历史,支持短期记忆、长期记忆、摘要压缩
  • Structured Output:用 Pydantic 模型约束输出格式,确保返回标准的 JSON

应用层(做什么)

这一层是面向具体业务场景的:

  • Chains:用管道符 | 把多个组件串成流水线,比如 prompt | llm | parser
  • RAG:从文档加载到向量检索到生成回答的完整链路
  • Agents:模型自主规划执行步骤,循环调用工具直到完成任务

六、环境准备(我用的是 uv)

LangChain 是基于 Python 的,所以第一步是搭好 Python 环境。

我为什么不用 conda?

以前我习惯用 conda,但这次我换了 uv。简单对比一下:

  • conda 确实什么都能管,但速度慢、体积大
  • uv 是 Rust 写的,安装包比 pip 快 10 到 100 倍
  • LangChain 的所有包都在 PyPI 上,用 uv 刚好合适
  • uv 还能管理 Python 版本,替代了 pyenv 的功能

如果你还在用 conda 做 LangChain 开发,可以考虑换 uv,体验真的不一样。

安装 uv

Windows(PowerShell):

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

macOS / Linux:

curl -LsSf https://astral.sh/uv/install.sh | sh

装完验证一下:uv --version

创建项目并安装 LangChain

# 创建项目目录
mkdir langchain-course && cd langchain-course

# 初始化项目(自动创建虚拟环境和 pyproject.toml)
uv init

# 指定 Python 版本
uv python pin 3.12

# 安装核心包
uv add langchain

# 安装你需要的模型集成
uv add langchain-openai      # OpenAI
uv add langchain-anthropic   # Claude
uv add langchain-deepseek    # DeepSeek
uv add langchain-ollama      # 本地模型

# 安装常用扩展
uv add python-dotenv         # 环境变量管理
uv add langchain-chroma      # 向量数据库

理解那几个文件

用 uv 初始化后,目录里会出现几个文件:

  • pyproject.toml:项目的“购物清单”,记录了你装了哪些包。你不需要手动编辑,uv add 会自动维护它。
  • uv.lock:精确记录了每个包的版本号,包括间接依赖。把这个文件提交到 Git,别人拉下来执行 uv sync 就能得到一模一样的环境。
  • .venv:虚拟环境文件夹,存放实际安装的包。这个不要提交到 Git,加到 .gitignore 里。

配置 API Key

LangChain 本身不提供模型,你需要有自己的 API Key。我目前用的是 CloseAI(国内中转平台,支持支付宝),配置方式很简单:

在项目根目录创建 .env 文件:

OPENAI_API_KEY=你的密钥
OPENAI_BASE_URL=你的代理地址

然后在代码里加载:

from dotenv import load_dotenv
import os

load_dotenv()
api_key = os.getenv("OPENAI_API_KEY")

记得把 .env 加到 .gitignore,别把密钥传到网上了。


七、第一个程序

环境搭好之后,我写了一个最简单的调用试试水:

from langchain_openai import ChatOpenAI
import os

llm = ChatOpenAI(
    model="gpt-4",
    api_key=os.getenv("OPENAI_API_KEY"),
    base_url=os.getenv("OPENAI_BASE_URL")
)

response = llm.invoke("你好,请用一句话介绍 Python")
print(response.content)

invoke 是最基本的调用方法,传字符串进去,拿回复出来。就这么简单。

后面我还会学到 stream(流式输出)和 batch(批量调用),但这是第一步。


八、接下来我打算学什么

我现在刚把环境搭好、跑通了第一个 demo,接下来准备按这个路线往下走:

  1. Model I/O:各种模型的调用方式、消息格式、输出解析
  2. Prompts:提示词模板怎么写、怎么复用
  3. Chains:怎么把多个步骤串成一条流水线
  4. Memory:怎么让模型记住上下文
  5. Tools:怎么让模型调用外部工具
  6. RAG:检索增强生成,让模型能回答私有数据的问题
  7. Agents:让模型自主规划执行

九、一点心得

学 LangChain 这件事,我的感受是:它解决的不是“能不能做”的问题,而是“能不能高效地做”的问题。

直接调 API 当然也能实现所有功能,但代码量、维护成本、可读性都会随着需求增加而迅速恶化。LangChain 提供的是一套标准化的“乐高积木”,让你可以快速拼出想要的功能,而不是每次都从烧砖开始。

如果你也在学 LangChain,我的建议是:别只看文档,动手写代码。 从最简单的 invoke 开始,慢慢往上加功能——加 prompt 模板、加输出解析、加工具调用……每一步都跑通,比看十遍文档都管用。

后面学到新东西我再来更新这篇博客。如果你也在学 LangChain,欢迎一起交流。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐