中文翻译暂不可用,显示俄语原文。

Как вы обеспечиваете, что 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-m310248192ОтличноеДа1.1 GB
intfloat/multilingual-e5768512ХорошееДа550 MB
OpenAI text-embedding-3-small15368192ОтличноеНет (API)
Cohere embed-multilingual-v31024512ХорошееНет (API)
sentence-transformers/distiluse-base-multilingual512512СреднееДа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)

Что делать со смешанными чанками

  1. Чанки могут содержать оба языка — это нормально, не разделяйте
  2. При retrieval, запрос на русском найдёт этот чанк (потому что смысл совпадает)
  3. LLM должна быть мультиязычной, чтобы прочитать смешанный контекст

5. Решение 4: Мультиязычная LLM для генерации

Проблема LLM должна понимать контекст на русском и английском и отвечать на языке запроса (или на нужном языке).

Плохие варианты

  • Английская LLM (Llama-2-7B) может плохо генерировать на русском
  • Русская LLM (Saiga) может не понимать английские документы

Хорошие варианты

МодельРусскийАнглийскийSelf-hostedРазмер
3 Какие стратегии chunking'а вы знаете и когда какую применяете3]] Какие стратегии chunking'а вы знаете и когда какую применяете3]] Какие стратегии chunking'а вы знаете и когда какую применяете3]] Какие стратегии chunking'а вы знаете и когда какую применяете3]]-8BLlama-3-8B]] (multilingual)
GPT-4ОтличныйОтличныйНет
3 Какие стратегии chunking'а вы знаете и когда какую применяете3]] Какие стратегии chunking'а вы знаете и когда какую применяете3]] Какие стратегии chunking'а вы знаете и когда какую применяете3]] Какие стратегии chunking'а вы знаете и когда какую применяете3Claude 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)

Шаги

  1. Собрать 50 документов на русском, 50 на английском (похожие темы)
  2. Индексировать через BGE-M3
  3. Составить 20 запросов на русском, 20 на английском
  4. Для каждого запроса проверить:
    • Находит ли retrieval русские документы по английскому запросу?
    • Находит ли retrieval английские документы по русскому запросу?
  5. Замерить cross-lingual recall@5
  6. Оценить качество генерации LLM (отвечает ли на нужном языке)

Ожидаемый результат BGE-M3 должен давать recall@5 > 0.7 для cross-lingual запросов. Llama-3 должна отвечать на языке запроса.


10. Сводная таблица решений

КомпонентЛучшее open-source решениеПочему
Embedding модельBAAI/bge-m3100+ языков, 8192 токенов, отличный русский
Векторная БДQdrantПоддерживает BGE-M3, гибридный поиск
LLM (генерацияLlama-3-8B (multilingual)Хороший русский и английский
Fallback переводHelsinki-NLP/opus-mt-en-ruЕсли не хотите менять LLM
Оценка качестваRAGAS с мультиязычным judgeПоддерживает русский через BGE-M3

Связь с другими вопросами

ВопросТема
1RAG архитектура (embedding этап)
4Векторная БД (выбор для мультиязычных данных)
15Embedding модели (сравнение мультиязычных)
16Оценка качества (cross-lingual recall)
18Multi-vector retrieval (ColBERT multilingual)

Вопрос 20 полностью разобран. Первая часть (вопросы 1-20) завершена. Переходим к вопросу 21, когда будете готовы.


Навигация