实现参考
旧教程对照与报错速查

旧教程在 LangChain v1 跑不通?新旧写法对照与报错速查

网上的 LangChain 教程大多写于 0.1 到 0.3 时期。照着它们在 v1 上敲代码,往往第一行就报错。本页是“拿着旧教程来排错”的入口:先判断你遇到的是哪一类问题,再按旧写法逐条查到新写法,每一条结果都在 0.3.27 和 1.4.7 两套环境里真实运行过,不是凭文档推断。

读完你可以得到三样东西:旧教程里常见的 12 组 import 现在该写成什么、需要先安装哪个包;model(...)、predict、chain.run 这类调用方式在新版里的下场;以及按报错原文查原因的速查表。需要完整的迁移步骤和回滚方案,请接着读迁移 Runbook。

适用版本与验证信息

环境已安装的关键包本页的用途
0.3.27(旧环境)langchain==0.3.27、langchain-core==0.3.86、langchain-community==0.3.31、langchain-text-splitters==0.3.11还原旧教程当年的运行结果
1.4.7(仅 langchain)langchain==1.4.7、langchain-core==1.7.0、langchain-openai==1.7.2、langgraph==1.2.17只升级主包、没装任何兼容包时会看到什么
1.4.7 + 兼容层在上一行基础上增加 langchain-classic==1.0.8、langchain-community==0.4.2、langchain-text-splitters==1.1.3按迁移指南装好兼容包后的状态
  • 验证日期:2026-10-26;Python 3.12.12;
  • 官方来源:LangChain v1 migration guide (opens in a new tab);
  • 实验代码:站点仓库 labs/old-tutorial-patterns/,环境依赖锁定在 labs/requirements/;脚本不联网、不需要任何 API Key。

先判断:你遇到的是哪一类问题

旧教程在新版上出问题,原因只有四类,处理方式完全不同。先对号入座,再去对应小节:

你看到的现象属于哪一类去哪一节
程序启动或导入阶段就抛出 ModuleNotFoundError、ImportError: cannot import name符号换了位置或换了包一、import 对照
TypeError: ... object is not callable,或 AttributeError: ... has no attribute 'predict'旧的调用方式已被移除二、调用方式
OpenAIError: Missing credentials和版本无关,是密钥没有配置三、参数名与密钥
没有报错,但回答不对、一直卡住、记不住上下文行为变了,旧写法悄悄失效五、不报错但行为变了

如果你手上是线上报错日志而不是一段教程代码,直接去生产故障诊断中心,那里按报错原文收录了 13 种真实故障。

一、import:旧写法对应的新位置

旧教程几乎都从 langchain 主包里导入一切。v1 把主包精简到只保留智能体相关的接口,其余的分别搬到了 langchain-core、langchain-classic、langchain-community、langchain-text-splitters 和各家模型的独立包里。

下表每一行都来自 old_imports.py 的实际运行:旧写法在 1.4.7 里的报错取自“仅 langchain”环境,新写法在装好兼容包的环境里逐条导入验证通过。

