4.模型调用方法

调用方法

一、核心分类逻辑

大模型调用由3个判断维度交叉组合,总共6种写法,所有业务场景都离不开这6类:

  1. 批量/单条:单次请求1组对话(单条) / 单次一次性传入多组对话(批处理batch)
  2. 同步/异步:阻塞等待结果(同步invoke) / 发起请求后不阻塞主线程(异步ainvoke,带a前缀)
  3. 普通输出/流式输出stream:全部生成完一次性返回 / 分段逐字实时推送(打字机效果)

组合拆分6大方法:

  1. 同步单条普通调用 invoke
  2. 异步单条普通调用 ainvoke
  3. 同步单条流式调用 stream
  4. 异步单条流式调用 astream
  5. 同步批量批处理 batch
  6. 异步批量批处理 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 区分

  1. 普通调用(invoke):一次返回完整文本,适合后台计算、不需要实时展示
  2. 流式(stream):分段逐字输出,前端聊天界面首选,提升用户体验
  3. 批量(batch):一次性提交多组独立问答,追求高吞吐量批量处理数据,和流式互不冲突
posted @ 2026-08-17 19:00  _丑小鸭  阅读(0)  评论(0)    收藏  举报