ChromaDB — встраиваемая векторная БД. Хранит тексты и их эмбеддинги, умеет искать по смыслу. Не требует отдельного сервера.
Установка
uv add chromadb
# При первой установке скачивается ~500 МБ (модель эмбеддингов)
PersistentClient — сохранение на диск
import chromadb
# Данные сохраняются в папку ./chroma_db
client = chromadb.PersistentClient(path="./chroma_db")
# Создать коллекцию или получить существующую
collection = client.get_or_create_collection(name="documents")
chromadb.Client() — данные только в RAM, исчезают при перезапуске.
add() — добавляем документы
collection.add(
documents=["Python — интерпретируемый язык.", "Django — веб-фреймворк."],
ids=["doc_0", "doc_1"],
metadatas=[{"source": "intro.txt"}, {"source": "frameworks.txt"}]
)
Три обязательных поля:
- documents — тексты
- ids — уникальные строки (нельзя дублировать)
- metadatas — словари с метаданными (опционально, но полезно)
ChromaDB автоматически создаёт эмбеддинги через встроенную модель.
query() — семантический поиск
results = collection.query(
query_texts=["Как создать веб-приложение?"],
n_results=3,
include=["documents", "metadatas", "distances"]
)
for doc, meta, dist in zip(
results["documents"][0],
results["metadatas"][0],
results["distances"][0]
):
relevance = 1 - dist
print(f"[{relevance:.0%}] {meta['source']}: {doc[:80]}")
Интерпретация distance
distance — косинусное расстояние от 0 до 2:
| Distance | Релевантность | Интерпретация |
|---|---|---|
| 0.0–0.3 | 70–100% | Очень похоже |
| 0.3–0.6 | 40–70% | Умеренно похоже |
| > 0.6 | < 40% | Слабая связь |
# Фильтрация по порогу
THRESHOLD = 0.5
relevant = [
(doc, meta) for doc, meta, dist
in zip(results["documents"][0], results["metadatas"][0], results["distances"][0])
if dist < THRESHOLD
]
Проверка дублей перед добавлением
existing_ids = set(collection.get(include=[])["ids"])
new_docs, new_ids, new_metas = [], [], []
for doc, id_, meta in zip(documents, ids, metadatas):
if id_ not in existing_ids:
new_docs.append(doc)
new_ids.append(id_)
new_metas.append(meta)
if new_docs:
collection.add(documents=new_docs, ids=new_ids, metadatas=new_metas)
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!