240922-chromadb的基本使用
A. 基本使用
ChromaDB 是一个专门为向量数据库和嵌入查询优化的数据库。它可以与嵌入模型结合使用,存储和查询高维向量数据,通常用于大规模语义搜索、推荐系统等领域。
以下是使用 ChromaDB 的步骤:
1. 安装 ChromaDB
你可以通过 pip 安装 ChromaDB:
pip install chromadb
2. 创建一个数据库并插入数据
你需要创建一个 Chroma
的实例,然后可以在这个实例中创建一个集合并添加向量数据。
import chromadb# 创建 ChromaDB 客户端
client = chromadb.Client()# 创建一个集合,用于存储向量数据
collection = client.create_collection(name="my_collection")# 插入向量数据
documents = ["Document 1", "Document 2", "Document 3"]
embeddings = [[0.1, 0.2, 0.3], # 向量 1[0.4, 0.5, 0.6], # 向量 2[0.7, 0.8, 0.9], # 向量 3
]
metadata = [{"source": "A"}, {"source": "B"}, {"source": "C"}]collection.add(documents=documents, # 文本embeddings=embeddings, # 对应的嵌入向量metadatas=metadata # 附加的元数据
)
3. 查询向量
你可以根据提供的查询向量进行相似性搜索,查找与查询向量相似的文档。
query_embedding = [0.2, 0.3, 0.4] # 你的查询向量# 搜索最相似的文档
results = collection.query(query_embeddings=[query_embedding],n_results=2 # 返回最相似的 2 个文档
)# 输出结果
print(results)
4. 更新与删除数据
你可以根据需要更新或删除某些向量或文档:
更新:
collection.update(ids=["id_of_document"], # 要更新的文档的 iddocuments=["Updated document"],embeddings=[[0.9, 0.8, 0.7]], # 更新后的嵌入向量
)
删除:
collection.delete(ids=["id_of_document"]) # 删除特定 ID 的文档
5. 获取集合中的数据
如果你想获取某个集合中的所有数据,可以使用以下方法:
all_docs = collection.get()
print(all_docs)
6. 使用 OpenAI 生成的嵌入向量
你还可以结合 OpenAI 等模型生成文本的嵌入向量,然后存储到 ChromaDB 中:
import openai# 使用 OpenAI 模型生成嵌入
response = openai.Embedding.create(model="text-embedding-ada-002",input="This is a sample document."
)embedding = response['data'][0]['embedding']
生成嵌入后,你可以将其插入到 ChromaDB 中,用于后续的查询和分析。
总结
ChromaDB 的主要功能包括:
- 存储和管理高维向量数据。
- 快速进行相似性搜索。
- 结合嵌入模型,用于语义搜索、推荐等应用。
如果你有更具体的需求或场景,可以进一步定制使用 ChromaDB 的操作。
B. 持久化与增量更新
在 ChromaDB 中,要实现持久化和增量更新,可以利用以下机制:
1. 持久化存储
ChromaDB 默认使用内存中的数据库来存储数据,但它也支持将数据持久化到磁盘,以便在应用重启后仍然保留数据。要实现持久化存储,你可以指定一个路径来保存数据。
import chromadb# 创建持久化的 ChromaDB 客户端,指定存储路径
client = chromadb.Client(persist_directory="./chromadb_data")# 创建或加载集合
collection = client.create_collection(name="my_collection")# 插入文档和向量
documents = ["Document 1", "Document 2"]
embeddings = [[0.1, 0.2, 0.3],[0.4, 0.5, 0.6],
]
metadata = [{"source": "A"}, {"source": "B"}]collection.add(documents=documents,embeddings=embeddings,metadatas=metadata
)# 调用这个方法来保存数据到磁盘
client.persist()
每当你更新或插入数据后,可以调用 client.persist()
将数据写入磁盘,这样即使程序关闭后,数据依然存在。
2. 增量更新
增量更新指的是当有新数据时,不必重写整个数据库,而只对新数据进行添加或修改。
增量插入新数据
你可以使用 collection.add()
方法来增量添加新文档和嵌入向量:
# 插入新的文档和嵌入
new_documents = ["Document 3"]
new_embeddings = [[0.7, 0.8, 0.9]]
new_metadata = [{"source": "C"}]# 增量添加到现有的集合中
collection.add(documents=new_documents,embeddings=new_embeddings,metadatas=new_metadata
)# 持久化保存增量更新的数据
client.persist()
更新现有的数据
如果你需要更新现有的文档或向量,可以使用 collection.update()
:
# 更新已有的文档,假设你要更新 ID 为 "doc_id_1" 的文档
collection.update(ids=["doc_id_1"], # 更新文档的 IDdocuments=["Updated Document 1"], # 新的文档内容embeddings=[[0.3, 0.4, 0.5]] # 新的向量
)# 持久化保存更新
client.persist()
删除文档
如果需要删除某些文档,可以使用 collection.delete()
方法:
# 删除 ID 为 "doc_id_1" 的文档
collection.delete(ids=["doc_id_1"])# 持久化保存更新
client.persist()
3. 加载已有数据
当你启动应用时,ChromaDB 可以从指定的持久化路径中加载已经保存的数据:
# 创建持久化的 ChromaDB 客户端并加载数据
client = chromadb.Client(persist_directory="./chromadb_data")# 加载已有的集合
collection = client.get_collection(name="my_collection")# 现在你可以查询、更新或删除集合中的数据
总结
- 持久化:通过指定
persist_directory
来保存数据到磁盘,并使用client.persist()
确保更新写入磁盘。 - 增量更新:可以使用
collection.add()
插入新数据,collection.update()
更新现有数据,或collection.delete()
删除数据,增量更新不会影响已有数据。 - 加载持久化数据:在应用启动时,通过指定路径加载已经保存的数据库集合。
这种方式确保数据的持久性,并且支持高效的增量更新。
C. 参考文献
- chroma-core/chroma: the AI-native open-source embedding database
- alejandro-ao/langchain-ask-pdf: An AI-app that allows you to upload a PDF and ask questions about it. It uses OpenAI’s LLMs to generate a response.
- VikParuchuri/marker: Convert PDF to markdown quickly with high accuracy
- 240922-Ollama使用Embedding实现RAG-CSDN博客