一、调用方式总览

"模型调用(Invocation)"是指通过特定方法触发大语言模型生成输出的过程。LangChain 提供以下核心调用方法:

方法

特点

适用场景

invoke()

阻塞式,一次性返回完整结果

问答、批处理任务、无需实时反馈

ainvoke()

非阻塞式,提高吞吐量

高并发 Web 应用、IO 密集型任务

stream()

流式输出,实时返回每个 token

聊天机器人、长文本生成

astream()

非阻塞式流式输出

高并发 Web 应用

batch()

批量处理多个输入

高并发、大量请求

abatch()

非阻塞式批量处理

高并发、IO 密集型任务

二、invoke() —— 阻塞式调用

invoke() 是最核心的方法,工作模式是阻塞式:程序等待模型完整生成响应后,再一次返回结果。

基本语法:

response = model.invoke(input, config=None)

参数说明:

参数

类型

说明

必需

input

str / list[dict] / list[Message]

发送给模型的内容

必需

config

dict

高级配置(回调、元数据、标签等)

可选

三种输入形式

1. 文本输入(最简单)

model = init_chat_model(
    model="openai:gpt-5.4-mini",
    api_key=CLOSEAI_API_KEY,
    base_url=CLOSEAI_BASE_URL,
)
​
prompt = "翻译成英文:你好世界"
response = model.invoke(prompt)
print(response)

✅ 适用快速测试;❌ 缺点是无法设置系统提示(system prompt)和传递对话历史。

2. 字典列表(推荐,最灵活)

messages = [
    {"role": "system", "content": "系统提示"},
    {"role": "user", "content": "用户消息"},
    {"role": "assistant", "content": "AI回复"},   # 可选,用于对话历史
    {"role": "user", "content": "继续提问"},
]
​
response = model.invoke(messages)

角色说明:

角色

英文

作用

系统提示

system

设定 AI 的角色、行为约束

用户消息

user

用户输入的内容

AI 回复

assistant

模型的历史回复

✅ 可设置系统提示、表达多轮对话历史、JSON 兼容、易于序列化,生产环境推荐。

3. 消息对象列表

将字符串封装为 LangChain 的消息对象(如 SystemMessage、HumanMessage),功能与字典列表等价。

三、stream() —— 流式输出

stream() 以流式方式返回结果,实时返回每个 token,能显著提升长文本生成的用户体验。

for chunk in model.stream("请用一句话介绍你自己"):
    print(chunk.content, end="", flush=True)

适用场景:聊天机器人、长文本生成等需要实时反馈的交互应用。

异步流式 astream()

import asyncio
​
async def demo():
    stream_resp = model.astream("请用一句话解释机器学习的基本概念。")
    async for chunk in stream_resp:
        content = chunk.content if hasattr(chunk, "content") else str(chunk)
        print(content, end="", flush=True)
​
asyncio.run(demo())

四、batch() —— 批量处理

batch() 用于一次性处理多个输入,适合高并发、大量请求的场景。

messages = [
    "你好,你是谁?",
    "2 + 3 * 5 = ?",
    "中国首都在哪里?",
]
​
responses = model.batch(messages)
​
for response in responses:
    print(response.content)

batch_as_completed() —— 按完成顺序接收

当输入很多或单次调用耗时差异大时,batch_as_completed() 允许收到第一个结果就立即返回(结果可能乱序),每个返回值是 (index, response) 元组:

responses = model.batch_as_completed(messages)
​
for response in responses:
    print(response)   # (2, AIMessage(...))

性能对比

实测对 4 条输入:

  • batch() 批量调用:约 1.91 秒;

  • 循环 invoke():约 3.87 秒;

批量调用可节省约 50.7% 的时间。

五、异步调用

同步 vs 异步

  • 同步(sync):发起任务后需等待完成才能继续,当前执行流被"阻塞";

  • 异步(async):发起任务后不必等待即可继续执行其他任务,执行流"不阻塞",结果可通过特定方式获取。

异步方法的特点

  • 避免阻塞主线程:同步调用会阻塞程序,异步方法让应用在等待 API 响应时保持响应性;

  • 优化资源利用:更高效地利用系统资源,减少空闲等待时间。

ainvoke() 示例

import asyncio
import time
​
async def demo_async_invoke():
    # 1. 发起异步调用,创建 Task
    async_task = asyncio.create_task(model.ainvoke("用一句话解释人工智能。"))
​
    # 2. 并行执行其他任务(不阻塞)
    for i in range(3):
        await asyncio.sleep(1)
        print(f">>> 正在执行第{i+1}个任务...")
​
    # 3. 获取模型结果
    response = await async_task
    print(f">>> 模型返回: {response.content}")
​
asyncio.run(demo_async_invoke())

abatch() 示例

import asyncio
​
async def demo_async_batch():
    questions = ["用一句话说明深度学习的区别", "中国首都在哪里?"]
​
    # 使用 create_task 让协程立即在后台执行
    batch_task = asyncio.create_task(model.abatch(questions))
​
    # 主程序继续执行其他任务
    for i in range(3):
        await asyncio.sleep(1)
​
    # 获取批量结果
    responses = await batch_task
    for response in responses:
        print(response.content)
​
asyncio.run(demo_async_batch()

小结

需求

推荐方法

简单问答 / 单次调用

invoke()

长文本 / 实时反馈

stream()

大量并发请求

batch()

高并发 / IO 密集

ainvoke()、astream()、abatch()