一文读懂LangChain模型:AI应用的“大脑”是如何工作的

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 模型提供了四种核心调用方法:invokestreambatchbatch_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) 标识消息类型,如 systemuserassistant
内容(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部署、微服务架构、线上问题排查
  • ✅ 偶尔聊聊「如何保住头发」这类程序员终极话题 😂

不搞水文,不贩卖焦虑,只写能跑通、能落地、能帮你少加班的实战内容。

关注我,咱们一起少踩坑,多写优雅代码。


📖 更多干货推荐


🎁 粉丝福利

本文涉及的 完整源码 + 可运行Demo + 配置示例,已打包整理好。

免费获取方式: 私信空门技术栈,领取源码包。

有任何问题,也欢迎后台私信,门主看到都会回复~

💬 对文章内容有疑问?想看下一篇写什么主题?

直接在评论区留言,你的每一条评论我都会看。说不定下一篇文章的主题,就来自你的问题!


🤝 项目合作 / 技术咨询

平时工作之余,也会接一些技术项目和咨询,主要方向:

⚔️ 企业级开发

  • Java / Spring Boot 项目开发与重构
  • 微服务架构设计与落地
  • 系统性能调优、线上问题排查

🤖 AI 应用落地(这是我最近的主力方向)

  • Spring AI Alibaba / RAG / Agent 应用开发
  • 企业私有知识库搭建
  • AI能力接入现有业务系统
  • 大模型本地化部署与调优

🛠️ 技术顾问 / 疑难Bug排查

  • 项目架构评审与方案设计
  • 线上疑难问题定位解决
  • 技术选型与团队培训

如果你正遇到以下情况,欢迎找我聊聊:

  • ✅ 想做AI项目,但技术方案拿不准
  • ✅ 项目卡在某个Bug上很久,团队搞不定
  • ✅ 想把AI接入现有业务,不知道从哪下手
  • ✅ 需要靠谱的开发外包或长期技术顾问

📮 联系渠道(按回复速度排序)

  1. 最快:私信V: 空门技术栈
  2. 邮件2929119150@qq.com(请注明来意和具体需求)

一个人踩坑,是事故;一群人踩坑,就是《避坑宝典》。

------ IT 空门,与诸君共修技术大道 😎

相关推荐
wdfk_prog13 小时前
嵌入式面试真题第 10 题:高优化等级下共享状态可见性、内存模型与系统级同步设计
java·linux·开发语言·面试·职场和发展·架构·c
2501_9419820514 小时前
企业微信二次开发:私域数据基石——三大核心基础能力接口实战
windows·架构·bootstrap·企业微信
胡萝卜术15 小时前
RAG 的知识炼油厂:从原始网页到可检索知识块的工程化之路
面试·架构·github
wdfk_prog15 小时前
嵌入式面试真题第 11 题:RTOS 优先级翻转与实时任务阻塞的通用治理
c语言·缓存·面试·职场和发展·架构
Sirius Wu15 小时前
OpenClaw Skill:Matplotlib 可视化技能 + 沙箱双层隔离完整详解
服务器·网络·人工智能·安全·ai·架构·aigc
咖啡无伴侣20 小时前
unplugin-auto-import 使用详解+面试高频考点
前端·架构
微三云 - 廖会灵 (私域系统开发)20 小时前
SaaS多租户电商平台架构实战:从租户隔离到计费系统的完整实现
架构
AI语宙漫游指南20 小时前
【Agent架构】Loop Engineering 深度拆解:从内循环外循环到退出条件定义
架构·agent
gis开发之家1 天前
vue3直击架构痛点 依赖倒置与接口隔离——打造坚如磐石的插件与高阶组件(HOC)模式
javascript·架构·typescript·前端框架·vue3
码云骑士1 天前
65-AI-Agent基础原理-AutoGPT-四大架构全景解读
人工智能·python·架构