Create README.md
Browse files
README.md
ADDED
@@ -0,0 +1,276 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
---
|
2 |
+
license: apache-2.0
|
3 |
+
datasets:
|
4 |
+
- Vikhrmodels/GrandMaster-PRO-MAX
|
5 |
+
- Vikhrmodels/Grounded-RAG-RU-v2
|
6 |
+
language:
|
7 |
+
- en
|
8 |
+
- ru
|
9 |
+
base_model:
|
10 |
+
- mistralai/Mistral-Nemo-Instruct-2407
|
11 |
+
---
|
12 |
+
|
13 |
+
## Vikhr-Llama3.1-8B-Instruct-R-21-09-24
|
14 |
+
|
15 |
+
### Описание
|
16 |
+
|
17 |
+
**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, подробнее читайте в секции *"Как эта модель создавалась"*.
|
18 |
+
|
19 |
+
Модель оптимизированна для различных вариантов использования, включая ризонинг, суммаризацию, код, roleplay, поддержание диалога. Vikhr-Llama обладает возможностью многоязычной генерации, и высокопроизводительными возможностями RAG. Модель иммет лучшие оценки среди прочих на наших инструктивных и RAG бенчарках и, поэтому, мы верим, что во многих задачах может быть лучше чем gpt-3.5-turbo от OpenAI.
|
20 |
+
|
21 |
+
Весь использованный код для обучения доступен в нашем репозитории [effective_llm_alignment](https://github.com/VikhrModels/effective_llm_alignment/) на GitHub, а основные датасеты доступны в нашем [профиле на HF](https://huggingface.co/Vikhrmodels).
|
22 |
+
|
23 |
+
### Особенности
|
24 |
+
1. Высокое качество генераций на русском и английском языках, а также некоторых других языках, благодаря датасету [Grandmaster-PRO-MAX](https://huggingface.co/datasets/Vikhrmodels/GrandMaster-PRO-MAX) и исходной модели
|
25 |
+
2. Поддержка системных промптов для регулриования стиля ответов
|
26 |
+
3. Поддержка до 128k токенов контекста благодаря исходной модели (RoPE scaling)
|
27 |
+
4. Grounded RAG режим - модель имеет специальную роль documents и специальный режим работы для поиска идентификаторов релевантных вопросу пользователя документов и использования их для ответа на вопрос, вдохновлено аналогичной способностью модели Command-R
|
28 |
+
|
29 |
+
### Метрики и оценка качества
|
30 |
+
|
31 |
+
Модель оценивалась на нашем русскоязычном 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.
|
32 |
+
|
33 |
+
#### Результаты на Ru-Arena-General
|
34 |
+
|
35 |
+
В качестве референсых отвеов, с которыми сравниваются модели выступают ответы от gpt-3.5-turbo-0125, поэтому она имеет винрейт 50%.
|
36 |
+
|
37 |
+
Здесь приведена лишь часть лидерборда, подробнее смотрите в репозитории бенчмарка.
|
38 |
+
|
39 |
+
| Model Name | Winrate | 95% CI | Average # Tokens |
|
40 |
+
|--------------------------------------------------|--------|--------------------|------------------|
|
41 |
+
| gpt-4-1106-preview | 90.9 | (-1.3, 1.0) | 541 |
|
42 |
+
| gpt-4o-mini | 83.9 | (-1.8, 1.1) | 448 |
|
43 |
+
| vikhr-nemo-12b-instruct-r-21-09-24 | 79.8 | (-2.2, 1.9) | 627 |
|
44 |
+
| gemma-2-9b-it-sppo-iter3 | 73.6 | (-1.6, 2.2) | 509 |
|
45 |
+
| gemma-2-9b-it | 69.2 | (-2.5, 1.9) | 459 |
|
46 |
+
| t-lite-instruct-0.1 | 64.7 | (-2.1, 1.7) | 810 |
|
47 |
+
| **vikhr-llama3.1-8b-instruct-r-21-09-24** | **63.4** | (-2.1, 2.5) | **618** |
|
48 |
+
| suzume-llama-3-8B-multilingual-orpo-borda-half | 57.1 | (-1.9, 2.2) | 682 |
|
49 |
+
| mistral-nemo-instruct-2407 | 50.5 | (-2.7, 2.6) | 403 |
|
50 |
+
| gpt-3.5-turbo-0125 | 50.0 | (0.0, 0.0) | 220 |
|
51 |
+
| c4ai-command-r-v01 | 49.0 | (-1.7, 2.2) | 529 |
|
52 |
+
| meta-llama-3.1-8b-instruct | 43.1 | (-2.8, 2.3) | 628 |
|
53 |
+
|
54 |
+
#### Результаты на бенчмарке RAG
|
55 |
+
|
56 |
+
Общий размер тестового сета - 200 примеров, 100 для in_domain вопросов и 100 для out_of_domain.
|
57 |
+
|
58 |
+
Тут для оценки качества модель-судья gpt-4o была проинструктирована учитывать релеватность и фактологичкскую полноту ответов исходя из документов и реферсного ответа от gpt-4-1106-preview.
|
59 |
+
|
60 |
+
Подробности промптов и оценок смотрите в коде бенчмарка доступно на [коллабе](https://colab.research.google.com/drive/16730rWQ4-yGqWoooLs0Ece_16frmOniP?usp=sharing)
|
61 |
+
|
62 |
+
in_domain - вопросы которые связаны с содержанием предоставленных документов в той или иной степени
|
63 |
+
out_of_domain - вопросы которые специально никак связаны с содержанием предоставленных документов
|
64 |
+
|
65 |
+
<table>
|
66 |
+
<thead>
|
67 |
+
<tr>
|
68 |
+
<th rowspan="2">question_type</th>
|
69 |
+
<th colspan="3">gpt-4o</th>
|
70 |
+
</tr>
|
71 |
+
<tr>
|
72 |
+
<th>judge_correct_percent</th>
|
73 |
+
<th>avg_answer_match_rougeL</th>
|
74 |
+
<th>avg_abs_indexes_diff</th>
|
75 |
+
</tr>
|
76 |
+
</thead>
|
77 |
+
<tbody>
|
78 |
+
<tr>
|
79 |
+
<td>in_domain</td>
|
80 |
+
<td>73%</td>
|
81 |
+
<td>0.34</td>
|
82 |
+
<td>NaN</td>
|
83 |
+
</tr>
|
84 |
+
<tr>
|
85 |
+
<td>out_of_domain</td>
|
86 |
+
<td>81%</td>
|
87 |
+
<td>0.20</td>
|
88 |
+
<td>NaN</td>
|
89 |
+
</tr>
|
90 |
+
</tbody>
|
91 |
+
</table>
|
92 |
+
|
93 |
+
<table>
|
94 |
+
<thead>
|
95 |
+
<tr>
|
96 |
+
<th style="visibility: hidden;" rowspan="2">question_type</th>
|
97 |
+
<th colspan="3">Vikhr-Llama3.1-8B-Instruct-R-21-09-24</th>
|
98 |
+
</tr>
|
99 |
+
<tr>
|
100 |
+
<th style="visibility: hidden;">judge_correct_percent</th>
|
101 |
+
<th style="visibility: hidden;">avg_answer_match_rougeL</th>
|
102 |
+
<th style="visibility: hidden;">avg_abs_indexes_diff</th>
|
103 |
+
</tr>
|
104 |
+
</thead>
|
105 |
+
<tbody>
|
106 |
+
<tr>
|
107 |
+
<td>in_domain</td>
|
108 |
+
<td>64%</td>
|
109 |
+
<td>0.41</td>
|
110 |
+
<td>0</td>
|
111 |
+
</tr>
|
112 |
+
<tr>
|
113 |
+
<td>out_of_domain</td>
|
114 |
+
<td>89%</td>
|
115 |
+
<td>0.51</td>
|
116 |
+
<td>0</td>
|
117 |
+
</tr>
|
118 |
+
</tbody>
|
119 |
+
</table>
|
120 |
+
|
121 |
+
<table>
|
122 |
+
<thead>
|
123 |
+
<tr>
|
124 |
+
<th style="visibility: hidden;" rowspan="2">question_type</th>
|
125 |
+
<th colspan="3">gpt-4o-mini</th>
|
126 |
+
</tr>
|
127 |
+
<tr>
|
128 |
+
<th style="visibility: hidden;">judge_correct_percent</th>
|
129 |
+
<th style="visibility: hidden;">avg_answer_match_rougeL</th>
|
130 |
+
<th style="visibility: hidden;">avg_abs_indexes_diff</th>
|
131 |
+
</tr>
|
132 |
+
</thead>
|
133 |
+
<tbody>
|
134 |
+
<tr>
|
135 |
+
<td>in_domain</td>
|
136 |
+
<td>65%</td>
|
137 |
+
<td>0.33</td>
|
138 |
+
<td>NaN</td>
|
139 |
+
</tr>
|
140 |
+
<tr>
|
141 |
+
<td>out_of_domain</td>
|
142 |
+
<td>73%</td>
|
143 |
+
<td>0.18</td>
|
144 |
+
<td>NaN</td>
|
145 |
+
</tr>
|
146 |
+
</tbody>
|
147 |
+
</table>
|
148 |
+
|
149 |
+
<table>
|
150 |
+
<thead>
|
151 |
+
<tr>
|
152 |
+
<th style="visibility: hidden;" rowspan="2">question_type</th>
|
153 |
+
<th colspan="3">gpt-3.5-turbo-0125 </th>
|
154 |
+
</tr>
|
155 |
+
<tr>
|
156 |
+
<th style="visibility: hidden;">judge_correct_percent</th>
|
157 |
+
<th style="visibility: hidden;">avg_answer_match_rougeL</th>
|
158 |
+
<th style="visibility: hidden;">avg_abs_indexes_diff</th>
|
159 |
+
</tr>
|
160 |
+
</thead>
|
161 |
+
<tbody>
|
162 |
+
<tr>
|
163 |
+
<td>in_domain</td>
|
164 |
+
<td>49%</td>
|
165 |
+
<td>0.28</td>
|
166 |
+
<td>NaN</td>
|
167 |
+
</tr>
|
168 |
+
<tr>
|
169 |
+
<td>out_of_domain</td>
|
170 |
+
<td>76%</td>
|
171 |
+
<td>0.20</td>
|
172 |
+
<td>NaN</td>
|
173 |
+
</tr>
|
174 |
+
</tbody>
|
175 |
+
</table>
|
176 |
+
|
177 |
+
### Как эта модель создавалась
|
178 |
+
|
179 |
+
#### Инструктивная SFT часть
|
180 |
+
|
181 |
+
Для SFT этапа обучения модели мы подготовили большой (150к инструкций) инструктивный синтетический датасет [Vikhrmodels/GrandMaster-PRO-MAX](https://huggingface.co/datasets/Vikhrmodels/GrandMaster-PRO-MAX). Его особенностью является встроеный CoT (Chain-Of-Thought), для сбора которого мы использовали модифицированный промет для gpt-4-turbo, подробности в карточке датасета.
|
182 |
+
|
183 |
+
Кроме того для того чтобы сделать RAG Grounding мы подготовили другой синтетический датасет - [Vikhrmodels/Grounded-RAG-RU-v2](https://huggingface.co/datasets/Vikhrmodels/Grounded-RAG-RU-v2) (50k диалогов), его пайплайн сборки достаточно сложный для короткого описания и полробнее об этом вы можете прочитать в его карточке.
|
184 |
+
|
185 |
+
#### Этап алайнмента с SMPO
|
186 |
+
|
187 |
+
Для дальнейшего улучшения качества ответов мы использовали следущий пайплайн:
|
188 |
+
1) Обучили кастомную Reward модель (она пока не будет выкладываться в открытый доступ)
|
189 |
+
2) Дедуплицировали и отфилтровали используя RM модель оригинальный датасет Vikhrmodels/GrandMaster-PRO-MAX, получив порядка 10к самых высококачественных и разнообразных диалогов.
|
190 |
+
3) Сделали Rejection Sampling с SFT чекпоинтом используя полученный датасет и Reward модель. (Генерировали 7 гипотез и брали только 2 самые худшие как rejected)
|
191 |
+
4) Дообучили SFT чекпоинт с помощью нашего метода SMPO используя полученный датасет из этапа 3. SMPO был спроектирован и выбран как метод для повышения стабильности тренировки преференсов в условиях Rejection Samping и достижения нужного margin.
|
192 |
+
|
193 |
+
Реализацию SMPO, rejection sampling и тд можно найти в нашей библиотеке [effective_llm_alignment](https://github.com/VikhrModels/effective_llm_alignment/) на GitHub
|
194 |
+
|
195 |
+
### Как работать с RAG
|
196 |
+
|
197 |
+
Роль documents представляет из себя список словарей с описанием контента документов, с примнением `json.dumps(array, ensure_ascii=False)` (см. пример ниже). \
|
198 |
+
Контент документов может быть представлен в **3** различных форматах: **Markdown**, **HTML**, **Plain Text**. Контент каждого документа - может быть чанком текста длиной до 4к символов.
|
199 |
+
|
200 |
+
```json
|
201 |
+
[
|
202 |
+
{
|
203 |
+
"doc_id": (0..5),
|
204 |
+
"title": "(null or str)",
|
205 |
+
"content": "(html or markdown or plain text)"
|
206 |
+
}
|
207 |
+
]
|
208 |
+
```
|
209 |
+
|
210 |
+
#### Пример правильного использования с OpenAI-like API
|
211 |
+
|
212 |
+
Запуск 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`
|
213 |
+
|
214 |
+
```python
|
215 |
+
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."
|
216 |
+
|
217 |
+
documents = [
|
218 |
+
{
|
219 |
+
"doc_id": 0,
|
220 |
+
"title": "Глобальное потепление: ледники",
|
221 |
+
"content": "За последние 50 лет объем ледников в мире уменьшился на 30%"
|
222 |
+
},
|
223 |
+
{
|
224 |
+
"doc_id": 1,
|
225 |
+
"title": "Глобальное потепление: Уровень моря",
|
226 |
+
"content": "Уровень мирового океана повысился на 20 см с 1880 года и продолжает расти на 3,3 мм в год"
|
227 |
+
}
|
228 |
+
]
|
229 |
+
sample_history = [
|
230 |
+
{'role': 'system', 'content': GROUNDED_SYSTEM_PROMPT},
|
231 |
+
{'role': 'documents', 'content': json.dumps(documents, ensure_ascii=False)},
|
232 |
+
{'role': 'user', 'content': 'Глоабльное потепление'}
|
233 |
+
]
|
234 |
+
relevant_indexes = llm_client.chat.completions.create(
|
235 |
+
model=llm_model,
|
236 |
+
messages=sample_history,
|
237 |
+
temperature=0.0,
|
238 |
+
max_tokens=2048
|
239 |
+
).choices[0].message.content
|
240 |
+
|
241 |
+
print('Using documents: ' + relevant_indexes + '\n----')
|
242 |
+
final_answer = llm_client.chat.completions.create(
|
243 |
+
model=llm_model,
|
244 |
+
messages=sample_history + [{'role': 'assistant', 'content': relevant_indexes}],
|
245 |
+
temperature=0.3,
|
246 |
+
max_tokens=2048
|
247 |
+
).choices[0].message.content
|
248 |
+
|
249 |
+
print(final_answer)
|
250 |
+
```
|
251 |
+
|
252 |
+
Ответ после выполнения кода будет выглядеть примерно так:
|
253 |
+
|
254 |
+
Using documents: {"relevant_doc_ids": [0, 1]}
|
255 |
+
----
|
256 |
+
|
257 |
+
Глобальное потепление – это долгосрочное повышение средней температуры атмосферы Земли. Это явление имеет множество последствий, включая таяние ледников и повышение уровня мирового океана.
|
258 |
+
|
259 |
+
Из доступной мне информации видно, что за последние 50 лет объем ледников в мире уменьшился на 30%. Это свидетельствует о том, что таяние ледников является одним из проявлений глобального потепления. Ледники играют важную роль в регулировании климата, так как они отражают солнечный свет и замедляют таяние снега и льда. Уменьшение их объема может привести к усилению таяния снега и льда в высоких широтах, что, в свою очередь, может привести к изменению климата в этих регионах.
|
260 |
+
|
261 |
+
Кроме того, уровень мирового океана повысился на 20 см с 1880 года и продолжает расти на 3,3 мм в год. Это повышение уровня моря обусловлено несколькими факторами, включая таяние ледников и ледниковых щитов, а также расширение океанов из-за повышения температуры воды. Повышение уровня моря может привести к затоплению прибрежных территорий, эрозии берегов и увеличению риска наводнений.
|
262 |
+
|
263 |
+
Глобальное потепление является сложной и многогранной проблемой, которая требует международного сотрудничества и принятия мер для сокращения выбросов парниковых газов, чтобы замедлить и, в конечном счете, остановить этот процесс.
|
264 |
+
|
265 |
+
Используя первый ответ модели `relevant_indexes` (JSON), можно понять нашла ли модель информацию в документах или нет, она обучена возврашать пустой массив если ее нет и в таком случае она будет отвечать, что не смогла найти информацию в базе знаний.
|
266 |
+
|
267 |
+
### Нюансы и ограничения
|
268 |
+
- Модель имеет **низкий уровень безопасности ответов** и нацелена на правильное и полное выполенние инстуркций, имейте это ввиду при использовании. Частично это исправляется системными промптами и дополнительными указаниями о важности безопасности в промпте пользователя.
|
269 |
+
- Системные промпты не предназначены для описание персонажей, используйте их только для спецификации стиля ответа (вроде "answer only in json format"). Кроме того они должны быть **на английском**, так как так было в датасете, здесь от английского не зависит язык ответа.
|
270 |
+
- RAG режим **требует обязательного** наличия системного промпта `GROUNDED_SYSTEM_PROMPT` описаного в секции *Как работать с RAG*. Так же иногда модель может добавлять также общую информацию в ответ к той, что есть в документах.
|
271 |
+
- Модель лучше использовать с низкой темптературой (0.1-0.4) и желательно с beam search.
|
272 |
+
|
273 |
+
### Авторы
|
274 |
+
- Sergei Bratchikov, [NLP Wanderer](https://t.me/nlpwanderer), Vikhr Team
|
275 |
+
- Konstantin Korolev, Vikhr Team
|
276 |
+
- Aleksandr Nikolich, Vikhr Team
|