旧教程里的写法在 1.4.7 里的报错新写法需要先安装
from langchain.chains import LLMChain(RetrievalQA、ConversationChain 同理)ModuleNotFoundError: No module named 'langchain.chains'from langchain_classic.chains import LLMChainlangchain-classic
from langchain.agents import initialize_agent, AgentType;AgentExecutorImportError: cannot import name 'initialize_agent' from 'langchain.agents'from langchain_classic.agents import initialize_agent, AgentTypelangchain-classic
from langchain.memory import ConversationBufferMemoryModuleNotFoundError: No module named 'langchain.memory'from langchain_classic.memory import ConversationBufferMemorylangchain-classic
from langchain.prompts import PromptTemplateModuleNotFoundError: No module named 'langchain.prompts'from langchain_core.prompts import PromptTemplate无,随 langchain 安装
from langchain.schema import HumanMessage;StrOutputParserModuleNotFoundError: No module named 'langchain.schema'from langchain_core.messages import HumanMessage;from langchain_core.output_parsers import StrOutputParser无
from langchain.chat_models import ChatOpenAIImportError: cannot import name 'ChatOpenAI' from 'langchain.chat_models'from langchain_openai import ChatOpenAIlangchain-openai
from langchain.llms import OpenAIModuleNotFoundError: No module named 'langchain.llms'from langchain_openai import OpenAIlangchain-openai
from langchain.embeddings import OpenAIEmbeddingsImportError: cannot import name 'OpenAIEmbeddings' from 'langchain.embeddings'from langchain_openai import OpenAIEmbeddingslangchain-openai
from langchain.vectorstores import FAISSModuleNotFoundError: No module named 'langchain.vectorstores'from langchain_community.vectorstores import FAISSlangchain-community
from langchain.document_loaders import TextLoaderModuleNotFoundError: No module named 'langchain.document_loaders'from langchain_community.document_loaders import TextLoaderlangchain-community
from langchain.text_splitter import RecursiveCharacterTextSplitterModuleNotFoundError: No module named 'langchain.text_splitter'from langchain_text_splitters import RecursiveCharacterTextSplitterlangchain-text-splitters
from langchain.callbacks import StdOutCallbackHandlerModuleNotFoundError: No module named 'langchain.callbacks'from langchain_core.callbacks import StdOutCallbackHandler无

实测中有几处值得注意:

  • 旧写法在 1.4.7 里一条都导入不了。 脚本里的 16 条旧 import,在 0.3.27 里全部成功,在 1.4.7(无论是否装了兼容包)里全部失败;
  • 旧版的警告并不总是在提醒你。 0.3.27 里只有 5 条旧写法会打印弃用警告,另外 11 条悄无声息地通过。如果你的旧项目日志里没有警告,不代表升级后没有问题;
  • 旧警告给出的新位置,在 v1 里不一定适用。 0.3.27 对 ChatOpenAI、OpenAI、OpenAIEmbeddings 的警告建议改从 langchain_community 导入;在 v1 环境里,应当改用 langchain_openai,本页已逐条验证可以导入;
  • “新写法能用”取决于装了什么。 在只升级了主包的环境里,16 条新写法只有 7 条能直接导入,其余 9 条需要先安装对应的包,报错是 No module named 'langchain_classic' 这一类。

要看更完整的符号可用性,包括旧位置在三种环境里的结果,请查导入兼容矩阵。

二、调用方式:旧写法还能不能用

修好 import 之后,下一个坑是调用方式。old_calls.py 用一个只会回答 pong 的最小聊天模型(类名 Pong,继承 BaseChatModel)逐个尝试旧写法,所以下表报错里的类名是 Pong;在你自己的代码里,它会是 ChatOpenAI 之类的实际类名。

旧教程里的写法0.3.271.4.7新写法
model([HumanMessage(content="hi")])能运行,打印弃用警告,提示将在 1.0 移除TypeError: 'Pong' object is not callablemodel.invoke("hi")
model.predict("hi")能运行,同样的弃用警告AttributeError: 'Pong' object has no attribute 'predict'model.invoke("hi")
model.predict_messages([...])能运行,同样的弃用警告AttributeError: 'Pong' object has no attribute 'predict_messages'model.invoke([...])
LLMChain(...).run("ping")能运行,LLMChain 与 Chain.run 各有一条弃用警告主包没有 LLMChain;装了 langchain-classic 后仍能运行,警告改为“将在 2.0.0 移除”chain.invoke({"word": "ping"})
chain({"word": "ping"})能运行,Chain.__call__ 弃用警告兼容包里仍能运行,同样是 2.0.0 移除警告chain.invoke({"word": "ping"})
chain.predict(word="ping")能运行,没有警告兼容包里能运行chain.invoke({"word": "ping"})

