文章目录

前言

上手 LangChain 开发大模型应用,第一个必须吃透的核心模块就是 Model I/O,它是框架和各类大模型交互的底层核心,所有对话、文本生成、多模态识图、批量处理功能全部依托该模块实现。

很多新手入门时会陷入一个误区:直接使用各大厂商原生 SDK 调用模型,等到需要切换模型、做多轮对话、流式输出、高并发服务时,代码会大量重构、维护成本陡增。而 Model I/O 提供了一套标准化交互规范,一套调用逻辑兼容 OpenAI、DeepSeek、通义千问、Claude、本地 Ollama 等几乎所有主流模型,极大降低多模型项目开发成本。

本文将拆解 Model I/O 底层逻辑、三类模型区分、消息结构、4 种调用模式、全平台接入代码、本地离线模型、高阶实用功能,搭配可直接复制运行的完整代码,看完即可独立完成任意大模型调用开发。

一、Model I/O 核心概念:三大组成模块

Model I/O 全称模型输入输出,完整覆盖向模型传递指令、发起请求、接收返回结果、格式化输出全链路,整体分为三大闭环环节,类比快递收发逻辑极易理解:

  1. Prompts(提示词模板)
    统一封装系统角色、用户问题、历史对话,标准化为模型可识别的消息格式;等同于打包快递,统一包装规范,适配所有快递公司。
  2. Models(模型调用层)
    LangChain 提供统一抽象接口,屏蔽不同厂商 API 差异,只需要修改初始化配置即可切换模型;等同于快递配送,统一配送流程,换快递公司无需修改收件逻辑。
  3. Output Parsers(输出解析器)
    将模型原生文本输出,自动解析为 JSON、列表、实体对象等结构化数据;等同于拆快递,把包裹内物品整理成业务可用格式。

本文聚焦最核心的 Models 模型调用层,提示词模板、输出解析器将在下一篇文档详解。

LangChain 三类模型核心区分(开发优先级划分)

框架内置三种模型抽象,适用场景完全隔离,开发前必须分清,避免误用:

模型分类 官方名称 核心交互逻辑 典型业务场景 学习优先级
对话模型 Chat Models 消息列表(多角色)入参,返回 AI 消息对象 人机对话、问答系统、文案生成、工具调用、多模态识图 ⭐⭐⭐⭐⭐ 必学核心
文本补全模型 LLMs 纯字符串输入,纯字符串输出 早期初代大模型接口,当前业务基本淘汰 ⭐ 仅了解概念
向量嵌入模型 Embeddings 文本输入,返回浮点数字向量数组 RAG 知识库、语义检索、文本相似度计算 ⭐⭐ RAG 章节重点学习

开发重点:日常业务开发 99% 场景使用 Chat Models,本文全部实战案例均基于对话模型展开。

二、LangChain 统一模型调用:对比原生 SDK 核心优势

2.1 原生厂商 SDK 的开发痛点

OpenAI、DeepSeek、Anthropic Claude、谷歌 Gemini 均提供独立官方 SDK,直接使用原生工具存在三大致命问题:

  1. 接口不统一,切换模型重写代码
    不同厂商客户端初始化、请求传参、结果取值语法完全不同,同时对接 2 种以上模型就要维护多套业务代码。
  2. 高级能力兼容成本高
    流式输出、对话记忆、批量请求、异步并发、Token 统计、限流等功能,每个厂商实现逻辑不一致,需要单独封装工具类。
  3. 业务扩展性差
    后续增加工具调用、Agent 智能体、链式流程时,原生 SDK 无法直接对接 LangChain 上层组件,需要大量适配改造。

2.2 LangChain 统一抽象的核心价值

LangChain 对所有对话模型做上层封装,设计一套标准化 API:invoke() 同步调用、stream() 流式输出、batch() 批量请求、ainvoke() 异步调用。
类比:

  • 原生 SDK = 手机品牌专用充电头,换手机必须换充电器;
  • LangChain Chat Models = 万能快充头,仅更换适配参数,充电操作完全不变。

项目迭代、多模型对比、用户自主切换模型场景下,能大幅缩减代码量,降低维护难度。

三、ChatOpenAI 基础入门:兼容 OpenAI 格式模型通用类

ChatOpenAI 是框架使用频率最高的模型类,所有兼容 OpenAI 接口规范的在线大模型均可使用该类调用,包含 OpenAI GPT 系列、DeepSeek、硅基流动、通义千问、智谱 AI 等国产模型。

3.1 最简可运行示例

环境依赖提前安装
pip install langchain-openai python-dotenv
完整代码
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv

