4.模型调用方法
调用方法
一、核心分类逻辑
大模型调用由3个判断维度交叉组合,总共6种写法,所有业务场景都离不开这6类:
- 批量/单条:单次请求1组对话(单条) / 单次一次性传入多组对话(批处理batch)
- 同步/异步:阻塞等待结果(同步invoke) / 发起请求后不阻塞主线程(异步ainvoke,带a前缀)
- 普通输出/流式输出stream:全部生成完一次性返回 / 分段逐字实时推送(打字机效果)
组合拆分6大方法:
- 同步单条普通调用
invoke - 异步单条普通调用
ainvoke - 同步单条流式调用
stream - 异步单条流式调用
astream - 同步批量批处理
batch - 异步批量批处理
abatch
基础约定:带
a前缀=异步;stream=流式分段输出;batch=批量多对话并行处理
二、前置基础概念(代码通用结构)
1. messages 消息数组(核心入参)
对应Java List<Message>,数组内包含3类消息对象,用来实现角色设定、上下文记忆:
SystemMessage:系统提示词,固定角色、规则、限制(最关键,决定模型输出边界)HumanMessage:用户提问内容AIMessage:模型历史回复,用于多轮对话上下文
示例规则设定:
messages = [
# System角色约束
SystemMessage(content="你是法律助手,仅回答法律问题,非法律问题统一回复:无可奉告"),
# 用户提问
HumanMessage(content="2+3等于几?")
]
2. 返回对象统一规则
调用后返回 AIMessage 对象:
.content:模型最终文本内容content_block:结构化返回块,字典格式,存储文本、类型等元数据
三、代码
模块1:单条普通调用
1.1 同步调用 model.invoke()
核心特点
- 阻塞主线程:发起请求后,程序卡死等待模型完整生成结果,期间无法执行其他逻辑
- 适用场景:低并发、单次简单问答、不需要实时输出
代码示例
# 1. 组装消息列表
messages = [
SystemMessage(content="法律助手,只回答法律问题,其他回复无可奉告"),
HumanMessage(content="简单介绍广告法,50字以内")
]
# 2. 同步调用,阻塞等待完整结果
res = model.invoke(messages)
# 3. 提取输出文本
print(res.content)
运行逻辑
程序执行到invoke会暂停,直到模型全部生成完毕才执行print;如果模型推理耗时久,服务器会阻塞,高并发场景性能差。
1.2 异步调用 model.ainvoke()
核心特点
- 非阻塞:发起请求后立刻释放主线程,后台处理模型推理,支持并发处理多请求
- Python语法要求:必须封装
async函数,调用时搭配await - 适用场景:高并发接口、多请求并行、不想占用服务器线程资源
代码示例
# 封装异步函数
async def async_single_chat():
messages = [
SystemMessage(content="法律助手,只回答法律问题"),
HumanMessage(content="劳动合同试用期规定")
]
# ainvoke异步调用,await等待结果
res = await model.ainvoke(messages)
print(res.content)
# 执行异步函数
asyncio.run(async_single_chat())
生活类比
同步=排队点餐,必须等餐做好才能离开;异步=拿号等候,领号后可以处理其他事,出餐再通知。
模块2:单条流式调用
2.1 同步流式 model.stream()
核心特点
- 返回生成器generator(迭代器),循环遍历分段获取文字,实现打字机实时输出
- IO流逻辑:分段刷新输出,前端聊天框实时展示效果
代码示例
messages = [
SystemMessage(content="乐于助人AI工程师"),
HumanMessage(content="简单讲解Python生成器")
]
# stream返回迭代器
response = model.stream(messages)
# 循环迭代,逐段打印
for chunk in response:
print(chunk.content, end="", flush=True)
底层原理
生成器是惰性计算,不会一次性加载全部结果,一段一段推送,适合前端实时对话场景。
2.2 异步流式 model.astream()
核心特点
- 异步生成器,使用
async for循环遍历,不阻塞主线程 - 无需对
stream本身加await,循环语法改为异步迭代
代码示例
async def async_stream_chat():
messages = [HumanMessage(content="写一段Python异步代码示例")]
# 异步流式
response = model.astream(messages)
# 异步迭代循环
async for chunk in response:
print(chunk.content, end="", flush=True)
asyncio.run(async_stream_chat())
模块3:批量批处理调用 batch/abatch
适用场景
单次提交多组独立对话,并行推理提升吞吐量,例如:语音助手一次性接收多条指令、批量文本摘要、批量数据打分。
入参不再是单条messages,而是messages数组列表,多组对话同时传入。
3.1 同步批量 model.batch()
# 多组对话,批量传入
batch_messages = [
[SystemMessage("法律助手"), HumanMessage("什么是定金")],
[SystemMessage("法律助手"), HumanMessage("租房押金能不退吗")],
[SystemMessage("法律助手"), HumanMessage("试用期可以不签合同吗")]
]
# 批量同步调用
result_list = model.batch(batch_messages)
# 遍历每组结果
for msg, res in zip(batch_messages, result_list):
print(f"问题:{msg[-1].content},回答:{res.content}")
返回值:list[AIMessage],结果列表和输入对话列表一一对应。
3.2 异步批量 model.abatch()
async def async_batch_chat():
batch_messages = [
[HumanMessage("Python列表和元组区别")],
[HumanMessage("生成器作用")]
]
# await等待批量异步结果
result_list = await model.abatch(batch_messages)
for res in result_list:
print(res.content)
asyncio.run(async_batch_chat())
四、同步 vs 异步 核心对比总结
| 维度 | 同步(invoke/stream/batch) | 异步(ainvoke/astream/abatch) |
|---|---|---|
| 线程阻塞 | 阻塞主线程,请求期间无法处理其他任务 | 非阻塞,释放主线程并发处理请求 |
| 语法要求 | 普通函数直接调用,无额外关键字 | 必须async函数 + await |
| 并发性能 | 差,高并发容易服务器卡顿 | 强,适合线上接口、大流量服务 |
| 适用场景 | 本地测试、低频次脚本、简单demo | 线上生产环境、高并发API、批量任务 |
五、流式Stream vs 普通输出 vs 批量Batch 区分
- 普通调用(invoke):一次返回完整文本,适合后台计算、不需要实时展示
- 流式(stream):分段逐字输出,前端聊天界面首选,提升用户体验
- 批量(batch):一次性提交多组独立问答,追求高吞吐量批量处理数据,和流式互不冲突

浙公网安备 33010602011771号