1. 引言
在使用 LangChain 开发大模型应用时,调用模型是最基础也是最核心的操作。LangChain 为不同模型(LLM、ChatModel)提供了统一且丰富的调用接口,其中 invoke、batch、stream 是最常用的三种同步调用方法。本文将从**入参(输入)和出参(返回值)**两个维度,系统总结这三种方法的完整用法。
2. 三种调用方法总览
| 方法 | 说明 | 适用场景 |
|---|---|---|
invoke(input) |
同步调用,返回单个结果 | 大多数常规问答、单次推理 |
batch(inputs) |
批量调用,返回结果列表 | 多条输入并行处理,提升吞吐 |
stream(input) |
流式调用,逐块返回 | 打字机效果、长文本实时输出 |
此外还有异步版本 ainvoke、abatch、astream,用于 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 是最核心的同步调用方法,入参灵活(字符串、消息列表、字典列表),出参为
str或AIMessage; - batch 入参为输入列表,出参为结果列表,适合批量处理提升吞吐;
- stream 入参与 invoke 相同,出参为迭代器,逐块产出
AIMessageChunk,适合流式输出; - 异步版本
ainvoke/abatch/astream入参出参结构与同步版本一致,适用于协程环境。
掌握这些方法的入参与出参,就能灵活应对从简单问答到复杂 Agent 应用的各种开发需求。