Chroma
本笔记本介绍如何开始使用 Chroma 向量存储。
Chroma is a AI-native open-source vector database focused on developer productivity and happiness. Chroma is licensed under Apache 2.0. View the full docs of
Chromaat this page, and find the API reference for the LangChain integration at this page.
设置
要访问 Chroma 个向量存储,您需要安装 langchain-chroma 集成包。
pip install -qU "langchain-chroma>=0.1.2"
凭据
无需任何凭据即可使用 Chroma 向量存储,只需安装上述包即可!
如果您希望获得一流的模型调用自动追踪功能,还可以通过取消注释以下代码来设置您的 LangSmith API 密钥:
# os.environ["LANGSMITH_API_KEY"] = getpass.getpass("Enter your LangSmith API key: ")
# os.environ["LANGSMITH_TRACING"] = "true"
初始化
基础初始化
以下是一个基本的初始化示例,包括使用本地目录来保存数据。
pip install -qU langchain-openai
import getpass
import os
if not os.environ.get("OPENAI_API_KEY"):
os.environ["OPENAI_API_KEY"] = getpass.getpass("Enter API key for OpenAI: ")
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
from langchain_chroma import Chroma
vector_store = Chroma(
collection_name="example_collection",
embedding_function=embeddings,
persist_directory="./chroma_langchain_db", # Where to save data locally, remove if not necessary
)
从客户端初始化
您也可以从 Chroma 客户端进行初始化,如果您希望更轻松地访问底层数据库,这将特别有用。
import chromadb
persistent_client = chromadb.PersistentClient()
collection = persistent_client.get_or_create_collection("collection_name")
collection.add(ids=["1", "2", "3"], documents=["a", "b", "c"])
vector_store_from_client = Chroma(
client=persistent_client,
collection_name="collection_name",
embedding_function=embeddings,
)
管理向量存储
创建向量存储后,我们可以通过添加和删除不同条目来与其交互。
将项目添加到向量存储
我们可以通过使用add_documents函数将项目添加到我们的向量存储中。
from uuid import uuid4
from langchain_core.documents import Document
document_1 = Document(
page_content="I had chocolate chip pancakes and scrambled eggs for breakfast this morning.",
metadata={"source": "tweet"},
id=1,
)
document_2 = Document(
page_content="The weather forecast for tomorrow is cloudy and overcast, with a high of 62 degrees.",
metadata={"source": "news"},
id=2,
)
document_3 = Document(
page_content="Building an exciting new project with LangChain - come check it out!",
metadata={"source": "tweet"},
id=3,
)
document_4 = Document(
page_content="Robbers broke into the city bank and stole $1 million in cash.",
metadata={"source": "news"},
id=4,
)
document_5 = Document(
page_content="Wow! That was an amazing movie. I can't wait to see it again.",
metadata={"source": "tweet"},
id=5,
)
document_6 = Document(
page_content="Is the new iPhone worth the price? Read this review to find out.",
metadata={"source": "website"},
id=6,
)
document_7 = Document(
page_content="The top 10 soccer players in the world right now.",
metadata={"source": "website"},
id=7,
)
document_8 = Document(
page_content="LangGraph is the best framework for building stateful, agentic applications!",
metadata={"source": "tweet"},
id=8,
)
document_9 = Document(
page_content="The stock market is down 500 points today due to fears of a recession.",
metadata={"source": "news"},
id=9,
)
document_10 = Document(
page_content="I have a bad feeling I am going to get deleted :(",
metadata={"source": "tweet"},
id=10,
)
documents = [
document_1,
document_2,
document_3,
document_4,
document_5,
document_6,
document_7,
document_8,
document_9,
document_10,
]
uuids = [str(uuid4()) for _ in range(len(documents))]
vector_store.add_documents(documents=documents, ids=uuids)
['f22ed484-6db3-4b76-adb1-18a777426cd6',
'e0d5bab4-6453-4511-9a37-023d9d288faa',
'877d76b8-3580-4d9e-a13f-eed0fa3d134a',
'26eaccab-81ce-4c0a-8e76-bf542647df18',
'bcaa8239-7986-4050-bf40-e14fb7dab997',
'cdc44b38-a83f-4e49-b249-7765b334e09d',
'a7a35354-2687-4bc2-8242-3849a4d18d34',
'8780caf1-d946-4f27-a707-67d037e9e1d8',
'dec6af2a-7326-408f-893d-7d7d717dfda9',
'3b18e210-bb59-47a0-8e17-c8e51176ea5e']
更新向量存储中的项目
现在我们已经将文档添加到向量存储中,可以使用 update_documents 函数来更新现有文档。
updated_document_1 = Document(
page_content="I had chocolate chip pancakes and fried eggs for breakfast this morning.",
metadata={"source": "tweet"},
id=1,
)
updated_document_2 = Document(
page_content="The weather forecast for tomorrow is sunny and warm, with a high of 82 degrees.",
metadata={"source": "news"},
id=2,
)
vector_store.update_document(document_id=uuids[0], document=updated_document_1)
# You can also update multiple documents at once
vector_store.update_documents(
ids=uuids[:2], documents=[updated_document_1, updated_document_2]
)
从向量存储中删除项目
我们也可以按以下方式从向量存储中删除条目:
vector_store.delete(ids=uuids[-1])
查询向量存储
一旦您的向量存储已创建并添加了相关文档,您很可能希望在链或代理运行期间对其进行查询。
直接查询
相似性搜索
执行简单的相似度搜索可以按以下方式完成:
results = vector_store.similarity_search(
"LangChain provides abstractions to make working with LLMs easy",
k=2,
filter={"source": "tweet"},
)
for res in results:
print(f"* {res.page_content} [{res.metadata}]")
* Building an exciting new project with LangChain - come check it out! [{'source': 'tweet'}]
* LangGraph is the best framework for building stateful, agentic applications! [{'source': 'tweet'}]
带分数的相似性搜索
如果您想执行相似度搜索并获取相应的分数,可以运行:
results = vector_store.similarity_search_with_score(
"Will it be hot tomorrow?", k=1, filter={"source": "news"}
)
for res, score in results:
print(f"* [SIM={score:3f}] {res.page_content} [{res.metadata}]")
* [SIM=1.726390] The stock market is down 500 points today due to fears of a recession. [{'source': 'news'}]
按向量搜索
您还可以通过向量进行搜索:
results = vector_store.similarity_search_by_vector(
embedding=embeddings.embed_query("I love green eggs and ham!"), k=1
)
for doc in results:
print(f"* {doc.page_content} [{doc.metadata}]")
* I had chocolate chip pancakes and fried eggs for breakfast this morning. [{'source': 'tweet'}]
其他搜索方法
还有许多其他搜索方法未在本笔记本中涵盖,例如 MMR 搜索或按向量搜索。如需查看AstraDBVectorStore可用的完整搜索功能列表,请参阅API 参考。
通过转换为检索器进行查询
您还可以将向量存储转换为检索器,以便在链中更轻松地使用。有关可传递的不同搜索类型和 kwargs 的更多信息,请访问 API 参考此处。
retriever = vector_store.as_retriever(
search_type="mmr", search_kwargs={"k": 1, "fetch_k": 5}
)
retriever.invoke("Stealing from the bank is a crime", filter={"source": "news"})
[Document(metadata={'source': 'news'}, page_content='Robbers broke into the city bank and stole $1 million in cash.')]
检索增强生成的用法
有关如何使用此向量存储进行检索增强生成 (RAG) 的指南,请参阅以下部分:
API 参考
有关所有 Chroma 向量存储功能和配置的详细文档,请参阅 API 参考:https://python.langchain.com/api_reference/chroma/vectorstores/langchain_chroma.vectorstores.Chroma.html