欢迎来到啾啾的博客🐱。
记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。
有很多很多不足的地方,欢迎评论交流,感谢您的阅读和评论😄。

引言

Token是大型语言模型(LLM)处理文本的最小单位,可以是一个单词、词根、标点符号,甚至是字母。 控制Prompt token的数量和方式对于优化模型性能、降低成本和提高响应速度至关重要。

控制Prompt token的主要策略和技术如下:

  • 优化和精简Prompt内容
  • 管理上下文窗口和对话历史
  • RAG
  • 批处理提示

资料:
Token 优化:有效提示工程的核心支柱
如何优化提示时的令牌效率

1 优化和精简Prompt内容

这是最直接有效的方法,旨在用更少的token表达清晰的指令。

  • 清晰、具体的指令: 避免模糊不清的表述,直接说明你的要求。例如,不说“请生成以下文本的摘要”,而是说“将以下文本总结为50字以内”。

  • 限制示例数量: 在使用“少样本(Few-shot)”提示时,只提供最必要的示例,过多的示例会不必要地增加token消耗。

  • 结构化输出格式: 要求模型以特定格式输出,如项目符号、JSON或特定结构,可以有效引导模型生成简洁的回答,避免冗长的自由发挥。

2 管理上下文窗口和对话历史

随着对话的进行,输入和输出的token都会累积,最终会超出模型的上下文窗口限制。

  • 截断(Truncation): 当输入超过最大token限制时,模型会自动截断最早的token。 开发者可以主动管理这个过程,例如只保留最近的N轮对话,这种方法被称为“滑动窗口”。

  • 输入输出平衡: 上下文窗口的预算需要同时考虑输入和输出。在发送长prompt时,必须为模型的回复预留足够的token空间。许多API允许设置max_tokens参数来限制生成内容的最大长度。

  • 内容总结: 将旧的对话消息压缩成摘要,可以有效保留历史信息,同时大幅减少token占用。

3 高级技术和策略

除了直接编辑和管理prompt,还有一些更高级的工程技术可以优化token使用。

  • 检索增强生成(RAG): 这是处理长上下文最常用的技术之一。RAG系统不会将整个知识库作为prompt输入,而是通过向量搜索等技术,只检索与问题最相关的几个文本块(通常几千个token),然后将这些精确的信息提供给模型。这样既能利用大模型的推理能力,又能将token消耗控制在合理范围。

  • 思维骨架提示(Skeleton-of-Thought Prompting): 这种技术让模型首先生成一个回答的结构化大纲(骨架),然后并行地填充每个部分的内容。这种方法可以显著加快生成速度,尤其适用于需要结构化长文本的场景。

  • 批处理提示(BatchPrompt): 将多个相似的数据点或任务合并到单个prompt中进行处理,而不是为每个任务单独发送请求,从而提高整体效率和token利用率。

4 利用API参数进行微调

大多数LLM的API都提供了一系列参数来控制生成过程,这也能间接影响token的使用。

  • 最大长度(Max Length): 直接设置模型生成响应的token上限,可以有效防止生成过长或无关的内容,从而控制成本。

  • 停止序列(Stop Sequences): 定义一个或多个字符串,一旦模型生成了这些字符串,就会立即停止。这对于控制生成内容的结构和长度非常有用。例如,在生成列表时,可以将“11.”设置为停止序列,以确保列表不超过10项。

  • 频率和存在惩罚(Frequency and Presence Penalty): 这些参数可以降低模型重复使用相同词汇或短语的概率,鼓励生成更多样化的内容,避免在不必要的重复上浪费token。

  • 温度(temperature)与Top-P:这两个参数主要控制生成内容的多样性。较低的temperature会让模型选择最可能的词,输出更具确定性、更简洁,适合事实问答或摘要任务,间接减少了“废话”token。较高的值则鼓励创造性,但也可能导致内容冗长。在工程上,建议调整其中一个,而不是两者都调。

通过综合运用以上这些方法,您可以有效地控制prompt的token使用,从而在保证输出质量的同时,实现成本效益和模型性能的最大化。

5 落地思考

目前实际的应用有Adaptive RAG,自适应RAG。其通过判断输入要求决定是否进行检索,同时也可以对输出进行判断(反思机制),看是否满足要求,是否要进行进一步推理、思考。

配置LLM参数max_length / max_tokens、stop_sequences、temperature、frequency_penalty & presence_penalty

还有就是长对话中的记忆策略,可以用摘要、滑动窗口、按需检索等手段,尽量减少token使用。

以及可以不用让LLM做所有的事情。将一个复杂任务分解,让LLM做它最擅长的自然语言处理部分,而将计算、数据查询、格式转换等任务交给传统的代码或外部API来完成。

例如,如果用户问“谷歌的股价是多少?”,应用应该先识别意图,然后调用一个股票查询API,最后让LLM将查询结果“GOOG: $180”包装成一句自然语言回答,而不是让LLM去“猜”股价,这样既准确又节约token。

Logo

为武汉地区的开发者提供学习、交流和合作的平台。社区聚集了众多技术爱好者和专业人士,涵盖了多个领域,包括人工智能、大数据、云计算、区块链等。社区定期举办技术分享、培训和活动,为开发者提供更多的学习和交流机会。

更多推荐