读这张表时抓住两点:

  • 模型对象本身的旧调用方式已经被删除。 model(...)、predict、predict_messages 在 0.3.x 里就已经标为弃用,v1 里直接没有了,所以报的是 TypeError 和 AttributeError,而不是 import 错误。统一改成 invoke;
  • 链对象的旧方法还活在兼容包里,但那是缓冲期。 langchain-classic 里的 LLMChain 和 run、__call__、predict 全都还能用,只是警告已经写明将在 2.0.0 移除。这给了你“先换 import、保持行为不变,再逐步迁移”的余地,具体做法见旧链迁移到 LCEL和对话记忆迁移。

三、参数名与密钥

旧教程里创建模型的写法通常是 ChatOpenAI(model_name="gpt-4o-mini", openai_api_key="sk-...", temperature=0, max_tokens=64)。old_calls.py 的后半段在 1.4.7 环境里验证了它:

  • 旧参数名仍然被接受。 model_name、openai_api_key 都能正常创建对象,读回来 model_name 是 gpt-4o-mini、temperature 是 0.0、max_tokens 是 64。所以这类代码不会因为参数名而报错;
  • 新代码建议直接使用 model=、api_key=。 脚本里 ChatOpenAI(model="gpt-4o-mini", api_key="sk-demo") 同样验证通过,写成这种形式可以避免依赖别名;
  • 没有配置密钥,构造对象时就会报错。 报错原文是 OpenAIError: Missing credentials. Please pass an api_key, workload_identity, admin_api_key, or set the OPENAI_API_KEY or OPENAI_ADMIN_KEY environment variable.,不需要等到发出请求。这与 LangChain 版本无关,设置环境变量 OPENAI_API_KEY 或显式传入 api_key 即可。

脚本里的密钥是占位的 sk-demo,从不联网;请不要把真实密钥写进代码或提交到仓库。

四、报错速查:按原文找原因

下表只收录本页实测过的报错,按你在终端里看到的第一行文字查找。

报错原文(节选)原因处理
No module named 'langchain.chains'、'langchain.memory'链和记忆已不在主包里装 langchain-classic,改从 langchain_classic 导入,见第一节
No module named 'langchain.prompts'、'langchain.schema'、'langchain.callbacks'这些符号已经拆到 langchain-core改从 langchain_core.prompts、langchain_core.messages、langchain_core.callbacks 导入
No module named 'langchain.llms'、'langchain.vectorstores'、'langchain.document_loaders'、'langchain.text_splitter'模型、向量库、加载器、切分器都已拆分到独立的包按第一节的表安装并改写
cannot import name 'AgentExecutor' from 'langchain.agents'、'initialize_agent'旧的智能体入口已从主包移除先用 langchain_classic.agents 保持行为,再迁到 create_agent
cannot import name 'ChatOpenAI' from 'langchain.chat_models'、'OpenAIEmbeddings' from 'langchain.embeddings'OpenAI 相关类已移到 langchain-openaifrom langchain_openai import ChatOpenAI, OpenAIEmbeddings
No module named 'langchain_classic'、'langchain_community'、'langchain_openai'、'langchain_text_splitters'新位置对应的包还没安装用 pip install 安装缺的那个包,见第六节
TypeError: '...' object is not callable(对模型对象)旧的 model(...) 调用方式已被移除改用 model.invoke(...)
AttributeError: '...' object has no attribute 'predict' 或 'predict_messages'旧的便捷方法已被移除改用 model.invoke(...)
OpenAIError: Missing credentials没有密钥,与版本无关设置 OPENAI_API_KEY 或传入 api_key

五、不报错但行为变了

最难排查的是不报错的情况。下面几种是旧教程迁移到 v1 时最容易遇到的,每一种在对应的详细页里都有实测输出:

