Год назад мы по умолчанию ставили text-embedding-ada-002 и не задумывались. В 2024-м - задумываемся. У OpenAI новая линейка, открытые модели догнали и местами обошли, для русского языка появились приличные варианты. Делимся таблицей решений.
Что мы тестировали
- OpenAI text-embedding-3-small (1536 dim) и -large (3072 dim).
- BGE-M3 от BAAI (1024 dim, открытая, мультиязычная).
- Jina embeddings v3 (1024 dim, мультиязычная).
- Cohere embed-multilingual-v3 (1024 dim).
- Базовая ada-002 как референс.
На английском (наш eval-набор)
На retrieval-задаче по корпусу 50k документов разница между лидерами в пределах 2–4 пунктов nDCG@10. text-embedding-3-large побеждает чаще, но BGE-M3 идёт вторым и стоит дешевле в self-hosted сценарии. Cohere embed-v3 сильно конкурентна.
На русском (отдельный eval)
Здесь картина другая. ada-002 проседает заметно - она училась преимущественно на английском. text-embedding-3-large сильно лучше, BGE-M3 примерно сопоставим, Jina v3 на русском показывает лучшие цифры из всех. Для русскоязычных RAG мы сейчас по умолчанию берём Jina v3 или BGE-M3.
Размерность и стоимость хранения
На больших корпусах размерность напрямую влияет на счёт за вектор-БД и память. 3072 dim у large-модели звучат соблазнительно, но при миллионе документов - это 12 ГБ только под векторы. text-embedding-3 поддерживает Matryoshka-truncation: можно хранить меньшую размерность с минимальной потерей.
Латентность и стоимость генерации
- OpenAI: ~80–200 мс на запрос, 0.02$ за миллион токенов (small) или 0.13$ (large).
- Cohere: ~60–150 мс, 0.10$ за миллион.
- BGE-M3 self-hosted на A10G: ~15–40 мс на запрос, $0 за токен, ~$300/мес за машину.
- Jina API: ~70–180 мс, 0.05$ за миллион.
Что мы сейчас выбираем
- Английский RAG, малый объём, нет требований по приватности - text-embedding-3-large через API.
- Русский или мультиязычный RAG - Jina v3 или BGE-M3.
- Большой объём (>5 млн документов), есть DevOps - BGE-M3 self-hosted.
- Жёсткие требования по приватности (медицина, госы) - только self-hosted, BGE-M3 или E5-mistral.