Vikhr-Nemo 是我们的旗舰单模态 LLM(大语言模型),它是 VikhrModels 团队对 mistralai/Mistral-Nemo-Instruct-2407 的改进版本,主要适用于俄语和英语。 在训练过程中,我们使用了多个阶段,包括 SFT 和 SMPO(我们自己的 DPO 变体),更多信息请参阅 "如何创建该模型 "部分。
该模型针对各种使用情况进行了优化,包括标音、摘要、代码、角色扮演和对话维护。 Vikhr-Nemo 具有多语言生成功能和高性能 RAG 功能。 该模型在我们的教学和 RAG 基准测试中取得了最佳成绩,因此我们相信它在某些任务(如 RAG)中的表现不亚于 OpenAI 的 gpt-4o-mini。
所有使用的训练代码都可以在 GitHub 上的 effective_llm_alignment 代码库中找到,主要数据集可以在 HF 上的个人资料中找到。
特点
- 得益于 Grandmaster-PRO-MAX 数据集和原始模型,可生成高质量的俄语、英语和其他语言版本
- 支持调整回复风格的系统选项
- 借助源模型,最多可支持 128k 个上下文标记
- Grounded RAG 模式–受 Command-R 模型类似功能的启发,该模型具有特殊的文档角色和特殊的操作模式,可查找与用户问题相关的文档标识符,并利用它们来回答问题
指标和质量评估
该模型在俄语开源 SbS 基准 ru-arena-general (50 个主题,每个主题 10 个问题)和基于 Grounded-RAG-v2 测试集的 RAG 基准上进行了评估,前者的评判者是 gpt-4-1106-preview,后者的评判者是 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 个,域外问题 100 个。
在此,为进行质量评估,指示模范评委 gpt-4o 根据文件和 gpt-4-1106-preview 的参考答案来考虑答案的相关性和事实完整性。
有关提示和分数的详细信息,请参阅 collab 上的基准代码。
in_domain–与所提交文件的内容有一定关系的问题 out_of_domain–与所提交文件的内容没有具体关系的问题。
question_type | gpt-4o | ||
---|---|---|---|
judge_correct_percent | avg_answer_match_rougeL | avg_abs_indexes_diff | |
in_domain | 73% | 0.34 | NaN |
out_of_domain | 81% | 0.20 | NaN |
question_type | Vikhr-Nemo-12B-Instruct-R-21-09-24 | ||
---|---|---|---|
judge_correct_percent | avg_answer_match_rougeL | avg_abs_indexes_diff | |
in_domain | 68% | 0.41 | 0 |
out_of_domain | 92% | 0.52 | 0 |
question_type | gpt-4o-mini | ||
---|---|---|---|
judge_correct_percent | avg_answer_match_rougeL | avg_abs_indexes_diff | |
in_domain | 65% | 0.33 | NaN |
out_of_domain | 73% | 0.18 | NaN |
question_type | gpt-3.5-turbo-0125 | ||
---|---|---|---|
judge_correct_percent | avg_answer_match_rougeL | avg_abs_indexes_diff | |
in_domain | 49% | 0.28 | NaN |
out_of_domain | 76% | 0.20 | NaN |
该模型是如何创建的
指导性 SFT 部分
在模型训练的 SFT 阶段,我们准备了一个大型(15 万条指令)教学合成数据集 Vikhrmodels/GrandMaster-PRO-MAX。 该数据集的特点是内嵌 CoT(Chain-Of-Thought,思维链),为了收集该数据集,我们使用了 gpt-4-turbo 的修改版 promet,详情请参见数据集卡片。
此外,为了制作 RAG Grounding,我们还准备了另一个合成数据集–Vikhrmodels/Grounded-RAG-RU-v2(50k 对话)。
与 SMPO 为进一步提高答复的质量。
进一步提高响应质量 、 我们 使用了以下 管道 :
- 我们训练了一个自定义奖励模型(暂不公开)
- 使用 RM 模型对原始 Vikhrmodels/GrandMaster-PRO-MAX 数据集进行了重复和过滤,获得了约 10k 个质量最高、最多样化的对话。
- 我们使用接收到的数据集和奖励模型进行了带有 SFT 检查点的拒绝采样。(我们生成了 7 个假设,只将最差的 2 个假设作为拒绝假设)
- 我们使用 SMPO 方法,使用第 3 阶段生成的数据集进一步训练了 SFT 检查点。SMPO 的设计和选择是为了在拒绝采样条件下提高偏好训练的稳定性,并达到所需的余量。
SMPP、剔除采样等功能的实现可在 GitHub 上的 efficie_lm_alignment 库中找到
使用 SMP 而不是其他 PO 方法的想法是在使用经典方法进行大量实验后产生的,必要时可以更好地控制收敛过程。如果仔细配置其他方法(例如 SimPO),也能获得类似的结果,但我们试图简化这一过程,并结合其他方法的最佳实践。
如何使用 RAG
文档角色是描述文档内容的字典列表,使用 json.dumps(array,ensure_ascii=False)(见下面的示例)。 文档内容可以用 3 种不同的格式表示:Markdown、HTML 和纯文本。 每个文档内容都可以是长度不超过 4k 字符的文本块。
[
{
"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-Nemo-12B-Instruct-R-21-09-24 --api-key token-abc123
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]}
----
Глобальное потепление – это долгосрочное повышение средней температуры атмосферы и океанов Земли. Это явление имеет множество последствий для нашей планеты, и среди них можно выделить два ключевых аспекта, основанных на доступных мне данных:
1. **Уменьшение объема ледников**: За последние 50 лет наблюдается значительное сокращение объема ледников по всему миру. Согласно данным, объем ледников уменьшился на 30%. Это может быть связано с таянием ледников из-за повышения температур, что является одним из признаков глобального потепления.
2. **Повышение уровня моря**: Уровень мирового океана также увеличивается, что связано с таянием ледников и ледяных покровов, а также с расширением воды при повышении температуры. С 1880 года уровень моря повысился на 20 сантиметров, и этот процесс продолжается, с ежегодным увеличением на 3,3 миллиметра.
Эти изменения имеют серьезные последствия для экосистем, климата и человеческого общества. Таяние ледников приводит к повышению уровня моря, что может привести к затоплению прибрежных территорий и островов, а также к изменению водных ресурсов и климатических паттернов.
通过使用 relevant_indexes(JSON)模型的第一个响应,我们可以了解该模型是否在文档中找到了信息,该模型经过训练,如果信息不存在,就会返回一个空数组,在这种情况下,它将响应无法在知识库中找到信息(在生成第二个响应时)。
细微差别和局限性
- 该模型的响应安全级别较低,旨在确保正确、完整地执行指令,因此在使用时要注意这一点,并亲自进行测试。 系统提示和用户提示中的额外安全考虑因素部分弥补了这一不足。
- 系统提示并非用于字符描述,我们建议将其用于答案样式规范(如 “答案只能是 json 格式”)。 此外,最好用英文书写,因为在数据集中,系统提示中英文的使用并不取决于答案的语言。
- RAG 模式需要使用 GROUNDED_SYSTEM_PROMPT 系统提示,详情请参见 如何使用 RAG 部分。 此外,有时模型还可以根据文档中的内容添加其知识中的一般信息。
- 最好使用低温模型(0.1-0.5),同时使用 top_k(30-50),在temperature 为 1.0 时会发现随机生成缺陷。