📝 LLM и AI

ChromaDB: векторная база данных для RAG

P
Автор
Pyland
📅
Опубликовано
30.06.2026
⏱️
Время чтения
1 мин
👁️
Просмотров
70
🌳
Уровень
Продвинутый
🐦 💼 ✈️

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)

🔐 Войдите в систему, чтобы оставить комментарий
🚪 Войти
💭

Комментариев пока нет

Станьте первым, кто поделится мнением об этой статье!

🔗 Похожие

Похожие статьи

Продолжите изучение с этими материалами

📝

httpx: современный HTTP-клиент для Python

httpx — HTTP-клиент нового поколения. Интерфейс похож на requests, но с поддержкой async/await из коробки.

📅 30.06.2026 👁️ 102
📝

AI-агенты: ReAct loop и автономные действия

Чат-бот отвечает на вопросы. Агент — действует: вызывает инструменты, получает реальные данные и использует их...

📅 30.06.2026 👁️ 97
📝

Typer: CLI-приложения без boilerplate

Typer создаёт CLI из аннотаций типов Python. Никаких argparse, никакого ручного парсинга — только декораторы...

📅 30.06.2026 👁️ 82

Понравилась статья?

Подпишитесь на наши обновления и получайте новые статьи первыми. Развивайтесь вместе с PyLand!