# 加载.env文件中存储的密钥、接口地址,避免硬编码泄露密钥
load_dotenv()

# 1. 初始化对话模型实例
llm = ChatOpenAI(model="gpt-4o-mini")

# 2. 同步调用模型,传入用户提问字符串
response = llm.invoke("详细介绍LangChain框架的Model I/O模块")

# 3. 获取模型返回文本内容
print(response.content)
新手高频踩坑知识点

llm.invoke() 返回值不是普通字符串,而是 AIMessage AI 消息对象:

  • .content 属性:模型输出的纯文本,业务中最常用;
  • .response_metadata 属性:存储本次请求元数据,包含消耗 Token、模型名称、请求耗时、接口返回状态等信息。

3.2 初始化核心参数全解析

初始化模型时可配置超参控制模型输出逻辑,生产环境必备配置:

llm = ChatOpenAI(
    model="gpt-4o-mini",    # 必填,目标模型名称
    temperature=0.6,         # 输出随机性控制参数
    max_tokens=1500,         # 限制模型最大输出token,防止超长回答消耗费用
    timeout=60,              # 接口请求超时时间,单位秒
    max_retries=3,           # 请求失败自动重试次数,应对网络波动
)
temperature 温度参数场景对照表

温度参数直接决定模型生成内容的稳定性与创造性,不同业务场景固定取值:

业务场景 推荐温度区间 底层逻辑说明
代码生成、数据抽取、专业翻译、数学计算 0 ~ 0.3 低随机性,输出固定严谨,杜绝模型幻觉
知识库问答、文本摘要、内容分析、方案解读 0.3 ~ 0.7 平衡准确性与语句流畅度,通用业务首选
文案创作、起名、头脑风暴、创意故事生成 0.7 ~ 1.0 高随机性,多样化输出,丰富创意内容
Token 计费基础概念

Token 是大模型处理文本的最小计算单元,并非汉字/单词:

  • 中文:1 Token ≈ 1~1.8 个汉字;
  • 英文:1 Token ≈ 3~4 个英文字母;
    计费规则:单次请求总消耗 Token = 输入上下文 Token + 模型输出 Token,上下文越长、回答篇幅越大,调用成本越高。
    开发调试阶段可使用 OpenAI 官方 Tokenizer 工具统计文本 Token 数量,提前预估接口调用费用。

3.3 动态模型切换工具 init_chat_model

项目需要多模型动态切换、A/B 测试场景,推荐使用 init_chat_model 统一初始化,无需多次导入各类模型类:

from langchain.chat_models import init_chat_model
from dotenv import load_dotenv
import os

load_dotenv()

# 一行初始化不同厂商模型
llm_gpt = init_chat_model("gpt-4o-mini", model_provider="openai")
llm_claude = init_chat_model("claude-sonnet-4-6", model_provider="anthropic")

# 调用方法完全统一,无需修改业务逻辑
print(llm_gpt.invoke("你好").content)
print(llm_claude.invoke("你好").content)

使用场景区分:

  1. 固定单一模型开发:直接使用 ChatOpenAIChatOllama 具体类,IDE 代码提示更完善;
  2. 动态切换多模型:优先使用 init_chat_model,简化初始化代码。

四、对话消息规范:4 类标准消息与 3 种传参格式

多轮对话、角色设定场景不能只传递单纯字符串,LangChain 定义标准化消息对象,区分消息发送者身份,让模型识别完整对话上下文。

4.1 四大标准消息类(记忆口诀:系统定规,用户提问,AI应答,工具回传)

消息类型 对应类名 核心作用 业务示例
系统消息 SystemMessage 设定 AI 角色、业务规则、输出格式约束 “你是专业Python后端工程师,回答代码问题附带完整可运行示例”
用户消息 HumanMessage 存储用户输入提问、原始需求 “如何使用LangChain实现异步批量模型调用?”
AI消息 AIMessage 存储历史AI回复,拼接多轮对话上下文 “异步调用需结合ainvoke与asyncio.gather实现并发请求”
工具消息 ToolMessage 存储工具函数执行结果,用于工具调用、Agent开发 天气工具返回:北京今日气温22-30℃,晴
多轮对话完整实战示例

将历史对话全部传入消息列表,模型可完整记忆上下文内容:

from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o-mini")

# 完整对话上下文列表
dialogue = [
    SystemMessage(content="你是贴心AI助手,记住用户姓名"),
    HumanMessage(content="我叫小张"),
    AIMessage(content="你好小张,有什么问题我可以帮你解答?"),
    HumanMessage(content="我叫什么名字?")
]

res = llm.invoke(dialogue)
print(res.content) # 输出:你叫小张