你看到的现象常见原因详细指南
TypeError: create_agent() got an unexpected keyword argument 'prompt'从 create_react_agent 迁移时,prompt= 改名为 system_prompt=迁移 Runbook
没有报错,但回答像是没看到你的问题invoke 的输入不是 {"messages": [...]};旧写法 {"input": ...} 不会报错,内容却没有送达模型入门:invoke 的输入
GraphRecursionError: Recursion limit of … reached without hitting a stop condition循环步数超过 recursion_limit;旧版超限时返回文本,v1 抛出异常迁移 Runbook
ValueError: Checkpointer requires one or more of the following 'configurable' keys: thread_id, …配了 checkpointer,调用时没有传 thread_idcheckpoint 与故障恢复
ToolMessage(status=error),内容里有 Field required模型生成的参数不满足工具的参数模式,校验错误被反馈给了模型工具调用 schema 排障
调用一直卡着,没有任何报错ChatOpenAI() 默认没有超时;设置了 timeout 也不是整次调用的总时长上限模型调用的延迟预算

六、一次迁移的推荐顺序

照着下面的顺序做,每一步都可以单独验证,也可以单独退回:

  1. 先留回滚点。 升级前把当前环境的依赖清单(例如 pip freeze 的结果)和代码一起提交,出问题时可以整体回到升级前;

  2. 安装新位置需要的包。 一次装齐,避免逐个撞上 No module named:pip install -U langchain langchain-openai langchain-classic langchain-community langchain-text-splitters;

  3. 按第一节的表替换 import。 先只改位置,不改逻辑;链、智能体、记忆都先指向 langchain_classic;

  4. 把模型对象的旧调用改成 invoke。 model(...)、predict 在 v1 里没有兼容层,必须直接改写;

  5. 运行你的测试,再用本页脚本检查环境。 在你自己的虚拟环境里运行 old_imports.py,看每一行的 old 和 new 状态;

  6. 之后再逐步迁移。 把 LLMChain 改成 LCEL、把 AgentExecutor 改成 create_agent、把记忆交给 checkpointer,每次只动一类,参见迁移 Runbook。

失败、回滚与排障

现象常见原因处理
你的环境里新写法报 No module named ...,本页显示通过本页的“新写法”结果来自装好兼容包的环境,你的环境少装了包用 pip list 对照第一节“需要先安装”那一列,补装缺的包
你的环境里旧写法居然能导入,本页显示失败环境里仍是 0.x 版本,或同时装了多个版本用 pip show langchain 核对版本,确认虚拟环境没有串用
导入成功但打印了弃用警告,与本页不一致你的 langchain 小版本与本页的 0.3.27 不同,警告内容可能不同以你环境里的警告文字为准,再对照第一节的新位置
升级后线上出问题,需要退回升级与业务改动混在了同一次发布里按第六节第一步留下的依赖清单整体还原,业务改动单独再发

升级任何一个相关包之后,都建议重新运行一次 old_imports.py 和 old_calls.py:它们只依赖已安装的包,不联网,也不会修改环境。

复现脚本

下面是本页全部结果的来源。old_imports.py 依次执行每条旧写法和对应的新写法并打印状态:

old_imports.py
"""Try the import lines old tutorials use, and the new lines that replace them, in the installed environment."""
import re
import warnings
 
# (old import, new import) pairs. Every statement is executed for real in each environment.
PAIRS = [
    ("from langchain.chains import LLMChain", "from langchain_classic.chains import LLMChain"),
    ("from langchain.chains import RetrievalQA", "from langchain_classic.chains import RetrievalQA"),
    ("from langchain.chains import ConversationChain", "from langchain_classic.chains import ConversationChain"),
    ("from langchain.agents import initialize_agent, AgentType", "from langchain_classic.agents import initialize_agent, AgentType"),
    ("from langchain.agents import AgentExecutor", "from langchain_classic.agents import AgentExecutor"),
    ("from langchain.memory import ConversationBufferMemory", "from langchain_classic.memory import ConversationBufferMemory"),
    ("from langchain.prompts import PromptTemplate", "from langchain_core.prompts import PromptTemplate"),
    ("from langchain.schema import HumanMessage", "from langchain_core.messages import HumanMessage"),
    ("from langchain.schema import StrOutputParser", "from langchain_core.output_parsers import StrOutputParser"),
    ("from langchain.chat_models import ChatOpenAI", "from langchain_openai import ChatOpenAI"),
    ("from langchain.llms import OpenAI", "from langchain_openai import OpenAI"),
    ("from langchain.embeddings import OpenAIEmbeddings", "from langchain_openai import OpenAIEmbeddings"),
    ("from langchain.vectorstores import FAISS", "from langchain_community.vectorstores import FAISS"),
    ("from langchain.document_loaders import TextLoader", "from langchain_community.document_loaders import TextLoader"),
    ("from langchain.text_splitter import RecursiveCharacterTextSplitter", "from langchain_text_splitters import RecursiveCharacterTextSplitter"),
    ("from langchain.callbacks import StdOutCallbackHandler", "from langchain_core.callbacks import StdOutCallbackHandler"),
]
 
 
def clean(text: str, lines: int = 1) -> str:
    kept = [re.sub(r" \(/[^)]*\)", " (<path>)", s.strip()) for s in text.strip().splitlines() if s.strip()]
    return " / ".join(kept[:lines])[:240]
 
 
