Векторные эмбеддинги: как AI понимает смысл текста

embeddingsainlppython

Эмбеддинги — это фундамент всего современного AI. Без них не работает ни RAG, ни семантический поиск, ни рекомендательные системы. Разберёмся, что это и как применять на практике.

Визуализация векторного пространства

Что такое эмбеддинг

Эмбеддинг — это числовой вектор (массив чисел), который представляет смысл текста. Похожие по смыслу тексты имеют похожие векторы.

# Примерные эмбеддинги (в реальности — сотни измерений)
"кот"[0.2, 0.8, 0.1, ...]
"котёнок"[0.3, 0.7, 0.2, ...]   # похож на "кот"
"сервер"[0.9, 0.1, 0.7, ...]   # далеко от "кот"

Размерность зависит от модели: nomic-embed-text даёт 768 измерений, text-embedding-3-large от OpenAI — до 3072.

Зачем это нужно

Компьютеры не понимают текст — они работают с числами. Эмбеддинги переводят текст в числовое пространство, где можно:

  • Искать похожее: найти документы, релевантные запросу
  • Кластеризовать: сгруппировать тексты по темам
  • Сравнивать: измерить, насколько два текста похожи
  • Дедуплицировать: найти почти одинаковые тексты

Cosine Similarity

Основная метрика похожести — косинусное сходство. Измеряет угол между двумя векторами:

import numpy as np

def cosine_similarity(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

# Результат от -1 до 1:
# 1.0  = идентичны
# 0.0  = не связаны
# -1.0 = противоположны

На практике для текстовых эмбеддингов:

  • более 0.8 — очень похожи (почти одно и то же)
  • 0.5–0.8 — тематически связаны
  • менее 0.3 — не связаны

Генерация эмбеддингов через Ollama

import ollama

response = ollama.embed(
    model="nomic-embed-text",
    input="Как настроить nginx reverse proxy"
)
vector = response["embeddings"][0]
print(f"Размерность: {len(vector)}")  # 768

Для батча документов:

texts = [
    "Настройка nginx как reverse proxy",
    "Docker compose для продакшена",
    "Мониторинг с Prometheus и Grafana"
]

response = ollama.embed(
    model="nomic-embed-text",
    input=texts
)
vectors = response["embeddings"]  # список из 3 векторов

Практический пример: семантический поиск

import ollama
import numpy as np

docs = [
    "Nginx — это веб-сервер и reverse proxy",
    "Docker позволяет контейнеризировать приложения",
    "Prometheus собирает метрики через pull-модель",
    "Grafana визуализирует данные из различных источников",
    "Ansible автоматизирует настройку серверов",
]

# Эмбеддинги документов
doc_embeddings = ollama.embed(model="nomic-embed-text", input=docs)["embeddings"]

# Эмбеддинг запроса
query = "как мониторить сервер"
query_emb = ollama.embed(model="nomic-embed-text", input=query)["embeddings"][0]

# Поиск
similarities = [
    np.dot(query_emb, doc_emb) / (np.linalg.norm(query_emb) * np.linalg.norm(doc_emb))
    for doc_emb in doc_embeddings
]

# Топ результатов
for i in np.argsort(similarities)[::-1][:3]:
    print(f"{similarities[i]:.3f} | {docs[i]}")

Результат:

0.742 | Prometheus собирает метрики через pull-модель
0.695 | Grafana визуализирует данные из различных источников
0.412 | Nginx — это веб-сервер и reverse proxy

Запрос «как мониторить сервер» нашёл Prometheus и Grafana — именно то, что нужно.

Выбор модели эмбеддингов

МодельРазмерностьСкоростьКачество (MTEB)Русский
nomic-embed-text768БыстраяХорошееСредний
bge-m31024СредняяОтличноеХороший
e5-mistral-7b4096МедленнаяТопХороший
multilingual-e5-large1024СредняяХорошееОтличный

Для русского языка лучше всего bge-m3 или multilingual-e5-large. Для английского — nomic-embed-text оптимален по соотношению скорость/качество.

Поиск по векторам

Хранение: векторные базы данных

Когда документов тысячи, линейный поиск не работает. Нужна специализированная БД:

  • ChromaDB — простая, встраиваемая, хороша для начала
  • Qdrant — быстрая, на Rust, фильтрация по метаданным
  • Milvus — масштабируемая, для миллионов векторов
  • pgvector — расширение для PostgreSQL (если уже используете PG)

Все они используют приближённый поиск ближайших соседей (ANN) через HNSW или IVF индексы.

Итого

Эмбеддинги — это мост между текстом и математикой. Понимание того, как они работают, критично для всех AI-приложений: RAG, поиск, рекомендации, классификация. Начните с nomic-embed-text через Ollama — это бесплатно, локально и достаточно для большинства задач.

© 2026 Terminal Notes. Built with SvelteKit.