Как вы обеспечиваете, что RAG работает с документами на русском и английском одновременно?
Краткий тезис
Создание RAG-системы, работающей с русскими и английскими документами одновременно, требует решения трёх задач: поиск (embedding модель должна понимать оба языка в одном пространстве), генерация (LLM должна уметь отвечать на нужном языке) и смешанные документы (один документ может содержать оба языка). Лучшее решение — мультиязычная embedding модель (BGE-M3, multilingual-e5), которая сама выравнивает языки в общем векторном пространстве. Для генерации можно использовать мультиязычную LLM (Llama-3, GPT-4) или переводить контекст. Главное правило: не пытайтесь нормализовать язык — современные модели справляются сами.
Ключевая идея Мультиязычная embedding модель отображает русские и английские тексты в общее векторное пространство, где "собака" и "dog" находятся рядом. Это позволяет искать по русскому запросу в английских документах и наоборот.
1. Проблема: языковой разрыв (language gap)
Что это Векторы русских и английских слов могут находиться в разных областях пространства, если embedding модель не обучена на обоих языках.
Проблема (с monolingual моделью
Русский запрос: "собака" → вектор V_ru
Английский документ: "dog" → вектор V_en
Если модель monolingual (только английская), V_ru и V_en могут быть далеки,
хотя слова имеют один смысл.
Термин «Language gap» Разрыв между векторными пространствами разных языков.
2. Решение 1: Мультиязычная embedding модель
Что это Модель, обученная на сотнях языков (включая русский и английский) так, что семантически близкие слова на разных языках имеют близкие векторы.
Лучшие мультиязычные модели
| Модель | Размерность | Токенов | Качество (русский) | Self-hosted | Размер |
|---|---|---|---|---|---|
| BAAI/bge-m3 | 1024 | 8192 | Отличное | Да | 1.1 GB |
| intfloat/multilingual-e5 | 768 | 512 | Хорошее | Да | 550 MB |
| OpenAI text-embedding-3-small | 1536 | 8192 | Отличное | Нет (API) | — |
| Cohere embed-multilingual-v3 | 1024 | 512 | Хорошее | Нет (API) | — |
| sentence-transformers/distiluse-base-multilingual | 512 | 512 | Среднее | Да | 250 MB |
Как это работает (пример с BGE-M3
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("BAAI/bge-m3")
# Русский
emb_ru = model.encode("собака")
# Английский
emb_en = model.encode("dog")
# Похожи? Должны быть очень близко
cosine_sim = cosine_similarity(emb_ru, emb_en)
print(cosine_sim) # → 0.92 (очень высоко)
Термин «Cross-lingual transfer» Способность модели переносить знания с одного языка на другой. BGE-M3 обучалась на 100+ языках одновременно, поэтому русский и английский оказались в одном пространстве.
Рекомендация для production BAAI/bge-m3 — лучший open-source выбор.
3. Решение 2: Язык запроса — не нормализуем
Что НЕ надо делать
# ❌ Плохо: пытаться перевести запрос вручную
if is_russian(query):
query = translate_to_english(query) # не надо!
Почему не надо
- Перевод теряет нюансы
- Добавляет латенси и стоимость
- Мультиязычная модель и так поймёт
Что надо делать
# ✅ Хорошо: оставляем запрос как есть
query_embedding = multilingual_model.encode(query) # любой язык
Термин «Normalization» в контексте языка Приведение всех запросов к одному языку (обычно английскому). Современные мультиязычные модели не требуют нормализации.
4. Решение 3: Смешанные документы (один чанк на двух языках)
Что это Документ может содержать и русский, и английский текст (например, техническая документация с английскими терминами).
Проблема Нужно, чтобы модель правильно эмбеддила смешанный текст.
Решение Мультиязычные модели отлично работают со смешанными текстами.
# Пример смешанного текста
mixed_text = """
Основной продукт компании — iPhone 15.
The device features A17 processor.
Цена составляет 799 dollars.
"""
# BGE-M3 корректно эмбеддит смешанный текст
embedding = model.encode(mixed_text)
Что делать со смешанными чанками
- Чанки могут содержать оба языка — это нормально, не разделяйте
- При retrieval, запрос на русском найдёт этот чанк (потому что смысл совпадает)
- LLM должна быть мультиязычной, чтобы прочитать смешанный контекст
5. Решение 4: Мультиязычная LLM для генерации
Проблема LLM должна понимать контекст на русском и английском и отвечать на языке запроса (или на нужном языке).
Плохие варианты
- Английская LLM (Llama-2-7B) может плохо генерировать на русском
- Русская LLM (Saiga) может не понимать английские документы
Хорошие варианты
| Модель | Русский | Английский | Self-hosted | Размер |
|---|---|---|---|---|
| 3 Какие стратегии chunking'а вы знаете и когда какую применяете | 3]] Какие стратегии chunking'а вы знаете и когда какую применяете | 3]] Какие стратегии chunking'а вы знаете и когда какую применяете | 3]] Какие стратегии chunking'а вы знаете и когда какую применяете3]]-8B | Llama-3-8B]] (multilingual) |
| GPT-4 | Отличный | Отличный | Нет | — |
| 3 Какие стратегии chunking'а вы знаете и когда какую применяете | 3]] Какие стратегии chunking'а вы знаете и когда какую применяете | 3]] Какие стратегии chunking'а вы знаете и когда какую применяете | 3]] Какие стратегии chunking'а вы знаете и когда какую применяете3 | Claude 3 |
| YandexGPT | Отличный | Средний | Нет | — |
| Mistral-7B | Средний | Отличный | Да | 7B |
Рекомендация 3 Какие стратегии chunking'а вы знаете и когда какую применяете|3]] Какие стратегии chunking'а вы знаете и когда какую применяете|3]] Какие стратегии chunking'а вы знаете и когда какую применяете|3]]-8B|Llama-3-8B]] (мультиязычная версия) — лучший open-source выбор для русско-английского RAG.
Пример промпта для мультиязычной LLM
prompt = f"""
Контекст может быть на русском или английском.
Отвечай на том же языке, на котором задан вопрос.
Контекст: {context}
Вопрос: {query}
Ответ:
"""
6. Решение 5: Fallback — перевод контекста
Что это Если ваша LLM не поддерживает один из языков (например, только английская), можно перевести контекст или запрос.
Когда нужно
- У вас английская LLM, но пользователи пишут по-русски
- У вас русская LLM (Saiga), но документы на английском
Варианты fallback
| Вариант | Что делаем | Плюсы | Минусы |
|---|---|---|---|
| Перевод запроса | Русский запрос → английский → поиск → ответ на английском | Просто | Ответ не на русском |
| Перевод контекста | Контекст (английский) → русский → ответ на русском | Ответ на русском | Перевод теряет нюансы |
| Перевод ответа | Ответ на английском → русский | Ответ на русском | Два LLM вызова |
Код (перевод контекста
from transformers import pipeline
translator = pipeline("translation_en_to_ru", model="Helsinki-NLP/opus-mt-en-ru")
def rag_with_translation(query, context_en):
# Переводим контекст
context_ru = translator(context_en)[0]['translation_text']
# Генерируем ответ на русском (русская LLM)
response = russian_llm.generate(query, context_ru)
return response
Рекомендация Если вы только начинаете — используйте мультиязычную LLM (Llama-3) и мультиязычную embedding (BGE-M3). Fallback с переводом — крайний случай.
7. Полный пайплайн для русско-английского RAG
from sentence_transformers import SentenceTransformer
from langchain_community.llms import Ollama
class MultilingualRAG:
def __init__(self):
# Мультиязычный embedder
self.embedder = SentenceTransformer("BAAI/bge-m3")
# Мультиязычная LLM
self.llm = Ollama(model="llama3") # Llama-3 multilingual
# Векторная БД (хранит эмбеддинги BGE-M3)
self.vector_store = QdrantClient(...)
def search(self, query: str, top_k: int = 5):
# Embedding запроса (язык не важен)
query_emb = self.embedder.encode(query)
# Поиск в векторной БД (найдёт и русские, и английские документы)
results = self.vector_store.search(
query_vector=query_emb,
limit=top_k
)
return results
def generate(self, query: str, context: list):
# Prompt на языке запроса
prompt = f"""
Контекст может быть на русском или английском.
Отвечай на том же языке, на котором задан вопрос.
Контекст: {context}
Вопрос: {query}
Ответ:
"""
# LLM сама выберет язык ответа
response = self.llm.invoke(prompt)
return response
def query(self, query: str):
context = self.search(query)
response = self.generate(query, context)
return response
8. Тестирование русско-английского RAG
Проверочные запросы
| Запрос | Ожидаемый язык ответа | Источник контекста |
|---|---|---|
| "What is the price of iPhone 15?" | Английский | Английские документы |
| "Сколько стоит iPhone 15?" | Русский | Русские документы |
| "Как переводится 'dog'?" | Русский | Может быть в русском документе |
| "Translate 'собака' to English" | Английский | Английский документ |
Метрика для оценки Cross-lingual recall@k — доля запросов, для которых retrieval нашёл релевантный документ на другом языке.
9. Пет-проект для закрепления
Задача Создать RAG с русскими и английскими документами и проверить cross-lingual retrieval.
Инструменты Python, Qdrant, BGE-M3, Llama-3 (через Ollama)
Шаги
- Собрать 50 документов на русском, 50 на английском (похожие темы)
- Индексировать через BGE-M3
- Составить 20 запросов на русском, 20 на английском
- Для каждого запроса проверить:
- Замерить cross-lingual recall@5
- Оценить качество генерации LLM (отвечает ли на нужном языке)
Ожидаемый результат BGE-M3 должен давать recall@5 > 0.7 для cross-lingual запросов. Llama-3 должна отвечать на языке запроса.
10. Сводная таблица решений
| Компонент | Лучшее open-source решение | Почему |
|---|---|---|
| Embedding модель | BAAI/bge-m3 | 100+ языков, 8192 токенов, отличный русский |
| Векторная БД | Qdrant | Поддерживает BGE-M3, гибридный поиск |
| LLM (генерация | Llama-3-8B (multilingual) | Хороший русский и английский |
| Fallback перевод | Helsinki-NLP/opus-mt-en-ru | Если не хотите менять LLM |
| Оценка качества | RAGAS с мультиязычным judge | Поддерживает русский через BGE-M3 |
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 1 | RAG архитектура (embedding этап) |
| 4 | Векторная БД (выбор для мультиязычных данных) |
| 15 | Embedding модели (сравнение мультиязычных) |
| 16 | Оценка качества (cross-lingual recall) |
| 18 | Multi-vector retrieval (ColBERT multilingual) |
Вопрос 20 полностью разобран. Первая часть (вопросы 1-20) завершена. Переходим к вопросу 21, когда будете готовы.
Навигация
- Предыдущий: 19
- Следующий: 21
- Индекс: 00. Индекс разборов