环境安装

理解了 LangChain 的架构分层之后,第一件事就是将这些分层架构所对应的核心包和工具安装到本地环境中。LangChain 的安装并不是一个单体包,而是由多个独立发布的子包组合而成,这种设计与它的架构哲学一脉相承,每个包只做自己那一层的事情,不互相侵入。

具体来说,langchain-core 是整个生态的基石,定义了 Runnable 接口和 LCEL 表达式语言,几乎所有其他组件都依赖它,但它自身不依赖任何第三方模型或工具。langchain-community 则扮演适配层的角色,把数以百计的第三方服务接入框架,让你可以用统一的接口操控来自不同厂商的模型和工具。langchain 主包位于其上,提供 Chains、Agents、Retrieval 等高层业务组件,是你日常开发中最常打交道的部分。这里将主包版本锁定到 1.2.14,是为了确保本系列学习过程中所有示例代码的行为与文档描述保持一致,避免因版本差异产生不必要的调试成本。

此外,langgraph 需要单独安装,因为它是一个完全独立的调度引擎,负责以图结构驱动有状态的多步骤工作流,其功能边界与核心框架截然不同,独立发布也意味着它可以按照自己的节奏迭代,不受主包发版周期的制约。langchain-openailangchain-anthropic 分别是 OpenAI 和 Anthropic 的官方集成包,各自封装了对应厂商模型的调用逻辑。这个系列课程统一使用 langchain-openai,因为当前市面上绝大多数主流模型均已兼容 OpenAI API 格式,一个包即可覆盖 OpenAI、DeepSeek、通义千问,以及通过 Ollama 或 OneAPI 等网关接入的本地模型。python-dotenv 则负责从 .env 文件中加载环境变量,它是管理 API 密钥的标准工具,不属于 LangChain 生态本身,却是安全开发的必备基础设施。

下面的命令展示了如何一步到位地安装本系列课程所需的全部依赖包。建议直接复制到终端执行,确保环境一致性:

# 核心框架
pip install langchain==1.2.14 langchain-core langchain-community

# LangGraph
pip install langgraph

# 模型提供商
pip install langchain-openai

# 工具
pip install python-dotenv

等待所有安装命令执行完毕,运行 pip list 即可确认这些包是否已成功安装到当前 Python 环境中,输出的包列表应该包含我们刚才安装的全部包名及对应的版本号。

API 密钥配置

本系列课程统一使用硅基流动作为模型服务平台。注册并获取 API 密钥之后,最常见的错误做法是直接把它硬编码到代码里,比如写成 api_key="sk-xxx"。这样做的隐患极大,一旦代码被提交到版本控制系统,密钥就永久留存在 Git 历史中,即便后来删掉那行代码,通过 git log 依然能被翻出来。公开仓库中泄露的 API 密钥往往在分钟级别内就会被自动扫描工具发现并滥用,造成意料之外的账单损失乃至账号封禁。

正确的做法是创建 .env 文件,将密钥写在里面,并通过 python-dotenv 在运行时将其加载为环境变量。它的内容格式非常简单,键名建议统一使用 OPENAI_API_KEY,这样 LangChain 默认就能识别,无需额外配置:

# .env 文件(存放于项目根目录,切勿提交到 Git)
OPENAI_API_KEY=sk-xxx

文件创建好之后,还需要在代码启动时把它加载进来,这样 LangChain 才能读到密钥。借助 python-dotenv,只需要在入口文件的最顶部加上两行即可:

from dotenv import load_dotenv
load_dotenv()  # 读取 .env 文件并注入环境变量,之后 LangChain 会自动从环境变量中获取密钥

最后是一个极易被忽视的安全步骤,务必在 .gitignore 文件中将 .env 加入排除列表,确保它永远不会被提交到 Git 仓库中。

第一个 LangChain 应用:传统方式 vs LCEL

在没有 LangChain 之前,调用大语言模型完成一个"角色扮演回答问题"的场景,开发者需要手动拼接系统提示词与用户消息,把它们组织成模型 API 要求的特定格式,发起请求,再从返回的 JSON 结构中解析出文本内容。这个过程看似简单,但一旦涉及变量替换、多轮对话历史管理或者输出格式校验,代码就会迅速膨胀成一堆难以维护的字符串操作和条件判断。更糟糕的是,每换一个模型提供商,这套逻辑几乎都要从头重写,因为不同厂商的接口规范各不相同。

