LangChain 模型调用方法总结:invoke、batch、stream 的入参与出参

1. 引言

在使用 LangChain 开发大模型应用时,调用模型是最基础也是最核心的操作。LangChain 为不同模型(LLM、ChatModel)提供了统一且丰富的调用接口,其中 invokebatchstream 是最常用的三种同步调用方法。本文将从**入参(输入)出参(返回值)**两个维度,系统总结这三种方法的完整用法。

2. 三种调用方法总览

方法 说明 适用场景
invoke(input) 同步调用,返回单个结果 大多数常规问答、单次推理
batch(inputs) 批量调用,返回结果列表 多条输入并行处理,提升吞吐
stream(input) 流式调用,逐块返回 打字机效果、长文本实时输出

此外还有异步版本 ainvokeabatchastream,用于 async 协程环境。

3. invoke 方法:入参与出参

3.1 入参(输入)

invoke 的入参主要有两种形式:

入参形式 适用模型 说明
字符串 str LLM / ChatModel 直接传入文本,最简单
消息对象列表 List[BaseMessage] ChatModel 保留多轮上下文,推荐用于对话
字典列表 List[Dict] ChatModel role / content 表示消息,便于动态拼接
python 复制代码
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage

llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.7)

# 形式一:直接传字符串
result = llm.invoke("请用一句话介绍 LangChain")

# 形式二:消息对象列表(保留多轮上下文)
messages = [
    SystemMessage(content="你是一个资深的 Python 技术博主。"),
    HumanMessage(content="请解释什么是 LangChain 的 invoke 方法?"),
]
response = llm.invoke(messages)

# 形式三:字典列表(动态拼接)
dict_messages = [
    {"role": "system", "content": "你是一个严谨的 Python 技术顾问。"},
    {"role": "user", "content": "请解释什么是 RAG?"},
]
response = llm.invoke(dict_messages)

invoke 还支持传入 config 参数,用于设置回调、标签、元数据等:

python 复制代码
response = llm.invoke(
    "讲一个关于程序员的笑话",
    config={
        "tags": ["humor", "tech"],
        "metadata": {"user_id": "12345"},
        "callbacks": [my_callback_handler],
    }
)

3.2 出参(返回值)

模型类型 返回类型 提取文本方式
LLM(文本模型) str 直接使用
ChatModel(对话模型) AIMessage 通过 .content 获取文本
python 复制代码
# LLM 返回 str
result = llm.invoke("请用一句话介绍 LangChain")
print(type(result))   # <class 'str'>
print(result)         # 直接打印文本

# ChatModel 返回 AIMessage
response = llm.invoke("请用一句话介绍 LangChain")
print(type(response))        # <class 'langchain_core.messages.ai.AIMessage'>
print(response.content)      # 模型生成的文本

4. batch 方法:入参与出参

4.1 入参(输入)

batch 接收一个列表,列表中的每个元素是一条独立输入,可以是字符串、消息对象或字典:

python 复制代码
questions = [
    "什么是 LangChain?",
    "什么是 RAG?",
    "什么是 Agent?",
]

# 字符串列表
answers = llm.batch(questions)

# 消息对象列表(每条输入可不同)
message_batch = [
    [SystemMessage(content="你是助手。"), HumanMessage(content="你好")],
    [SystemMessage(content="你是助手。"), HumanMessage(content="介绍 RAG")],
]
answers = llm.batch(message_batch)

batch 也支持配置参数,可对每条输入单独配置:

python 复制代码
answers = llm.batch(
    questions,
    config=[{"tags": ["batch-1"]}, {"tags": ["batch-2"]}, {"tags": ["batch-3"]}],
)

4.2 出参(返回值)

batch 返回一个列表,列表长度与输入数量一致,每个元素对应一条输入的返回结果:

python 复制代码
answers = llm.batch(questions)

print(type(answers))   # <class 'list'>
print(len(answers))    # 3,与输入数量一致

# 每个元素是 AIMessage,通过 .content 提取文本
for q, a in zip(questions, answers):
    print(f"Q: {q}\nA: {a.content}\n")

5. stream 方法:入参与出参

5.1 入参(输入)

stream 的入参与 invoke 相同,接收单个输入(字符串、消息对象或字典):

python 复制代码
# 字符串输入
for chunk in llm.stream("请写一首关于春天的五言绝句"):
    print(chunk.content, end="", flush=True)

# 消息对象输入
messages = [
    SystemMessage(content="你是一位诗人。"),
    HumanMessage(content="请写一首关于春天的诗"),
]
for chunk in llm.stream(messages):
    print(chunk.content, end="", flush=True)

5.2 出参(返回值)

stream 返回一个迭代器 ,逐块产出 AIMessageChunk,需要手动拼接得到完整结果:

python 复制代码
# stream 返回迭代器,逐块产出 AIMessageChunk
chunks = llm.stream("请写一段 200 字的自我介绍")
print(type(chunks))    # <class 'generator'>

full_response = ""
for chunk in chunks:
    full_response += chunk.content

print(full_response)

6. 入参与出参速查表

调用方式 入参类型 出参类型 提取文本方式
llm.invoke()(LLM) str str 直接使用
llm.invoke()(ChatModel) str / 消息列表 / 字典列表 AIMessage .content
llm.batch() List[输入] List[AIMessage] 遍历后 .content
llm.stream() str / 消息列表 / 字典列表 Iterator[AIMessageChunk] 逐块拼接 .content

提示:无论哪种调用方式,AIMessage.content 始终是模型生成的文本内容,这是最常用的提取方式。

7. 总结

LangChain 的模型调用体系设计得十分统一:

  • invoke 是最核心的同步调用方法,入参灵活(字符串、消息列表、字典列表),出参为 strAIMessage
  • batch 入参为输入列表,出参为结果列表,适合批量处理提升吞吐;
  • stream 入参与 invoke 相同,出参为迭代器,逐块产出 AIMessageChunk,适合流式输出;
  • 异步版本 ainvoke / abatch / astream 入参出参结构与同步版本一致,适用于协程环境。

掌握这些方法的入参与出参,就能灵活应对从简单问答到复杂 Agent 应用的各种开发需求。

相关推荐
SamChan9017 分钟前
Python+ReportLab自动生成PDF翻译质量审计报告:从数据到可视化的完整方案
开发语言·python·ai·pdf·wpf
深念Y18 分钟前
Makefile vs go run:Go 项目构建方式对比
java·开发语言·golang·k8s·编译·流水线·cicd
whcyhhh19 分钟前
头歌实践教学平台:数据科学与大数据技术导论(十八2)
大数据·开发语言·python
一晌小贪欢20 分钟前
Python办公18:PDF 转 Word——利用 OCR 技术批量提取不可编辑的文档内容
开发语言·python·pdf·word·excel·数据可视化·python办公
我命由我1234529 分钟前
Android Camera - 获取当前设备屏幕的旋转角度、保存帧到外部存储的私有空间
android·java·开发语言·java-ee·android jetpack·android-studio·android runtime
阮小贰41 分钟前
干支编码的确定性实现:节气切分 + 1000 条溯源断语(附 JS 源码)
开发语言·javascript·ecmascript
一晌小贪欢1 小时前
Python办公17:暴力拆分——按页数或指定范围提取 PDF 核心页面
java·开发语言·python·pdf·excel·数据可视化·python办公
孫治AllenSun1 小时前
【LangChain4J-06】Prompt 工程与模板化开发
开发语言·python·prompt
Maiko Star1 小时前
[LangChain RAG] 04 提示词工程:PromptTemplate、Few-shot 与 ChatPromptTemplate
langchain·prompt