def attempt(statement: str):
    """Return (status, deprecation hints) for one import statement."""
    with warnings.catch_warnings(record=True) as caught:
        warnings.simplefilter("always")
        try:
            exec(statement, {})
            status = "OK"
        except BaseException as exc:  # noqa: BLE001 - the point is to show any failure
            status = f"{type(exc).__name__}: {clean(str(exc))}"
    hints = []
    for w in caught:
        # Old releases name the replacement import inside the deprecation message; keep only that.
        suggestion = re.search(r"from langchain_community[\w.]* import \w+", str(w.message))
        text = f"{w.category.__name__}, suggests: {suggestion.group(0)}" if suggestion else w.category.__name__
        if text not in hints:
            hints.append(text)
    return status, hints
 
 
for old, new in PAIRS:
    print(old)
    status, hints = attempt(old)
    print(f"    old: {status}")
    for hint in hints:
        print(f"    old warning: {hint}")
    status, _ = attempt(new)
    print(f"    new: {status}  <- {new.split(' import ')[0].replace('from ', '')}")

在 0.3.27 里运行的输出:旧写法全部成功,其中 5 条会提示弃用,新写法因为没有安装对应的包而大多失败:

from langchain.chains import LLMChain
    old: OK
    new: ModuleNotFoundError: No module named 'langchain_classic'  <- langchain_classic.chains
from langchain.chains import RetrievalQA
    old: OK
    new: ModuleNotFoundError: No module named 'langchain_classic'  <- langchain_classic.chains
from langchain.chains import ConversationChain
    old: OK
    new: ModuleNotFoundError: No module named 'langchain_classic'  <- langchain_classic.chains
from langchain.agents import initialize_agent, AgentType
    old: OK
    new: ModuleNotFoundError: No module named 'langchain_classic'  <- langchain_classic.agents
from langchain.agents import AgentExecutor
    old: OK
    new: ModuleNotFoundError: No module named 'langchain_classic'  <- langchain_classic.agents
from langchain.memory import ConversationBufferMemory
    old: OK
    new: ModuleNotFoundError: No module named 'langchain_classic'  <- langchain_classic.memory
from langchain.prompts import PromptTemplate
    old: OK
    new: OK  <- langchain_core.prompts
from langchain.schema import HumanMessage
    old: OK
    new: OK  <- langchain_core.messages
from langchain.schema import StrOutputParser
    old: OK
    new: OK  <- langchain_core.output_parsers
from langchain.chat_models import ChatOpenAI
    old: OK
    old warning: LangChainDeprecationWarning, suggests: from langchain_community.chat_models import ChatOpenAI
    new: ModuleNotFoundError: No module named 'langchain_openai'  <- langchain_openai
from langchain.llms import OpenAI
    old: OK
    old warning: LangChainDeprecationWarning, suggests: from langchain_community.llms import OpenAI
    new: ModuleNotFoundError: No module named 'langchain_openai'  <- langchain_openai
from langchain.embeddings import OpenAIEmbeddings
    old: OK
    old warning: LangChainDeprecationWarning, suggests: from langchain_community.embeddings import OpenAIEmbeddings
    new: ModuleNotFoundError: No module named 'langchain_openai'  <- langchain_openai