4.2 三种消息传入方式,按需选择

方式1:直接传入纯字符串(最简)

仅适用于单轮无角色、无历史对话的快速测试:

res = llm.invoke("什么是Model I/O?")
方式2:消息对象列表(项目通用首选)

支持自定义系统角色、拼接完整对话历史,90% 业务开发使用该方式:

res = llm.invoke([
    SystemMessage(content="仅将中文翻译成标准英文,不输出额外解释"),
    HumanMessage(content="LangChain统一模型调用降低开发成本")
])
方式3:元组/字典轻量化格式(动态构建场景)

无需导入各类消息类,适合从数据库、配置文件读取对话数据,动态组装消息:

# 元组写法
msg_tuple = [
    ("system", "专业数据分析助手"),
    ("user", "分析2026大模型行业发展趋势")
]

# 字典写法,兼容OpenAI原生message结构
msg_dict = [
    {"role": "system", "content": "专业数据分析助手"},
    {"role": "user", "content": "分析2026大模型行业发展趋势"}
]

五、四种标准调用API,覆盖全部业务场景

LangChain 为所有 Chat Models 统一封装 4 套调用接口,分别适配同步、流式、批量、高并发异步场景,接口名称全局统一,切换模型无需修改调用代码。

5.1 invoke() 同步调用:基础通用场景

发送请求后阻塞程序,等待模型完整生成全部内容后返回,逻辑简单直观,适合脚本、单轮问答、原型开发。

res = llm.invoke("讲解LangChain四种模型调用方式")
print(res.content)

5.2 stream() 流式输出:打字机实时展示效果

逐 Token 返回模型输出内容,前端聊天界面、长文本生成必备,用户无需等待完整回复即可实时查看内容,优化交互体验。

print("AI 实时输出:", end="")
# 循环迭代流式分片chunk对象
for chunk in llm.stream("写一篇介绍LangChain的短篇技术博客"):
    print(chunk.content, end="", flush=True)

5.3 batch() 批量调用:批量数据处理场景

一次性传入多条独立提问,框架自动管理请求队列并发处理,无需手动编写循环逻辑,适用于批量文本摘要、批量标签分类、批量数据抽取。

question_list = [
    "Python装饰器原理",
    "JavaScript闭包概念",
    "Go协程优势"
]

response_list = llm.batch(question_list)
for q, ans in zip(question_list, response_list):
    print(f"提问:{q}\n回答:{ans.content}\n------")

5.4 ainvoke() 异步调用:Web高并发服务场景

基于 asyncio 异步 IO 实现非阻塞请求,模型调用过程中不会阻塞服务主线程,充分利用网络等待时间,并发请求量越大性能提升越明显。

核心误区纠正

单独串行 await ainvoke() 无法提速,必须搭配 asyncio.gather() 批量提交任务实现真正并发:

import asyncio
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o-mini")

async def async_batch_query():
    prompts = ["介绍北京", "介绍上海", "介绍广州", "介绍深圳"]
    # 批量创建异步任务
    task_group = [llm.ainvoke(prompt) for prompt in prompts]
    # 并发执行所有请求
    result_list = await asyncio.gather(*task_group)
    for res in result_list:
        print(res.content[:30] + "...\n")

# 普通py脚本执行异步函数
asyncio.run(async_batch_query())
# Jupyter Notebook 环境直接使用 await async_batch_query()

适用场景:FastAPI/Flask 后端接口、大规模批量离线数据处理、高并发 SaaS 平台。

六、主流在线大模型接入实战(复制即用)

兼容 OpenAI 接口规范的模型统一使用 ChatOpenAI,仅修改 api_keybase_urlmodel 三个参数;不兼容 OpenAI 格式的 Claude、Gemini 使用专属模型类或 init_chat_model

6.1 DeepSeek 国产高性价比模型

.env 环境变量配置

DEEPSEEK_API_KEY=sk-xxxx你的密钥
DEEPSEEK_BASE_URL=https://api.deepseek.com/v1

调用代码

import os
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
load_dotenv()

llm = ChatOpenAI(
    model="deepseek-chat",
    api_key=os.getenv("DEEPSEEK_API_KEY"),
    base_url=os.getenv("DEEPSEEK_BASE_URL")
)

6.2 硅基流动(海量开源在线模型)

.env 配置

SILICONFLOW_API_KEY=sk-xxxx
SILICONFLOW_BASE_URL=https://api.siliconflow.cn/v1

调用代码

llm = ChatOpenAI(
    model="Qwen/Qwen3-8B",
    api_key=os.getenv("SILICONFLOW_API_KEY"),
    base_url=os.getenv("SILICONFLOW_BASE_URL")
)

