代码中使用了 langchain.vectorstores.Chroma
来初始化 Chroma 向量存储,会触发 LangChainDeprecationWarning
,提示该导入在 LangChain 0.2 中已被废弃。官方推荐使用 langchain_community.vectorstores.Chroma
替代。本文基于 LangChain 0.3.x,详细解释如何迁移 Chroma 的导入,并提供代码示例,展示 Chroma 在语义搜索场景中的典型用法。
代码废弃告警:
LangChainDeprecationWarning: Importing Chroma from langchain.vectorstores is deprecated. Please replace deprecated imports:
from langchain.vectorstores import Chroma
with new imports of:
rom langchain_community.vectorstores import Chroma
You can use the langchain cli to automatically upgrade many imports. Please see documentation here https://python.langchain.com/docs/versions/v0_2/
from langchain.vectorstores import Chroma ……
为什么需要迁移?
langchain.vectorstores.Chroma
是 LangChain 早期用于与 Chroma 向量数据库交互的类,但随着 LangChain 的模块化重构,向量存储相关的功能(包括 Chroma)已被移到独立的 langchain_community
包中。迁移的原因包括:
- 模块化:将社区维护的功能移到
langchain_community
,保持langchain-core
轻量。 - 维护性:
langchain_community
由社区专门维护,更新更及时,支持最新 Chroma 功能。 - 长期支持:旧的
langchain.vectorstores.Chroma
在 LangChain 0.2 后废弃,将在未来版本移除。
新的 langchain_community.vectorstores.Chroma
提供与旧类相同的功能,但更稳定,并与 LangChain 0.3.x 的生态(如 LCEL、嵌入模型)兼容。
迁移步骤
以下是将 langchain.vectorstores.Chroma
迁移到 langchain_community.vectorstores.Chroma
的详细步骤,假设你使用 Chroma 进行语义搜索,结合 OpenAI 嵌入模型。
1. 分析原始代码
假设你的代码如下,使用 langchain.vectorstores.Chroma
创建向量存储:
import os
os.environ["OPENAI_API_KEY"] = "Your OpenAI API Key"
from langchain.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
# 初始化嵌入模型
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
# 准备文档
docs = [
"人工智能(AI)是计算机科学的一个分支,专注于创建智能系统。",
"机器学习是 AI 的子领域,涉及从数据中学习模型。"
]
# 创建向量存储
vectorstore = Chroma.from_texts(docs, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 1})
# 搜索相关文档
results = retriever.invoke("什么是人工智能?")
print(results[0].page_content)
输出示例:
人工智能(AI)是计算机科学的一个分支,专注于创建智能系统。
问题:
from langchain.vectorstores import Chroma
已废弃,需替换为from langchain_community.vectorstores import Chroma
。- 需要安装
langchain-community
和chromadb
包。 - 确保
OPENAI_API_KEY
有效,支持嵌入模型。
2. 安装必要依赖
确保安装 LangChain 0.3.x、langchain-community
和 Chroma 相关依赖:
pip install --upgrade langchain langchain-community langchain-openai chromadb
确认 Chroma 数据库可用(chromadb
提供 Chroma 的核心功能)。
3. 迁移到 langchain_community.vectorstores.Chroma
以下是迁移后的代码,替换 Chroma 的导入:
import os
os.environ["OPENAI_API_KEY"] = "Your OpenAI API Key"
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
# 初始化嵌入模型
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
# 准备文档
docs = [
"人工智能(AI)是计算机科学的一个分支,专注于创建智能系统。",
"机器学习是 AI 的子领域,涉及从数据中学习模型。"
]
# 创建向量存储
vectorstore = Chroma.from_texts(docs, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 1})
# 搜索相关文档
results = retriever.invoke("什么是人工智能?")
print(results[0].page_content)
输出示例:
人工智能(AI)是计算机科学的一个分支,专注于创建智能系统。
代码说明
- OpenAI API 密钥:
- 通过
os.environ["OPENAI_API_KEY"]
设置,替换为实际密钥。 - 确保密钥支持嵌入模型(如
text-embedding-3-small
)。
- 通过
- 导入替换:
- 将
from langchain.vectorstores import Chroma
替换为from langchain_community.vectorstores import Chroma
。 - 功能保持不变,创建和管理向量存储。
- 将
- 嵌入模型:
- 使用
langchain_openai.OpenAIEmbeddings
生成文档嵌入。 - 指定
model="text-embedding-3-small"
,更高效且成本低。
- 使用
- 向量存储:
Chroma.from_texts
将文档转换为嵌入并存储。as_retriever
创建检索器,k=1
返回最相关的一个文档。
- 调用:
retriever.invoke
执行语义搜索,返回匹配的文档。
4. 结合 LCEL 和 LLM(完整问答示例)
Chroma 常用于语义搜索后结合 LLM 生成回答。以下是一个完整示例,使用迁移后的 Chroma
和 LCEL 构建问答链:
import os
os.environ["OPENAI_API_KEY"] = "Your OpenAI API Key"
from langchain_community.vectorstores import Chroma
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
# 初始化嵌入模型和 LLM
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
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)是计算机科学的一个分支,专注于创建能够执行需要人类智能的任务的系统,例如学习、推理和决策。
代码说明
- Chroma:
- 使用
langchain_community.vectorstores.Chroma
创建向量存储。 retriever
搜索与查询最相关的 2 个文档(k=2
)。
- 使用
- LCEL 链:
RunnableParallel
(通过字典{"context": retriever, "question": RunnablePassthrough()}
)并行处理检索和输入传递。prompt | llm | StrOutputParser
生成基于上下文的回答。
- 调用:
- 输入为字符串问题,输出为 LLM 生成的回答。
5. 自动迁移(可选)
LangChain 提供 CLI 工具自动升级废弃导入:
- 安装 LangChain CLI:
pip install langchain-cli
- 运行迁移命令:
langchain migrate
- 按提示扫描代码,工具会将
langchain.vectorstores.Chroma
替换为langchain_community.vectorstores.Chroma
。
注意:
- 迁移工具可能无法处理复杂代码,建议手动验证。
- 确保安装
langchain-community
以支持新导入。
6. 测试与验证
- 依赖:
- 确认已安装
langchain-community
和chromadb
(pip install chromadb
)。 - 验证
OPENAI_API_KEY
有效,支持嵌入模型。
- 确认已安装
- 运行:
- 测试向量存储创建,确认文档嵌入正确。
- 测试语义搜索,验证检索和回答质量。
- Chroma 配置:
- 默认使用内存存储,生产环境可设置持久化路径:
vectorstore = Chroma.from_texts(docs, embeddings, persist_directory="./chroma_db")
- 默认使用内存存储,生产环境可设置持久化路径:
注意事项
- 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
:旧模型,仍广泛使用。
- Chroma 配置:
- 默认内存模式适合测试,持久化需设置
persist_directory
。 - 支持其他向量存储(如 FAISS、Pinecone),可根据需求替换。
- 默认内存模式适合测试,持久化需设置
- 性能:
- 嵌入生成速度依赖 API 调用,批量处理(
from_texts
)可提高效率。 - Chroma 的搜索性能依赖文档数量和硬件。
- 嵌入生成速度依赖 API 调用,批量处理(
- Ollama 替代:
- 若想避免 OpenAI API 费用,可使用
langchain_ollama.OllamaEmbeddings
:from langchain_ollama import OllamaEmbeddings embeddings = OllamaEmbeddings(model="nomic-embed-text")
- 若想避免 OpenAI API 费用,可使用
常见问题
Q1:可以继续使用 langchain.vectorstores.Chroma
吗?
A:可以,但不建议。它已废弃,迁移到 langchain_community.vectorstores.Chroma
更安全。
Q2:新旧 Chroma 功能有差异吗?
A:功能相同,仅导入路径变更,新类支持最新 Chroma 功能和 LangChain 0.3.x 生态。
Q3:如何选择向量存储?
A:Chroma 适合本地测试和中小规模数据,FAISS 适合高性能本地存储,Pinecone 适合云端大规模部署。
Q4:Chroma 支持持久化吗?
A:支持,通过 persist_directory
参数保存数据到磁盘,参考 Chroma 文档。
总结
从 langchain.vectorstores.Chroma
迁移到 langchain_community.vectorstores.Chroma
的步骤包括:
- 安装
langchain
,langchain-community
,langchain-openai
, 和chromadb
。 - 替换导入:
from langchain.vectorstores import Chroma
改为from langchain_community.vectorstores import Chroma
。 - 设置
OPENAI_API_KEY
,确保支持嵌入模型。 - 使用
Chroma.from_texts
创建向量存储,结合 LCEL 和 LLM 实现语义搜索。 - 可选使用 LangChain CLI(
langchain migrate
)自动升级导入。 - 可选使用
langchain_ollama.OllamaEmbeddings
替代 OpenAI 嵌入。