Современная LLM с дополненной выдачей: bge-large-en-v1.5

Современная LLM с дополненной выдачей: bge-large-en-v1.5

Введение

Вас интересует передовая retrieval-augmented LLM «bge-large-en-v1.5»? Присоединяйтесь к нам в этом блоге, чтобы подробно изучить эту модель. Вы узнаете о роли эмбеддинговых моделей и их практическом применении. Мы покажем, как развернуть «bge-large-en-v1.5» в коде, донастроить её и бесшовно интегрировать с LLM API. Приготовьтесь открыть новые возможности на стыке эмбеддинговых моделей и LLM!

Что такое bge-large-en-v1.5?

Кратко: bge-large-en-v1.5 — это открытая эмбеддинговая модель, созданная BAAI.

Аббревиатура «bge» в названии расшифровывается как «BAAI General Embedding». BAAI, известная на GitHub как «FlagEmbedding», — это частная некоммерческая организация, занимающаяся исследованиями и разработками в области ИИ. Сосредоточившись на LLM с дополненной выдачей, BAAI запустила несколько связанных проектов: LLM с длинным контекстом (Activation Beacon), тонкая настройка LM (LM-Cocktail), плотный поиск (BGE-M3, LLM Embedder, BGE Embedding), модель реранжировщика (BGE Reranker) и бенчмаркинг (C-MTEB). Bge-large-en-v1.5 относится к серии моделей BGE Embedding и разработана специально для задач плотного поиска.

Что делает эмбеддинговая модель для плотного поиска?

Эмбеддинговая модель для плотного поиска преобразует текстовые данные в плотные семантические представления, которые улавливают смысл и контекст входных данных. Эти плотные представления используются плотным ретривером для эффективного поиска релевантной информации. Вот как это работает и несколько примеров.

Преобразование текста в плотные представления

Модель принимает на вход предложения, абзацы или целые документы и преобразует их в векторы фиксированной длины (эмбеддинги). Эти векторы кодируют семантическую информацию о тексте, обеспечивая более тонкое понимание, чем простое сопоставление ключевых слов.

LLM часто включают эмбеддинговые модели в свою архитектуру. Например, BERT использует эмбеддинговые методы для представления слов и входных последовательностей перед обработкой через свои трансформерные слои. LLM выигрывают от эмбеддинговых моделей, используя их способность улавливать семантические связи и контекстуальные нюансы, что важно для генерации связных и уместных ответов в таких задачах, как генерация диалога или машинный перевод.

Роль плотного ретривера

Плотный ретривер использует эти эмбеддинги для выполнения задач поиска. В отличие от традиционных разреженных методов, основанных на точном совпадении ключевых слов, плотный ретривер вычисляет оценки сходства напрямую между эмбеддингами запроса и эмбеддингами документов. Такой подход позволяет более точно искать информацию в текстах различной длины — от коротких предложений до длинных документов.

Примеры применения

В задачах информационного поиска, таких как поисковые системы или системы вопросов-ответов, эти плотные представления обеспечивают эффективный и точный поиск релевантных документов или отрывков.

Например, запрос «Каковы симптомы COVID-19?» преобразуется в эмбеддинговый вектор. Аналогичным образом документы, описывающие симптомы COVID-19, также преобразуются в эмбеддинги. Сравнивая сходство между эмбеддингом запроса и эмбеддингами документов (с помощью, например, косинусной меры), можно быстро определить и ранжировать наиболее релевантные документы.

Другой пример — рекомендательные системы. Здесь эмбеддинги помогают рекомендовать товары, статьи или видео, понимая предпочтения пользователей и сходство контента.

В целом, эмбеддинговые модели для плотного поиска в сочетании с плотными ретриверами играют ключевую роль в современных AI-приложениях, преобразуя текст в осмысленные представления и эффективно извлекая релевантную информацию на основе семантического сходства.

Как использовать bge-large-en-v1.5 в коде?

Использование bge-large-en-v1.5 с LangChain

Вы можете использовать bge в langchain следующим образом:

from langchain.embeddings import HuggingFaceBgeEmbeddings
model_name = "BAAI/bge-large-en-v1.5"
model_kwargs = {'device': 'cuda'}
encode_kwargs = {'normalize_embeddings': True} # установите True для вычисления косинусного сходства
model = HuggingFaceBgeEmbeddings(
    model_name=model_name,
    model_kwargs=model_kwargs,
    encode_kwargs=encode_kwargs,
    query_instruction="Generate a representation for this sentence to be used for retrieving relevant articles:"
)
model.query_instruction = "Generate a representation for this sentence to be used for retrieving relevant articles:"

