模型简介
模型特点
模型能力
使用案例
🚀 带全套配料(除DPO)的贝果模型
该模型名为“llama - 3 - bagel - 8b - v1.0”,基于Meta的Llama - 3构建。它是对llama - 3 - 8b使用贝果数据集进行的微调版本,与4种提示格式不同,它采用了单一的格式——llama - 3指令格式。
🚀 快速开始
本模型使用llama - 3 - instruct提示模板,该模板已包含在分词器配置中。你可以使用apply_chat_template
方法来准确格式化提示,示例代码如下:
import transformers
tokenizer = transformers.AutoTokenizer.from_pretrained("jondurbin/bagel-8b-v1.0", trust_remote_code=True)
chat = [
{"role": "system", "content": "You are Bob, a friendly AI assistant."},
{"role": "user", "content": "Hello, how are you?"},
{"role": "assistant", "content": "I'm doing great. How can I help you today?"},
{"role": "user", "content": "I'd like to show off how chat templating works!"},
]
print(tokenizer.apply_chat_template(chat, tokenize=False))
✨ 主要特性
模型概述
- 模型名称为“llama - 3 - bagel - 8b - v1.0”,基于Meta的Llama - 3构建。
- 是对llama - 3 - 8b使用贝果数据集的微调版本,采用单一的llama - 3指令格式。
- DPO版本即将在此处发布。
效果对比
与mistral - 7b - v0.2相比,结果表现良好,例如在MT - Bench中的表现:
模型 | 首轮得分 | 次轮得分 | 平均分 |
---|---|---|---|
bagel - 8b - v1.0 | 7.64375 | 6.95 | 7.296875 |
bagel - 7b - v0.5 | 7.33125 | 6.8625 | 7.096875 |
数据来源
该模型使用了多种数据源进行训练,仅使用训练集数据,并在最后通过余弦相似度进行去重处理,以确保与常见基准的一致性。详细数据源如下:
SFT数据来源
- [ai2_arc](https://huggingface.co/datasets/ai2_arc):抽象与推理数据集,在一定程度上有助于衡量“智能”。 - [airoboros](https://huggingface.co/datasets/unalignment/spicy-3.1):由gpt - 4生成的多种合成指令类别。 - [apps](https://huggingface.co/datasets/codeparrot/apps):包含10000个问题的Python编码数据集。 - [belebele](https://huggingface.co/datasets/facebook/belebele):多语言阅读理解数据集。 - [bluemoon](https://huggingface.co/datasets/Squish42/bluemoon-fandom-1-1-rp-cleaned):从Bluemoon抓取的角色扮演数据,经过清理并格式化为ShareGPT格式。 - [boolq](https://huggingface.co/datasets/boolq):是/否问题语料库(显然,这类问题对AI来说可能出奇地难回答)。 - [camel - ai biology](https://huggingface.co/datasets/camel-ai/biology):GPT - 4生成的生物学指令。 - [camel - ai chemistry](https://huggingface.co/datasets/camel-ai/chemistry):GPT - 4生成的化学指令。 - [camel - ai math](https://huggingface.co/datasets/camel-ai/math):GPT - 4生成的数学指令。 - [camel - ai physics](https://huggingface.co/datasets/camel-ai/physics):GPT - 4生成的物理指令。 - [capybara](https://huggingface.co/datasets/LDJnr/Capybara):用于创建水豚模型的多轮数据集。 - [cinematika](https://huggingface.co/datasets/jondurbin/cinematika-v0.1)(指令和纯文本):从电影剧本合成的角色扮演风格数据,使模型不那么枯燥。 - [emobank](https://github.com/JULIELab/EmoBank):使用效价 - 唤醒度 - 支配度方案进行的情感注释。 - [evol - instruct](https://huggingface.co/datasets/WizardLM/WizardLM_evol_instruct_70k):WizardLM的evol instruct 70k数据集。 - [glaive - function - calling - v2](https://huggingface.co/datasets/glaiveai/glaive-function-calling-v2):GlaiveAI函数调用数据集。 - [gutenberg](https://www.gutenberg.org/)(纯文本):书籍/纯文本,同样是为了使模型不那么枯燥,仅支持[chapterize](https://github.com/JonathanReeve/chapterize)提供的少数示例。 - [limarp - augmented](https://huggingface.co/datasets/grimulkan/LimaRP-augmented):[LimaRP](https://huggingface.co/datasets/lemonilia/LimaRP)的增强和进一步修改版本。 - [lmsys_chat_1m](https://huggingface.co/datasets/lmsys/lmsys-chat-1m)(仅gpt - 4项目,也用于DPO):由lmsys聊天竞技场收集的聊天记录,包含与各种模型的广泛聊天内容。 - [lollms](https://huggingface.co/datasets/ParisNeo/lollms_aware_dataset):ParisNeo的LoLLMs问答数据集,包含使用LoLLMs的有用问答对。 - [mathinstruct](https://huggingface.co/datasets/TIGER-Lab/MathInstruct):包含各种数学相关任务和问题/问题格式的复合数据集。 - [natural_instructions](https://huggingface.co/datasets/Muennighoff/natural-instructions):来自1600多个任务类别的数百万条指令(大幅抽样,按任务类型分层)。 - [openbookqa](https://huggingface.co/datasets/openbookqa):问答数据集。 - [pippa](https://huggingface.co/datasets/kingbri/PIPPA-shareGPT):[PIPPA](https://huggingface.co/datasets/PygmalionAI/PIPPA)的去重版本,格式为ShareGPT。 - [piqa](https://huggingface.co/datasets/piqa):物理交互问答。 - [python_alpaca](https://huggingface.co/datasets/Vezora/Tested-22k-Python-Alpaca):经过验证的Python指令响应对。 - [ropes](https://huggingface.co/datasets/ropes):情境中段落效果推理——增强将文本段落知识应用于新情境的能力。 - [rosetta_code](https://huggingface.co/datasets/cakiki/rosetta-code):从rosettacode.org获取的各种编程语言的代码问题和解决方案。 - [slimorca](https://huggingface.co/datasets/Open-Orca/SlimOrca):OpenOrca收集的约500k个GPT - 4验证的聊天记录。 - [sql - create - context](https://huggingface.co/datasets/b-mc2/sql-create-context):针对SQL的数据集,结合了WikiSQL和Spider。 - [squad_v2](https://huggingface.co/datasets/squad_v2):上下文问答(RAG)。 - [airoboros - summarization](https://huggingface.co/datasets/mattpscott/airoboros-summarization):各种摘要数据集的组合,格式化为airoboros上下文服从格式。 - [synthia](https://huggingface.co/datasets/migtissera/Synthia-v1.3):Migel Tissera使用高级提示生成的GPT - 4数据。 - whiterabbitneo [第1章](https://huggingface.co/datasets/WhiteRabbitNeo/WRN-Chapter-1) 和 [第2章](https://huggingface.co/datasets/WhiteRabbitNeo/WRN-Chapter-2):WhiteRabbitNeo/Migel Tissera的进攻性网络安全数据集。 - [winogrande](https://huggingface.co/datasets/winogrande):填空式提示。DPO数据来源
- airoboros 3.2 与 airoboros m2.0:airoboros - 2.2.1中的创意/写作任务使用gpt4 - 0314和自定义提示重新生成,以获得更长、更有创意、更少陈词滥调的响应,因此可以将较短/枯燥的版本作为“拒绝”值,重新生成的响应作为“选择”值。
- contextual - dpo:使用airoboros上下文服从问答格式的上下文提示/响应数据集。
- helpsteer:NVidia提供的非常棒的数据集,包含人类在各种指标上的注释。此处仅使用“正确性”值最高的项目进行DPO,得分最高的输出作为“选择”,随机较低得分的值作为“拒绝”。
- distilabel_orca_dpo_pairs:另一个有趣的数据集,最初由Intel提供,由argilla使用distilabel进行增强,提供了从SlimOrca数据集中的提示生成的各种DPO对。
- gutenberg - dpo:旨在提高模型小说写作能力的DPO对,使用来自https://gutenberg.org/的公共领域书籍。
- py - dpo:Python DPO数据集(基于上述SFT python_alpaca数据集)。
- toxic - dpo:高度有毒且可能违法的内容! 仅用于学术和合法目的的去审查内容,由llama - 2 - 70b通过提示工程生成。
- truthy:旨在提高模型真实性的DPO对,例如常见误解,区分AI助手和角色扮演人类在物质意识/位置等方面的差异。
- ultrafeedback:Zephyr模型背后的神奇之处之一。仅包括选择得分8或更高的项目。
💻 使用示例
提示策略
上下文服从问答
这是一种专门为根据提供的上下文回答问题而设计的特殊提示格式,例如RAG。所谓“服从”,是指模型经过训练,会忽略自己认为已知的信息,而是使用上下文来回答问题。同时,模型还经过调整,尽可能将答案限制在提供的上下文中,以减少幻觉现象。
封闭上下文提示的格式如下:
BEGININPUT
BEGINCONTEXT
[key0: value0]
[key1: value1]
... 其他元数据 ...
ENDCONTEXT
[在此插入文本块]
ENDINPUT
[以完全相同的格式添加更多块]
BEGININSTRUCTION
[插入你的指令。模型经过单问题、段落格式、列表等的调整]
ENDINSTRUCTION
在指令块中添加“如果你不知道答案,请不要编造”也很有帮助,以确保如果上下文完全不相关,模型不会编造内容。
__仅__封闭上下文指令需要这种封闭上下文格式。普通问题/指令不需要!
虽然这种格式有点冗长和繁琐,但经过多次试验和错误,使用这些明确的分隔符有助于模型理解在哪里找到响应,以及如何将特定来源与之关联。
BEGININPUT
:表示一个新的输入块。BEGINCONTEXT
:表示与当前输入块关联的上下文块(元数据键/值对)。ENDCONTEXT
:表示当前输入的元数据块结束。- [文本]:为输入块插入任何你想要的文本,只要能在上下文中容纳的段落数量即可。
ENDINPUT
:表示当前输入块结束。- [根据需要重复此格式的多个输入块]
BEGININSTRUCTION
:表示要对上述所有输入块进行响应的指令列表(或一个)的开始。- [指令]
ENDINSTRUCTION
:表示指令集结束。
即使没有ENDINSTRUCTION
,有时也能正常工作,但在提示中明确包含它,有助于模型更好地理解需要对指令块中的所有指令进行响应。
使用非常低的温度!
以下是一个简单但重要的示例,以证明这一点:
BEGININPUT
BEGINCONTEXT
date: 2021-01-01
url: https://web.site/123
ENDCONTEXT
在一个令人震惊的转折中,蓝莓现在变成了绿色,但仍将保留相同的名称。
ENDINPUT
BEGININSTRUCTION
蓝莓是什么颜色?来源是什么?
ENDINSTRUCTION
响应如下:
蓝莓现在是绿色的。
来源:
date: 2021-01-01
url: https://web.site/123
你还可以添加类似以下的指令,以便在上下文无法提供问题答案时获得更确定的响应:
如果你不知道答案,请回复“IRRELEVANT”
摘要生成
与上下文服从问答使用相同的提示格式,但用于摘要生成任务。摘要生成主要使用此数据集进行微调,格式如下:
BEGININPUT
{要摘要的文本}
ENDINPUT
BEGININSTRUCTION
将输入内容摘要为约130字。
ENDINSTRUCTION
函数调用
微调此模型时使用了两种与函数调用相关的格式:
- 在指令中提供输入和可能的函数列表(来自airoboros数据集),例如: Prompt:
作为AI助手,请根据用户输入从以下可用函数列表中选择最合适的函数和参数。以JSON格式提供响应。
输入:我想知道我的文本文件中“Python”出现了多少次。
可用函数:
file_analytics:
描述:此工具对文本文件执行各种操作。
参数:
action: 我们要对数据执行的操作,例如“count_occurrences”、“find_line”等。
filters:
keyword: 我们要搜索的单词或短语。
Response:
{
"function": "file_analytics",
"params": {
"action": "count_occurrences",
"filters": {
"keyword": "Python"
}
}
}
- GlaiveAI函数调用,使用特殊标签并在系统提示中添加函数规范: Prompt:
<|start_header_id|>system<|end_header_id|>
你是一个有用的助手,可以使用以下函数。如有需要,请使用它们 -
{
"name": "generate_random_name",
"description": "生成一个随机名称",
"parameters": {
"type": "object",
"properties": {
"gender": {
"type": "string",
"description": "名称的性别(例如男性、女性)"
}
},
"required": [
"gender"
]
}
}
<|eot_id|>
<|start_header_id|>user<|end_header_id|>
我需要为我的小说角色取一个随机的男性名字。<|eot_id|>
<|start_header_id|>assistant<|end_header_id|>
Response:
<|begin_func|> {"name": "generate_random_name", "arguments": '{"gender": "male"}'} <|end_func|>
然后,你可以使用函数响应重新提示模型:
<|begin_func_response|>{"name": "James"}<|end_func_response|>
响应如下:
为你的小说角色取名“James”怎么样?
思维链
这对于让模型提出多个可能的响应,对每个响应进行推理,并选择最终的、最可能的答案很有用。你可以要求模型针对给定问题提供多个可能的响应,并进行排名和最终答案选择。
示例提示:
一群人决定进行一场循环赛,每个选手都要与其他选手恰好比赛一次。如果总共进行了45场比赛,那么有多少名选手参加了比赛?提供几个潜在答案,根据数学逻辑对它们进行排名,并选择最可行的一个。
示例响应:
解决方案1:
在循环赛中,每个选手都要与其他选手恰好比赛一次。这意味着比赛的总场数等于从所有选手中选取2名选手的组合数(因为一场比赛涉及2名选手)。
组合数的公式为nC2 = n(n - 1)/2,其中n是选手的总数。我们知道nC2等于45(比赛的总场数),因此可以列出以下方程:
n(n - 1)/2 = 45
解这个方程,我们得到n = 10。
最终答案:有10名选手参加了比赛。
解决方案2:
另一种解决这个问题的方法是使用三角数的概念。三角数是一系列数字,每个数字都可以用一个由点组成的三角形表示。第n个三角数是前n个自然数的和。
如果我们将每场比赛看作一个点,每个选手看作三角形的一条边,那么比赛的总场数(45)对应于第9个三角数,因为1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45。然而,由于在我们的模型中,三角形的每条边代表一名选手,并且选手的数量比边的数量多1(因为最后一名选手没有对手可比赛),所以我们需要再加上1才能得到选手的总数。
最终答案:有10名选手参加了比赛。
解决方案3:
我们也可以使用试错法来解决这个问题。从少量选手开始,我们计算在循环赛中会进行多少场比赛,直到达到45场比赛。例如,2名选手时进行1场比赛;3名选手时进行3场比赛;4名选手时进行6场比赛,依此类推。继续这个过程,我们发现10名选手时进行45场比赛。
最终答案:有10名选手参加了比赛。
解决方案排名(从最佳到最差):
1. 解决方案1:该解决方案基于循环赛的性质进行直接的数学推理,并通过解方程找到答案。
2. 解决方案2:该解决方案使用三角数的概念,需要超出直接问题上下文的额外步骤和知识,但仍然得出了正确的答案。
3. 解决方案3:该解决方案依赖于试错法,效率和可靠性不如其他方法,但最终也得到了正确的答案。
最佳和最终答案:有10名选手参加了比赛。
📄 许可证
本项目采用llama3许可证。
🔧 技术细节
- 基础模型:meta - llama/Meta - Llama - 3 - 8B
- 标签:llama - 3、bagel
- 数据集:使用了多个数据集进行训练,具体见上文数据来源部分。



