Технологии··10 мин чтения

Эмбеддинги и RAG в 2026: от теории к рабочему API для разработчиков

Эмбеддинги (embeddings) и RAG (Retrieval Augmented Generation) — гайд для разработчиков 2026. Что это, как работает, цена через API в рублях, примеры на Python.

Эмбеддинги и RAG в 2026: от теории к рабочему API для разработчиков

Эмбеддинги и RAG — две связанные техники, которые в 2026 году стали стандартом для построения «умных» приложений с LLM. Без них любой production-grade чат-бот, поиск или ассистент работает плохо.

В этом гайде:

  • Что такое эмбеддинги простыми словами
  • Что такое RAG (Retrieval Augmented Generation) и зачем оно
  • Как использовать эмбеддинги через API в России без VPN
  • Сравнение моделей (text-embedding-3-small, large, ada-002, multilingual)
  • Цены в рублях за 1M токенов
  • Пример простой RAG-системы на Python (100 строк)
  • Когда RAG избыточен (и что использовать вместо)

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

Эмбеддинг — это математическое представление текста в виде вектора чисел. Пример:

"Кошка сидит на крыше" → [0.012, -0.034, 0.567, ..., 0.089]
                          (вектор из 1536 чисел)

Главное свойство: близкие по смыслу тексты дают близкие векторы. Если вы посчитаете расстояние (косинусное сходство) между «Кошка сидит на крыше» и «Кот лежит на коньке», оно будет маленьким (~0.3). А между «Кошка сидит на крыше» и «Курс рубля к доллару» — большим (~0.9).

Это позволяет:

  • Семантический поиск — найти статьи похожие на запрос (не по точным словам, а по смыслу)
  • Кластеризация — сгруппировать схожие документы
  • Рекомендации — найти товары/контент похожие на те что юзер лайкнул
  • RAG — найти релевантные куски документации для ответа на вопрос

Что такое RAG

RAG = Retrieval Augmented Generation. Это паттерн использования LLM: «не давай модели ответить из головы — найди релевантный контекст из ваших данных и подсунь его модели».

Без RAG (плохо):

# Юзер: "Каков лимит API на тарифе Pro в RubikBot?"
response = openai.chat.completions.create(
    model="gpt-5",
    messages=[{"role": "user", "content": "Каков лимит API на тарифе Pro в RubikBot?"}]
)
# Ответ: "Не могу ответить, у меня нет информации о ценах RubikBot..."
# (или галлюцинация — "Лимит 1000 запросов" хотя на самом деле 120)

С RAG (правильно):

# 1. Эмбеддинг вопроса юзера
question_embedding = embed("Каков лимит API на тарифе Pro в RubikBot?")

# 2. Поиск релевантных кусков документации (vector search)
relevant_docs = vector_db.search(question_embedding, k=3)
# Возвращает 3 наиболее похожих документа

# 3. LLM генерирует ответ С этим контекстом
context = "\n".join(d.text for d in relevant_docs)
response = openai.chat.completions.create(
    model="gpt-5",
    messages=[
        {"role": "system", "content": f"Контекст:\n{context}\n\nОтвечай только на основе контекста."},
        {"role": "user", "content": "Каков лимит API на тарифе Pro в RubikBot?"}
    ]
)
# Ответ: "На тарифе Pro лимит API 120 RPM" (точно из документации)

Преимущества RAG

  • Точность — модель не выдумывает, отвечает на основе ваших данных
  • Свежесть — модель обучена на 2024-2025, но через RAG может ответить про 2026 события
  • Конфиденциальность — ваши данные не уходят в обучающий датасет
  • Дешевизна vs fine-tuning — RAG в 10-100 раз дешевле чем дообучать модель

Эмбеддинги модели в RubikBot

В RubikBot доступны 3 модели от OpenAI для эмбеддингов:

МодельDefault dimMax dim$/1M tokens~₽/1M tokens (95₽/$, 30% markup)
text-embedding-3-small15361536$0.02~4.75 ₽
text-embedding-3-large30723072$0.13~30.88 ₽
text-embedding-ada-00215361536 (fixed)$0.10~23.75 ₽

Какую выбрать?

  • text-embedding-3-small (default рекомендация) — лучшее качество для большинства задач, цена минимальная. Берите это.
  • text-embedding-3-large — заметно лучше для тонких семантических различий (например, медицинские, юридические тексты). В 6 раз дороже.
  • text-embedding-ada-002 — старая модель 2022, оставлена для backward compat. Не рекомендуем для новых проектов.

Что такое dimensions параметр?

text-embedding-3-* поддерживают сокращение векторов для экономии места в БД:

emb = client.embeddings.create(
    model="text-embedding-3-small",
    input="text",
    dimensions=512  # вместо 1536 default — урезать до 512
)
# Качество немного падает, но БД сжимается в 3 раза

Реалистично: для большинства задач достаточно 512-768. Полные 1536 нужны для очень точных задач.


Пример простой RAG-системы

100 строк Python, индексирует документы в локальный SQLite (без отдельной vector DB), отвечает на вопросы через GPT-5:

import os
import sqlite3
import json
import numpy as np
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["RUBIKBOT_API_KEY"],
    base_url="https://rubikbot.com/api/v1"
)

# 1. Setup БД
db = sqlite3.connect("knowledge.db")
db.execute("""
    CREATE TABLE IF NOT EXISTS docs (
        id INTEGER PRIMARY KEY,
        text TEXT,
        embedding TEXT  -- JSON-encoded list of floats
    )
""")

def embed(text: str) -> list[float]:
    r = client.embeddings.create(model="text-embedding-3-small", input=text)
    return r.data[0].embedding