Использование bge-large-en-v1.5 с Huggingface Transformers

С пакетом transformers вы можете использовать модель следующим образом: сначала пропустите входные данные через трансформер, затем выберите последнее скрытое состояние первого токена (т.е. [CLS]) в качестве эмбеддинга предложения.

from transformers import AutoTokenizer, AutoModel
import torch
# Предложения, для которых мы хотим получить эмбеддинги
sentences = ["Sample Data-1", "Sample Data-2"]

# Загружаем модель из HuggingFace Hub
tokenizer = AutoTokenizer.from_pretrained('BAAI/bge-large-en-v1.5')
model = AutoModel.from_pretrained('BAAI/bge-large-en-v1.5')
model.eval()
# Токенизируем предложения
encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt')
# для задачи s2p (короткий запрос к длинному отрывку) добавьте инструкцию к запросу (не добавляйте инструкцию для отрывков)
# encoded_input = tokenizer([instruction + q for q in queries], padding=True, truncation=True, return_tensors='pt')
# Вычисляем эмбеддинги токенов
with torch.no_grad():
    model_output = model(**encoded_input)
    # Применяем pooling. В данном случае cls pooling.
    sentence_embeddings = model_output[0][:, 0]
# нормируем эмбеддинги
sentence_embeddings = torch.nn.functional.normalize(sentence_embeddings, p=2, dim=1)
print("Sentence embeddings:", sentence_embeddings)

Больше информации об использовании моделей bge можно найти на GitHub в репозитории FlagEmbedding.

Как донастроить bge-large-en-v1.5?

Шаг 1: Установка

  • Установка через pip: pip install -U FlagEmbedding
  • Или установка из исходного кода после клонирования репозитория и перехода в него: pip install .
  • Для разработки используйте редактируемую установку: pip install -e .

Шаг 2: Подготовка данных

  • Обучающие данные должны быть в формате JSON, каждая строка — словарь с ключами query, pos (список положительных текстов) и neg (список отрицательных текстов).
  • Если отрицательные тексты недоступны, их можно случайно выбрать из корпуса.

Шаг 3: Майнинг сложных негативов

  • Используйте скрипт для майнинга сложных негативов, чтобы улучшить качество эмбеддингов.
  • Вы можете запустить майнинг сложных негативов следующей командой:
python -m FlagEmbedding.baai_general_embedding.finetune.hn_mine \
--model_name_or_path BAAI/bge-base-en-v1.5 \
--input_file toy_finetune_data.jsonl \
--output_file toy_finetune_data_minedHN.jsonl \
--range_for_sampling 2-200 \
--negative_number 15 \
--use_gpu_for_searching
  • Input File: JSON-файл, содержащий данные для донастройки; скрипт определяет top-k документов для каждого запроса, а затем случайным образом выбирает негативные примеры из этих top-k результатов, исключая уже предоставленные положительные примеры.
  • Output File: путь к файлу, в который будет сохранён JSON, обогащённый вновь полученными сложными негативами, для последующей донастройки.
  • Number of Negatives: задаёт количество негативных сэмплов, которые нужно собрать.
  • Sampling Range: определяет диапазон, из которого берутся негативные сэмплы. Например, диапазон 2–100 означает, что негативы будут взяты из документов со 2-го по 200-й. Расширение диапазона, например до 60–300, делает выбор негативов менее сложным, охватывая большее количество документов.
  • Retrieval Pool: источник, из которого скрипт будет брать документы для поиска. По умолчанию это множество всех негативов из входного файла, отформатированное как обучающие данные. Если указан конкретный пул, скрипт будет использовать его для поиска негативных примеров.
  • GPU-Based Searching: опция, указывающая, следует ли использовать GPU-ускоренный faiss-gpu для повышения эффективности процесса извлечения негативов.

Шаг 4: Обучение

