LangChain / LLM 开发中:invoke() 与 predict() 的区别

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 句话记住)

  1. predict = 文本
  2. invoke = 对象
  3. 聊天用 predict
  4. 做项目用 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}")

参考资源:

相关推荐
vvoennvv6 小时前
【Python TensorFlow】 TCN-LSTM时间序列卷积长短期记忆神经网络时序预测算法(附代码)
python·神经网络·机器学习·tensorflow·lstm·tcn
nix.gnehc6 小时前
PyTorch
人工智能·pytorch·python
z***3357 小时前
SQL Server2022版+SSMS安装教程(保姆级)
后端·python·flask
I'm Jie7 小时前
从零开始学习 TOML,配置文件的新选择
python·properties·yaml·toml
大模型真好玩7 小时前
LangChain1.0实战之多模态RAG系统(二)——多模态RAG系统图片分析与语音转写功能实现
人工智能·langchain·mcp
二川bro8 小时前
Scikit-learn全流程指南:Python机器学习项目实战
python·机器学习·scikit-learn
代码的乐趣8 小时前
支持selenium的chrome driver更新到142.0.7444.175
chrome·python·selenium
数据知道8 小时前
Django基础项目:从零到一搭建用户管理系统
python·django·python web·python项目
大模型教程8 小时前
谷歌AI Agent技术指南深度解读,从概念到生产
langchain·llm·agent