---
license: apache-2.0
datasets:
- Vikhrmodels/GrandMaster-PRO-MAX
- Vikhrmodels/Grounded-RAG-RU-v2
language:
- en
- ru
base_model:
- meta-llama/Meta-Llama-3.1-8B-Instruct
---

## Vikhr-Llama3.1-8B-Instruct-R-21-09-24

### Описание

**Vikhr-Llama3.1** - это унимодальная LLM (Large Language Model) на 8B параметров представляющая из себя улучшенную версию [meta-llama/Meta-Llama-3.1-8B-Instruct](https://huggingface.co/meta-llama/Meta-Llama-3.1-8B-Instruct) командой **VikhrModels**, адаптированную преимущественно для русского и английского языков. Для ее обучения мы использовали несколько этапов включающих в себя **SFT** и **SMPO** - нашу собственную вариацию DPO, подробнее читайте в секции *"Как эта модель создавалась"*.

Модель оптимизированна для различных вариантов использования, включая ризонинг, суммаризацию, код, roleplay, поддержание диалога. Vikhr-Llama обладает возможностью многоязычной генерации, и высокопроизводительными возможностями RAG. Модель имеет лучшие оценки среди прочих на наших инструктивных и RAG бенчарках и, поэтому, мы верим, что во многих задачах может быть лучше чем gpt-3.5-turbo от OpenAI.

Весь использованный код для обучения доступен в нашем репозитории [effective_llm_alignment](https://github.com/VikhrModels/effective_llm_alignment/) на GitHub, а основные датасеты доступны в нашем [профиле на HF](https://huggingface.co/Vikhrmodels).

### Особенности
1. Высокое качество генераций на русском и английском языках, а также некоторых других языках, благодаря датасету [Grandmaster-PRO-MAX](https://huggingface.co/datasets/Vikhrmodels/GrandMaster-PRO-MAX) и исходной модели
2. Поддержка системных промптов для регулирования стиля ответов
3. Поддержка до 128k токенов контекста благодаря исходной модели (RoPE scaling)
4. Grounded RAG режим - модель имеет специальную роль documents и специальный режим работы для поиска идентификаторов релевантных вопросу пользователя документов и использования их для ответа на вопрос, вдохновлено аналогичной способностью модели Command-R

### Метрики и оценка качества

Модель оценивалась на нашем русскоязычном open-source SbS бенчмарке [ru-arena-general](https://github.com/VikhrModels/ru_llm_arena) (50 топиков по 10 вопросов), где судьей выступает gpt-4-1106-preview и [бенчмарке](https://colab.research.google.com/drive/16730rWQ4-yGqWoooLs0Ece_16frmOniP?usp=sharing) для RAG на основе тестового сета [Grounded-RAG-v2](https://huggingface.co/datasets/Vikhrmodels/Grounded-RAG-RU-v2), где судей выступала gpt-4o.

#### Результаты на Ru-Arena-General

В качестве рефересных отвеов, с которыми сравниваются модели выступают ответы от gpt-3.5-turbo-0125, поэтому она имеет винрейт 50%.

Здесь приведена лишь часть лидерборда, подробнее смотрите в репозитории бенчмарка.

| Model Name                                       | Winrate  | 95% CI             | Average # Tokens |
|--------------------------------------------------|--------|--------------------|------------------|
| gpt-4-1106-preview                               | 90.9   | (-1.3, 1.0)        | 541              |
| gpt-4o-mini                                      | 83.9   | (-1.8, 1.1)        | 448              |
| vikhr-nemo-12b-instruct-r-21-09-24               | 79.8   | (-2.2, 1.9)        | 627              |
| gemma-2-9b-it-sppo-iter3                         | 73.6   | (-1.6, 2.2)        | 509              |
| gemma-2-9b-it                                    | 69.2   | (-2.5, 1.9)        | 459              |
| t-lite-instruct-0.1                              | 64.7   | (-2.1, 1.7)        | 810              |
| **vikhr-llama3.1-8b-instruct-r-21-09-24**            | **63.4**   | (-2.1, 2.5)        | **618**              |
| suzume-llama-3-8B-multilingual-orpo-borda-half   | 57.1   | (-1.9, 2.2)        | 682              |
| mistral-nemo-instruct-2407                       | 50.5   | (-2.7, 2.6)        | 403              |
| gpt-3.5-turbo-0125                               | 50.0   | (0.0, 0.0)         | 220              |
| c4ai-command-r-v01                               | 49.0   | (-1.7, 2.2)        | 529              |
| meta-llama-3.1-8b-instruct                       | 43.1   | (-2.8, 2.3)        | 628              |

#### Результаты на бенчмарке RAG

Общий размер тестового сета - 200 примеров, 100 для in_domain вопросов и 100 для out_of_domain.

Тут для оценки качества модель-судья gpt-4o была проинструктирована учитывать релеватность и фактологическую полноту ответов исходя из документов и реферсного ответа от gpt-4-1106-preview.

Подробности промптов и оценок смотрите в коде бенчмарка на [коллабе](https://colab.research.google.com/drive/16730rWQ4-yGqWoooLs0Ece_16frmOniP?usp=sharing)

in_domain - вопросы которые связаны с содержанием предоставленных документов в той или иной степени \
out_of_domain - вопросы которые специально никак не связаны с содержанием предоставленных документов

<table>
<thead>
  <tr>
    <th rowspan="2">question_type</th>
    <th colspan="3">gpt-4o</th>
  </tr>
  <tr>
    <th>judge_correct_percent</th>
    <th>avg_answer_match_rougeL</th>
    <th>avg_abs_indexes_diff</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td>in_domain</td>
    <td>73%</td>
    <td>0.34</td>
    <td>NaN</td>
  </tr>
  <tr>
    <td>out_of_domain</td>
    <td>81%</td>
    <td>0.20</td>
    <td>NaN</td>
  </tr>
</tbody>
</table>

<table>
<thead>
  <tr>
    <th style="visibility: hidden;" rowspan="2">question_type</th>
    <th colspan="3">Vikhr-Llama3.1-8B-Instruct-R-21-09-24</th>
  </tr>
  <tr>
    <th style="visibility: hidden;">judge_correct_percent</th>
    <th style="visibility: hidden;">avg_answer_match_rougeL</th>
    <th style="visibility: hidden;">avg_abs_indexes_diff</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td>in_domain</td>
    <td>64%</td>
    <td>0.41</td>
    <td>0</td>
  </tr>
  <tr>
    <td>out_of_domain</td>
    <td>89%</td>
    <td>0.51</td>
    <td>0</td>
  </tr>
</tbody>
</table>

<table>
<thead>
  <tr>
    <th style="visibility: hidden;" rowspan="2">question_type</th>
    <th colspan="3">gpt-4o-mini</th>
  </tr>
  <tr>
    <th style="visibility: hidden;">judge_correct_percent</th>
    <th style="visibility: hidden;">avg_answer_match_rougeL</th>
    <th style="visibility: hidden;">avg_abs_indexes_diff</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td>in_domain</td>
    <td>65%</td>
    <td>0.33</td>
    <td>NaN</td>
  </tr>
  <tr>
    <td>out_of_domain</td>
    <td>73%</td>
    <td>0.18</td>
    <td>NaN</td>
  </tr>
</tbody>
</table>

<table>
<thead>
  <tr>
    <th style="visibility: hidden;" rowspan="2">question_type</th>
    <th colspan="3">gpt-3.5-turbo-0125 </th>
  </tr>
  <tr>
    <th style="visibility: hidden;">judge_correct_percent</th>
    <th style="visibility: hidden;">avg_answer_match_rougeL</th>
    <th style="visibility: hidden;">avg_abs_indexes_diff</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td>in_domain</td>
    <td>49%</td>
    <td>0.28</td>
    <td>NaN</td>
  </tr>
  <tr>
    <td>out_of_domain</td>
    <td>76%</td>
    <td>0.20</td>
    <td>NaN</td>
  </tr>
</tbody>
</table>

### Как эта модель создавалась

#### Инструктивная SFT часть

Для SFT этапа обучения модели мы подготовили большой (150к инструкций) инструктивный синтетический датасет [Vikhrmodels/GrandMaster-PRO-MAX](https://huggingface.co/datasets/Vikhrmodels/GrandMaster-PRO-MAX). Его особенностью является встроеный CoT (Chain-Of-Thought), для сбора которого мы использовали модифицированный промет для gpt-4-turbo, подробности в карточке датасета.

Кроме того, для того чтобы сделать RAG Grounding, мы подготовили другой синтетический датасет - [Vikhrmodels/Grounded-RAG-RU-v2](https://huggingface.co/datasets/Vikhrmodels/Grounded-RAG-RU-v2) (50k диалогов), его пайплайн сборки достаточно сложный для короткого описания и полробнее об этом вы можете прочитать в его карточке.

#### Этап алайнмента с SMPO

Для дальнейшего улучшения качества ответов мы использовали следущий пайплайн:
1) Обучили кастомную Reward модель (она пока не будет выкладываться в открытый доступ)
2) Дедуплицировали и отфилтровали используя RM модель оригинальный датасет Vikhrmodels/GrandMaster-PRO-MAX, получив порядка 10к самых высококачественных и разнообразных диалогов.
3) Сделали Rejection Sampling с SFT чекпоинтом используя полученный датасет и Reward модель. (Генерировали 7 гипотез и брали только 2 самые худшие как rejected)
4) Дообучили SFT чекпоинт с помощью нашего метода SMPO используя полученный датасет из этапа 3. SMPO был спроектирован и выбран как метод для повышения стабильности тренировки преференсов в условиях Rejection Sampling и достижения нужного margin.

Реализацию SMPO, rejection sampling и другое можно найти в нашей библиотеке [effective_llm_alignment](https://github.com/VikhrModels/effective_llm_alignment/) на GitHub

Идея использования именно SMPO, а не другого PO метода, возникла в результате проведения большого количества экспериментов с классическими методами, при необходимости лучшего контроля процесса сходимости. При тщательной настройке других методов (например SimPO), можно добится похожего результата, однако мы постарались стаблизировать этот процесс и объединить лучшие практики из других методов.

### Как работать с RAG

Роль documents представляет из себя список словарей с описанием контента документов, с примнением `json.dumps(array, ensure_ascii=False)` (см. пример ниже). \
Контент документов может быть представлен в **3** различных форматах: **Markdown**, **HTML**, **Plain Text**. Контент каждого документа - может быть чанком текста длиной до 4к символов.

```json
[
  {
    "doc_id": (0..5),
    "title": "(null or str)",
    "content": "(html or markdown or plain text)"
  }
]
```

#### Пример правильного использования с OpenAI-like API

Запуск vLLM сервера: `vllm serve --dtype half --max-model-len 32000 -tp 1 Vikhrmodels/Vikhr-Llama3.1-8B-Instruct-R-21-09-24 --api-key token-abc123`

```python
GROUNDED_SYSTEM_PROMPT = "Your task is to answer the user's questions using only the information from the provided documents. Give two answers to each question: one with a list of relevant document identifiers and the second with the answer to the question itself, using documents with these identifiers."

documents = [
  {
    "doc_id": 0,
    "title": "Глобальное потепление: ледники",
    "content": "За последние 50 лет объем ледников в мире уменьшился на 30%"
  },
  {
    "doc_id": 1,
    "title": "Глобальное потепление: Уровень моря",
    "content": "Уровень мирового океана повысился на 20 см с 1880 года и продолжает расти на 3,3 мм в год"
  }
]
sample_history = [
    {'role': 'system', 'content': GROUNDED_SYSTEM_PROMPT}, 
    {'role': 'documents', 'content': json.dumps(documents, ensure_ascii=False)},
    {'role': 'user', 'content': 'Глоабльное потепление'}
]
relevant_indexes = llm_client.chat.completions.create(
    model=llm_model,
    messages=sample_history,
    temperature=0.0,
    max_tokens=2048
).choices[0].message.content

print('Using documents: ' + relevant_indexes + '\n----')
final_answer = llm_client.chat.completions.create(
    model=llm_model,
    messages=sample_history + [{'role': 'assistant', 'content': relevant_indexes}],
    temperature=0.3,
    max_tokens=2048
).choices[0].message.content

print(final_answer)
```

Ответ после выполнения кода будет выглядеть примерно так:

    Using documents: {"relevant_doc_ids": [0, 1]}
    ----

    Глобальное потепление – это долгосрочное повышение средней температуры атмосферы Земли. Это явление имеет множество последствий, включая таяние ледников и повышение уровня мирового океана.
    
    Из доступной мне информации видно, что за последние 50 лет объем ледников в мире уменьшился на 30%. Это свидетельствует о том, что таяние ледников является одним из проявлений глобального потепления. Ледники играют важную роль в регулировании климата, так как они отражают солнечный свет и замедляют таяние снега и льда. Уменьшение их объема может привести к усилению таяния снега и льда в высоких широтах, что, в свою очередь, может привести к изменению климата в этих регионах.
    
    Кроме того, уровень мирового океана повысился на 20 см с 1880 года и продолжает расти на 3,3 мм в год. Это повышение уровня моря обусловлено несколькими факторами, включая таяние ледников и ледниковых щитов, а также расширение океанов из-за повышения температуры воды. Повышение уровня моря может привести к затоплению прибрежных территорий, эрозии берегов и увеличению риска наводнений.
    
    Глобальное потепление является сложной и многогранной проблемой, которая требует международного сотрудничества и принятия мер для сокращения выбросов парниковых газов, чтобы замедлить и, в конечном счете, остановить этот процесс.

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

### Нюансы и ограничения
- Модель имеет **низкий уровень безопасности ответов** и нацелена на правильное и полное выполенние инструкций, имейте это ввиду при использовании и тестируйте самостоятельно. Частично это исправляется системными промптами и дополнительными указаниями о важности безопасности в промпте пользователя.
- Системные промпты не предназначены для описание персонажей, мы рекомендуем использовать их для спецификации стиля ответа (вроде "answer only in json format"). Кроме того, желательно, писать их **на английском языке**, так как так было в датасете, от использования английского в системных промтпах не зависит язык ответа.
- RAG режим **требует обязательного** наличия системного промпта `GROUNDED_SYSTEM_PROMPT` описаного в секции *Как работать с RAG*. Так же иногда модель может добавлять общую информацию из своих знаний в ответ к той, что есть в документах.
- Модель лучше использовать с низкой темптературой (0.1-0.4) и желательно с beam search, а таже использовать top_k (30-50).

### Авторы 
- Sergei Bratchikov, [NLP Wanderer](https://t.me/nlpwanderer), Vikhr Team
- Konstantin Korolev, Vikhr Team
- Aleksandr Nikolich, Vikhr Team
