专家编排:第一性原理多模型系统
Leeroo 团队:Majid Yazdani, Alireza Mohammadshahi, Arshad Shaikh。
本文介绍我们创新的多模型 LLM 平台,该平台优于传统的单一 LLM 系统。我们的系统已在 MMLU 和 GSM8k 基准测试中进行评估,与通用和领域特定 LLM 专家相比,表现出显著更优的性能。此外,我们的 LeerooDedicated-Math-7b 已在 Huggingface 🤗 上开源,供社区使用。
目录
引言
过去一年,闭源通用 LLM 的兴起以数十亿美元注入模型,以编码大量人类知识为标志。这些模型在广泛的任务中表现出卓越的成功,成为人工智能系统原型设计的标准。针对特定企业应用定制这些模型依赖于提示工程和向其输入上下文添加外部知识。然而,这种方法不可预测,需要大量实验才能达到预期效果。此外,不能保证一种模型迭代中有效的技术能延续到后续版本。此外,随着监管框架的收紧和数据安全担忧的增加,个人和企业越来越不愿意与闭源模型提供商共享敏感信息。LLM 专家输出难以控制,加上 GPT-4 等平台相关的高昂推理成本,带来了额外障碍,挑战了这些模型在商业应用中的可行性。
同时,小型、领域特定模型的开发变得越来越容易,微调方法也在不断发展。微调是企业用于教授 LLM 其用例的最常见方法。然而,尽管有这些进步,小型微调模型有限的知识使其对于长尾用例而言变得脆弱,这些用例在微调训练集中几乎找不到。这就提出了一个关键问题:是否有可能智能地整合世界上最好的模型的知识,不仅能匹敌甚至超越领先的闭源模型的能力,而且能更高效地做到这一点,同时允许企业训练自己的专用模型?这篇博客文章探讨了实现这一宏伟目标的潜力。
专家编排
我们引入了多模型 LLM 构建系统,旨在提供一个高质量的人工智能系统,超越传统单一 LLM 系统的能力。我们创新的核心在于一个基于 LLM 的编排器,该编排器经过训练,用于评估底层 LLM 专家的知识。给定一个包含通用和领域特定模型的底层 LLM 专家列表,我们训练的编排器可以在不运行其推理的情况下预测它们在不同查询上的性能。随后,我们的解码机制根据性能、成本效益和隐私标准,识别最佳专家。为了训练编排器,我们对各种模型在不同的输入集上运行,以评估它们的性能。这些数据使编排器能够有效地“离线采访”这些模型,并了解它们的能力。因此,它可以在推理时根据训练期间收集到的见解高效地部署最合适的专家。
我们使用 MMLU 基准测试评估了我们的方法。该基准测试因其广度和深度而特别引人注目,涵盖了 57 个不同的领域。我们利用 Huggingface hub 中的开源模型,参数分别为 7B、13B 和 34B 的模型,作为底层专家。随后,我们采用了我们论文中提供的一个子模算法,以识别作为专家集合的最具协同作用的模型。
在下图中,我们展示了我们的发现与领先的开源和闭源 LLM 专家(即 GPT4、Mixtral 和 LLaMa2)的比较。仅使用开源专家,Leeroo 模型比 Mixtral(性能最佳的开源 LLM)高出 5.27% 的准确率,同时保持了可比的推理成本。值得注意的是,它在与 GPT3.5 竞争的同时,将成本降低了 73.3%,并且完全开源。随后,在将 GPT4-turbo 集成作为底层专家之一后,Leeroo 模型实现了与 GPT4 相当的性能,同时将 50% 的查询发送到开源专家,从而将推理成本降低了近 50%。有趣的是,Leeroo 模型在将 25% 的查询发送到开源专家的情况下,超越了 GPT4 性能 0.24%。
为了进一步探究模型改进的来源,我们在下图中展示了 17 个子类别上的性能分布。一个显著的成功领域是 STEM 领域,如数学和计算机科学,我们的模型表现尤为出色。这种令人印象深刻的性能主要归因于社区整合了专门的小模型(约 7B),这些模型针对数学和编码任务进行了微调。此外,这种方法有助于识别专家稀缺的领域。未来研究可以集中精力通过开发领域特定高效专家来提高这些领域的性能。
Leeroo Math 7b
我们架构的一个实例化是构建一个专用模型,该模型与闭源通用模型(例如 GPT4)相结合,以在所有权和质量之间提供最佳权衡。Leeroo Math 7B 模型就体现了这种方法。该模型旨在处理数学查询,要么生成解决方案,要么在必要时利用 GPT-4 弥补其知识库中的不足。在使用 GSM8k 数据集的评估中,Leeroo Math 7B 模型在 5 次少样本设置中达到了 84.77% 的准确率,使其位居同类模型前列,并显著超越了其基础模型 MetaMath 7B,后者在相同数据集上的得分为 68.84%(基于 Huggingface OpenLLM 排行榜)。这是在依靠 GPT-4 回答 GSM8k 中一半问题的情况下实现的。
随着我们拥有更多训练数据,我们可以保持或提高质量,同时逐步减少对外部、离线模型(如 GPT-4)的依赖。例如,通过多训练 50% 的数据,我们可以将所有权提高 7.4%。
尝试我们的模型 🤗
您可以在 Leeroo HF hub 上尝试 LeerooDedicated-Math-7b。给定查询,模型会生成答案,或将其标记为“GPT4”。
在以下示例中,模型生成答案。
model = AutoModelForCausalLM.from_pretrained("leeroo/LeerooDedicated-Math-7b", trust_remote_code=True)
tokenizer = AutoTokenizer.from_pretrained("leeroo/LeerooDedicated-Math-7b")
device = model.device
# the following question is answered by the leeroo expert
question = "Natalia sold clips to 48 of her friends in April,and then she sold half as many clips in May.How many clips did Natalia sell altogether in April and May?"
encodeds = tokenizer([question], return_tensors="pt")
model_inputs = encodeds['input_ids'].to(device)
generated_ids = model.generate(model_inputs, max_new_tokens=100, do_sample=False)
decoded = tokenizer.batch_decode(generated_ids)
print(decoded[0])
# Natalia sold 48 clips in April.\nIn May, she sold half as many clips as in April,
# so she sold 48/2 = 24 clips.\nAltogether, Natalia sold 48 + 24 = 72 clips in April and May.\n#### 72\nThe answer is: 72</s>
对于下面的查询,它将查询定向到 GPT4,由特殊标签 <GPT4>
指示。
question = "James loves to go swimming and has to swim across a 20-mile lake. He can swim at a pace of 2 miles per hour. He swims 60% of the distance. After that, he stops on an island and rests for half as long as the swimming time. He then finishes the remaining distance while going half the speed. How long did it take him to get across the lake?"
encodeds = tokenizer([question], return_tensors="pt")
model_inputs = encodeds['input_ids'].to(device)
generated_ids = model.generate(model_inputs, max_new_tokens=100, do_sample=False)
decoded = tokenizer.batch_decode(generated_ids)
print(decoded[0])
# <GPT4></s>
了解更多
🔍 要深入了解我们的方法和结果,请参考我们的出版物和存储库。
🌍 加入 Leeroo 社区以获取更多更新:领英、Discord、X、官网。
引用
@misc{mohammadshahi2024leeroo,
title={Leeroo Orchestrator: Elevating LLMs Performance Through Model Integration},
author={Alireza Mohammadshahi and Ali Shaikh and Majid Yazdani},
year={2024},
eprint={2401.13979},
archivePrefix={arXiv},
primaryClass={cs.CL}
}