Skip to content

大模型基础调用方式 ​

来源:LangChain 教程 · 第 02 章《模型的创建与调用》 核心:LangChain 不提供任何大模型,只是"工具",依赖第三方集成各家模型。


1. 调用前的准备 ​

1.1 需要三个要素 ​

每个平台配置时都需要:模型名(model)、API Key、Base URL。

1.2 线上大模型服务平台 ​

平台网址备注
OpenRouterhttps://openrouter.ai/全球主流中转,含国外模型,支持国内直连
CloseAIhttps://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
OpenRouterChatOpenRouter / ChatOpenAI / init_chat_model
CloseAIChatOpenAI / 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)

输入支持三种形式:

  1. 文本输入(最简单):model.invoke("翻译成英文:你好世界"),自动转成 user message。
  2. 字典列表(推荐,最灵活,支持 system/多轮):
python
messages = [
    {"role": "system", "content": "你是一个专业的数学老师。"},
    {"role": "user", "content": "什么是斐波那契数列?"},
]
response = model.invoke(messages)
print(f"AI 的回复:{response.content}")
角色英文作用
systemSystem设定 AI 行为、角色、规则
userHuman/User用户输入/问题
assistantAI/AssistantAI 历史回复(对话上下文)

不传历史 AI 会"失忆"——多轮对话需手动把历史 append 进 messages 再调用。

  1. 消息对象列表(类型安全,适合大型项目):
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_reasonstop 正常结束 / length 达上限截断
usage_metadata(或 response_metadata.token_usage)输入/输出/总 token 消耗
response_metadata.latency_checkpoint延迟拆解(ttft 首字时间等)
tool_calls / invalid_tool_calls工具调用信息
idLangChain 运行唯一 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. 常用初始化参数 ​

参数类型说明默认
modelstr模型名称(可带 provider 前缀)无
model_providerstr模型提供商无
api_keystrAPI 密钥(可省略,从环境变量读)None
base_urlstrAPI 请求地址None
temperaturefloat输出随机性,0-2,越高越随机0.7
max_tokensint限制最大输出 token 数None
timeoutfloat请求超时(秒)None
max_retriesint失败重试次数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 思考模式)。