from langchain.vectorstores import FAISS
    old: OK
    old warning: LangChainDeprecationWarning, suggests: from langchain_community.vectorstores import FAISS
    new: OK  <- langchain_community.vectorstores
from langchain.document_loaders import TextLoader
    old: OK
    old warning: LangChainDeprecationWarning, suggests: from langchain_community.document_loaders import TextLoader
    new: OK  <- langchain_community.document_loaders
from langchain.text_splitter import RecursiveCharacterTextSplitter
    old: OK
    new: OK  <- langchain_text_splitters
from langchain.callbacks import StdOutCallbackHandler
    old: OK
    new: OK  <- langchain_core.callbacks

在只升级了主包的 1.4.7 里运行的输出:旧写法全部失败,新写法有 7 条可以直接导入:

from langchain.chains import LLMChain
    old: ModuleNotFoundError: No module named 'langchain.chains'
    new: ModuleNotFoundError: No module named 'langchain_classic'  <- langchain_classic.chains
from langchain.chains import RetrievalQA
    old: ModuleNotFoundError: No module named 'langchain.chains'
    new: ModuleNotFoundError: No module named 'langchain_classic'  <- langchain_classic.chains
from langchain.chains import ConversationChain
    old: ModuleNotFoundError: No module named 'langchain.chains'
    new: ModuleNotFoundError: No module named 'langchain_classic'  <- langchain_classic.chains
from langchain.agents import initialize_agent, AgentType
    old: ImportError: cannot import name 'initialize_agent' from 'langchain.agents' (<path>)
    new: ModuleNotFoundError: No module named 'langchain_classic'  <- langchain_classic.agents
from langchain.agents import AgentExecutor
    old: ImportError: cannot import name 'AgentExecutor' from 'langchain.agents' (<path>)
    new: ModuleNotFoundError: No module named 'langchain_classic'  <- langchain_classic.agents
from langchain.memory import ConversationBufferMemory
    old: ModuleNotFoundError: No module named 'langchain.memory'
    new: ModuleNotFoundError: No module named 'langchain_classic'  <- langchain_classic.memory
from langchain.prompts import PromptTemplate
    old: ModuleNotFoundError: No module named 'langchain.prompts'
    new: OK  <- langchain_core.prompts
from langchain.schema import HumanMessage
    old: ModuleNotFoundError: No module named 'langchain.schema'
    new: OK  <- langchain_core.messages
from langchain.schema import StrOutputParser
    old: ModuleNotFoundError: No module named 'langchain.schema'
    new: OK  <- langchain_core.output_parsers
from langchain.chat_models import ChatOpenAI
    old: ImportError: cannot import name 'ChatOpenAI' from 'langchain.chat_models' (<path>)
    new: OK  <- langchain_openai
from langchain.llms import OpenAI
    old: ModuleNotFoundError: No module named 'langchain.llms'
    new: OK  <- langchain_openai
from langchain.embeddings import OpenAIEmbeddings
    old: ImportError: cannot import name 'OpenAIEmbeddings' from 'langchain.embeddings' (<path>)
    new: OK  <- langchain_openai
from langchain.vectorstores import FAISS
    old: ModuleNotFoundError: No module named 'langchain.vectorstores'
    new: ModuleNotFoundError: No module named 'langchain_community'  <- langchain_community.vectorstores
from langchain.document_loaders import TextLoader
    old: ModuleNotFoundError: No module named 'langchain.document_loaders'
    new: ModuleNotFoundError: No module named 'langchain_community'  <- langchain_community.document_loaders
from langchain.text_splitter import RecursiveCharacterTextSplitter
    old: ModuleNotFoundError: No module named 'langchain.text_splitter'
    new: ModuleNotFoundError: No module named 'langchain_text_splitters'  <- langchain_text_splitters
from langchain.callbacks import StdOutCallbackHandler
    old: ModuleNotFoundError: No module named 'langchain.callbacks'
    new: OK  <- langchain_core.callbacks

