✅区别:
.run()
是早期 LangChain 中用于简单链(如LLMChain
)的快捷方法,只接受一个输入字段的字典或值;
.invoke()
是新框架下通用的执行方法,能处理多个输入、支持组合链(Runnable)执行。
🧠 核心区别表格对比
项目 | .run() | .invoke() |
---|---|---|
使用场景 | 传统 LLMChain 等老 API | 推荐的新式 Runnable 接口 |
输入格式 | 字典(要求只有一个字段)或单个值 | 字典(可以多个字段),支持复杂结构 |
能否传多个输入 | ❌ 不行(除非 prompt 只用一个字段) | ✅ 可以传多个 key,比如 question + schema |
错误提示 | 错误信息可能较模糊 | 更清晰、规范 |
推荐程度 | ✅ 适合快速使用 | ✅✅ 推荐用于任何复杂链或结构化 prompt 的场景 |
✅ 用数值 + 代码例子对比
我们以一个生成 Cypher 查询的场景为例:
🧪 示例 1:简单的 LLMChain(只需要一个输入)
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain.chat_models import ChatOpenAI
prompt = PromptTemplate.from_template("用 Cypher 查询图数据库中:{question}")
llm_chain = LLMChain(llm=ChatOpenAI(), prompt=prompt)
# ✅ run() 简洁明了
result = llm_chain.run("查询所有患者的名字")
print(result)
# 等价的写法(invoke)
result2 = llm_chain.invoke({"question": "查询所有患者的名字"})
print(result2)
输出示例:
MATCH (p:Patient) RETURN p.name
🧪 示例 2:复杂 chain,有多个输入字段(question + schema)
from operator import itemgetter
from langchain_core.runnables import RunnableLambda
# prompt 需要两个字段
prompt = PromptTemplate.from_template("""
根据 schema:{schema}
和问题:{question}
生成一个 Cypher 查询。
""")
# 使用 Runnable chain
chain = (
{
"schema": itemgetter("schema"),
"question": itemgetter("question"),
}
| prompt
| ChatOpenAI()
)
# ✅ invoke 可以传多个字段
result = chain.invoke({
"schema": "(:Patient)-[:HAS_DISEASE]->(:Disease)",
"question": "查询患有高血压的病人"
})
print(result)
# ❌ run 不支持,因为输入字段不是一个
# chain.run(...) 会报错
✅ 总结重点
.run() 适合 | .invoke() 适合 |
---|---|
简单 LLMChain | 多输入、多步骤组合链 |
快速实验 | 更复杂的工程结构 |
老版本接口 | LangGraph、Runnable 新框架 |
✅ 建议你记住的规则:
如果你用的是简单的
LLMChain
,只有一个输入字段,可以用.run()
;
只要有多个字段、组合结构、嵌套 prompt,一定要用.invoke()
,更稳更灵活。