代码中使用了 openai.ChatCompletion
,会触发 APIRemovedInV1
错误,提示 OpenAI Python SDK 在 1.0.0 及以上版本已移除 ChatCompletion
接口。官方建议迁移到新接口(openai.chat.completions.create
),或回退到旧版本(如 openai==0.28
)。本文基于 LangChain 0.3.x 和 OpenAI SDK 1.x,详细解释如何在 LangChain 中处理此错误,并迁移到新接口。
代码报错信息:
APIRemovedInV1:
You tried to access openai.ChatCompletion, but this is no longer supported in openai>=1.0.0 - see the README at https://github.com/openai/openai-python for the API.
You can runopenai migrate
to automatically upgrade your codebase to use the 1.0.0 interface.
Alternatively, you can pin your installation to the old version, e.g.pip install openai==0.28
A detailed migration guide is available here: https://github.com/openai/openai-python/discussions/742 ……
为什么触发 APIRemovedInV1
错误?
OpenAI Python SDK 在 2023 年 11 月发布了 1.0.0 版本,引入了重大接口变更:
- 旧接口(
openai<1.0.0
):使用openai.ChatCompletion.create
或openai.Completion.create
调用模型。 - 新接口(
openai>=1.0.0
):使用openai.chat.completions.create
(聊天模型)或openai.completions.create
(文本补全模型)。 - 原因:新接口更模块化,支持类型提示和异步调用,且与 OpenAI 的最新模型(如
gpt-4o
)兼容。 - 影响:LangChain 0.3.x 默认使用
openai>=1.0.0
,因此直接调用旧接口(如openai.ChatCompletion
)会报错。
在 LangChain 中,langchain_openai
模块(ChatOpenAI
等)已适配新接口,因此推荐通过 LangChain 的封装调用 OpenAI 模型,而不是直接使用 openai
库的低级接口。
迁移步骤
以下是将代码从旧的 openai.ChatCompletion
迁移到 LangChain 0.3.x 的推荐方式,结合 langchain_openai.ChatOpenAI
使用新接口。
1. 分析原始代码
假设你的代码直接使用 openai.ChatCompletion
,如下:
import os
import openai
os.environ["OPENAI_API_KEY"] = "Your OpenAI API Key"
openai.api_key = os.environ["OPENAI_API_KEY"]
# 旧接口调用
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "你是一个助手。"},
{"role": "user", "content": "什么是人工智能?"}
]
)
print(response.choices[0].message.content)
输出示例:
人工智能(AI)是计算机科学的一个分支,旨在创建能够执行需要人类智能的任务的系统,例如学习、推理、问题解决和决策。
问题:
openai.ChatCompletion.create
在openai>=1.0.0
中已移除,需迁移到openai.chat.completions.create
或使用 LangChain 的ChatOpenAI
。- LangChain 提供更高层次的封装,推荐优先使用。
2. 安装必要依赖
确保安装最新版本的 LangChain 和 OpenAI SDK:
pip install --upgrade langchain langchain-openai openai
确认 openai
版本为 1.0.0 或以上:
pip show openai
若仍使用旧版本(openai<1.0.0
),升级或按需回退(见“回退方案”)。
3. 迁移到 LangChain 的 ChatOpenAI
以下是使用 langchain_openai.ChatOpenAI
重写上述代码的示例,适配 OpenAI SDK 1.x:
import os
os.environ["OPENAI_API_KEY"] = "Your OpenAI API Key"
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
# 初始化 ChatOpenAI
llm = ChatOpenAI(temperature=0, model="gpt-3.5-turbo")
# 定义提示模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个助手。"),
("human", "{question}")
])
# 创建 LCEL 链
chain = prompt | llm | StrOutputParser()
# 调用链
response = chain.invoke({"question": "什么是人工智能?"})
print(response)
输出示例:
人工智能(AI)是计算机科学的一个分支,旨在创建能够执行需要人类智能的任务的系统,例如学习、推理、问题解决和决策。
代码说明
- OpenAI API 密钥:
- 通过
os.environ["OPENAI_API_KEY"]
设置,替换为实际密钥。 - LangChain 自动使用此密钥调用 OpenAI API。
- 通过
- ChatOpenAI:
ChatOpenAI
封装了openai.chat.completions.create
,适配新接口。- 指定
model="gpt-3.5-turbo"
,支持gpt-4o
、gpt-4o-mini
等。
- 提示模板:
ChatPromptTemplate
定义系统和用户消息,与旧messages
列表等效。
- LCEL 链:
prompt | llm | StrOutputParser
创建链,处理消息输入、生成响应并解析为字符串。
- 调用:
- 输入为字典(
{"question": "..."}
),输出为字符串。
- 输入为字典(
4. 直接使用 OpenAI SDK 1.x(可选)
若不想使用 LangChain,而是直接迁移到 OpenAI SDK 1.x 接口,代码如下:
import os
import openai
os.environ["OPENAI_API_KEY"] = "Your OpenAI API Key"
client = openai.OpenAI(api_key=os.environ["OPENAI_API_KEY"])
# 新接口调用
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "你是一个助手。"},
{"role": "user", "content": "什么是人工智能?"}
]
)
print(response.choices[0].message.content)
输出示例:
人工智能(AI)是计算机科学的一个分支,旨在创建能够执行需要人类智能的任务的系统,例如学习、推理、问题解决和决策。
说明:
- 使用
openai.OpenAI
客户端,调用client.chat.completions.create
。 - 消息格式与旧接口相同,但路径变更为
openai.chat.completions
。 - 推荐在 LangChain 中使用
ChatOpenAI
,以利用提示模板、解析器等功能。
5. 结合对话历史(推荐)
为了展示 LangChain 的强大功能,以下示例添加对话历史支持:
import os
os.environ["OPENAI_API_KEY"] = "Your OpenAI API Key"
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_community.chat_message_histories import ChatMessageHistory
# 初始化 ChatOpenAI
llm = ChatOpenAI(temperature=0, model="gpt-3.5-turbo")
# 定义提示模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个助手,请根据对话历史回答问题。"),
MessagesPlaceholder(variable_name="history"),
("human", "{input}")
])
# 创建 LCEL 链
runnable = prompt | llm
# 初始化消息历史存储
store = {}
def get_session_history(session_id: str) -> ChatMessageHistory:
if session_id not in store:
store[session_id] = ChatMessageHistory()
return store[session_id]
# 创建带历史的链
chain = RunnableWithMessageHistory(
runnable,
get_session_history,
input_messages_key="input",
history_messages_key="history"
)
# 调用链
session_id = "user1"
response = chain.invoke(
{"input": "我叫鲍勃"},
config={"configurable": {"session_id": session_id}}
)
print(response.content)
response = chain.invoke(
{"input": "我的名字是什么?"},
config={"configurable": {"session_id": session_id}}
)
print(response.content)
输出示例:
你好,鲍勃!很高兴认识你!有什么可以帮助你的?
你的名字是鲍勃。
说明:
- 使用
RunnableWithMessageHistory
管理对话历史。 ChatOpenAI
适配新接口,支持多轮对话。
6. 自动迁移(可选)
OpenAI 提供 openai migrate
工具,自动将旧接口迁移到新接口:
- 安装
openai
迁移工具:pip install openai --upgrade
- 运行迁移命令:
openai migrate
- 按提示扫描代码,工具会将
openai.ChatCompletion.create
替换为openai.chat.completions.create
。
注意:
- 迁移工具可能不完全适配 LangChain 代码,建议手动检查。
- LangChain 的
ChatOpenAI
已内置新接口,无需直接修改 OpenAI 调用。
7. 回退方案(不推荐)
若无法立即迁移,可回退到旧版本 openai==0.28
:
pip install openai==0.28
缺点:
- 旧版本不支持新模型(如
gpt-4o
)。 - 不再接收更新,可能存在安全风险。
- LangChain 0.3.x 推荐
openai>=1.0.0
,回退可能导致兼容性问题。
推荐:优先迁移到 ChatOpenAI
或 openai.chat.completions.create
。
8. 测试与验证
- 依赖:
- 确认
langchain-openai
和openai>=1.0.0
已安装。 - 验证
OPENAI_API_KEY
有效。
- 确认
- 运行:
- 测试简单问答,确认输出正确。
- 测试对话历史场景,验证上下文保留。
- 模型:
- 使用
gpt-3.5-turbo
或gpt-4o-mini
(性价比高),确保密钥支持。
- 使用
注意事项
- API 密钥安全:
- 避免硬编码密钥,推荐使用
.env
文件:from dotenv import load_dotenv load_dotenv() # 加载 OPENAI_API_KEY
- 确保密钥支持指定模型。
- 避免硬编码密钥,推荐使用
- LangChain 优势:
ChatOpenAI
提供提示模板、解析器、历史管理等功能,优于直接使用openai
库。- LCEL 支持流式输出(
stream
)、异步调用(ainvoke
)。
- 模型选择:
- 推荐
gpt-4o-mini
(高性价比)或gpt-4o
(高性能)。 - 旧接口不支持新模型,迁移后可访问最新模型。
- 推荐
- 错误处理:
- 若 API 调用失败,检查密钥、模型名称或网络连接。
- 使用 LangChain 的
verbose=True
调试链执行。
- Ollama 兼容性:
- 若结合
langchain_ollama.ChatOllama
,无需 OpenAI SDK 1.x 迁移,直接使用本地模型。
- 若结合
常见问题
Q1:可以继续使用 openai==0.28
吗?
A:可以,但不推荐。旧版本不支持新模型,且 LangChain 0.3.x 可能不完全兼容。
Q2:LangChain 的 ChatOpenAI
是否受影响?
A:不受影响。ChatOpenAI
已适配 openai>=1.0.0
,内部使用新接口。
Q3:如何选择 ChatOpenAI
还是直接 openai
?
A:推荐 ChatOpenAI
,因其集成 LCEL、提示模板、解析器等功能,适合复杂工作流。直接 openai
适合简单调用。
Q4:迁移后性能有变化吗?
A:性能无显著变化,但新接口支持最新模型(如 gpt-4o
),可能提升质量。
总结
APIRemovedInV1
错误因 openai.ChatCompletion
在 openai>=1.0.0
中移除而触发。迁移方案包括:
- 安装
langchain-openai
和openai>=1.0.0
。 - 使用
langchain_openai.ChatOpenAI
替换openai.ChatCompletion.create
,结合 LCEL 构建链。 - 或者直接使用
openai.chat.completions.create
(低级接口)。 - 可选运行
openai migrate
自动升级代码。 - 不推荐回退到
openai==0.28
,因其不支持新模型和更新。 - 设置
OPENAI_API_KEY
确保 API 访问。