old_calls.py 逐个尝试旧的调用方式和参数名:

old_calls.py
"""Run the call styles old tutorials use against a minimal chat model and report what each one does."""
import re
import warnings
 
from langchain_core.language_models.chat_models import BaseChatModel
from langchain_core.messages import AIMessage, HumanMessage
from langchain_core.outputs import ChatGeneration, ChatResult
from langchain_core.prompts import PromptTemplate
 
 
class Pong(BaseChatModel):
    """A chat model that always answers 'pong'; no network, no API key."""
 
    @property
    def _llm_type(self) -> str:
        return "pong"
 
    def _generate(self, messages, stop=None, run_manager=None, **kwargs):
        return ChatResult(generations=[ChatGeneration(message=AIMessage(content="pong"))])
 
 
def clean(text: str, lines: int = 1) -> str:
    kept = [re.sub(r" \(/[^)]*\)", " (<path>)", s.strip()) for s in text.strip().splitlines() if s.strip()]
    return " / ".join(kept[:lines])[:240]
 
 
def case(label: str, fn) -> None:
    print(label)
    with warnings.catch_warnings(record=True) as caught:
        warnings.simplefilter("always")
        try:
            out = fn()
            print(f"    result: {out.content if isinstance(out, AIMessage) else out!r}")
        except BaseException as exc:  # noqa: BLE001 - the point is to show any failure
            print(f"    {type(exc).__name__}: {clean(str(exc))}")
    seen = []
    for w in caught:
        text = f"{w.category.__name__}: {clean(str(w.message))}"
        if text not in seen:
            seen.append(text)
            print(f"    warning {text}")
 
 
model = Pong()
case('model([HumanMessage("hi")])', lambda: model([HumanMessage(content="hi")]))
case('model.predict("hi")', lambda: model.predict("hi"))
case('model.predict_messages([HumanMessage("hi")])', lambda: model.predict_messages([HumanMessage(content="hi")]))
case('model.invoke("hi")', lambda: model.invoke("hi"))
 
try:
    from langchain.chains import LLMChain
    source = "langchain.chains"
except ImportError:
    try:
        from langchain_classic.chains import LLMChain
        source = "langchain_classic.chains"
    except ImportError:
        LLMChain = None
        source = "not installed"
print(f"LLMChain comes from: {source}")
 
if LLMChain is not None:
    prompt = PromptTemplate.from_template("Say {word}")
    chain = lambda: LLMChain(llm=model, prompt=prompt)  # noqa: E731 - a fresh chain per case
    case('chain.run("ping")', lambda: chain().run("ping"))
    case('chain({"word": "ping"})', lambda: chain()({"word": "ping"}))
    case('chain.predict(word="ping")', lambda: chain().predict(word="ping"))
    case('chain.invoke({"word": "ping"})', lambda: chain().invoke({"word": "ping"}))
 
try:
    from langchain_openai import ChatOpenAI
except ImportError as exc:
    print(f"langchain_openai: {type(exc).__name__}")
else:
    def old_style():
        llm = ChatOpenAI(model_name="gpt-4o-mini", openai_api_key="sk-demo", temperature=0, max_tokens=64)
        return (llm.model_name, llm.temperature, llm.max_tokens)
 
    case('ChatOpenAI(model_name=..., openai_api_key=..., temperature=0, max_tokens=64)', old_style)
    case('ChatOpenAI(model="gpt-4o-mini", api_key="sk-demo")', lambda: ChatOpenAI(model="gpt-4o-mini", api_key="sk-demo").model_name)
    case('ChatOpenAI(model="gpt-4o-mini") without any key', lambda: ChatOpenAI(model="gpt-4o-mini"))

在 0.3.27 里运行的输出:旧的调用方式都能用,同时打印弃用警告:

model([HumanMessage("hi")])
    result: 'pong'
    warning LangChainDeprecationWarning: The method `BaseChatModel.__call__` was deprecated in langchain-core 0.1.7 and will be removed in 1.0. Use :meth:`~invoke` instead.
