很多人刚接触 LangChain,照着官方文档写完 import 就开始迷糊:API key 要不要写死在代码里?ChatOpenAI、HumanMessage、StrOutputParser到底都是什么?为什么model | parser就能把两个东西串成一条链?
这篇文章把官方「快速上手」那一套拆开讲透:6 个步骤各自在解决什么痛点、背后Runnable和LCEL两个核心抽象到底是什么、以及新手最常踩的 5 个坑。
一、先说结论
快速上手可以压缩成一句话:配好 key → 定义模型 → 拼消息 → 调一下 → 解析输出 → 用管道符串成链。但真正值得记住的,不是这 6 步的 API,而是两个贯穿全框架的抽象:
- Runnable:所有组件的统一定义接口(
invoke / batch / stream)。 - LCEL:用
|把多个 Runnable 声明式组合成一条「链」。
环境为Python 3.13 + langchain 0.3.x;快速上手实际只用到langchain-openai和langchain-core两个包。整个 quickstart 里的model、parser、chain全都是 Runnable 实例,统一由.invoke()驱动——这是理解后面一切的前提。
二、核心机制
2.1 为什么需要 LangChain(原生 LLM 的 7 个痛点)
课件原话点得很直接:把 LLM 当搜索引擎用还行,一旦嵌进真实应用就暴露一堆问题——
- 简单 Prompt 容易幻觉;
- 提示词结构能否统一规范;
- 如何灵活切换不同大模型;
- 模型输出是非结构化的,怎么和要结构化数据的程序接口对接;
- 怎么克服预训练知识陈旧、引入实时信息;
- 怎么连接外部工具/系统执行具体任务。
LangChain 的解法:把自然语言处理流程拆解成标准化组件,开发者自由组合、高效定制工作流。这一步的定位必须清楚——它是「脚手架/编排框架」,不是模型本身。
2.2 Runnable 接口(地基)
Runnable 是使用所有 LangChain 组件的基础。它定义了统一接口,允许组件具备五种能力:
| 能力 | 含义 |
|---|---|
invoke | 单个输入 → 单个输出 |
batch | 多个输入高效批量转换 |
stream | 输出边生成边流式返回 |
| inspect | 查看输入/输出/配置的原理图信息 |
compose | 多个 Runnable 组合成复杂管道(LCEL) |
为什么这个抽象关键?语言模型、输出解析器、检索器、甚至编译后的 LangGraph 图,全部实现 Runnable。于是它们能互相拼接、能统一被invoke/batch/stream调用——这就是「组合」之所以可能的根。
2.3 LCEL(声明式组合)
LCEL(LangChain Expression Language)用声明式方法,从已有 Runnable 构建新的 Runnable:
chain = model | parser这条语句构建出的新对象类型是RunnableSequence(一种「链」)。重点:RunnableSequence 自身也是 Runnable 实例,所以它实现了完整接口,能继续.invoke(),也能再和别的 Runnable 拼。|不是普通管道,而是 LCEL 的组合运算符。
三、实现细节(6 步)
步骤 1:申请 API key 并配置环境变量
key 不写死在源码里,而是放进环境变量,原因是隐私——避免在代码仓库里泄露。程序通过读取对应环境变量拿 key。
import os os.environ["OPENAI_API_KEY"] = "你的key" # 或写在 shell / .env 里或者手动添加
步骤 2:定义大模型
from langchain_openai import ChatOpenAI model = ChatOpenAI(model="gpt-5-mini") //如果你用的是deepseek的API 执行下面代码 model = ChatOpenAI( model="deepseek-chat", # deepseek模型名称 base_url="https://api.deepseek.com", # deepseek接口地址 # api_key 会自动读取环境变量 OPENAI_API_KEY,你需要把deepseek的key放到OPENAI_API_KEY )步骤 3:定义消息列表
from langchain_core.messages import HumanMessage, SystemMessage messages = [ SystemMessage(content="Translate the following from English into Chinese"), HumanMessage(content="hi!"), ]SystemMessage:系统角色,通常作为序列第一条,用来启动 AI 行为。HumanMessage:用户角色,从用户传给模型。
步骤 4:调用大模型
result = model.invoke(messages) print(result) # 类型为 AIMessagemodel是 Runnable,所以能用.invoke()。返回的AIMessage关键字段:
| 字段 | 作用 |
|---|---|
content | 消息正文 |
additional_kwargs | 工具调用等附加负载 |
response_metadata | 响应本身信息(请求ID、模型版本、原始元数据)→ 调试/日志用 |
usage_metadata | Token 消耗量化(in/out/total)→ 成本计算/监控用 |
步骤 5:输出解析
from langchain_core.output_parsers import StrOutputParser parser = StrOutputParser() print(parser.invoke(result)) # 输出:你好!StrOutputParser把AIMessage解析成纯字符串。它也是 Runnable。
步骤 6:链式执行(完整代码)
from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage, SystemMessage from langchain_core.output_parsers import StrOutputParser model = ChatOpenAI(model="gpt-5-mini") messages = [ SystemMessage(content="Translate the following from English into Chinese"), HumanMessage(content="hi!"), ] parser = StrOutputParser() chain = model | parser # LCEL 组合 result = chain.invoke(messages) print(result) # 输出:你好!四、常见误区(新手 5 坑)
- API key 写死在源码→ 仓库一推就泄露,用环境变量。
- 把
gpt-5-mini当固定写法→ 那是课程示例,实际换成你可用的模型名(待验证)。 - 以为
invoke只有模型能用→ 解析器、链都是 Runnable,统一用invoke。 - 没理解 chain 的本质→
chain是RunnableSequence,本身还是 Runnable,可继续组合。 - 装包装错→ 快速上手只用
langchain-openai+langchain-core;import报错多半是集成包没单独装(呼应《LangChain 安装》那篇)。
五、面试官追问(区分真题 / 推导)
【真题】LCEL 是什么?model | parser的|做了什么?
答:LCEL 是声明式组合语言,|把左右两个 Runnable 包成RunnableSequence。它仍是 Runnable,因此自动获得invoke/batch/stream一致接口。这是 2026 大模型岗高频题。
【真题】invoke/batch/stream区别?
答:invoke 单输入单输出;batch 多输入批量;stream 边生成边返回。三者都是 Runnable 统一接口的方法,调用方无需关心背后是模型还是解析器。
【推导】为什么model和parser都能.invoke()?
答:两者都实现 Runnable 接口,invoke 是契约方法,与具体组件类型无关。
【真题】接入大模型有哪几种方式?各自优劣?
答:①官方原生 SDK(如 openai 库直连):可控、无抽象层,但样板代码多、难组合;②LangChain 等框架(本篇所用):组件化、易拼接、自动获得 batch/stream,代价是抽象层有学习成本、版本变动快;③原生 HTTP 请求:最轻、零依赖,但鉴权/重试/解析全要自己写。选框架的核心收益就是 Runnable/LCEL 的统一组合能力。(注:流浪已写《LLM 三种接入方式》专文,本篇是其中「框架方式」的落地示例。)
【推导】response_metadata和usage_metadata有什么区别?
答:前者侧重「响应本身上下文」(请求ID、模型版本、服务商原始元数据)→ 调试/日志;后者侧重「资源消耗量化」(Token 数)→ 成本/监控。一个回答「这次请求怎么回事」,一个回答「花了多少」。
六、与前面文章的联系 / 面试串联(必看)
按约定,本篇和「流浪」已发文章做知识点串联,每个常考点附答案:
① 串联《LangChain 安装:从 pip install 到看懂包依赖链路》
本篇from langchain_openai import ChatOpenAI来自langchain-openai,HumanMessage / StrOutputParser来自langchain-core——正是安装篇讲的依赖关系。
面试常考:为什么装了langchain还import langchain_openai报错?答:langchain是元包,OpenAI 集成需单独装langchain-openai(默认规则在面试追问第 5 条也写过)。
② 串联《LLM 三种接入方式》【推断·未读正文】
从标题可确定流浪专文讲过接入方式;本篇是其中「框架方式」的具体落地。上面「面试官追问第 4 条」已给出三种方式的答案与优劣,可直接复用。
③ 串联《从 Vibe Coding 到 LangGraph》【推断·未读正文】
本篇chain = model | parser是 LCEL 声明式组合的最小形态;LangGraph 在此之上加了状态(State)与分支/循环,把线性链升级成有状态图。理解了 Runnable/LCEL,再学 LangGraph 是顺坡下坡。
七、小结
一句话:快速上手真正要记住的是Runnable(统一接口)+ LCEL(用|组合),6 步 API 练两遍就熟,其余接口用到再查。
如果这篇帮你把「快速上手」嚼透了,欢迎在评论区聊聊你踩过的第一个坑,或者想看我拆哪块核心组件。我是流浪,持续更新 LangChain 深度笔记,我们下篇见。