6.3 OpenAI GPT 国内代理渠道

.env 配置

OPENAI_API_KEY=sk-xxxx
OPENAI_BASE_URL=https://api.closeai-asia.com/v1

调用代码(自动读取环境变量)

llm = ChatOpenAI(model="gpt-4o-mini")

6.4 非OpenAI规范模型统一接入

from langchain.chat_models import init_chat_model

# Claude  Anthropic厂商
llm_claude = init_chat_model("claude-sonnet-4-6", model_provider="anthropic")
# Gemini 谷歌厂商
llm_gemini = init_chat_model("gemini-2.5-flash", model_provider="google_genai")

厂商接入速查表

模型平台 使用模型类 关键环境变量
OpenAI/国内代理、DeepSeek、硅基流动 ChatOpenAI API_KEY、BASE_URL
Anthropic Claude ChatAnthropic / init_chat_model ANTHROPIC_API_KEY
本地Ollama开源模型 ChatOllama 无需密钥

七、离线本地模型调用:Ollama 零API成本方案

无线上API密钥、离线私有化部署场景,推荐使用 Ollama 本地运行开源大模型,LangChain 提供专用 ChatOllama 类对接。

7.1 Ollama 基础使用流程

  1. 官网下载安装 Ollama 客户端;
  2. 终端执行命令拉取并启动模型(首次自动下载权重文件):
ollama run qwen3.5:4b
  1. LangChain 调用代码
from langchain_ollama import ChatOllama

# 本地默认地址 http://localhost:11434
llm = ChatOllama(model="qwen3.5:4b", base_url="http://localhost:11434")
res = llm.invoke("介绍本地大模型Ollama")
print(res.content)

性能适配建议:普通笔记本电脑选择 4B/7B 参数轻量化模型,13B 及以上大参数量模型需要高性能显卡支撑,否则推理速度极慢。

八、生产环境高阶实用特性

8.1 多模态识图:图文混合提问

支持图像输入的模型(GPT-4o、Qwen-VL 等)可传入本地图片 Base64 数据,实现图片识别、图文问答:

import base64
from langchain_core.messages import HumanMessage

# 读取本地图片转base64编码
with open("test.jpg", "rb") as f:
    img_data = base64.b64encode(f.read()).decode()

# 图文混合消息结构
msg = HumanMessage(content=[
    {"type": "text", "text": "详细描述这张图片内容"},
    {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{img_data}"}}
])
res = llm.invoke([msg])
print(res.content)

8.2 Token 消耗统计:成本监控工具

通过内置回调器统计批量请求总 Token 消耗,用于计费监控、成本优化:

from langchain_core.callbacks import get_usage_metadata_callback

with get_usage_metadata_callback() as cb:
    llm.invoke("问题1")
    llm.invoke("问题2")
# 输出输入Token、输出Token、总Token消耗
print(cb.usage_metadata)

8.3 接口速率限流:避免平台封禁

通过内存限流器控制每秒最大请求次数,防止高频调用触发厂商接口限流、封禁密钥:

from langchain_core.rate_limiters import InMemoryRateLimiter

# 每10秒最多允许1次请求
rate_limiter = InMemoryRateLimiter(requests_per_second=0.1)
llm = ChatOpenAI(model="gpt-4o-mini", rate_limiter=rate_limiter)

8.4 提示词缓存:降低Token开销

长固定系统提示词重复调用场景,开启厂商服务端缓存,重复上下文无需重复计费:

  • OpenAI 系列模型:默认自动开启上下文缓存,无需额外配置;
  • Anthropic Claude:接入中间件开启缓存,缓存命中最高节省90% Token 费用。

九、全文核心知识点总结

  1. Model I/O 三大核心组件:Prompts 提示词模板、Models 模型调用层、Output Parsers 输出解析器;
  2. 三类模型区分:开发核心为 Chat Models 对话模型,LLMs 文本补全模型已淘汰,Embeddings 向量模型用于 RAG;
  3. 标准化消息体系:SystemMessage、HumanMessage、AIMessage、ToolMessage,支撑完整多轮对话;
  4. 四类统一调用接口:invoke() 同步、stream() 流式、batch() 批量、ainvoke() 异步并发;
  5. 跨模型统一封装:兼容 OpenAI 接口模型全部使用 ChatOpenAI,仅修改初始化参数即可切换;
  6. 离线方案:Ollama + ChatOllama 实现本地开源模型私有化调用;
  7. 生产增强能力:多模态识图、Token用量统计、接口限流、提示词缓存适配线上业务。
Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