LangChain 用三个核心组件彻底重构了这个流程。ChatPromptTemplate 负责定义提示词模板,它把固定的指令与动态的变量占位符分离开来,让 prompt 的结构可复用、可测试。ChatOpenAI 是模型的抽象封装,它统一了对 OpenAI 模型的调用接口,并通过 Runnable 接口与其他组件保持一致。StrOutputParser 负责将模型返回的复杂消息对象解析为纯字符串,屏蔽了不同模型输出格式之间的细节差异。三者都实现了同一套 Runnable 接口,这说明它们天然具备被组合的能力。

LCEL(LangChain Expression Language)则把"组合"这件事变得前所未有地直观。通过管道运算符 |,三个组件被串联成一条数据处理流水线:上一个组件的输出自动成为下一个组件的输入,整个调用链的执行顺序与代码的书写顺序完全对应,读起来就像一句人话:先格式化 prompt,再送给模型,再把结果转成字符串。相比之下,传统方式需要在多处跳跃才能理清数据的流向,而 LCEL 让这条脉络一目了然。

把刚才说的三个组件用代码实现出来,就是下面这样。这里选择通义千问 Qwen/Qwen3.6-35B-A3B 作为示例模型,你也可以换成硅基流动上托管的任何其他兼容 OpenAI API 的模型:

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

llm = ChatOpenAI(model="Qwen/Qwen3.6-35B-A3B", temperature=0)
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个{role}"),
    ("user", "{question}")
])
output_parser = StrOutputParser()

# LCEL 管道式组合
chain = prompt | llm | output_parser
result = chain.invoke({"role": "Python专家", "question": "解释装饰器"})
print(result)

运行这段代码之后,如果你看到了有意义的文本输出,说明整个环境已经顺利跑通了。下图就是我运行这段代码之后得到的回复,模型扮演 Python 专家的角色,对"解释装饰器"给出了详尽的回答,从装饰器的解释到进阶的原理,最后到使用示例都有涉及。不过你可能注意到代码中 temperature=0 这个参数,它把模型的随机性压到了最低,让每次运行的结果尽可能一致,这样在学习阶段验证行为会方便很多。而 chain.invoke() 接收的那个字典,则与 prompt 模板里的 {role}{question} 占位符一一对应——你只需要把变量名和值丢进去,LangChain 会自动完成模板替换、模型调用和结果解析的全过程,调用方不需要关心这些中间环节到底是怎么实现的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

练习任务

今天的三项练习构成一条认知递进的路径,建议按顺序完成。首先专注于搭建完整的开发环境,把上述所有依赖包安装到位,配置好 .env 文件并成功运行示例代码,这一步的核心目标是验证本地环境的可用性,排除所有潜在的安装与配置障碍,为后续学习铺平道路。

在环境跑通之后,安装 langchain-anthropic,尝试把示例代码中的 ChatOpenAI 替换为 ChatAnthropic,用完全相同的 prompt 向不同的模型提问,观察两者的回答风格与内容差异。这项练习的真正收获不在于比较哪个模型更好,而在于亲身验证 LangChain 封装层的核心价值——切换模型只需更改一行初始化代码,chain 的其余部分完全不需要修改,这正是统一接口抽象的意义所在。

最后做一次对比性思考,如果不使用 LangChain,直接调用 OpenAI 原生 Python SDK 完成同样的功能需要几步?把两段代码并排放在一起,分析各自的代码量、可读性和可维护性差异,用不超过 100 字的文字写下你的结论。这个过程会让你对 LangChain 的设计决策形成更有依据的判断,而不是停留在"好用"这种模糊的直觉层面。

考核点 ✅

用不超过 100 字的文字写下你的结论。这个过程会让你对 LangChain 的设计决策形成更有依据的判断,而不是停留在"好用"这种模糊的直觉层面。

考核点 ✅

今天内容的考核围绕四个维度展开,目标是确认你不仅能让代码跑起来,还真正理解了每一步背后的含义。环境验证方面,执行 pip list | grep langchain 并截图,确认输出中包含正确的包名与版本号,这一步看似机械,却是排除"我以为装了但没装"这类隐性问题的唯一可靠手段。代码实操方面,成功运行第一个 LCEL chain 并得到一段有意义的文字输出,不只是打印出来就算完成,而是要理解代码中每一行的职责,ChatPromptTemplate 做什么、ChatOpenAI 做什么、StrOutputParser 做什么,以及 | 运算符如何把它们串联起来。多模型切换方面,将 ChatOpenAI 替换为 ChatAnthropic 后,chain 在不修改其余代码的情况下仍能正常运行,这是对 LangChain 接口一致性设计的直接验证,如果切换时遇到报错,说明对封装层的理解还不到位。差异化分析方面,用 100 字以内写下 LangChain 封装相对于裸调 API 的核心优势,文字要具体而非空泛,能够指向真实的代码场景,而不是重复一遍官方文档的营销语言。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