model.predict("hi")
    result: 'pong'
    warning LangChainDeprecationWarning: The method `BaseChatModel.predict` was deprecated in langchain-core 0.1.7 and will be removed in 1.0. Use :meth:`~invoke` instead.
model.predict_messages([HumanMessage("hi")])
    result: 'pong'
    warning LangChainDeprecationWarning: The method `BaseChatModel.predict_messages` was deprecated in langchain-core 0.1.7 and will be removed in 1.0. Use :meth:`~invoke` instead.
model.invoke("hi")
    result: 'pong'
LLMChain comes from: langchain.chains
chain.run("ping")
    result: 'pong'
    warning LangChainDeprecationWarning: The class `LLMChain` was deprecated in LangChain 0.1.17 and will be removed in 1.0. Use :meth:`~RunnableSequence, e.g., `prompt | llm`` instead.
    warning LangChainDeprecationWarning: The method `Chain.run` was deprecated in langchain 0.1.0 and will be removed in 1.0. Use :meth:`~invoke` instead.
chain({"word": "ping"})
    result: {'word': 'ping', 'text': 'pong'}
    warning LangChainDeprecationWarning: The method `Chain.__call__` was deprecated in langchain 0.1.0 and will be removed in 1.0. Use :meth:`~invoke` instead.
chain.predict(word="ping")
    result: 'pong'
chain.invoke({"word": "ping"})
    result: {'word': 'ping', 'text': 'pong'}
langchain_openai: ModuleNotFoundError

在 1.4.7 加兼容层里运行的输出:模型对象的旧调用已被移除,链的旧方法仍可用,旧参数名仍被接受:

model([HumanMessage("hi")])
    TypeError: 'Pong' object is not callable
model.predict("hi")
    AttributeError: 'Pong' object has no attribute 'predict'
model.predict_messages([HumanMessage("hi")])
    AttributeError: 'Pong' object has no attribute 'predict_messages'
model.invoke("hi")
    result: 'pong'
LLMChain comes from: langchain_classic.chains
chain.run("ping")
    result: 'pong'
    warning LangChainDeprecationWarning: The class `LLMChain` was deprecated in LangChain 0.1.17 and will be removed in 2.0.0. Use `RunnableSequence, e.g., `prompt | llm`` instead.
    warning LangChainDeprecationWarning: The method `Chain.run` was deprecated in langchain-classic 0.1.0 and will be removed in 2.0.0. Use `invoke` instead.
chain({"word": "ping"})
    result: {'word': 'ping', 'text': 'pong'}
    warning LangChainDeprecationWarning: The method `Chain.__call__` was deprecated in langchain-classic 0.1.0 and will be removed in 2.0.0. Use `invoke` instead.
chain.predict(word="ping")
    result: 'pong'
chain.invoke({"word": "ping"})
    result: {'word': 'ping', 'text': 'pong'}
ChatOpenAI(model_name=..., openai_api_key=..., temperature=0, max_tokens=64)
    result: ('gpt-4o-mini', 0.0, 64)
ChatOpenAI(model="gpt-4o-mini", api_key="sk-demo")
    result: 'gpt-4o-mini'
ChatOpenAI(model="gpt-4o-mini") without any key
    OpenAIError: Missing credentials. Please pass an `api_key`, `workload_identity`, `admin_api_key`, or set the `OPENAI_API_KEY` or `OPENAI_ADMIN_KEY` environment variable.

相关阅读

来源

以上来源均于 2026-10-26 核对。表中的结果来自站点仓库 labs/old-tutorial-patterns/ 的实际运行,第五节的现象来自站内各详细页的实测。

维护信息

  • 编辑:LangChain 中文网编辑部(内容标准见编辑与纠错说明);
  • 最近验证:2026-10-26;
  • 复现:先执行 labs/setup-envs.sh 重建环境,再执行 python3 labs/run.py --lab old-tutorial-patterns;
  • 发现错误请按联系我们反馈。