主题
大模型基础调用方式
来源:LangChain 教程 · 第 02 章《模型的创建与调用》 核心:LangChain 不提供任何大模型,只是"工具",依赖第三方集成各家模型。
1. 调用前的准备
1.1 需要三个要素
每个平台配置时都需要:模型名(model)、API Key、Base URL。
1.2 线上大模型服务平台
| 平台 | 网址 | 备注 |
|---|---|---|
| OpenRouter | https://openrouter.ai/ | 全球主流中转,含国外模型,支持国内直连 |
| CloseAI | https://platform.closeai-asia.com/ | 亚洲最大中转,含国外模型 |
| 阿里云百炼 | https://bailian.console.aliyun.com/ | 企业端友好,新用户送 Token |
| 硅基流动 | https://www.siliconflow.cn/ | 性价比高,适合个人,9B 以下常免费 |
| 百度千帆 | https://console.bce.baidu.com/qianfan/overview | 主打百度生态 |
| 火山引擎 | https://console.volcengine.com/ark/ | 主打字节多模态生态 |
- 想用国外模型:选前两个(中转);只用国内:选后四个。
- 也可直接用模型厂商自有平台(DeepSeek、智谱等)。
1.3 依赖与配置
python
# 常用依赖(按需安装)
pip install langchain-openai # ChatOpenAI,兼容接口通用
pip install langchain-deepseek # ChatDeepSeek(依赖 langchain-openai)
pip install langchain-ollama # 本地模型
pip install langchain-openrouter # OpenRouter 专用
pip install python-dotenv # 读取 .env建议用 .env 文件管理密钥(生产环境推荐,加入 .gitignore 防泄露):
python
# .env 示例
DEEPSEEK_API_KEY=sk-xxxx
DEEPSEEK_BASE_URL=https://api.deepseek.com
ZHIPUAI_API_KEY=sk-xxxx
CLOSEAI_API_KEY=sk-xxxx
CLOSEAI_BASE_URL=https://api.openai-proxy.org/v1代码中统一加载:
python
from dotenv import load_dotenv
load_dotenv(override=True) # override=True 强制 .env 覆盖系统同名变量2. 模型初始化的三种方式
方式 1:使用模型提供商专用类(最直接)
LangChain 为部分厂商提供了专门的 Model 类:
python
from langchain_deepseek import ChatDeepSeek
import os
from dotenv import load_dotenv
load_dotenv(override=True)
deepseek_llm = ChatDeepSeek(
model="deepseek-v4-flash", # 也可用 model_name=
# api_key=os.getenv("DEEPSEEK_API_KEY"),
# api_base=os.getenv("DEEPSEEK_BASE_URL"), # 注意:这里是 api_base
)
print(deepseek_llm.invoke("请介绍一下你自己"))- 不传 api_key 时会从环境变量
DEEPSEEK_API_KEY自动读取,URL 有默认值。 - 其他专用类:
ChatZhipuAI、ChatTongyi、ChatOllama、ChatOpenRouter等。 - 硬编码密钥仅限临时测试,生产环境用
.env。
方式 2:用 ChatOpenAI 走 OpenAI 兼容接口(通用)
结论:大多数 API 平台都支持 OpenAI 接口规范,基本都可以通过 ChatOpenAI 集成。 这也是"一家厂商一个 base_url"通吃的关键。
python
from langchain_openai import ChatOpenAI
import os
from dotenv import load_dotenv
load_dotenv(override=True)
# 同一套代码换 base_url + model 即可切换厂商
llm = ChatOpenAI(
model="deepseek-v4-flash", # 或 glm-5.1 / qwen-plus / gpt-5.4-mini
api_key=os.getenv("CLOSEAI_API_KEY"),
base_url=os.getenv("CLOSEAI_BASE_URL"), # 注意:这里是 base_url(兼容接口用)
)
print(llm.invoke("1 + 1 = ?"))参数名差异:专用类多用
api_base,ChatOpenAI/兼容接口用base_url。
方式 3:用 init_chat_model 统一初始化(推荐)
init_chat_model 是 LangChain 的统一初始化接口,根据模型名自动选择对应驱动类。
python
from langchain.chat_models import init_chat_model
import os
from dotenv import load_dotenv
load_dotenv(override=True)
model = init_chat_model(
"deepseek:deepseek-v4-flash", # 或 "openai:gpt-5.4-mini"(provider:model)
model_provider="openai", # 也可省略,自动推断;深色 provider 名用冒号前缀代替
api_key=os.getenv("CLOSEAI_API_KEY"),
base_url=os.getenv("CLOSEAI_BASE_URL"),
temperature=0.7,
max_tokens=1000,
)
print(model.invoke("你好,一句话回答"))关键点:
model_provider支持的供应商很多(openai / deepseek / anthropic / ollama / openrouter …)。- 指定方式二选一:
model="deepseek:xxx"或model_provider="deepseek";两者都省时按内置规则推断。 - 并非所有模型都能自动推断(如
qwen-plus不指定会报错),未纳入注册的供应商(如 dashscope)设model_provider="openai"用兼容规范处理。 - 底层仍是 ChatOpenAI / ChatDeepSeek 等,效果与直接初始化一致。
同一模型的三种可达方式小结:
| 平台 | 可用方式 |
|---|---|
| DeepSeek 官网 | ChatDeepSeek / ChatOpenAI / init_chat_model |
| 阿里百炼 | ChatTongyi / ChatOpenAI / init_chat_model |
| OpenRouter | ChatOpenRouter / ChatOpenAI / init_chat_model |
| CloseAI | ChatOpenAI / init_chat_model |
本地模型(Ollama)已拆分为独立章节,详见《本地模型Ollama》(含 Ollama 介绍、跨平台安装、模型下载、常用命令、LangChain 两种调用方式)。
3. 模型调用方法(核心)
LangChain 提供同步、异步、流式、批量等调用方式:
| 方法 | 同步 | 异步 | 说明 |
|---|---|---|---|
| invoke | ✅ | ainvoke | 阻塞式,一次性返回完整结果,最常用 |
| stream | ✅ | astream | 流式,逐 token 返回,适合聊天/长文本 |
| batch | ✅ | abatch | 批量并行处理,减少往返开销 |
| batch_as_completed | ✅ | — | 按完成顺序 yield,可乱序但带索引 |
3.1 invoke() —— 核心方法
python
response = model.invoke(input, config=None)输入支持三种形式:
- 文本输入(最简单):
model.invoke("翻译成英文:你好世界"),自动转成 user message。 - 字典列表(推荐,最灵活,支持 system/多轮):
python
messages = [
{"role": "system", "content": "你是一个专业的数学老师。"},
{"role": "user", "content": "什么是斐波那契数列?"},
]
response = model.invoke(messages)
print(f"AI 的回复:{response.content}")| 角色 | 英文 | 作用 |
|---|---|---|
| system | System | 设定 AI 行为、角色、规则 |
| user | Human/User | 用户输入/问题 |
| assistant | AI/Assistant | AI 历史回复(对话上下文) |
不传历史 AI 会"失忆"——多轮对话需手动把历史 append 进 messages 再调用。
- 消息对象列表(类型安全,适合大型项目):
python
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
messages = [
SystemMessage("你是一个专业的数学老师。"),
HumanMessage("2 + 3 * 2 = ?"),
AIMessage("8"),
HumanMessage("我刚才问什么问题了?"),
]返回值:AIMessage 对象,关键字段:
| 字段 | 说明 |
|---|---|
content | 模型生成的文本回答(最核心) |
response_metadata.model_name / model_provider | 实际模型名 / 供应商 |
response_metadata.finish_reason | stop 正常结束 / length 达上限截断 |
usage_metadata(或 response_metadata.token_usage) | 输入/输出/总 token 消耗 |
response_metadata.latency_checkpoint | 延迟拆解(ttft 首字时间等) |
tool_calls / invalid_tool_calls | 工具调用信息 |
id | LangChain 运行唯一 ID |
python
response = model.invoke("用一句话解释什么是 AI")
print("回复:", response.content)
print("模型:", response.response_metadata["model_name"])
print("结束原因:", response.response_metadata["finish_reason"])
usage = response.response_metadata.get("token_usage", {})
print(f"输入 {usage.get('prompt_tokens')} / 输出 {usage.get('completion_tokens')} / 总 {usage.get('total_tokens')}")3.2 stream() —— 流式输出
python
for chunk in model.stream("写一首七言律诗"):
print(chunk.text, end="", flush=True) # 逐 token 输出- 优点:首字更快、体验更流畅、可实时展示思考过程。
- 依赖供应商对流式的支持。
3.3 batch() —— 批量调用
python
responses = model.batch(["你好,你是谁?", "2 + 3 * 5 = ?", "中国首都在哪里?"])
for r in responses:
print(r.content)- 与循环 invoke 相比可大幅节省时间(实测批量 1.91s vs 循环 3.87s,省约 50%)。
batch_as_completed()按完成顺序返回(index, result)元组,可乱序但带回索引。
3.4 异步调用(高并发)
python
import asyncio
import os
from dotenv import load_dotenv
load_dotenv() # 执行加载:此后 os.getenv / OpenAI() 能读到 OPENAI_API_KEY、OPENAI_BASE_URL
MODEL = os.getenv("OPENAI_MODEL", "deepseek-v4.1-flash") # 对话模型名:读环境变量 OPENAI_MODEL,缺省为 "deepseek-v4.1-flash"
async def main():
from langchain_openai import ChatOpenAI # 局部导入:LangChain 对 OpenAI 的封装类
llm = ChatOpenAI(model=MODEL) # 实例化对话模型客户端,指定模型名为上面读到的 MODEL
task = asyncio.create_task(llm.ainvoke("用一句话解释人工智能。"))
for i in range(3):
await asyncio.sleep(1)
print(f"执行第 {i + 1} 个任务...")
response = await task
print(response.content)执行第 1 个任务...
执行第 2 个任务...
执行第 3 个任务...
人工智能是让机器模拟人类的感知、学习、推理和决策等智能行为,以完成通常需要人类智慧才能完成的任务的技术。
Process finished with exit code 0- 同步阻塞主线程,异步让程序等待响应时保持响应性、高效利用资源。
- 对应方法:
ainvoke/astream/abatch。
3.5 异常处理
python
try:
response = model.invoke("Hello")
print(response.content)
except ValueError as e:
print(f"配置错误: {e}")
except ConnectionError as e:
print(f"网络错误: {e}")
except Exception as e:
print(f"未知错误: {e}")4. 常用初始化参数
| 参数 | 类型 | 说明 | 默认 |
|---|---|---|---|
| model | str | 模型名称(可带 provider 前缀) | 无 |
| model_provider | str | 模型提供商 | 无 |
| api_key | str | API 密钥(可省略,从环境变量读) | None |
| base_url | str | API 请求地址 | None |
| temperature | float | 输出随机性,0-2,越高越随机 | 0.7 |
| max_tokens | int | 限制最大输出 token 数 | None |
| timeout | float | 请求超时(秒) | None |
| max_retries | int | 失败重试次数 | 6 |
temperature 使用场景:
- 0.0-0.3:需一致/准确(数学、数据提取、分类、代码)
- 0.5-0.7:平衡(聊天、问答)
- 0.8-1.5:创造(写作、头脑风暴)
- 1.5-2.0:高度创造(诗歌、故事)
Token 概念:
- token 是分词器拆分后的最小语义单元;1 中文 token≈1-1.8 汉字,1 英文 token≈3-4 字符。
- 大模型以 token 计费。不同模型分词算法不同,同一文本 token 数可能不同。
5. 进阶:config 运行时配置
config 参数允许在调用时动态覆盖模型行为,无需初始化时写死。
python
config = {
"run_name": "joke_generation", # LangSmith 中显示的名称
"tags": ["tag1", "tag2"], # 分类标签
"metadata": {"user_id": "123"}, # 业务上下文
"configurable": { # 动态覆盖模型参数
"model": "deepseek-v4-pro",
"temperature": 0.7,
"max_tokens": 1000,
},
}
response = model.invoke("1 + 2 = ?", config=config)| 配置项 | 说明 |
|---|---|
| run_name / tags / callbacks | 主要用于 LangSmith 追踪、筛选、调试 |
| metadata | 附加业务元数据,可传给工作流后续节点 |
| max_concurrency | 限制最大并发,防止打爆 API(配合 batch 用) |
| recursion_limit | 限制递归深度,防 Agent 无限循环 |
| configurable | 万能字典,动态切换模型/组件 |
要点:
configurable覆盖默认参数时,需在init_chat_model初始化时指定configurable_fields=("model", "model_provider", "temperature", "max_tokens")来声明运行时可替换的参数。 区别:初始化参数=模型默认设置(大部分场景);运行时 config=单次调用特定设置,优先级更高。
6. 拓展要点
- 美化输出:
response.pretty_print()或from rich import print as rprint; rprint(response)。 - 查看能力画像:LangChain 1.1+ 支持
model.profile(看是否支持 tool calling、结构化输出、多模态等),依赖厂商是否声明(DeepSeek/CloseAI 为空,OpenRouter 有)。 - 查看完整参数:
ChatDeepSeek.model_fields.keys()或init_chat_model(...).model_fields.keys()。 - 厂商扩展字段:
model_kwargs={"tools": [...]}:传递 OpenAI 兼容但 LangChain 未列出的字段(如 function call 的 tools)。extra_body={"thinking": {"type": "enabled"}}:传模型厂商基于 OpenAI 协议扩展的字段(如 DeepSeek 思考模式)。