【LangChain】langchain.embeddings.OpenAIEmbeddings 迁移至 langchain_openai.OpenAIEmbeddings

代码中使用了 langchain.embeddings.OpenAIEmbeddings 类来初始化 OpenAI 嵌入模型,会触发 LangChainDeprecationWarning,提示该类在 LangChain 0.0.9 中已被废弃,并将在 1.0.0 中移除。官方推荐使用 langchain_openai 包中的 OpenAIEmbeddings 类替代。本文基于 LangChain 0.3.x,详细解释如何迁移 OpenAIEmbeddingslangchain_openai.OpenAIEmbeddings,并提供代码示例,展示嵌入模型的典型用法(如文本嵌入和语义搜索)。

代码废弃告警:
LangChainDeprecationWarning: The class OpenAIEmbeddings 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 as from :class:~langchain_openai import OpenAIEmbeddings``.
embeddings = OpenAIEmbeddings() ……


为什么需要迁移?

langchain.embeddings.OpenAIEmbeddings 是 LangChain 早期用于调用 OpenAI 嵌入模型(如 text-embedding-ada-002)的类,但随着 LangChain 的模块化重构,OpenAI 相关的功能已被移到独立的 langchain_openai 包中。迁移的原因包括:

  1. 模块化:将 OpenAI 特定功能移到 langchain_openai,保持 langchain-core 轻量。
  2. 维护性langchain_openai 由社区专门维护,更新更及时,支持最新 OpenAI 嵌入模型(如 text-embedding-3-small)。
  3. 长期支持:旧的 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-002text-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]
代码说明
  1. OpenAI API 密钥
    • 通过 os.environ["OPENAI_API_KEY"] 设置,替换为实际密钥。
    • 确保密钥支持嵌入模型(如 text-embedding-3-small)。
  2. 导入替换
    • from langchain.embeddings import OpenAIEmbeddings 替换为 from langchain_openai import OpenAIEmbeddings
    • 功能保持不变,生成文本嵌入。
  3. 模型初始化
    • OpenAIEmbeddings(model="text-embedding-3-small") 指定嵌入模型。
    • 默认使用 text-embedding-ada-002,推荐 text-embedding-3-small(更高效,成本更低)。
  4. 嵌入生成
    • 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)是计算机科学的一个分支,专注于创建能够执行需要人类智能的任务的系统,例如学习、推理和决策。
代码说明
  1. 嵌入模型
    • 使用 langchain_openai.OpenAIEmbeddings 生成文档嵌入,存储到 Chroma。
    • Chroma.from_texts 将文本转换为嵌入并索引。
  2. 向量存储
    • vectorstore.as_retriever 创建检索器,搜索与查询最相似的文档(k=2 返回 2 个结果)。
  3. LCEL 链
    • retriever 检索相关文档,RunnablePassthrough 传递用户问题。
    • prompt | llm | StrOutputParser 生成最终回答。
  4. 调用
    • 输入为字符串问题,输出为基于上下文的回答。
5. 测试与验证
  • 依赖
    • 确认已安装 langchain-openaichromadbpip install chromadb)。
    • 验证 OPENAI_API_KEY 有效,支持嵌入模型。
  • 运行
    • 测试单条文本嵌入,确认向量维度正确(text-embedding-3-small 为 1536 维)。
    • 测试语义搜索,验证检索和回答质量。
  • 模型
    • 默认 text-embedding-ada-002(1536 维),推荐 text-embedding-3-small(更高效)或 text-embedding-3-large(更高精度)。

注意事项

  1. API 密钥安全
    • 避免硬编码密钥,推荐使用 .env 文件:
      from dotenv import load_dotenv
      load_dotenv()  # 加载 OPENAI_API_KEY
      
    • 确保密钥支持嵌入模型(检查 OpenAI 仪表板)。
  2. 嵌入模型选择
    • text-embedding-3-small:1536 维,成本低,适合大多数场景。
    • text-embedding-3-large:3072 维,精度更高,成本更高。
    • text-embedding-ada-002:旧模型,1536 维,仍广泛使用。
    • 参考 OpenAI 嵌入文档
  3. 向量存储
    • Chroma 适合本地测试,生产环境可考虑 FAISS、Pinecone 等。
    • 确保文档数量和嵌入维度匹配。
  4. 性能
    • 嵌入生成速度依赖 API 调用,批量处理(embed_documents)可提高效率。
    • 本地 Ollama 嵌入模型(如 nomic-embed-text)可替代 OpenAI,需使用 langchain_ollama.OllamaEmbeddings
  5. Ollama 替代
    • 若想避免 OpenAI API 费用,可使用 langchain_ollama.OllamaEmbeddings
      from langchain_ollama import OllamaEmbeddings
      embeddings = OllamaEmbeddings(model="nomic-embed-text")
      

常见问题

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 的步骤包括:

  1. 安装 langchainlangchain-openaipip install langchain langchain-openai)。
  2. 替换导入:from langchain.embeddings import OpenAIEmbeddings 改为 from langchain_openai import OpenAIEmbeddings
  3. 设置 OPENAI_API_KEY,确保支持嵌入模型。
  4. 推荐使用 text-embedding-3-smalltext-embedding-3-large
  5. 结合向量存储(如 Chroma)实现语义搜索或问答。
  6. 可选使用 langchain_ollama.OllamaEmbeddings 替代 OpenAI 嵌入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬彬侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值