当前位置: 首页 > news >正文

停止浪费 LLM 令牌

原文:towardsdatascience.com/stop-wasting-llm-tokens-a5b581fb3e6e?source=collection_archive---------5-----------------------#2024-08-07

将输入批量处理可以在不影响性能的情况下带来显著的节省

https://medium.com/@toschnab?source=post_page---byline--a5b581fb3e6e--------------------------------https://towardsdatascience.com/?source=post_page---byline--a5b581fb3e6e-------------------------------- Tobias Schnabel

·发布于Towards Data Science ·阅读时间:5 分钟·2024 年 8 月 7 日

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ef7ee72d335ca3384877e59bbc877f89.png

图片由Orgalux提供,来源于Unsplash

如果你使用 LLM 来标注或处理更大的数据集,很可能你并没有意识到自己浪费了大量的输入令牌。当你反复调用 LLM 处理文本片段或整个文档时,你的任务指令和静态的少样本示例会在每个输入示例中重复出现。就像将盘子整齐地堆叠能节省空间一样,将输入批量处理可以带来显著的节省。

假设你想要标注一个较小的文档库,包含 1000 个单页文档,并且每个文档的指令和少样本示例约为半页长。分别标注每个文档将花费大约 100 万个输入令牌。然而,如果你在同一次调用中标注十个文档,你将节省大约30 万个****输入令牌(即节省 30%),因为我们不需要重复指令!正如下面的示例所示,这通常在性能损失最小(甚至可能获得性能提升)的情况下发生,特别是当你同时优化提示时。

通过小批量处理来节省令牌

在下面的图中,我假设我们平均文档长度为D个令牌,指令和少样本示例的长度为rD*个令牌。我在前一段中提到的示例场景,即指令长度为文档的一半(r= 0.5),出现在下方的蓝色曲线中。对于更长的共享指令,我们的节省可能会更高:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/64d532489c7951a7ac87012d7fc726cf.png

主要的收获是:

实际操作中的小批量

让我们实际操作一个任务,我们希望对文本片段进行分类,以便进行进一步分析。我们将使用来自自然指令基准的一个有趣任务,在该任务中,我们需要将辩论中的句子标注为四个类别之一(价值、事实、证词或政策)。

看一个示例,我们看到我们首先获取当前主题作为上下文,然后需要对相关句子进行分类。

{"input":{"topic":"the fight for justice,equality,peaceand love is futile","sentence":"What matters is what I am personally doing to ensure that I am filling the cup!"},"output":"Value"}

我们尚未回答的一个问题是:

我们如何选择正确的小批量大小?

之前的工作表明,最佳的小批量大小取决于任务和模型。我们实际上有两个选择:

  1. 我们选择一个合理的小批量大小,比如 5,并希望我们不会看到任何下降。

  2. 我们优化小批量大小以及其他选择,例如少量示例的数量。

正如你可能已经猜到的那样,我们将在这里选择第二种方案。为了运行我们的实验,我们将使用开源框架SAMMO,这是一个用于 LLM 调用和提示优化的框架。

在 SAMMO 中,提示被编码为提示程序(这些程序只是嵌套的 Python 类,接收输入数据后被调用)。我们将任务分成三个部分,并以 JSON 格式组织小批量。

defprompt_program(fewshot_data,n_fewshot_examples=5,minibatch_size=1):returnOutput(MetaPrompt([Section("Instructions",task["Definition"]),Section("Examples",FewshotExamples(fewshot_data,n_fewshot_examples),),Section("Output in same format as above",InputData()),],data_formatter=JSONDataFormatter(),render_as="markdown",).with_extractor(on_error="empty_result"),minibatch_size=minibatch_size,on_error="empty_result",)

如果不使用小批量,并且使用五个少量示例,我们得到的准确率为 0.76,并且需要支付58255 个输入令牌

现在,让我们探索小批量如何影响成本和性能。由于小批量减少了总输入成本,我们现在可以使用这些节省的成本来添加更多的少量示例!我们可以通过在 SAMMO 中设置搜索空间来研究这些权衡:

defsearch_space(fewshot_data):minibatch_size=search_op.one_of([1,5,10],name="minibatch_size")n_fewshot_examples=search_op.one_of([5,20],name="n_fewshot")returnprompt_program(fewshot_data,n_fewshot_examples,minibatch_size)

运行这个实验向我们展示了完整的权衡:

