Векторные эмбеддинги: как AI понимает смысл текста
Эмбеддинги — это фундамент всего современного 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-text | 768 | Быстрая | Хорошее | Средний |
bge-m3 | 1024 | Средняя | Отличное | Хороший |
e5-mistral-7b | 4096 | Медленная | Топ | Хороший |
multilingual-e5-large | 1024 | Средняя | Хорошее | Отличный |
Для русского языка лучше всего bge-m3 или multilingual-e5-large. Для английского — nomic-embed-text оптимален по соотношению скорость/качество.

Хранение: векторные базы данных
Когда документов тысячи, линейный поиск не работает. Нужна специализированная БД:
- ChromaDB — простая, встраиваемая, хороша для начала
- Qdrant — быстрая, на Rust, фильтрация по метаданным
- Milvus — масштабируемая, для миллионов векторов
- pgvector — расширение для PostgreSQL (если уже используете PG)
Все они используют приближённый поиск ближайших соседей (ANN) через HNSW или IVF индексы.
Итого
Эмбеддинги — это мост между текстом и математикой. Понимание того, как они работают, критично для всех AI-приложений: RAG, поиск, рекомендации, классификация. Начните с nomic-embed-text через Ollama — это бесплатно, локально и достаточно для большинства задач.