代码中使用了 langchain.embeddings.OpenAIEmbeddings
类来初始化 OpenAI 嵌入模型,会触发 LangChainDeprecationWarning
,提示该类在 LangChain 0.0.9 中已被废弃,并将在 1.0.0 中移除。官方推荐使用 langchain_openai
包中的 OpenAIEmbeddings
类替代。本文基于 LangChain 0.3.x,详细解释如何迁移 OpenAIEmbeddings
到 langchain_openai.OpenAIEmbeddings
,并提供代码示例,展示嵌入模型的典型用法(如文本嵌入和语义搜索)。
代码废弃告警:
LangChainDeprecationWarning: The classOpenAIEmbeddings
was deprecated in LangChain 0.0.9 and will be removed in 1.0. An updated version of the class exists in the :class:~langchain-openai package and should be used instead. To use it run
pip install -U :class:~langchain-openai
and import asfrom :class:
~langchain_openai import OpenAIEmbeddings``.
embeddings = OpenAIEmbeddings() ……
为什么需要迁移?
langchain.embeddings.OpenAIEmbeddings
是 LangChain 早期用于调用 OpenAI 嵌入模型(如 text-embedding-ada-002
)的类,但随着 LangChain 的模块化重构,OpenAI 相关的功能已被移到独立的 langchain_openai
包中。迁移的原因包括:
- 模块化:将 OpenAI 特定功能移到
langchain_openai
,保持langchain-core
轻量。 - 维护性:
langchain_openai
由社区专门维护,更新更及时,支持最新 OpenAI 嵌入模型(如text-embedding-3-small
)。 - 长期支持:旧的
OpenAIEmbeddings
类将在 LangChain 1.0 中移除,新类是未来标准。
新的 langchain_openai.OpenAIEmbeddings
提供与旧类相同的功能,但更稳定,并与 LangChain 0.3.x 的生态(如 LCEL、向量存储)兼容。
迁移步骤
以下是将 langchain.embeddings.OpenAIEmbeddings
迁移到 langchain_openai.OpenAIEmbeddings
的详细步骤,假设你使用 OpenAI 嵌入模型进行文本嵌入或语义搜索。
1. 分析原始代码
假设你的代码如下,使用 langchain.embeddings.OpenAIEmbeddings
生成文本嵌入:
import os
os.environ["OPENAI_API_KEY"] = "Your OpenAI API Key"
from langchain.embeddings import OpenAIEmbeddings
# 初始化嵌入模型
embeddings = OpenAIEmbeddings()
# 生成文本嵌入
text = "什么是人工智能?"
embedding = embeddings.embed_query(text)
print(embedding[:5]) # 打印嵌入向量的前 5 维
输出示例:
[-0.013245678, 0.025678901, -0.008912345, 0.017890123, -0.004567890]
问题:
from langchain.embeddings import OpenAIEmbeddings
已废弃,需替换为from langchain_openai import OpenAIEmbeddings
。- 需要安装
langchain-openai
包。 - 确保
OPENAI_API_KEY
有效,支持嵌入模型(如text-embedding-ada-002
或text-embedding-3-small
)。
2. 安装必要依赖
确保安装 LangChain 0.3.x 和 langchain-openai
:
pip install --upgrade langchain langchain-openai
确认 OpenAI API 密钥已配置,支持嵌入模型调用。
3. 迁移到 langchain_openai.OpenAIEmbeddings
以下是迁移后的代码,替换 OpenAIEmbeddings
的导入:
import os
os.environ["OPENAI_API_KEY"] = "Your OpenAI API Key"
from langchain_openai import OpenAIEmbeddings
# 初始化嵌入模型
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
# 生成文本嵌入
text = "什么是人工智能?"
embedding = embeddings.embed_query(text)
print(embedding[:5]) # 打印嵌入向量的前 5 维
输出示例:
[-0.012345678, 0.023456789, -0.007890123, 0.016789012, -0.003456789]
代码说明
- OpenAI API 密钥:
- 通过
os.environ["OPENAI_API_KEY"]
设置,替换为实际密钥。 - 确保密钥支持嵌入模型(如
text-embedding-3-small
)。
- 通过
- 导入替换:
- 将
from langchain.embeddings import OpenAIEmbeddings
替换为from langchain_openai import OpenAIEmbeddings
。 - 功能保持不变,生成文本嵌入。
- 将
- 模型初始化:
OpenAIEmbeddings(model="text-embedding-3-small")
指定嵌入模型。- 默认使用
text-embedding-ada-002
,推荐text-embedding-3-small
(更高效,成本更低)。
- 嵌入生成:
embed_query
生成单条文本的嵌入向量。embed_documents
可批量生成多条文本的嵌入。
4. 结合向量存储(语义搜索示例)
嵌入模型常用于语义搜索或问答系统,结合向量存储(如 Chroma)。以下是一个完整示例,展示如何使用迁移后的 OpenAIEmbeddings
构建语义搜索:
import os
os.environ["OPENAI_API_KEY"] = "Your OpenAI API Key"
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_community.vectorstores import Chroma
from langchain_core.runnables import RunnablePassthrough
# 初始化嵌入模型
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
# 初始化 LLM
llm = ChatOpenAI(temperature=0, model="gpt-4o-mini")
# 准备文档
docs = [
"人工智能(AI)是计算机科学的一个分支,专注于创建智能系统。",
"机器学习是 AI 的子领域,涉及从数据中学习模型。",
"深度学习是机器学习的一种,使用神经网络处理复杂任务。"
]
# 创建向量存储
vectorstore = Chroma.from_texts(docs, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 2})
# 定义提示模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个助手,根据以下上下文回答问题:\n{context}"),
("human", "{question}")
])
# 创建 LCEL 链
chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
# 调用链
response = chain.invoke("什么是人工智能?")
print(response)
输出示例:
人工智能(AI)是计算机科学的一个分支,专注于创建能够执行需要人类智能的任务的系统,例如学习、推理和决策。
代码说明
- 嵌入模型:
- 使用
langchain_openai.OpenAIEmbeddings
生成文档嵌入,存储到 Chroma。 Chroma.from_texts
将文本转换为嵌入并索引。
- 使用
- 向量存储:
vectorstore.as_retriever
创建检索器,搜索与查询最相似的文档(k=2
返回 2 个结果)。
- LCEL 链:
retriever
检索相关文档,RunnablePassthrough
传递用户问题。prompt | llm | StrOutputParser
生成最终回答。
- 调用:
- 输入为字符串问题,输出为基于上下文的回答。
5. 测试与验证
- 依赖:
- 确认已安装
langchain-openai
和chromadb
(pip install chromadb
)。 - 验证
OPENAI_API_KEY
有效,支持嵌入模型。
- 确认已安装
- 运行:
- 测试单条文本嵌入,确认向量维度正确(
text-embedding-3-small
为 1536 维)。 - 测试语义搜索,验证检索和回答质量。
- 测试单条文本嵌入,确认向量维度正确(
- 模型:
- 默认
text-embedding-ada-002
(1536 维),推荐text-embedding-3-small
(更高效)或text-embedding-3-large
(更高精度)。
- 默认
注意事项
- API 密钥安全:
- 避免硬编码密钥,推荐使用
.env
文件:from dotenv import load_dotenv load_dotenv() # 加载 OPENAI_API_KEY
- 确保密钥支持嵌入模型(检查 OpenAI 仪表板)。
- 避免硬编码密钥,推荐使用
- 嵌入模型选择:
text-embedding-3-small
:1536 维,成本低,适合大多数场景。text-embedding-3-large
:3072 维,精度更高,成本更高。text-embedding-ada-002
:旧模型,1536 维,仍广泛使用。- 参考 OpenAI 嵌入文档。
- 向量存储:
- Chroma 适合本地测试,生产环境可考虑 FAISS、Pinecone 等。
- 确保文档数量和嵌入维度匹配。
- 性能:
- 嵌入生成速度依赖 API 调用,批量处理(
embed_documents
)可提高效率。 - 本地 Ollama 嵌入模型(如
nomic-embed-text
)可替代 OpenAI,需使用langchain_ollama.OllamaEmbeddings
。
- 嵌入生成速度依赖 API 调用,批量处理(
- Ollama 替代:
- 若想避免 OpenAI API 费用,可使用
langchain_ollama.OllamaEmbeddings
:from langchain_ollama import OllamaEmbeddings embeddings = OllamaEmbeddings(model="nomic-embed-text")
- 若想避免 OpenAI API 费用,可使用
常见问题
Q1:可以继续使用 langchain.embeddings.OpenAIEmbeddings
吗?
A:可以,但不建议。它将在 LangChain 1.0 中移除,迁移到 langchain_openai.OpenAIEmbeddings
更安全。
Q2:新旧 OpenAIEmbeddings
功能有差异吗?
A:功能相同,仅导入路径变更,新类支持最新模型(如 text-embedding-3-small
)。
Q3:如何选择嵌入模型?
A:text-embedding-3-small
适合成本敏感场景,text-embedding-3-large
适合高精度需求,text-embedding-ada-002
适合兼容旧系统。
Q4:嵌入模型支持本地运行吗?
A:OpenAI 嵌入模型需 API 调用,替代方案是使用 langchain_ollama.OllamaEmbeddings
运行本地模型。
总结
从 langchain.embeddings.OpenAIEmbeddings
迁移到 langchain_openai.OpenAIEmbeddings
的步骤包括:
- 安装
langchain
和langchain-openai
(pip install langchain langchain-openai
)。 - 替换导入:
from langchain.embeddings import OpenAIEmbeddings
改为from langchain_openai import OpenAIEmbeddings
。 - 设置
OPENAI_API_KEY
,确保支持嵌入模型。 - 推荐使用
text-embedding-3-small
或text-embedding-3-large
。 - 结合向量存储(如 Chroma)实现语义搜索或问答。
- 可选使用
langchain_ollama.OllamaEmbeddings
替代 OpenAI 嵌入。