torchrun --nproc_per_node {number of gpus} \
-m FlagEmbedding.baai_general_embedding.finetune.run \
--output_dir {path to save model} \
--model_name_or_path BAAI/bge-large-en-v1.5 \
--train_data ./toy_finetune_data.jsonl \
--learning_rate 1e-5 \
--fp16 \
--num_train_epochs 5 \
--per_device_train_batch_size {large batch size; set 1 for toy data} \
--dataloader_drop_last True \
--normlized True \
--temperature 0.02 \
--query_max_len 64 \
--passage_max_len 256 \
--train_group_size 2 \
--negatives_cross_device \
--logging_steps 10 \
--save_steps 1000 \
--query_instruction_for_retrieval ""
  • per_device_train_batch_size: количество сэмплов, обрабатываемых в одном тренировочном батче на каждое устройство. Как правило, увеличение размера батча улучшает производительность модели. Вы можете увеличить этот размер, используя такие опции, как половинная точность (--fp16), конфигурация DeepSpeed (--deepspeed ./df_config.json, где df_config.json также может называться ds_config.json) и градиентный чекпоинтинг (--gradient_checkpointing).
  • train_group_size: определяет общее количество примеров (положительных и отрицательных), используемых для каждого запроса во время обучения. Поскольку гарантированно есть один положительный пример, эта настройка определяет количество отрицательных примеров (train_group_size - 1). Убедитесь, что это число не превышает количество доступных негативов в списке neg ваших данных. Помимо этих групповых негативов, в процессе донастройки учитываются и другие негативы из того же батча.
  • negatives_cross_device: позволяет распределять отрицательные примеры между всеми доступными GPU, эффективно увеличивая общее количество негативов, используемых в обучении.
  • learning_rate: выберите значение, подходящее для вашей конкретной модели. Для моделей большого, базового или малого масштаба обычно рекомендуются значения 1e-5, 2e-5 или 3e-5.
  • temperature: влияет на разброс распределения оценок сходства. Рекомендуемые значения — от 0.01 до 0.1.
  • query_max_len: максимальная длина запроса, которая должна соответствовать средней длине запросов в вашем наборе данных.
  • passage_max_len: максимальная длина отрывка, устанавливаемая в соответствии со средней длиной отрывков в ваших данных.
  • query_instruction_for_retrieval: необязательная инструкция, добавляемая к каждому запросу для целей поиска. Можно оставить пустой строкой, если дополнительный контекст не требуется.
  • in-batch negative usage: флаг, указывающий, следует ли рассматривать отрывки из того же батча как отрицательные примеры в обучении. По умолчанию включён (True).
  • save_steps: определяет частоту сохранения контрольных точек модели в зависимости от количества выполненных шагов обучения.

Шаг 5: Загрузка модели

После донастройки модели BGE вы можете легко загрузить её, как показано в этом примере. Если при донастройке вы указали особое значение для гиперпараметра --query_instruction_for_retrieval, не забудьте соответствующим образом подставить query_instruction_for_retrieval.

Шаг 6: Оценка модели

Для оценки модели вы можете запустить этот скрипт, предоставленный FlagEmbedding.

Настройка базовой модели bge путём донастройки может привести к улучшению производительности на конкретной задаче, но также может вызвать заметное снижение общей эффективности модели вне целевой области (например, падение производительности на задачах c-mteb). Информацию о решении (использование LM-Cocktail), а также о процессе донастройки можно найти в разделе «FlagEmbedding/examples/finetune» на GitHub.

Как интегрировать bge-large-en-v1.5 с LLM API?

Интеграция эмбеддинговой модели с LLM обогащает возможности NLP, позволяя проводить более сложный семантический поиск, контекстуальное понимание и персонализированные взаимодействия. Эта интеграция особенно полезна для улучшения таких задач, как рекомендации на основе контента, кластеризация документов, поиск аномалий, кросс-языковая обработка и построение графов знаний. Она также поддерживает продвинутую суммаризацию текста и улучшение признаков для моделей машинного обучения, что приводит к повышению производительности в анализе тональности и классификации тем.

Шаг 1: Настройка окружения

Убедитесь, что у вас есть необходимое Python-окружение с установленными требуемыми пакетами.

pip install openai
# Установите другие необходимые пакеты, например, requests, numpy и т.д.

Шаг 2: Инициализация клиента Novita AI API

Вы уже предоставили код для инициализации клиента Novita AI API. Вот он для справки:

from openai import OpenAI

client = OpenAI(
    base_url="https://api.novita.ai/v3/openai",
    api_key="<YOUR Novita AI API Key>",  # Замените на ваш фактический API-ключ
)
model = "nousresearch/nous-hermes-llama2-13b"

Шаг 3: Загрузка эмбеддинговой модели

