来源:互联网 更新时间:2026-07-18 07:29
基于大模型开发应用,打交道最多的,其实就是怎么给 LLM 发请求、收结果。这一步做得顺不顺,直接决定了程序的性能和最终的用户体验。LangChain 在这方面做得挺周到,它用 init_chat_model 统一封装了三套核心的同步调用接口——invoke、stream 和 batch,还配套了对应的异步版本,专门应对高并发场景。这三兄弟底层共用同一套消息结构,但返回形式、阻塞逻辑和适用的业务场景差别很大。这篇就来把这三种核心方法掰开揉碎讲清楚,顺带对比下异步调用,理一理在实际项目中到底该怎么选、怎么用。

下面所有示例都基于同一套 OpenRouter 兼容模型配置,支持字典消息,也支持 LangChain 内置的 HumanMessage/SystemMessage 传参:
from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage, SystemMessage
from dotenv import load_dotenv
import os
import asyncio
from rich import print as rprint
# 加载环境变量
load_dotenv(override=True)
llm = init_chat_model(
model="deepseek-v4-flash",
model_provider="openai",
api_key=os.getenv("OPENROUTER_API_KEY"),
base_url=os.getenv("OPENROUTER_BASE_URL")
)
同步等待,模型得把整段话全都想好了,才一次性吐出来给你。返回的是一个完整的 AIMessage 对象,里面装着完整的文本、Token 消耗、接口延迟、模型元数据,甚至还能包含工具调用信息。入参方式也很灵活,纯字符串、字典形式的对话数组、或者内置的消息对象,随便哪种都行。最适合的场景就是那些简短问答、后台单次查询,还有传统的多轮对话机器人。
# 基础单轮提问
res = llm.invoke([
SystemMessage(content="专业数学老师"),
HumanMessage(content="什么是斐波那契数列")
])
print("完整回答:", res.content)
# 查看计费Token消耗
print("输入Token:", res.usage_metadata["input_tokens"])
print("输出Token:", res.usage_metadata["output_tokens"])
LLM 本身不带记忆功能,这一点不管是哪种调用方式都一样。要实现多轮对话,就得手动把完整的历史拼接好传进去:
conversation = [
{"role": "system", "content": "友好AI助手"},
{"role": "user", "content": "我叫小张"}
]
# 第一轮调用
res1 = llm.invoke(conversation)
# 追加AI回复与新提问,留存上下文
conversation.append({"role": "assistant", "content": res1.content})
conversation.append({"role": "user", "content": "我叫什么名字?"})
res2 = llm.invoke(conversation)
print(res2.content)
优点很直接:代码简单,信息完整,拿到一个 AIMessage,里面既有文本,又有 Token 统计、响应耗时这些元数据。缺点也明显:生成长文本时,整个程序都得干等着,前端会长时间一片空白,用户的体验感会大打折扣。
返回的是一个迭代器,模型每生成一小段文字,就立刻推给你,完全不用等全文。返回的是分段的 Chunk 对象,通过 .text 字段可以提取到当前的字块,然后实时拼起来。这个方案简直就是为网页聊天和长文案生成量身定做的。
print("流式实时输出:")
for chunk in llm.stream("详细讲解高等数学的作用"):
print(chunk.text, end="", flush=True)
最大的好处是首字返回的速度极快,可以轻松实现打字机一样的实时输出效果,用户体验会好很多。缺点是分片太零碎,没法直接拿到完整的 Token 统计,得自己手动把所有 chunk 的消耗数据累加起来。
批量接口可以一次性提交多条独立的问答,减少了重复的网络握手和鉴权开销。跟循环调用 invoke 相比,成本更低,耗时也更短。它有两种模式:
batch():老老实实等所有任务全部完成,然后按输入顺序,统一返回一个结果列表。batch_as_completed():哪个任务先完成,就先返回哪个,输出顺序是乱的。这种模式最适合那些任务耗时差异比较大的场景。tasks = [
"1+99等于多少",
"什么是大语言模型",
"中国的首都"
]
results = llm.batch(tasks)
for index, ans in enumerate(results):
print(f"问题{index+1}:{ans.content}
")
tasks = ["介绍Python", "解释微积分", "一年多少天"]
for res in llm.batch_as_completed(tasks):
print("单条批量结果:", res.content)
批量处理海量问答、做数据清洗的时候,节约接口开销的效果很明显。但缺点也摆在那:只适合那些相互之间没有关联的独立问题,不能直接用来批量传递多轮对话的上下文。
线上后端、FastAPI Web 服务、多任务并发这些场景里,用同步接口会把事件循环死死地卡住,服务的并发承载能力直线下降。所以 LangChain 为上面那三种方法都配上了异步版:
ainvoke:异步单次完整调用,对应同步的 invokeastream:异步流式分片调用,对应同步的 streamabatch:异步批量调用,对应同步的 batchasync def async_invoke_demo():
res = await llm.ainvoke(HumanMessage(content="2+5*8等于几"))
print("异步回答:", res.content)
asyncio.run(async_invoke_demo())
async def async_stream_demo():
print("异步流式输出:")
async for chunk in llm.astream("解释人工智能定义"):
print(chunk.text, end="", flush=True)
asyncio.run(async_stream_demo())
async def async_batch_demo():
tasks = ["春天的特点", "什么是向量", "地球公转周期"]
results = await llm.abatch(tasks)
for r in results:
print(r.content, "
")
asyncio.run(async_batch_demo())
| 调用方式 | 同步方法 | 异步方法 | 返回形式 | 最佳适用场景 |
|---|---|---|---|---|
| 单次完整问答 | invoke | ainvoke | 完整 AIMessage 对象 | 后台脚本、简单接口、多轮对话 |
| 实时流式输出 | stream | astream | 分段迭代器 | 网页聊天、长文本生成 |
| 批量多任务处理 | batch | abatch | 有序结果列表 | 离线批量数据清洗、批量问答 |
| 无序批量返回 | batch_as_completed | - | 随完成随输出 | 任务耗时差距大的批量任务 |
invoke,代码最简单,信息也最全。stream,线上服务就得上 astream。batch 或 abatch,接口开销能省不少。ainvoke、astream、abatch。invoke、stream、batch 这三招,构成了 LangChain 模型请求的三大基础能力,分别对应单次问答、实时交互和批量处理这三类核心业务场景。同步接口最适合本地开发和低并发场景,异步接口则是线上高并发服务的标配。不管选哪种,它们都共用一套消息传递规则,上下文记忆全靠手动拼接对话列表来实现。开发的时候,只要根据并发量和交互形式,挑对了接口,性能和用户体验就都能顾得上。
七麦数据官网网页地址 七麦数据官方入口在线首页
币安Binance官方中文网站 币安App最新版下载及新手注册指南
问卷星官方网站入口地址 问卷星网页版在线使用
闲鱼的严选验货在哪里看?闲鱼严选和验货宝哪个可靠
新浪人工智能热点小时报丨2026年06月20日02时_今日实时人工智能热点速递
淘宝直播如何看回放在哪里看?怎么查看淘宝直播回放
以太坊(ETH)未来数周或持续呈现低迷态势,多重因素制约价格走势
PokePay加密卡2026完整指南:申请开卡全攻略+多场景应用技巧
为何比特币BTC价格跌破7.3万美元?一文拆解影响近期比特币行情的五大原因
新手如何购买比特币?2026年新手在币安购买比特币的完整教程
比特币(BTC)与黄金在英国相遇:21Shares将BOLD基金引入伦敦
洛克王国世界S2赛季对战怎么打
迷你网名古风男生霸气(精选100个)
GPT5.6惨遭切脑,Fable 5回归要变弱鸡版?
《梦幻西游》特殊鬼怪怎么抓-隐藏变异鬼应对要点
文雅简易网名男生可爱(精选100个)
动漫《恶之华》剧情介绍
王者荣耀「西行封妖记」【孙权-仙扇使者】6月25日上线!
ThinkBook系列最新价格全解析:2026年选购避坑与实时询价指南
闲鱼严选和验货宝哪个可靠?闲鱼的验货宝怎么样,,
手机号码测吉凶
本站所有软件,都由网友上传,如有侵犯你的版权,请发邮件haolingcc@hotmail.com 联系删除。 版权所有 Copyright@2012-2013 haoling.cc