Главная / Статьи / ChromaDB как векторный мозг для чат-ботов, понимающих документы

ChromaDB как векторный мозг для чат-ботов, понимающих документы

Почему RAG нуждается в хранилище векторов, как работают коллекции и фильтры метаданных в Chroma, и когда стоит создать прототип до завершения обучения.

1352 слов

ChromaDB: векторная база данных, лежащая в основе функции «чат с документами»

Некоторые чат-боты кажутся необычайно осведомлёнными о ваших файлах — PDF с документацией по кадрам, каталогах продуктов, пятидесятистраничных отчётах прошлой недели. За таким поведением стоит векторная база данных. Для многих разработчиков ChromaDB является стандартным выбором для быстрого создания такого слоя.

Проблема, которую решает Chroma

ГЛМ — мощные универсалы, но слабые сотрудники вашей компании: они не знают отчётов о доходах за прошлый квартал или правил отпусков. Тонкая настройка моделей на закрытых документах происходит медленно и нестабильно. Генерация с усилением на основе поиска позволяет встраивать документы, хранить их векторные представления, находить близкие к запросу документы и использовать эти фрагменты в качестве контекста для модели.

Вам нужно место для хранения векторных представлений, фильтрации метаданных и поиска ближайших аналогов. Chroma стремится стать таким местом с простым API.

Что такое Chroma

База данных с встроенными моделями с открытым исходным кодом, ориентированная на использование Python: создаётся коллекция, добавляются документы с встроенными моделями и метаданными, осуществляются поиски по векторам или тексту (с использованием подключённой функции генерации векторов). Она может работать в рамках одного процесса для прототипов или как сервис для небольших команд.

Установите и создайте клиента/коллекцию:

"The quarterly revenue exceeded projections."
→ [0.021, -0.143, 0.887, 0.002, ... ] (1536 numbers)

Добавьте тексты (Chroma может выполнить функцию генерации векторов за вас):

import chromadb

Ищите наиболее близкие куски данных:

client = chromadb.Client()
collection = client.create_collection("company-docs")collection.add(
    documents=["Q3 revenue exceeded projections by 12%"],
    metadatas=[{"department": "finance", "quarter": "Q3"}],
    ids=["doc-001"]
)

Фильтры метаданных позволяют сузить результаты до определённой линейки продуктов, арендатора или даты:

results = collection.query(
    query_texts=["What was our budget performance last quarter?"],
    n_results=3,
    where={"department": "finance"}  # Optional metadata filter
)

Постоянство данных и клиенты

Временные клиенты уничтожаются вместе с процессом — это подходит для тестов. Постоянные пути сохраняют данные между запусками:

System: You are a helpful assistant. Use the following context to answer.

Http-клиенты взаимодействуют с сервером Chroma, когда необходимо выйти за рамки режима встроенных моделей:

Context:
- "Q3 revenue exceeded projections by 12%"
- "Engineering headcount grew to support product roadmap"
- "Marketing spend increased customer acquisition"User: How did we perform in Q3?

Место Chroma среди аналогов

Chroma подходит для локальных приложений, ноутбуков и ранних сервисов типа RAG. Если вам нужна высокая доступность в нескольких регионах, сложные гибридные операции поиска или экстремальная масштабируемость, стоит рассмотреть специально созданные кластеры (Qdrant, Weaviate, pgvector в масштабе и т. д.). Многие команды по-прежнему создают прототипы с использованием Chroma, а затем мигрируют на другие решения.

Минимальный цикл RAG

Встроите вопрос, выполните поиск в коллекции, сохраните документы в промпте и сгенерируйте результат:

User Query
    ↓
Embedding Model
    ↓
Query Vector
    ↓
ChromaDB (HNSW Index)
    ↓
Top-K Similar Documents
    ↓
LLM Prompt (Context + Query)
    ↓
Accurate, Grounded Answer
pip install chromadb

Сохраняйте разумные размеры фрагментов, храните пути исходных файлов в метаданных и указывайте на них в интерфейсе ответов.

Когда не использовать Chroma

from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import PyPDFLoader

Игнорируйте Chroma, если у вас уже выбран другой векторный слой, требуются экзотические распределенные топологии с самого начала или у вас есть только реляционные запросы без использования эмбеддингов. В остальных случаях он остается практичным инструментом для чат-ботов, умеющих обрабатывать документы.

# Step 1: Load your documents
loader = PyPDFLoader("company-policy.pdf")
documents = loader.load()# Step 2: Split into chunks
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(documents)# Step 3: Embed and store in ChromaDB
vectorstore = Chroma.from_documents(
    documents=chunks,
    embedding=OpenAIEmbeddings(),
    persist_directory="./chroma_store"
)# Step 4: Query it
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
results = retriever.invoke("What is the remote work policy?")for r in results:
    print(r.page_content)

Во всех примерах рекомендуется использовать явные теги модели, чтобы обновления не скрыто меняли поведение в процессе обучения.

Во всех примерах рекомендуется использовать явные теги модели, чтобы обновления не скрыто меняли поведение в процессе обучения.

Во всех примерах рекомендуется использовать явные теги модели, чтобы обновления не скрыто меняли поведение в процессе обучения.

Во всех примерах рекомендуется использовать явные теги модели, чтобы обновления не скрыто меняли поведение в процессе обучения.

Во всех примерах рекомендуется использовать явные теги модели, чтобы обновления не скрыто меняли поведение в процессе обучения.

Во всех примерах рекомендуется использовать явные теги модели, чтобы обновления не скрыто меняли поведение в процессе обучения.

Во всех примерах рекомендуется использовать явные теги модели, чтобы обновления не скрыто меняли поведение в процессе обучения.

Во всех примерах рекомендуется использовать явные теги модели, чтобы обновления не скрыто меняли поведение в процессе обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без видимых изменений во время обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без видимых изменений во время обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без видимых изменений во время обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без видимых изменений во время обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без видимых изменений во время обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без видимых изменений во время обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без видимых изменений во время обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без видимых изменений во время обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без уведомления в процессе обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без уведомления в процессе обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без уведомления в процессе обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без уведомления в процессе обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без уведомления в процессе обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без уведомления в процессе обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без уведомления в процессе обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без уведомления в процессе обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без видимых изменений во время обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без видимых изменений во время обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без видимых изменений во время обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без видимых изменений во время обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без видимых изменений во время обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без видимых изменений во время обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без видимых изменений во время обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без видимых изменений во время обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без видимых изменений во время обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без видимых изменений во время обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без видимых изменений во время обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без видимых изменений во время обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без видимых изменений во время обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без видимых изменений во время обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без видимых изменений во время обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не меняли поведение без видимых изменений во время обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не скрыто меняли поведение в процессе обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не скрыто меняли поведение в процессе обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не скрыто меняли поведение в процессе обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не скрыто меняли поведение в процессе обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не скрыто меняли поведение в процессе обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не скрыто меняли поведение в процессе обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не скрыто меняли поведение в процессе обучения.

Во всех примерах рекомендуется использовать явные теги моделей, чтобы обновления не скрыто меняли поведение в процессе обучения.