Предполагая, что у вас есть доступ к модели bge-large-en-v1.5, загрузите её. Если это модель Hugging Face, вы можете использовать библиотеку transformers следующим образом:

from transformers import AutoModel, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("BAAI/bge-large-en-v1.5")
model = AutoModel.from_pretrained("BAAI/bge-large-en-v1.5")

Шаг 4: Определение функции получения эмбеддингов

Создайте функцию для получения эмбеддингов из модели bge-large-en-v1.5.

def get_embeddings(text):
    inputs = tokenizer(text, return_tensors="pt")
    with torch.no_grad():
        embeddings = model(**inputs)[0].mean(dim=1)
    return embeddings.numpy()

Шаг 5: Интеграция с Novita AI LLM API

Теперь интегрируйте эмбеддинговую модель с LLM API, чтобы улучшить ответы API или выполнять такие задачи, как семантический поиск.

def enhanced_llm_response(prompt):
    # Получаем начальный ответ от LLM
    response = client.completions.create(
        model=model,
        prompt=prompt,
        stream=True,
        max_tokens=512,
    )
    
    # Обрабатываем ответ (например, извлекаем текст)
    # Это заглушка для фактической обработки ответа
    response_text = next(response)['choices'][0]['text'].content
    
    # Получаем эмбеддинги для ответа
    response_embeddings = get_embeddings(response_text)
    
    # Здесь вы можете использовать эмбеддинги для различных целей,
    # таких как семантический поиск, фильтрация и т.д.
    
    return response_text, response_embeddings

Шаг 6: Использование улучшенной функции

Теперь вы можете использовать функцию enhanced_llm_response для получения ответов от LLM и их обработки с помощью эмбеддинговой модели.

prompt = "A chat between a curious user and an artificial intelligence assistant"
response, embeddings = enhanced_llm_response(prompt)
print(response)
# Делайте что-то с эмбеддингами, например, сохраняйте их, ищите похожие тексты и т.д.

Шаг 7: Обработка ошибок и логирование

Добавьте обработку ошибок и логирование в свой код для управления лимитами API, ошибками запросов и другими потенциальными проблемами.

Шаг 8: Тестирование и итерация

Тщательно протестируйте интеграцию и вносите изменения на основе результатов. Возможно, потребуется настроить параметры, обработать больше краевых случаев или оптимизировать производительность.

Обратите внимание, что фактические детали реализации могут различаться в зависимости от конкретных возможностей и требований Novita AI LLM API и модели bge-large-en-v1.5. Вы можете обратиться за технической поддержкой к команде Novita AI по адресу: support@novita.ai.

Заключение

В заключение, наше исследование «bge-large-en-v1.5» высветило её ключевую роль в задачах плотного поиска, предоставив глубокое погружение в её возможности, применение и практическую реализацию. От знакомства с моделью и её значением в мире эмбеддингов до демонстрации её использования в коде и процесса донастройки — мы представили исчерпывающее руководство. Более того, интеграция с Novita AI LLM API иллюстрирует потенциал модели для усиления семантического понимания и точности поиска LLM.

Следите за обновлениями о LLM!

Часто задаваемые вопросы

1. Как работает BGE reranker?

Подавая на вход реранжировщика запрос и отрывок, вы получаете оценку релевантности. Эту оценку можно преобразовать в значение с плавающей точкой в диапазоне [0, 1] с помощью сигмоидной функции. Цель — гарантировать, что результаты с наивысшим рейтингом будут более релевантными и качественными, что улучшит общую производительность системы.

2. Какова длина контекста BGE?

Последняя модель bge-m3 имеет длину контекста 8 КБ.

3. Каков размер эмбеддинга bge-m3?

Она может обрабатывать входные данные различной длины — от коротких предложений до длинных документов, содержащих до 8192 токенов.

Novita AI — это единая облачная платформа, расширяющая ваши AI-амбиции. Благодаря плавно интегрированным API, беcсерверным вычислениям и GPU-ускорению мы предоставляем экономически эффективные инструменты, необходимые для быстрого создания и масштабирования вашего бизнеса на основе ИИ. Устраните проблемы с инфраструктурой и начните бесплатно — Novita AI воплощает ваши AI-мечты в реальность.

Рекомендуемое чтение

Что такое LLM Embeddings: всё, что нужно знать

Раскрывая силу BGE Large: будущее текстовых эмбеддингов