Векторные эмбеддинги и специализированные базы данных стали фундаментом современных 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: Индексация данных

  1. Берем текстовые документы
  2. Разбиваем на чанки (куски по 200-1000 токенов)
  3. Создаем эмбеддинг для каждого чанка
  4. Сохраняем эмбеддинги в векторную БД вместе с метаданными

Шаг 2: Поиск

  1. Получаем поисковый запрос от пользователя
  2. Создаем эмбеддинг запроса
  3. Ищем наиболее похожие векторы в БД (через cosine similarity или другие метрики)
  4. Возвращаем соответствующие документы

Метрики похожести

Метрика Диапазон Когда использовать
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.

Стратегия гибридного поиска

  1. Выполнить векторный поиск (top 20 результатов)
  2. Выполнить keyword поиск (top 20 результатов)
  3. Объединить результаты с взвешенным скорингом
  4. Вернуть 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 улучшают точность результатов

Примечания и источники

  1. Mikolov, T., et al. (2013). Efficient Estimation of Word Representations in Vector Space. ICLR.
  2. Reimers, N., & Gurevych, I. (2019). Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks. EMNLP.
  3. Johnson, J., Douze, M., & Jégou, H. (2019). Billion-scale similarity search with GPUs. IEEE Transactions on Big Data.
  4. Gao, L., et al. (2021). Unsupervised Corpus Aware Language Model Pre-training for Dense Passage Retrieval. ACL.