
本文详解 langchain 0.1.17+ 中 llmchain 被弃用后的迁移方案,提供兼容性封装与原生推荐写法(prompt | llm),并给出可直接运行的重构代码、调用示例及关键注意事项。
本文详解 langchain 0.1.17+ 中 llmchain 被弃用后的迁移方案,提供兼容性封装与原生推荐写法(prompt | llm),并给出可直接运行的重构代码、调用示例及关键注意事项。
LangChain 自 v0.1.17 起正式弃用 LLMChain 类(将在 v1.0 中彻底移除),官方明确推荐使用 Runnable 组合范式 —— 即通过管道操作符 | 将 ChatPromptTemplate 与 LLM 实例链式组合,形成 RunnableSequence。这不仅更符合 LangChain 的新架构设计(统一 Runnable 接口),也提升了可测试性、可组合性与类型安全性。
✅ 推荐做法:使用 prompt | llm(原生、简洁、未来兼容)
将原有 _create_chain 方法完全重构为返回一个 Runnable 实例:
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import Runnable
def _create_chain(self, template: str) -> Runnable:
prompt = ChatPromptTemplate.from_template(template)
# ✅ 正确方式:返回 prompt | llm(自动推导为 RunnableSequence)
return prompt | self.llm
调用时,不再使用 .run(),而是统一使用 .invoke()(支持异步的 .ainvoke()):
chain = self._create_chain("请用一句话解释 {topic}。")
result = chain.invoke({"topic": "LangChain"})
# result 是 AIMessage 对象(若使用 ChatModel)或 str(若使用 LLM)
print(result.content if hasattr(result, "content") else result)
? 提示:
prompt | llm返回的是RunnableSequence[dict, BaseMessage | str],其输入为字典(如{"topic": "xxx"}),输出取决于 LLM 类型(ChatModel→AIMessage;LLM→str)。如需强制转为字符串,可追加.get_content()或使用StrOutputParser:from langchain_core.output_parsers import StrOutputParser chain = prompt | self.llm | StrOutputParser()
⚠️ 兼容性方案(临时过渡,不推荐长期使用)
若项目规模大、改造成本高,可自行定义轻量级 LLMChain 作为过渡层(注意:它不是真正等价替代,仅解决 import 和基础调用问题):
# llm_chain.py
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableSequence
from langchain_core.output_parsers import StrOutputParser
class LLMChain:
def __init__(self, llm, prompt: ChatPromptTemplate):
self.chain = prompt | llm | StrOutputParser() # 默认输出字符串
def invoke(self, input_dict: dict, **kwargs):
return self.chain.invoke(input_dict, **kwargs)
# 可选:模拟旧版 .run() 行为(兼容老代码)
def run(self, **kwargs):
return self.invoke(kwargs)
然后替换导入:
# ❌ 旧导入(报错) # from langchain.chains import LLMChain # ✅ 新导入(指向自定义封装) from .llm_chain import LLMChain # 注意路径
? 关键注意事项
-
LLMChain已无.run()方法:所有 Runnable 均统一使用.invoke()/.ainvoke()/.batch(); -
类型提示更严格:
prompt | llm返回Runnable[dict, BaseMessage],需显式处理输出结构(如用StrOutputParser或AIMessage.content); -
避免混用旧/新范式:不要在同一个链中混合
LLMChain(...).run()和prompt | llm | parser,会导致行为不一致; -
调试建议:使用
.get_graph().print_ascii()可视化链结构,确认是否为预期的 RunnableSequence。
✅ 总结
| 方式 | 推荐度 | 适用场景 | 维护成本 |
|---|---|---|---|
prompt | llm | parser(原生 Runnable) |
⭐⭐⭐⭐⭐ | 新项目、中长期维护 | 极低(LangChain 官方主推) |
自定义 LLMChain 封装类 |
⭐⭐☆ | 紧急过渡、遗留系统灰度升级 | 中(需自行维护解析逻辑) |
| 强制降级 LangChain 版本 | ⚠️ | 绝对不推荐 | 极高(丧失安全更新与新特性) |
拥抱 Runnable 范式是 LangChain 进化的必然方向。一次重构,换来更清晰的流程、更强的可观测性,以及面向未来的扩展能力。立即行动,从替换 LLMChain 开始。










