LangChain / LLM 开发中:invoke() 与 predict() 的区别
文章当中的1400等等协议内容大家不必在意这是我日常会用到的 大家主要了解就可以了

作者:吴佳浩
最后更新:2025-11-25
适用版本:LangChain v1.0+
1. 为什么会有 invoke() 和 predict() 两个方法?
在 LangChain / LCEL / OpenAI ChatModel 开发中,你会看到同一个模型居然能同时调用:
python
llm.predict(...)
llm.invoke(...)
predict 与 invoke 功能差异巨大,会影响:
- Chain 输出
- 推理(reasoning)
- 工具调用(tool_calls)
- 多轮对话结构
- Agent 是否正常运行
2. 一句话区别(核心记忆表)
| 方法 | 作用 | 返回类型 | 是否包含推理(reasoning) | 是否支持工具调用 | 是否适用 Chain/Agent |
|---|---|---|---|---|---|
| predict() | 获取模型最终输出的文本 | str |
否 | 否 | 否 |
| invoke() | 执行完整一次模型/链/agent 调用 | dict / Message / JSON |
是 | 是 | 是 |
3. 形象理解:两种调用方式的差异
3.1 predict() 工作流程(仅返回文本)
flowchart LR
A[Input Prompt] --> B[predict]
B --> C[LLM Output Text]
C --> D[Return str]
3.2 invoke() 工作流程(返回结构化对象)
flowchart LR
A[Input Dict or Messages] --> B[invoke]
B --> C[Run LLM or Chain or Agent]
C --> D{需要工具调用?}
D -->|是| E[Generate ToolCalls]
D -->|否| F[Generate Messages]
E --> G[Return Structured Object]
F --> G
G --> H[包含 reasoning + metadata]
4. 代码对比(最清晰的差异)
4.1 predict() 示例(返回纯文本)
python
text = llm.predict("Explain GA/T 1400")
print(text)
print(type(text)) # <class 'str'>
返回示例:
bash
GA/T 1400 is a video interface standard...
<class 'str'>
返回类型:str
4.2 invoke() 示例(返回结构化对象)
python
result = llm.invoke("Explain GA/T 1400")
print(result)
print(type(result)) # <class 'langchain_core.messages.ai.AIMessage'>
返回示例:
json
{
"type": "AIMessage",
"content": "GA/T 1400 is a video interface standard...",
"tool_calls": [
{
"name": "query_database",
"args": {"table": "standards", "query": "GA/T 1400"},
"id": "call_abc123"
}
],
"response_metadata": {
"finish_reason": "tool_calls",
"model": "gpt-4",
"token_usage": {"prompt_tokens": 45, "completion_tokens": 120}
},
"id": "run-xyz789"
}
返回类型:AIMessage / dict / JSON
5. 为什么实际项目必须使用 invoke()?
predict() 只输出一段文本,信息量不够。
而 invoke() 可以返回:
- JSON 结构化数据
- 多轮 messages 完整历史
- tool_calls 工具调用记录
- 推理链(reasoning)中间步骤
- metadata 元数据(token使用、模型版本等)
- Chain / Agent 的完整输出结构
6. 实战案例:GA/T 1400 协议解析对比
6.1 使用 predict() - 信息丢失❌
python
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4")
# 使用 predict
result = llm.predict("将以下 SIP INVITE 转换为 GA/T 1400 XML格式: INVITE sip:34020000001320000001@...")
print(result)
# 输出:只有一段XML文本字符串,没有解析状态、没有验证结果、没有错误信息
问题:
- 无法知道转换是否成功
- 没有中间推理步骤
- 无法追溯错误原因
- 不能进行后续工具调用
6.2 使用 invoke() - 完整信息✅
python
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
@tool
def validate_gat1400_xml(xml_content: str) -> dict:
"""验证 GA/T 1400 XML 格式是否符合标准"""
# 验证逻辑
return {"valid": True, "errors": []}
llm_with_tools = ChatOpenAI(model="gpt-4").bind_tools([validate_gat1400_xml])
# 使用 invoke
result = llm_with_tools.invoke("将以下 SIP INVITE 转换为 GA/T 1400 XML格式: INVITE sip:34020000001320000001@...")
print(result)
输出结构:
json
{
"content": "<?xml version=\"1.0\"?><Query><CmdType>Catalog</CmdType>...</Query>",
"tool_calls": [
{
"name": "validate_gat1400_xml",
"args": {"xml_content": "<?xml version=\"1.0\"?>..."},
"id": "call_validate_001"
}
],
"response_metadata": {
"finish_reason": "tool_calls",
"reasoning": [
"1. 解析 SIP INVITE 头部",
"2. 提取设备ID 34020000001320000001",
"3. 映射到 GA/T 1400 DeviceID 字段",
"4. 构建 XML 结构",
"5. 调用验证工具"
]
}
}
优势:
✅ 可以追溯每一步转换逻辑
✅ 自动调用验证工具
✅ 包含完整的 metadata
✅ 可以集成到 Agent 工作流
7. 场景选择指南(快速决策)
你只要一句聊天文本 → predict()
例如:
- 聊天机器人一句回复
- 简单答疑
- 快速原型验证
python
# 适用场景
response = llm.predict("今天天气怎么样?")
你做实际系统开发 → invoke()
例如:
- 数据格式转换(XML ↔ JSON)
- SQL 自动生成
- SIP / GA1400 协议处理
- 多步骤 LCEL Chain
- Agent 工具调用
- 多轮会话管理
python
# 适用场景
result = llm.invoke([
{"role": "system", "content": "你是 GA/T 1400 协议专家"},
{"role": "user", "content": "解析这条 SIP 消息"}
])
8. 内部结构差异(类图)
8.1 predict() 输出结构(只有文本)
classDiagram
class PredictOutput {
+str content
}
8.2 invoke() 输出结构(包含完整元信息)
classDiagram
class InvokeOutput {
+string content
+list tool_calls
+dict response_metadata
+list messages
+string reasoning
+string id
+dict usage_metadata
}
class ToolCall {
+string name
+dict args
+string id
}
class ResponseMetadata {
+string finish_reason
+string model
+dict token_usage
+list reasoning_steps
}
InvokeOutput "1" --> "*" ToolCall
InvokeOutput "1" --> "1" ResponseMetadata
9. predict() 常踩的坑(必须避免)
❌ 1. 在 Agent 中使用 predict()
python
# 错误示例
agent = create_openai_functions_agent(llm, tools, prompt)
result = agent.predict("查询数据库") # 工具调用丢失!
后果: Agent 无法调用工具,功能完全失效
2. 在 SQL Chain 中用 predict()
python
# 错误示例
sql_chain = create_sql_query_chain(llm, db)
query = sql_chain.predict("查询销售额前10的产品") # reasoning 消失
后果: 无法追溯 SQL 生成逻辑,调试困难
3. 多轮 messages 被压成一段文本
python
# 错误示例
history = [
{"role": "user", "content": "我叫张三"},
{"role": "assistant", "content": "你好张三"},
{"role": "user", "content": "我叫什么?"}
]
response = llm.predict(str(history)) # 上下文彻底丢失
后果: 模型看到的是字符串而不是结构化对话
4. LCEL 链式组合报类型错误
python
# 错误示例
chain = prompt | llm.predict | output_parser # TypeError!
后果: predict() 返回 str 无法兼容 LCEL 管道
正确做法:
python
# ✅ 正确示例
chain = prompt | llm.invoke | output_parser # 完美运行
10. 性能对比
| 维度 | predict() | invoke() |
|---|---|---|
| 执行速度 | 略快(5-10ms) | 标准 |
| 内存占用 | 低 | 中等 |
| 可调试性 | 差 | 优秀 |
| 生产环境适用性 | 不推荐 | 强烈推荐 |
11. 最终总结(4 句话记住)
- predict = 文本
- invoke = 对象
- 聊天用 predict
- 做项目用 invoke
🔥 我再唠叨一句
在实际的SQL 自动生成 、多模型推理 、LLM API 开发 中:
100% 都必须使用 invoke()
12. 快速决策流程图
flowchart TD
A[需要调用 LLM] --> B{只要一句回复?}
B -->|是| C[predict]
B -->|否| D{需要以下任一功能?}
D --> E[工具调用]
D --> F[推理步骤]
D --> G[多轮对话]
D --> H[Chain/Agent]
E --> I[invoke]
F --> I
G --> I
H --> I
C --> J[返回 str]
I --> K[返回 AIMessage]
附录:完整代码模板
A. predict() 模板(简单聊天)
python
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4")
response = llm.predict("你好,介绍一下自己")
print(response)
B. invoke() 模板(生产系统)
python
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
llm = ChatOpenAI(model="gpt-4")
messages = [
SystemMessage(content="你是 GA/T 1400 协议专家"),
HumanMessage(content="解析这条 SIP INVITE 消息")
]
result = llm.invoke(messages)
# 访问完整结构
print(f"内容: {result.content}")
print(f"工具调用: {result.tool_calls}")
print(f"元数据: {result.response_metadata}")
参考资源: