/
Вопросы и ответы
/
RAG
/

Как выбрать векторную базу данных?

Как выбрать векторную базу данных?

11 часов назад

Никита Вихров

Ответы

0

Как выбрать векторную базу данных

Векторная база хранит embeddings и умеет быстро искать ближайшие векторы. Для маленьких проектов подойдёт что угодно. Для больших — выбор важен.


ChromaDB — для старта и прототипов

Работает локально, без сервера, данные в файле. Ставится в одну строку.

import chromadb
from sentence_transformers import SentenceTransformer

client = chromadb.Client()  # in-memory
# или: chromadb.PersistentClient(path="./chroma_db") — сохраняет на диск

collection = client.create_collection("docs")
model = SentenceTransformer("all-MiniLM-L6-v2")

# Добавляем документы
documents = [
    "PostgreSQL подключается через DATABASE_URL",
    "JWT токен передаётся в заголовке Authorization",
    "Rate limit — 100 запросов в минуту",
]
embeddings = model.encode(documents).tolist()

collection.add(
    documents=documents,
    embeddings=embeddings,
    ids=["doc1", "doc2", "doc3"]
)

# Ищем
results = collection.query(
    query_embeddings=model.encode(["как подключить базу"]).tolist(),
    n_results=2
)
print(results["documents"])
# → [["PostgreSQL подключается через DATABASE_URL", "..."]]

Когда подходит: прототип, локальная разработка, небольшой объём данных (до 100k документов).


pgvector — если PostgreSQL уже есть

Расширение для PostgreSQL. Не нужен отдельный сервис — векторы хранятся в той же базе, что и остальные данные.

import psycopg2
import numpy as np
from sentence_transformers import SentenceTransformer

model = SentenceTransformer("all-MiniLM-L6-v2")
conn = psycopg2.connect("postgresql://user:password@localhost/mydb")
cur = conn.cursor()

# Один раз: создаём расширение и таблицу
cur.execute("CREATE EXTENSION IF NOT EXISTS vector")
cur.execute("""
    CREATE TABLE IF NOT EXISTS documents (
        id SERIAL PRIMARY KEY,
        content TEXT,
        embedding vector(384)
    )
""")

# Добавляем документ
content = "JWT токен передаётся в заголовке Authorization: Bearer <token>"
embedding = model.encode([content])[0].tolist()

cur.execute(
    "INSERT INTO documents (content, embedding) VALUES (%s, %s)",
    (content, embedding)
)
conn.commit()

# Ищем ближайшие по косинусному расстоянию
query = "как передать токен в запросе"
query_embedding = model.encode([query])[0].tolist()

cur.execute("""
    SELECT content, 1 - (embedding <=> %s::vector) AS similarity
    FROM documents
    ORDER BY embedding <=> %s::vector
    LIMIT 3
""", (query_embedding, query_embedding))

for content, similarity in cur.fetchall():
    print(f"{similarity:.3f}: {content}")

Когда подходит: команда уже работает с PostgreSQL, нет желания поддерживать отдельный сервис, объём до нескольких миллионов документов.


Pinecone — управляемое облачное решение

Не нужно настраивать инфраструктуру. Работает через API.

from pinecone import Pinecone
from sentence_transformers import SentenceTransformer

pc = Pinecone(api_key="your-api-key")
index = pc.Index("my-docs")
model = SentenceTransformer("all-MiniLM-L6-v2")

# Добавляем
documents = {"doc1": "PostgreSQL подключается через DATABASE_URL"}
for doc_id, content in documents.items():
    embedding = model.encode([content])[0].tolist()
    index.upsert(vectors=[(doc_id, embedding, {"content": content})])

# Ищем
query_embedding = model.encode(["как подключить базу"])[0].tolist()
results = index.query(vector=query_embedding, top_k=3, include_metadata=True)

for match in results["matches"]:
    print(f"{match['score']:.3f}: {match['metadata']['content']}")

Когда подходит: продакшн с большим объёмом данных, нужна высокая доступность, команда не хочет заниматься инфраструктурой.


Как выбирать

ChromaDBpgvectorPinecone
Сложность настройкиМинимальнаяНизкаяНет (SaaS)
СтоимостьБесплатноСтоимость PostgreSQLОт $70/мес
МасштабДо ~100kДо ~10MНеограниченно
Отдельный сервисНетНетДа
Продакшн-готовностьНетДаДа

Стратегия простая: ChromaDB для прототипа, pgvector если PostgreSQL уже в стеке, Pinecone или аналог если нужен масштаб и команда не хочет заниматься инфраструктурой.

11 часов назад

Никита Вихров

+7 800 100 22 47

бесплатно по РФ

+7 495 085 21 62

бесплатно по Москве

108813 г. Москва, вн.тер.г. поселение Московский,
г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3
ОГРН 1217300010476
ИНН 7325174845