我似乎无法从 Chroma 矢量数据库中删除文档。如果您能了解此示例为何不起作用,以及可以/应该进行哪些修改才能使其正常运行,我将不胜感激。
import dotenv
import os
import chromadb
from chromadb.config import Settings
from chromadb.utils import embedding_functions
dotenv.load_dotenv()
client = chromadb.Client(
Settings(chroma_db_impl="duckdb+parquet", persist_directory="db/chroma")
)
embedding = embedding_functions.OpenAIEmbeddingFunction(
api_key=os.getenv("OPENAI_API_KEY"),
model_name="text-embedding-ada-002",
)
collection = client.get_or_create_collection(name="test", embedding_function=embedding)
from llama_index import SimpleDirectoryReader
documents = SimpleDirectoryReader(
input_dir="./sampledir",
recursive=True,
exclude_hidden=False,
filename_as_id=True,
).load_data()
collection.add(
documents=[doc.get_text() for doc in documents],
ids=[doc.doc_id for doc in documents],
)
print(collection.count()) # PRINTS n
doc_ids = collection.get()["ids"]
collection.delete(ids=doc_ids)
print(collection.count()) # SHOULD BE ZERO, BUT PRINTS n
这可能对任何在 ChromaDB 中搜索删除文档的人有帮助
获取集合,您可以按照文档中提到的任何步骤进行操作,如下所示:
collection = client.get_collection(name="collection_name")
collection.delete(ids="id_value")
collection = client.get_collection(name="collection_emb")
collection.delete(where={'metadata_field': {'<Operator>': '<Value>'}})
如果您有带有键
URL
的元数据,并且您想要删除 URL 等于 www.example.com
的所有文档
collection.delete(where={'URL': {'$eq': 'www.example.com'}})
过滤元数据支持以下运算符:
$eq
- 等于(字符串、int、float)$ne
- 不等于(字符串、整数、浮点数)$gt
- 大于(int,float)$gte
- 大于或等于 (int, float) $lt
- 小于(int,float)$lte
- 小于或等于(int,float)有关如何使用元数据进行过滤的更多信息,请参阅此处的文档: