Векторные базы данных и эмбеддинги: просто о сложном
Векторные эмбеддинги и специализированные базы данных стали фундаментом современных AI приложений. От семантического поиска до RAG систем – понимание работы с векторными представлениями критично для разработчиков AI решений. Разберем эти концепции простым языком с практическими примерами.
Что такое эмбеддинги
Эмбеддинг (embedding, векторное представление) – это способ представить текст, изображение или другие данные в виде массива чисел (вектора). Это как перевод слов на язык математики, где компьютер может вычислять смысловую близость1.
Представьте, что каждое слово или фраза – это точка в многомерном пространстве. Похожие по смыслу слова находятся рядом в этом пространстве, а разные – далеко друг от друга.
Простой пример
Текст: "Кот сидит на диване"
Эмбеддинг: [0.23, -0.45, 0.67, ..., 0.12] (обычно 384-1536 чисел)
Текст: "Кошка лежит на софе"
Эмбеддинг: [0.25, -0.43, 0.69, ..., 0.14] (очень похож на первый)
Текст: "Квантовая физика сложна"
Эмбеддинг: [-0.78, 0.92, -0.34, ..., 0.56] (совершенно другой)
Как создаются эмбеддинги
Эмбеддинги создаются специальными AI моделями, обученными на огромных объемах текста. Модель "понимает" контекст и смысл слов, кодируя его в числа2.
| Модель эмбеддингов | Размерность | Стоимость | Применение |
|---|---|---|---|
| text-embedding-3-small (OpenAI) | 1536 | $0.02 / 1M токенов | Универсальное, быстрое |
| text-embedding-3-large | 3072 | $0.13 / 1M токенов | Максимальное качество |
| Cohere embed-v3 | 1024 | $0.10 / 1M токенов | Мультиязычность |
| Voyage AI | 1024 | $0.12 / 1M токенов | Специализированные домены |
Создание эмбеддинга через API
from openai import OpenAI
client = OpenAI(api_key="your_key")
response = client.embeddings.create(
model="text-embedding-3-small",
input="Искусственный интеллект меняет мир"
)
embedding = response.data[0].embedding # Массив из 1536 чисел
print(f"Размер эмбеддинга: {len(embedding)}")
print(f"Первые 5 значений: {embedding[:5]}")
Зачем нужны эмбеддинги
1. Семантический поиск
В отличие от традиционного поиска по ключевым словам, семантический поиск находит результаты по смыслу, даже если нет точного совпадения слов.
Пример:
- Запрос: "Как готовить итальянскую пасту?"
- Традиционный поиск найдет документы с этими словами
- Семантический поиск также найдет "Рецепты спагетти карбонара" и "Приготовление макарон по-итальянски"
2. Рекомендательные системы
Нахождение похожих товаров, статей или контента на основе смыслового сходства.
3. RAG (Retrieval-Augmented Generation)
Поиск релевантной информации из базы знаний для ответа языковой модели. Об этом подробнее дальше.
4. Кластеризация и классификация
Группировка похожих документов, категоризация контента, обнаружение дубликатов.
Векторные базы данных: зачем нужны
Обычные базы данных (SQL, NoSQL) не оптимизированы для работы с векторами. Поиск похожих векторов среди миллионов записей в обычной БД будет слишком медленным.
Векторные базы данных специально разработаны для эффективного хранения и поиска векторных эмбеддингов3.
Популярные векторные БД
| База данных | Тип | Особенности | Оптимально для |
|---|---|---|---|
| Pinecone | Managed cloud | Простота использования, масштабируемость | Быстрый старт, продакшн |
| Weaviate | Open-source | Гибридный поиск, графовые связи | Сложные сценарии поиска |
| Chroma | Embedded / Server | Легковесная, для разработки | Локальная разработка, прототипы |
| Qdrant | Open-source / Cloud | Высокая производительность, Rust | High-load приложения |
| Milvus | Open-source | Горизонтальное масштабирование | Очень большие датасеты |
| pgvector | PostgreSQL extension | Интеграция с PostgreSQL | Когда уже используете Postgres |
Как работает векторный поиск
Шаг 1: Индексация данных
- Берем текстовые документы
- Разбиваем на чанки (куски по 200-1000 токенов)
- Создаем эмбеддинг для каждого чанка
- Сохраняем эмбеддинги в векторную БД вместе с метаданными
Шаг 2: Поиск
- Получаем поисковый запрос от пользователя
- Создаем эмбеддинг запроса
- Ищем наиболее похожие векторы в БД (через cosine similarity или другие метрики)
- Возвращаем соответствующие документы
Метрики похожести
| Метрика | Диапазон | Когда использовать |
|---|---|---|
| Cosine similarity | -1 до 1 (1 = идентичны) | Стандарт для текстовых эмбеддингов |
| Euclidean distance | 0 до ∞ (0 = идентичны) | Когда важна абсолютная близость |
| Dot product | -∞ до ∞ | Нормализованные векторы, быстрое вычисление |
Практический пример: создание простой RAG системы
Шаг 1: Установка библиотек
pip install openai chromadb
Шаг 2: Индексация документов
import chromadb
from openai import OpenAI
# Инициализация
client_openai = OpenAI(api_key="your_key")
chroma_client = chromadb.Client()
collection = chroma_client.create_collection(name="knowledge_base")
# Документы для индексации
documents = [
"Искусственный интеллект - это область компьютерных наук.",
"Машинное обучение - подраздел AI, использующий данные для обучения.",
"Нейронные сети вдохновлены структурой человеческого мозга.",
"GPT - это языковая модель от OpenAI."
]
# Создание эмбеддингов и сохранение
for i, doc in enumerate(documents):
embedding_response = client_openai.embeddings.create(
model="text-embedding-3-small",
input=doc
)
collection.add(
embeddings=[embedding_response.data[0].embedding],
documents=[doc],
ids=[f"doc_{i}"]
)
print("Документы проиндексированы!")
Шаг 3: Поиск релевантной информации
def search_knowledge_base(query, n_results=2):
# Создаем эмбеддинг для запроса
query_embedding = client_openai.embeddings.create(
model="text-embedding-3-small",
input=query
)
# Ищем похожие документы
results = collection.query(
query_embeddings=[query_embedding.data[0].embedding],
n_results=n_results
)
return results['documents'][0]
# Пример использования
query = "Что такое нейросети?"
relevant_docs = search_knowledge_base(query)
print("Найденные документы:")
for doc in relevant_docs:
print(f"- {doc}")
Шаг 4: RAG - использование с языковой моделью
def rag_query(user_question):
# 1. Найти релевантную информацию
context_docs = search_knowledge_base(user_question)
context = "\n".join(context_docs)
# 2. Создать промпт с контекстом
messages = [
{"role": "system", "content": "Используй предоставленный контекст для ответа."},
{"role": "user", "content": f"Контекст:\n{context}\n\nВопрос: {user_question}"}
]
# 3. Получить ответ от модели
response = client_openai.chat.completions.create(
model="gpt-4o",
messages=messages
)
return response.choices[0].message.content
# Использование RAG
answer = rag_query("Объясни что такое нейронные сети")
print(answer)
Оптимизация векторного поиска
Chunking strategies
Размер чанков критически влияет на качество поиска:
| Размер чанка | Преимущества | Недостатки |
|---|---|---|
| Маленькие (100-200 токенов) | Точность, меньше шума | Потеря контекста |
| Средние (400-600 токенов) | Баланс точности и контекста | Универсальный подход |
| Большие (800-1000 токенов) | Больше контекста | Может быть много нерелевантной информации |
Overlap между чанками
Добавление overlap (например, 50-100 токенов) между чанками помогает не потерять контекст на границах:
def chunk_text(text, chunk_size=500, overlap=50):
chunks = []
start = 0
while start < len(text):
end = start + chunk_size
chunk = text[start:end]
chunks.append(chunk)
start = end - overlap # Сдвигаем с учетом overlap
return chunks
Метаданные и фильтрация
Добавление метаданных позволяет комбинировать семантический и традиционный поиск:
collection.add(
embeddings=[embedding],
documents=[doc],
metadatas=[{
"source": "documentation",
"chapter": "intro",
"date": "2025-01-15"
}],
ids=["doc_1"]
)
# Поиск с фильтрацией
results = collection.query(
query_embeddings=[query_embedding],
where={"source": "documentation"}, # Фильтр по метаданным
n_results=5
)
Гибридный поиск
Комбинирование семантического (векторного) и лексического (keyword) поиска часто дает лучшие результаты4.
Стратегия гибридного поиска
- Выполнить векторный поиск (top 20 результатов)
- Выполнить keyword поиск (top 20 результатов)
- Объединить результаты с взвешенным скорингом
- Вернуть top 5 финальных результатов
Распространенные проблемы и решения
Проблема 1: Низкое качество поиска
Причины:
- Неоптимальный размер чанков
- Плохая модель эмбеддингов
- Отсутствие preprocessing текста
Решения:
- Экспериментируйте с размером чанков
- Используйте более качественные модели эмбеддингов
- Очищайте текст (удаляйте HTML, форматирование)
- Добавьте метаданные для контекста
Проблема 2: Медленный поиск
Решения:
- Используйте правильные индексы (HNSW, IVF)
- Уменьшите размерность эмбеддингов (если позволяет качество)
- Добавьте кэширование частых запросов
- Масштабируйте БД горизонтально
Проблема 3: Высокая стоимость
Оптимизации:
- Кэшируйте эмбеддинги уже обработанных документов
- Используйте более дешевые модели эмбеддингов для некритичных задач
- Батчинг при создании эмбеддингов (обрабатывайте много документов сразу)
Продвинутые техники
Reranking
После векторного поиска используйте специализированную reranking модель для улучшения порядка результатов:
from sentence_transformers import CrossEncoder
# Получили результаты векторного поиска
initial_results = search_knowledge_base(query, n_results=20)
# Reranking
reranker = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2')
pairs = [[query, doc] for doc in initial_results]
scores = reranker.predict(pairs)
# Сортируем по новым скорам
reranked = sorted(zip(initial_results, scores), key=lambda x: x[1], reverse=True)
top_results = [doc for doc, score in reranked[:5]]
Multi-vector представления
Создавайте несколько эмбеддингов для одного документа с разных "точек зрения":
- Эмбеддинг полного текста
- Эмбеддинг саммари
- Эмбеддинги ключевых концепций
Ключевые выводы
- Эмбеддинги переводят текст в векторное пространство, где семантически похожие тексты близки
- Векторные базы данных оптимизированы для быстрого поиска похожих векторов среди миллионов записей
- RAG системы используют векторный поиск для предоставления языковым моделям релевантного контекста
- Качество векторного поиска зависит от chunking strategy, модели эмбеддингов и оптимизаций
- Гибридный поиск и reranking улучшают точность результатов
Примечания и источники
- Mikolov, T., et al. (2013). Efficient Estimation of Word Representations in Vector Space. ICLR. ↑
- Reimers, N., & Gurevych, I. (2019). Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks. EMNLP. ↑
- Johnson, J., Douze, M., & Jégou, H. (2019). Billion-scale similarity search with GPUs. IEEE Transactions on Big Data. ↑
- Gao, L., et al. (2021). Unsupervised Corpus Aware Language Model Pre-training for Dense Passage Retrieval. ACL. ↑