setting objective costs parse_errors-------------------------------------------------------------------------------------------------*{'minibatch_size':1,'n_fewshot':5}0.76{'input':58255,'output':5817}0.0{'minibatch_size':1,'n_fewshot':20}0.76{'input':133355,'output':6234}0.0{'minibatch_size':5,'n_fewshot':5}0.75{'input':15297,'output':5695}0.0{'minibatch_size':5,'n_fewshot':20}0.77{'input':30317,'output':5524}0.0{'minibatch_size':10,'n_fewshot':5}0.73{'input':9928,'output':5633}0.0*{'minibatch_size':10,'n_fewshot':20}0.77{'input':17438,'output':5432}0.0

因此,即使使用 20 个少量示例,我们仍然节省了近70%的输入成本([58255–17438]/58255),并且**保持了整体准确性!**作为练习,你可以实现自己的目标,自动考虑成本,或在搜索空间中包括不同的数据格式化方式。

注意事项

所有这些背后的隐含前提是:(i)我们有足够的输入示例使用共享的指令,(ii)我们在延迟方面有一定的灵活性。第一个假设在许多标注场景中是成立的,但显然在一次性查询中不成立。在标注或其他离线处理任务中,延迟并不是特别关键,因为吞吐量最为重要。然而,如果你的任务是尽可能快地给用户提供答案,那么发出B个并行调用可能比一次调用B个输入示例更有意义。

结论

正如这个快速且实用的示例所示,同时对 LLM 进行多个输入提示可以在更好或相当的准确度下大大降低成本。好消息是,即使在适中的小批量大小下(例如 5 或 10),节省的成本也可能相当可观。借助 SAMMO,你可以自动查看在不同选择下性能的表现,从而做出最佳选择。

一个开放的研究问题是如何将此与检索增强生成(RAG)结合——可以通过对所有检索的示例取并集,或以某种方式对其进行排名。SAMMO 让你在构建提示时探索这些策略中的一些,同时还有很多其他选择,例如如何格式化输入数据。如果你希望查看更多关于这个话题或其他任何内容,请留下评论。

*免责声明:*我是 SAMMO 的作者,这是一个开源的 MIT 许可证框架,用于提示优化。

资源

http://www.jsqmd.com/news/747713/

相关文章:

  • 公牛集团年营收160亿:净利41亿同比降5% 阮学平套现14.6亿
  • Reward Forcing:实时视频生成的高效蒸馏方法
  • SAP ME21N采购订单屏幕增强实战:手把手教你为抬头添加成本中心和订单号字段
  • 从零构建语义化代码搜索引擎:基于AST分块与向量检索的工程实践
  • 大语言模型安全评估:RefusalBench框架解析与实践
  • 不差钱的宁德时代完成配售:募资392亿港元 2025年净利722亿
  • Windows 11下Multisim 14.0元件库报错?别急着重装,试试这个降级到10.0的稳定方案
  • Fluent表达式 vs UDF:我该用哪个?从三个真实场景帮你做选择
  • 5分钟完成视频字幕制作:VideoSrt开源工具让语音转字幕变得如此简单
  • php信创=PHP-FPM容器在鲲鹏ARM64架构性能异常排查与信创内核参数调优
  • CloudBase MCP:AI编程IDE与Serverless部署的智能桥梁实战
  • RISE:多世界模型组合实现机器人自主进化
  • LLM与Rank-GRPO在推荐系统中的融合实践
  • Micro-Diffusion压缩技术:图像去噪与压缩的协同优化
  • 曲柄压力机曲柄滑块工作机构设计 14M论文(论文+CAD图纸+实习报告+中期报告)
  • 一场差点吵起来的测试环境搭建咨询,暴露了90%测试人的认知盲区
  • Jeeves:为AI助手注入灵魂与纪律的工程化平台
  • AutoSAR PNC实战:手把手教你配置OBC与BMS的局部网络唤醒(基于AUTOSAR 4.0.3+)
  • AI Agent自托管部署实战:基于OpenClaw与Diploi的自动化启动器
  • 大语言模型幻觉问题解决方案:QueryBandits框架实践
  • md-wechat:基于Node.js的Markdown转微信公众号排版工具详解
  • 第五部分-后期特效与着色器——26. 着色器基础
  • Craw4LLM:为LLM训练打造智能爬虫,从网页中提取高质量数据
  • 别再为单片机EEPROM不够用发愁了!手把手教你用AT24C32扩展存储(附完整Arduino/STM32代码)
  • STM32F411从HSI切换到HSE,你的25MHz晶振真的起振了吗?一个硬件工程师的排查笔记
  • 不会开发AI Skill,你明天可能还在改自动化脚本
  • 量子启发式KAN-LSTM:时序预测新突破
  • 终极解决方案:5分钟让魔兽争霸3在Win10/Win11完美运行
  • AI开发合规指南:从API封禁案例看服务条款与安全实践
  • 纯前端AI账单分析器:零服务器部署,浏览器内保障数据隐私