LangChain 模型(Models)技术知识点学习文档

1. 模型概述
在 LangChain 中,模型是整个框架的核心组件,堪称 Agent 的推理引擎。LangChain 通过统一的接口封装了不同提供商(OpenAI、Anthropic、Google Gemini 等)的模型,让开发者可以在不改变业务代码的情况下自由切换底层模型。
模型的能力范围
现代 LLM 不仅可以生成文本,还支持:
| 能力 | 说明 |
|---|---|
| 文本生成 | 理解和生成自然语言文本 |
| 工具调用(Tool Calling) | 调用外部工具(数据库查询、API 等)并将结果用于响应 |
| 结构化输出(Structured Output) | 按预定义格式(Pydantic、TypedDict、JSON Schema)输出内容 |
| 多模态(Multimodality) | 处理和返回图像、音频、视频等非文本数据 |
| 推理(Reasoning) | 模型执行多步推理,展示思考过程(如 OpenAI o1、DeepSeek-R1) |
2. 环境准备与依赖安装
LangChain 采用模块化设计,核心包和各模型提供商是分开的,按需安装即可。
bash
# 安装 LangChain 核心包
uv add langchain
# 安装 OpenAI 兼容的模型提供商包(最常用)
uv add langchain_openai
# 其他提供商示例
# uv add langchain_anthropic # Anthropic Claude
# uv add langchain_google_genai # Google Gemini
# uv add langchain_community # 社区集成
环境变量配置
使用 .env 文件管理 API 密钥等敏感配置:
python
import load_dotenv
# 或 from dotenv import load_dotenv
load_dotenv.load_dotenv() # 加载 .env 文件中的环境变量
关键环境变量:
OPENAI_API_KEY--- OpenAI 的 API 密钥OPENAI_BASE_URL--- 自定义 API 端点地址(兼容 OpenAI 协议的服务)
💡 重要提示 :当前市面上绝大多数模型 API 接口都兼容 OpenAI 的调用规则,所以无论你使用任何模型(本地部署的 Qwen、DeepSeek 等),只要配置正确的
OPENAI_BASE_URL,就可以直接使用langchain_openai来调用。这就是为什么ChatOpenAI不仅仅用于 OpenAI 自己的模型。
3. 模型初始化(两种方式)
方式一:init_chat_model() --- 通用初始化(推荐)
init_chat_model 是 LangChain 提供的通用模型初始化函数,可以用统一的方式初始化不同提供商的模型。
python
from langchain.chat_models import init_chat_model
model = init_chat_model(
model="Qwen3-0.6B", # 模型名称
model_provider="openai", # 提供商标识
temperature=0.7, # 温度参数
)
response = model.invoke("你好")
print(response.content)
支持的提供商一览:
| 提供商 | 示例模型名 |
|---|---|
openai |
gpt-4o, gpt-4o-mini |
anthropic |
claude-sonnet-4-6 |
azure_openai |
azure_openai:gpt-4o |
google_genai |
gemini-2.5-flash |
aws |
us.anthropic.claude-sonnet-4-6 |
huggingface |
microsoft/Phi-3-mini-4k-instruct |
方式二:ChatOpenAI() --- 直接使用提供商类
当模型兼容 OpenAI API 时,也可以直接使用 ChatOpenAI 类:
python
from langchain_openai import ChatOpenAI
openai = ChatOpenAI(
model="Qwen3-0.6B",
temperature=0.7,
)
response = openai.invoke("你好")
print(response.content)
两种方式的对比
| 特性 | init_chat_model |
ChatOpenAI |
|---|---|---|
| 通用性 | 高,支持多种提供商 | 仅限于 OpenAI 兼容的 API |
| 切换提供商 | 改参数即可 | 需要换类 |
| 代码简洁度 | 统一接口,更简洁 | 与提供商强耦合 |
| 适用场景 | 多提供商切换 / 快速原型 | 固定使用 OpenAI 生态 |
4. 核心调用方法
LangChain 模型提供了四种核心调用方法:invoke、stream、batch、batch_as_completed。
4.1 invoke --- 直接调用
最基础的调用方式:传入输入,等待完整响应后一次性返回。
python
from langchain_openai import ChatOpenAI
openai = ChatOpenAI(model="Qwen3-0.6B", temperature=0.7)
# 单条消息
response = openai.invoke("你好")
print(response.content)
invoke() 方法接受消息作为输入,在生成完整响应后输出一个 AIMessage 对象,包含:
| 属性 | 说明 |
|---|---|
content |
文本响应内容 |
response_metadata |
响应元数据(token 用量、模型名称、finish_reason 等) |
tool_calls |
工具调用列表(如有) |
id |
LangChain 运行 ID |
完整响应对象示例:
python
content='你好!有什么可以帮助你的吗?😊'
additional_kwargs={'refusal': None}
response_metadata={
'token_usage': None,
'model_provider': 'openai',
'model_name': None,
'id': 'qwen3',
'finish_reason': None,
'logprobs': None
}
id='lc_run--019f5fdc-f180-7e10-b387-6273e07f0533-0'
tool_calls=[]
4.2 stream --- 流式输出
大多数模型支持在生成过程中逐步输出内容,而非等全部生成完再返回。流式输出显著改善了用户体验,特别适合长响应场景。
python
from langchain_openai import ChatOpenAI
openai = ChatOpenAI(model="Qwen3-0.6B", temperature=0.7)
# 基本流式输出
for chunk in openai.stream("你好"):
for block in chunk.content_blocks:
if block["type"] == "reasoning" and (reasoning := block.get("reasoning")):
print(f"推理:{reasoning}")
elif block["type"] == "text":
print(block["text"], end="", flush=True)
content_blocks 类型说明:
| 类型 | 含义 | 何时出现 |
|---|---|---|
"reasoning" |
推理/思考过程 | 推理模型(如 Qwen3 的 <think> 块) |
"text" |
普通文本输出 | 所有模型 |
"tool_call_chunk" |
工具调用的分块 | 模型调用工具时 |
流式输出的关键特性:
stream()返回AIMessageChunk对象,可以通过+累加为完整消息- 支持
astream_events()进行更精细的事件级流式处理 - 自动流式 :在流式应用中,即使调用
invoke(),LangChain 也会自动切换到内部流式模式
4.3 batch --- 批量调用
将一组独立请求批量发送给模型,并行处理,可以显著提高性能并降低成本。
python
from langchain_openai import ChatOpenAI
openai = ChatOpenAI(model="Qwen3-0.6B", temperature=0.7)
responses = openai.batch([
"为什么鹦鹉有五颜六色的羽毛?",
"飞机是如何飞行的?",
"什么是量子计算?"
])
for response in responses:
print(response.content)
行为特点:
batch()会等待所有请求完成后,一次性按原始顺序返回所有结果- 内部使用客户端并行化,不等同于推理提供商的批量 API
适用场景:
- 需要处理多个独立问题
- 批量翻译、分类、摘要等任务
- 提高吞吐量,减少总等待时间
4.4 batch_as_completed --- 按完成顺序返回
与 batch() 不同,batch_as_completed() 在每个输入完成生成时立即返回,不等其他请求。
python
list_of_inputs = [
"为什么鹦鹉有五颜六色的羽毛?",
"飞机是如何飞行的?",
"什么是量子计算?"
]
responses = openai.batch_as_completed(
list_of_inputs,
config={'max_concurrency': 3} # 限制最大并行调用数
)
for idx, response in responses:
print(f"输入 {idx} 完成:{response.content[:50]}...")
关键特性:
| 特性 | 说明 |
|---|---|
| 返回格式 | 每个结果为 (输入索引, AIMessage) 的元组 |
| 顺序 | 结果按完成顺序到达,非按输入顺序 |
| 并发控制 | 通过 config={'max_concurrency': N} 限制并行数 |
batch() vs batch_as_completed() 对比:
| 特性 | batch() |
batch_as_completed() |
|---|---|---|
| 返回时机 | 全部完成后一起返回 | 每个完成立即返回 |
| 返回顺序 | 保持输入顺序 | 按完成顺序 |
| 包含索引 | 否 | 是 (index, response) |
| 适用场景 | 需要保持顺序 | 需要快速响应 / 处理速度不一的请求 |
5. 模型常用参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
model |
string |
必需 | 模型名称或标识符 |
api_key |
string |
从环境变量读取 | API 认证密钥 |
temperature |
number |
--- | 控制输出随机性。值越高越有创意/随机,越低越确定 |
timeout |
number |
--- | 等待模型响应的最大时间(秒),超时取消请求 |
max_tokens |
number |
--- | 限制响应中输出的最大 token 数量(控制输出长度) |
max_retries |
number |
6 |
请求失败时的最大重试次数 |
temperature 详解
ini
temperature = 0.0 → 完全确定性,相同输入总是相同输出
temperature = 0.7 → 平衡的随机性
temperature = 1.0+ → 高度随机,适合创意写作
max_retries 机制
LangChain 具有内置的连接弹性:
- 自动重试失败的 API 请求(网络错误、429 限流、5xx 服务器错误)
- 使用指数退避 + 抖动策略,避免雪崩效应
- 客户端错误(401 认证失败、404 找不到)不会重试
- 对于不稳定的网络环境,建议将
max_retries增加到 10-15
6. 消息系统(Messages)
6.1 消息概述
消息是 LangChain 中模型上下文的基本单位,用于表示模型的输入和输出,承载内容和元数据。
一个消息对象包含三个核心部分:
| 部分 | 说明 |
|---|---|
| 角色(Role) | 标识消息类型,如 system、user、assistant |
| 内容(Content) | 消息的实际内容,可以是文本、图像、音频、文档等 |
| 元数据(Metadata) | 可选字段,如响应信息、消息 ID、token 使用情况 |
6.2 四种消息类型
LangChain 提供了四种消息对象,分别对应不同的对话角色:
① SystemMessage --- 系统消息
作用:设置模型行为准则,定义角色和响应指南。是对话的"开场白"和"行为约束"。
python
from langchain_core.messages import SystemMessage
# 定义模型角色
system_message = SystemMessage(content="你是一个专业的翻译:翻译成英文")
# 更详细的角色定义
system_message = SystemMessage("你是一个天气预报助手,必须使用工具来回答天气问题。")
最佳实践 :在消息列表的最前面放置系统消息,内容应明确、具体。
② HumanMessage --- 用户消息
作用:表示用户输入和与模型的交互。可以包含文本、图像、音频等。
python
from langchain_core.messages import HumanMessage
human_message = HumanMessage(content="你好,世界!")
human_message = HumanMessage("查询北京的天气")
③ AIMessage --- AI 消息
作用:表示模型生成的响应,包含文本内容、工具调用和元数据。
python
from langchain_core.messages import AIMessage
# 通常由模型响应自动生成,也可以手动构造
ai_message = AIMessage("J'adore la programmation.")
AIMessage 的特殊属性:
tool_calls:工具调用列表response_metadata:token 用量、模型名称等content_blocks:多模态内容块
④ ToolMessage --- 工具消息(概念)
表示工具调用的输出结果,在工具调用流程中使用。
四种消息汇总
| 消息类型 | 发送方 | 用途 |
|---|---|---|
SystemMessage |
开发者 | 定义模型角色、行为准则、响应格式 |
HumanMessage |
用户 | 用户输入、问题、指令 |
AIMessage |
模型 | 模型生成的文本、工具调用请求 |
ToolMessage |
工具 | 工具执行后的返回结果 |
6.3 消息对象 vs 字典格式
LangChain 支持两种方式传递消息:
方式一:消息对象
python
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
messages = [
SystemMessage("你是一个将英语翻译成法语的有用助手。"),
HumanMessage("翻译:我喜欢编程。"),
AIMessage("J'adore la programmation."),
HumanMessage("翻译:我喜欢构建应用程序。")
]
response = openai.invoke(messages)
方式二:字典格式(等同于 OpenAI Chat Completions 格式)
python
messages = [
{"role": "system", "content": "你是一位诗人"},
{"role": "user", "content": "写一首关于春天的俳句"},
{"role": "assistant", "content": "樱花开了....."}
]
for chunk in openai.stream(messages):
print(chunk.text, end="", flush=True)
对比:
| 特性 | 消息对象 | 字典格式 |
|---|---|---|
| 可读性 | 类型明确,IDE 提示好 | 简洁直观 |
| 功能完整性 | 支持多模态、元数据 | 基本功能 |
| 兼容性 | LangChain 生态 | 与 OpenAI API 格式完全一致 |
| 推荐度 | 复杂应用 | 快速原型、简单场景 |
6.4 使用场景
消息提示(Message Prompt)适用于以下场景:
- ✅ 管理多轮对话:通过消息列表维护完整的对话历史
- ✅ 处理多模态内容:图像、音频、文件等非文本数据
- ✅ 包含系统指令:通过 SystemMessage 控制模型行为
- ✅ 工具调用流程:模型请求→工具执行→结果返回的完整闭环
7. 工具调用(Tools)
7.1 工具概念
工具是 Agent 用来执行操作的组件。它们通过定义明确的输入和输出,让模型能够与外部世界交互。
工具的核心组成:
- 可调用函数:实际执行业务逻辑的函数
- 输入 Schema:定义函数参数的类型和结构
- 文档字符串:帮助模型理解何时及如何使用该工具
7.2 @tool 装饰器
使用 @tool 装饰器是定义工具最简单的方式:
python
from langchain.tools import tool
@tool
def get_weather(location: str) -> str:
"""查询指定位置的天气"""
return f"{location}的天气是晴朗的,温度是25摄氏度"
关键 :函数的文档字符串
"""查询指定位置的天气"""就是工具的描述信息,模型会根据这个描述来判断何时调用该工具。描述越清晰,模型越容易做出正确的工具选择。
7.3 绑定工具到模型
通过 bind_tools() 将工具绑定到模型后,模型就可以在需要时自动请求调用工具:
python
from langchain_openai import ChatOpenAI
from langchain.tools import tool
openai = ChatOpenAI(model="qwen-plus", temperature=0.7, max_tokens=300)
@tool
def get_weather(location: str) -> str:
"""查询指定位置的天气"""
return f"{location}的天气是晴朗的,温度是25摄氏度"
# 绑定工具
model_with_tools = openai.bind_tools([get_weather])
# 发送消息
messages = [
{"role": "system", "content": "你是一个天气预报助手,必须使用工具来回答天气问题。"},
{"role": "user", "content": "查询北京的天气"}
]
response = model_with_tools.invoke(messages)
# 检查模型是否请求了工具调用
if response.tool_calls:
for tool_call in response.tool_calls:
print(f"✅ 工具:{tool_call['name']}")
print(f"✅ 参数:{tool_call['args']}")
else:
print(f"❌ 模型没有调用工具")
print(f"回复:{response.content}")
工作流程:
用户输入 → 模型分析 → 决定调用工具 → 返回 tool_calls
↓
执行工具函数
↓
工具结果传回模型 → 生成最终回复
7.4 工具选择控制
tool_choice 参数控制模型的工具调用行为:
| 值 | 行为 |
|---|---|
"auto"(默认) |
模型自主决定是否调用工具 |
"any" 或 "required" |
强制模型必须调用至少一个工具 |
"none" |
禁止模型调用任何工具 |
"tool_name"(指定名称) |
强制调用特定工具 |
python
# 强制必须使用工具
model_with_tools = openai.bind_tools([get_weather], tool_choice="required")
# 禁止使用工具
model_with_tools = openai.bind_tools([get_weather], tool_choice="none")
并行工具调用 :模型可以同时调用多个工具,通过 parallel_tool_calls=False 可以禁用它。
8. 方法对比总结
| 方法 | 输入 | 输出时机 | 返回类型 | 适用场景 |
|---|---|---|---|---|
invoke() |
单条消息 / 消息列表 | 等待完整响应 | AIMessage |
一般对话、简单问答 |
stream() |
单条消息 / 消息列表 | 逐步输出 | AIMessageChunk 迭代器 |
需要实时显示的长响应、聊天界面 |
batch() |
多个独立输入 | 全部完成后一起返回 | list[AIMessage](保持输入顺序) |
批量处理、提高吞吐量 |
batch_as_completed() |
多个独立输入 | 每个完成立即返回 | (index, AIMessage) 迭代器 |
需要快速获取首个结果、处理速度不一的请求 |
调用方法选择指南
scss
你只有 1 个问题?
├─ 需要实时展示? → stream()
└─ 等全部结果再显示? → invoke()
你有多个独立问题?
├─ 需要保持顺序? → batch()
├─ 哪个先完成先用哪个? → batch_as_completed()
└─ 需要控制并发数? → batch_as_completed(config={'max_concurrency': N})
附录:LangChain 模型生态系统一览
scss
┌──────────────────────────────┐
│ LangChain 统一接口 │
│ (invoke / stream / batch) │
└─────────────┬────────────────┘
│
┌───────────────────────┼───────────────────────┐
│ │ │
┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐
│ OpenAI │ │ Anthropic │ │ Google │
│ (GPT-4o...) │ │ (Claude...) │ │ (Gemini...) │
└──────────────┘ └──────────────┘ └──────────────┘
│ │ │
┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐
│ AWS │ │ HuggingFace │ │ 本地模型 │
│ (Bedrock) │ │ (开源模型) │ │ (Ollama...) │
└──────────────┘ └──────────────┘ └──────────────┘
👇 三连支持,动力源泉
如果这篇文章帮你省下了踩坑的时间,欢迎:
🔹 点赞 ------ 让更多人看到这篇干货 🔹 在看 ------ 你的认可是我持续输出的动力 🔹 转发 ------ 分享给身边正在做AI Agent的朋友
你的每一个小动作,对我都很重要 ❤️
🙏 关于作者
你好,我是 空门技术栈,一个常年和Bug战斗、持续填坑的Java开发者。
专注分享:
- ✅ Java / Spring Boot / Spring AI Alibaba 企业级实战
- ✅ RAG知识库、AI Agent、多智能体协作落地经验
- ✅ Docker部署、微服务架构、线上问题排查
- ✅ 偶尔聊聊「如何保住头发」这类程序员终极话题 😂
不搞水文,不贩卖焦虑,只写能跑通、能落地、能帮你少加班的实战内容。
关注我,咱们一起少踩坑,多写优雅代码。
📖 更多干货推荐
- 告别手动复制接口文档!Apifox MCP + AI 自动测试让开发效率起飞
- MySQL MCP Server 从零安装到使用实战,AI 直接查询数据库
- Spring Event 用了三年,同事一句话把我问懵了
- Java 抽象类(Abstract Class)彻底讲透:从基础到多态实战
- Spring AI Alibaba 多智能体(Multi-agent)实战:6 大协作模式 + 完整代码
- Spring AI Alibaba 智能体作为工具实战:别再让主 Agent 当"人肉路由器"了
- 一文搞懂 Spring AI Alibaba Workflow:10 个实战案例带你彻底掌握 AI 工作流编排
- AI 工程进入第四时代!Loop Engineering 正在淘汰 Prompt Engineering
- RAG 知识库为什么越更新越乱?一文讲透生产级文档更新方案
- GPT-5.6 三档模型:Sol、Terra、Luna 怎么选?一篇文章讲透
- Transformers VS vLLM:大模型部署到底该选谁?从本地运行到生产上线完整解析
🎁 粉丝福利
本文涉及的 完整源码 + 可运行Demo + 配置示例,已打包整理好。
免费获取方式: 私信空门技术栈,领取源码包。
有任何问题,也欢迎后台私信,门主看到都会回复~
💬 对文章内容有疑问?想看下一篇写什么主题?
直接在评论区留言,你的每一条评论我都会看。说不定下一篇文章的主题,就来自你的问题!
🤝 项目合作 / 技术咨询
平时工作之余,也会接一些技术项目和咨询,主要方向:
⚔️ 企业级开发
- Java / Spring Boot 项目开发与重构
- 微服务架构设计与落地
- 系统性能调优、线上问题排查
🤖 AI 应用落地(这是我最近的主力方向)
- Spring AI Alibaba / RAG / Agent 应用开发
- 企业私有知识库搭建
- AI能力接入现有业务系统
- 大模型本地化部署与调优
🛠️ 技术顾问 / 疑难Bug排查
- 项目架构评审与方案设计
- 线上疑难问题定位解决
- 技术选型与团队培训
如果你正遇到以下情况,欢迎找我聊聊:
- ✅ 想做AI项目,但技术方案拿不准
- ✅ 项目卡在某个Bug上很久,团队搞不定
- ✅ 想把AI接入现有业务,不知道从哪下手
- ✅ 需要靠谱的开发外包或长期技术顾问
📮 联系渠道(按回复速度排序):
- 最快:私信V: 空门技术栈
- 邮件 :2929119150@qq.com(请注明来意和具体需求)
一个人踩坑,是事故;一群人踩坑,就是《避坑宝典》。
------ IT 空门,与诸君共修技术大道 😎