纲要
- LangChain 大模型组件概述
LLMs与ChatModels的核心区别- 官方合作包与社区包的依赖组织
- 大模型标准参数配置
- 标准事件驱动大模型交互
invoke:同步调用stream:流式输出batch:批量处理astream_events:异步事件流with_structured_output:结构化输出
- 消息格式:
OpenAI格式与LangChain格式 - 上下文窗口与速率限制的基础认知
- 完整可运行代码示例
为什么需要统一的大模型组件
当前大模型生态中,不同的厂商提供各自独立的 API 与调用方式。若直接使用原生 SDK 进行 AI 应用开发,在需要切换或组合多个模型时将面临极高的集成成本。LangChain 提供的大模型组件正是为了抹平这些差异:无论是 OpenAI、DeepSeek 还是 Anthropic 的模型,都可以通过统一接口进行调用,从而显著降低开发复杂度。
LLMs 与 ChatModels 的区别
LangChain 对大模型的封装分为两类,其核心差异如下:
| 类型 | 输入/输出 | 功能特性 | 当前地位 |
|---|---|---|---|
LLMs | 纯字符串 | 仅文本补全,无工具调用、结构化输出、多模态 | 旧范式,逐渐弃用 |
ChatModels | 消息列表(支持 OpenAI 与 LangChain 两种消息格式) | 支持工具调用、结构化输出、多模态、流式等 | 主流推荐使用 |
ChatModels既兼容 OpenAI 的system/user/assistant消息结构,也支持 LangChain 自定义的SystemMessage、HumanMessage、AIMessage、ToolMessage等格式。- 在 LangChain 中,带有
Chat前缀的类(如ChatOpenAI)都属于ChatModels,而早期以纯文本为主的模型封装通常以LLM结尾(如OpenAI)。当前实际开发中几乎全部采用ChatModels。
包的组织:官方合作包与社区包
从 LangChain 0.3 版本开始,依赖包进行了拆分:
- 官方合作包:以
langchain-为前缀,如langchain-openai、langchain-anthropic、langchain-google-genai、langchain-aws。由 LangChain 官方维护,接口升级及时,稳定性高。 - 社区包:集中在
langchain-community中,由开源社区贡献,维护时效和稳定性相对较低。
推荐优先使用官方合作包。安装方式示例:
pip install langchain-openai langchain-anthropic langchain-deepseek
标准参数一览
实例化大模型组件时可配置的核心参数(官方合作包强制统一):
| 参数 | 说明 | 示例 |
|---|---|---|
model | 模型名称 | "gpt-4" |
temperature | 随机度(0~1),越小越遵循指令,越大越有创造性 | 0.0(严格)或 0.7(创意) |
timeout | 单次请求超时秒数 | 30 |
max_tokens | 最大输出 token 数(部分新模型推荐使用 max_completion_tokens,详见官方文档) | 200 |
stop | 停止符,遇到该字符时立即停止输出 | "\n" 或 "我" |
max_retries | API 调用失败后的最大重试次数 | 3 |
api_key | 对应厂商的 API 密钥 | 可从环境变量读取 |
base_url | 代理地址(如有需要) | "https://api.openai.com/v1" |
rate_limit | 请求速率限制(QPS) | 按厂商文档设置 |
注意:标准参数仅对厂商 API 开放了相应能力的模型有效。社区包不强制使用统一参数名。
标准事件驱动
大模型组件提供了一系列标准方法(事件)来驱动交互,下面的时序图展示了几种核心事件的生命周期:
invoke:同步调用
最基础的调用方式,传入提示词,等待模型返回完整结果。
stream:流式输出
逐 token 返回,前端可以呈现打字机效果,显著提升用户体验。使用 for 循环消费 chunk.content。
batch:批量处理
同时向模型发送多个请求,全部完成后统一返回结果列表。适用于批量评测、离线生成等场景。
astream_events:异步事件流
基于事件的流式输出,允许开发者在模型开始响应、流式输出中、输出结束时捕获不同事件并执行自定义逻辑。需使用 async for,并指定 version="v2"。
with_structured_output:结构化输出
让模型直接返回结构化数据(如 JSON),而非纯文本。通常结合 Pydantic 定义输出模式,下游代码可直接按字段读取,避免正则解析。
消息字段说明
大模型返回的 AIMessage 包含以下关键字段:
content:模型响应的文本内容tool_calls:工具调用信息(标准化字段)invalid_tool_calls:无效的工具调用usage_metadata:输入 / 输出 token 统计id:消息唯一标识response_metadata:响应头、token 计数等原始数据
不同模型的原生返回字段并不相同,LangChain 会对 usage_metadata 等做标准化处理,但部分字段仍需注意厂商差异。
完整可运行代码
以下代码展示了使用 langchain-openai 调用 GPT-4,并演示标准参数配置以及五个核心事件。运行前请设置环境变量 OPENAI_API_KEY,并安装依赖:
pip install langchain-openai pydantic
import os
import asyncio
from pydantic import BaseModel, Field
from langchain_openai import ChatOpenAI
# 1. 配置模型,演示所有标准参数
llm = ChatOpenAI(
model="gpt-4",
temperature=0.4, # 随机度
timeout=30, # 超时秒数
max_tokens=200, # 最大输出 token 数
# stop=["我"], # 可选停止符
max_retries=3, # 最大重试次数
api_key=os.getenv("OPENAI_API_KEY"), # 从环境变量读取
# base_url="https://your-proxy.com/v1", # 如需代理
)
prompt = "用一句话介绍一下你自己。"
# 2. invoke:同步调用
print("=== invoke ===")
result = llm.invoke(prompt)
print(result.content)
print()
# 3. stream:流式输出
print("=== stream ===")
for chunk in llm.stream(prompt):
print(chunk.content, end="", flush=True)
print("\n")
# 4. batch:批量处理
print("=== batch ===")
questions = [
"LangChain 是什么?",
"LangChain 有哪些竞品?",
]
results = llm.batch(questions)
for q, r in zip(questions, results):
print(f"Q: {q}\nA: {r.content}\n")
print()
# 5. astream_events:异步事件流
async def stream_events():
print("=== astream_events ===")
events = []
async for event in llm.astream_events(prompt, version="v2"):
events.append(event)
event_name = event["event"]
if event_name == "on_chat_model_start":
print("[事件] 模型开始响应")
elif event_name == "on_chat_model_stream":
chunk = event["data"]["chunk"]
if chunk.content:
print(chunk.content, end="", flush=True)
elif event_name == "on_chat_model_end":
print("\n[事件] 模型响应结束")
# 最终输出包含 usage_metadata
final_output = events[-1]["data"]["output"]
print(f"Token 用量: {final_output.usage_metadata}")
print()
asyncio.run(stream_events())
# 6. with_structured_output:结构化输出
print("=== structured output ===")
class Joke(BaseModel):
"""让模型输出一个笑话"""
setup: str = Field(description="笑话的开场/包袱铺垫")
punchline: str = Field(description="笑话的包袱/笑点")
rating: int | None = Field(default=None, description="好笑程度 1-10 分")
structured_llm = llm.with_structured_output(Joke)
joke_result = structured_llm.invoke("给我讲一个程序员的笑话")
print(f"setup: {joke_result.setup}")
print(f"punchline: {joke_result.punchline}")
print(f"rating: {joke_result.rating}")
运行说明:
- 代码依赖
langchain-openai和pydantic,请先通过 pip 安装。 - 需要有效 OpenAI API Key 并设置为环境变量
OPENAI_API_KEY。 stop参数可根据需要取消注释,观察停止符效果。- 异步部分需 Python 3.8+ 并安装
asyncio(标准库自带)。
API 速览
本文涉及的核心 API 均来自 langchain-openai 包(v0.3+),主要接口如下:
| API | 所属库 | 方法签名 | 说明 |
|---|---|---|---|
ChatOpenAI | langchain_openai | ChatOpenAI(model: str, temperature: float, ...) | OpenAI 对话模型客户端,返回 ChatOpenAI 实例 |
invoke | BaseChatModel | invoke(input: str, config: dict) -> AIMessage | 同步调用,返回完整 AIMessage |
stream | BaseChatModel | stream(input: str, config: dict) -> Iterator[ChatGenerationChunk] | 流式调用,返回生成器,逐 token 产出 ChatGenerationChunk |
batch | BaseChatModel | batch(inputs: List[str], config: dict) -> List[AIMessage] | 批量调用,传入字符串列表,返回 AIMessage 列表 |
astream_events | BaseChatModel | astream_events(input: str, version: str, config: dict) -> AsyncIterator[dict] | 异步事件流,需指定 version="v2",产出事件字典 |
with_structured_output | BaseChatModel | with_structured_output(schema: Type[BaseModel]) -> Runnable | 绑定输出模式,返回支持结构化调用的 Runnable,调用 invoke 后返回 Pydantic 模型实例 |
参考文档
官方文档
参考链接
总结
本文系统介绍了 LangChain 大模型组件的核心知识,旨在帮助开发者通过统一接口调用不同厂商的大模型,显著降低集成复杂度。核心要点包括:
- 组件分类:区分了旧式
LLMs(纯文本补全)与推荐的ChatModels(支持消息、工具调用、结构化输出、多模态),当前开发应优先使用ChatModels。 - 包管理:LangChain 0.3 起依赖拆分为官方合作包(如
langchain-openai)和社区包(langchain-community),推荐优先使用官方合作包以确保稳定性和及时更新。 - 标准参数:罗列了
model、temperature、timeout、max_tokens、stop、max_retries等统一配置项,需注意部分参数(如max_tokens)在新模型中有对应推荐字段,且标准参数仅对开放相应能力的模型有效。 - 核心事件:详细讲解了
invoke(同步完整返回)、stream(逐 token 流式)、batch(批量并发)、astream_events(异步事件流,支持监听开始/流式/结束状态)和with_structured_output(结合 Pydantic 直接输出结构化数据)五个核心方法,并通过时序图和完整代码展示了其生命周期和调用方式。 - 消息格式:
AIMessage包含content、tool_calls、usage_metadata等重要字段,LangChain 已对部分字段(如 token 统计)做标准化处理,但厂商差异仍需关注。 - 代码实践:提供了配置
ChatOpenAI并演示所有核心事件的可运行 Python 脚本,涵盖同步调用、流式输出、批量处理、异步事件流和结构化输出,代码已确认可直接执行。
1031



被折叠的 条评论
为什么被折叠?