# 2. Индексируем документы
def index_doc(text: str):
    emb = embed(text)
    db.execute(
        "INSERT INTO docs (text, embedding) VALUES (?, ?)",
        (text, json.dumps(emb))
    )
    db.commit()

# 3. Поиск через cosine similarity
def search(query: str, k=3) -> list[str]:
    q_emb = np.array(embed(query))
    rows = db.execute("SELECT text, embedding FROM docs").fetchall()
    scored = []
    for text, emb_json in rows:
        emb = np.array(json.loads(emb_json))
        # Cosine similarity = dot product / norms
        sim = float(np.dot(q_emb, emb) / (np.linalg.norm(q_emb) * np.linalg.norm(emb)))
        scored.append((sim, text))
    scored.sort(reverse=True)
    return [text for _, text in scored[:k]]

# 4. RAG-ответ
def rag_answer(question: str) -> str:
    relevant = search(question, k=3)
    context = "\n\n".join(relevant)
    response = client.chat.completions.create(
        model="gpt-5-mini",
        messages=[
            {"role": "system", "content": f"Контекст:\n{context}\n\nОтвечай только из контекста. Если не знаешь — скажи."},
            {"role": "user", "content": question}
        ]
    )
    return response.choices[0].message.content

# 5. Демо
docs = [
    "RubikBot — российская платформа единого доступа к нейросетям.",
    "На тарифе Pro 990 ₽/мес лимит API 120 запросов в минуту.",
    "Все цены прозрачные: курс ЦБ × наценка 30%.",
    "Регистрация бесплатна, при подтверждении email даём 50 ₽ бонусом.",
]
for d in docs:
    index_doc(d)

print(rag_answer("Сколько стоит Pro подписка?"))
# → "Pro подписка стоит 990 ₽ в месяц..."

print(rag_answer("Есть ли бесплатный старт?"))
# → "Да, при регистрации даётся 50 ₽ бонусом..."

В production используйте specialized vector DB: Qdrant (российский, рекомендуем), Pinecone, Weaviate, pgvector.


Когда RAG избыточен

Не нужно RAG, если:

  • Документы помещаются в context window модели (Claude Sonnet 4.6 = 1M tokens — это десятки книг). Просто передавайте всё в контекст.
  • Запрос не требует ваших данных (общие вопросы, креатив, перевод).
  • Документация меняется редко и можно сделать fine-tuning один раз.

Нужно RAG, если:

  • Объём документов >>> context window (тысячи документов, террабайты текста).
  • Данные часто обновляются (новости, регламенты, knowledge base продукта).
  • Каждый ответ должен быть строго на основе конкретных документов (compliance, legal).
  • Нужна цитата источника (с RAG вы знаете какие именно документы использовались).

Бенчмарки моделей

На MTEB (Multilingual Text Embedding Benchmark) 2026:

МодельMTEB EnglishMTEB RussianSpeed (texts/sec)
text-embedding-3-small64.660.1600
text-embedding-3-large67.263.4250
text-embedding-ada-00260.856.2800
YandexGPT embeddings (если доступны)~62400

Для русского language text-embedding-3-small — лучший баланс качество/цена/скорость.


Сравнение vector DB для production

DBОткрытый кодSelf-hostCloudЦена cloud (1M vectors)
Qdrant (РФ-команда)✓ MITдада$40/мес
Weaviate✓ BSDдада$60/мес
Pineconeнетнеттолько cloud$70/мес
pgvector (Postgres extension)дачерез managed Postgresбесплатно
Chromaдада$30/мес
Milvusдада (Zilliz)$50/мес

Рекомендация для российских проектов:

  • Прототип: pgvector (через ваш существующий Postgres)
  • Production: Qdrant (российская команда, MIT, есть managed cloud в РФ)
  • Энтерпрайз: Milvus или Weaviate для специфических use-cases

FAQ

См. блок FAQ ниже.

Попробуйте

Эмбеддинги через API → Открыть playground → Тарифы →

50 ₽ welcome bonus = индексация ~10 тыс. документов через text-embedding-3-small.

Частые вопросы

Эмбеддинги и RAG — это одно и то же?+
Нет. Эмбеддинги — это техника представления текста как вектор чисел. RAG — это паттерн использования эмбеддингов + LLM для построения ответов на основе ваших данных. Эмбеддинги — building block. RAG — система которая их использует.
Какая модель эмбеддингов лучшая в 2026?+
Для большинства задач — text-embedding-3-small (OpenAI). Хорошо работает с русским языком, дешёвая ($0.02/1M tokens), быстрая. Для требовательных задач (медицина, юр) рассмотрите text-embedding-3-large — в 6 раз дороже, заметно качественнее на сложных смыслах.
Можно ли RAG без отдельной vector DB?+
Да, для небольших проектов (до 10-100 тысяч документов) достаточно встроить эмбеддинги в Postgres через pgvector. Для миллионов документов — нужна специализированная vector DB (Qdrant, Pinecone, Weaviate). Production-grade RAG обычно использует separate vector DB для масштабирования.
RAG vs fine-tuning — что выбрать?+
RAG в 95% случаев лучше: дешевле, быстрее внедрить, проще обновлять данные. Fine-tuning имеет смысл когда: (1) нужна специфическая стилистика ответов; (2) задача очень узкая (классификация по 100 категориям); (3) объём пользовательских запросов огромный (миллионы в день) и стоимость каждого критична. Для типичных бизнес-задач — берите RAG.
Можно ли получить эмбеддинги для русского текста?+
Да, все модели от OpenAI хорошо работают с русским языком из коробки. На MTEB Russian text-embedding-3-small даёт 60.1 (top 5 модель для русского в 2026). YandexGPT embeddings также хороши для русского и нативно соответствуют 152-ФЗ.

Автор: Команда RubikBot