自2022年ChatGPT发布以来,人工智能领域迎来了自动化大量任务的巨大变革。市场上涌现出越来越多利用大型语言模型(LLM)的AI产品。然而,在实际应用LLM的方式上,仍有诸多改进空间。例如,通过LLM提示词优化器改进提示词,以及有效利用缓存令牌,便是能显著提升LLM应用性能的两项简单技术。
本文将深入探讨几项具体的提示词创建与结构优化技术。这些技术旨在帮助读者有效降低模型的推理延迟和运行成本,同时显著提升响应质量。目标是提供可立即应用于自身LLM应用程序的实用技巧,从而实现性能的显著飞跃。

上图信息图清晰地概述了本文的核心内容。文章将详细介绍四种能够大幅提升LLM应用性能的技术,这些技术涵盖了成本效益、响应延迟和输出质量等关键方面。具体内容包括:有效利用缓存令牌、将用户问题置于提示词末尾、使用提示词优化器,以及建立定制化的LLM基准测试体系。图片来源:Gemini。
为何需要优化提示词?
在许多情况下,一个为特定LLM设计的提示词可能已经能够产生尚可接受的结果。然而,往往由于没有投入足够的时间进行优化,这使得应用性能提升的巨大潜力被白白浪费。
通过本文将介绍的具体优化技术,可以轻松地在不花费太多精力的情况下,同时提升模型响应的质量并降低运行成本。仅仅因为一个提示词和LLM的组合能够工作,并不意味着它已达到最佳性能。实践证明,稍加努力,便能实现显著的性能提升。
具体的优化技术
本节将深入探讨可用于优化提示词的各项具体技术。
静态内容前置原则
首先介绍的技术是始终将提示词中的静态内容(即在多次API调用中保持不变的内容)置于提示词的前部。
之所以建议将静态内容前置,是因为所有大型LLM提供商,如Anthropic、Google和OpenAI,都普遍采用了缓存令牌(Cached Tokens)机制。缓存令牌是指在之前的API请求中已经被处理过的令牌,它们可以被更快、更经济地再次处理。尽管具体定价因提供商而异,但缓存的输入令牌通常仅收取正常输入令牌价格的约10%。
缓存令牌是那些在之前API请求中已被处理过的令牌,其处理成本和速度均优于普通令牌。
这意味着,如果连续两次发送相同的提示词,第二次请求中的输入令牌成本将仅为第一次请求的十分之一。这种效率提升得益于LLM提供商对这些输入令牌的处理进行了缓存,从而使得后续相同请求的处理变得更加经济和迅速。
在实际应用中,实现输入令牌缓存的关键在于将可变内容置于提示词的末尾。
例如,如果有一个较长的系统提示词,其中包含一个在每次请求中都会变化的问题,建议采用以下结构:
prompt = f"""
{较长的静态系统提示词}
{用户提示词}
"""
具体示例如下:
prompt = f"""
您是一名文档专家...
您应始终以此格式回复...
如果用户询问关于...您应回答...
{用户问题}
"""
在此示例中,提示词的静态内容被放置在最前面,然后才跟随可变内容(即用户问题)。
在某些场景下,可能需要输入文档内容。如果正在处理大量不同的文档,则应将文档内容置于提示词的末尾:
# 处理不同文档时
prompt = f"""
{静态系统提示词}
{可变提示指令 1}
{文档内容}
{可变提示指令 2}
{用户问题}
"""
然而,如果需要多次处理相同的文档,可以通过确保在文档内容之前不放置任何可变指令来确保文档的令牌也能被缓存:
# 多次处理相同文档时
prompt = f"""
{静态系统提示词}
{文档内容} # 确保此内容位于任何可变指令之前
{可变提示指令 1}
{可变提示指令 2}
{用户问题}
"""
请注意,缓存令牌通常只有在前1024个令牌在两次请求中完全相同时才会被激活。例如,如果上述示例中的静态系统提示词少于1024个令牌,则无法有效利用缓存令牌。
# 避免以下做法
prompt = f"""
{可变内容} < --- 这将导致缓存令牌机制失效
{静态系统提示词}
{文档内容}
{可变提示指令 1}
{可变提示指令 2}
{用户问题}
"""
提示词的构建应始终遵循“最静态内容在前,最动态内容在后”的原则(即变化最少的内容在前,变化最多的内容在后)。
- 如果有一个较长的系统和用户提示词,且不包含任何变量,应将其置于提示词的前部,并将变量添加到提示词的末尾。
- 例如,如果从文档中获取文本,并需要多次处理同一文档内容,也应确保利用缓存机制,将文档内容置于提示词的静态部分。
这可以应用于文档内容,或者任何较长的提示词,以有效利用缓存机制。
将用户问题置于提示词末尾
另一项提升LLM性能的有效技术是始终将用户问题置于提示词的末尾。理想情况下,应将提示词组织为系统提示词包含所有通用指令,而用户提示词则仅由用户问题构成,示例如下:
system_prompt = "<通用指令>"
user_prompt = f"{用户问题}"
根据Anthropic的提示词工程文档指出,将用户问题置于提示词末尾可以使模型性能提高高达30%,尤其在使用长上下文时效果更为显著。将问题放在末尾能让模型更清晰地理解其需要完成的任务,这在多数情况下会带来更优质的响应结果。
利用提示词优化器
人类编写的提示词往往存在杂乱、不一致、包含冗余内容和结构性欠缺等问题。因此,建议始终将提示词通过提示词优化器进行处理。
最简单的提示词优化器是直接向一个LLM发出指令,例如“优化这个提示词:{您的提示词}”,它将返回一个结构更清晰、冗余内容更少、更优化的提示词版本。
然而,更优的方法是使用专门的提示词优化工具,例如OpenAI或Anthropic控制台中提供的优化器。这些优化器本身就是经过特别提示和训练的LLM,专门用于优化用户提交的提示词,通常能产生更好的效果。此外,在使用优化器时,应确保提供以下额外信息:
- 关于期望完成任务的详细描述
- 提示词成功执行任务的示例,包括输入和输出
- 提示词未能成功执行任务的示例,同样包括输入和输出
提供这些附加信息通常会带来显著优化的结果,最终获得一个性能更佳的提示词。在许多情况下,只需投入10-15分钟,就能获得一个效率大幅提升的提示词。这使得利用提示词优化器成为改善LLM性能投入产出比最高的方法之一。
对LLM进行基准测试
所选择使用的LLM也会显著影响LLM应用的整体性能。不同的LLM擅长处理不同类型的任务,因此有必要根据特定的应用场景,对多种LLM进行试用和评估。建议至少配置好对主流LLM提供商的访问权限,如Google Gemini、OpenAI和Anthropic。这些设置相对简单,若已具备相应的凭证,切换LLM提供商仅需数分钟。此外,也可以考虑测试开源LLM,尽管它们通常需要投入更多精力进行部署和调优。
接下来,需要针对所要完成的具体任务建立一套专门的基准测试体系,并据此评估哪个LLM表现最佳。此外,还应定期检查模型的性能表现,因为大型LLM提供商会不时地对模型进行升级,即使不发布新的版本。当然,也应时刻关注并准备尝试大型LLM提供商推出的任何新模型,以保持技术的领先性。
总结
本文探讨了四种可用于提升LLM应用性能的核心技术。这些技术包括:有效利用缓存令牌、将用户问题置于提示词末尾、使用提示词优化器,以及建立定制化的LLM基准测试体系。这些方法都相对简单易行,但却能带来显著的性能提升。相信还有许多类似且简单的技术有待发掘,建议开发者们持续关注并探索。这些话题通常会在各类技术博客中被提及,例如Anthropic的博客就提供了大量有助于提升LLM性能的实用洞见。
