LLM 能够自动执行大量任务。自 2022 年 ChatGPT 发布以来,我们看到市场上越来越多的 AI 产品使用 LLM。然而,我们利用 LLM 的方式仍然需要进行很多改进。例如,使用 LLM 提示改进器和利用缓存令牌是两种简单的技术,您可以利用它们来极大地提高 LLM 应用程序的性能。
在本文中,我将讨论几种可以应用于创建和构建提示的方式的具体技术,这将减少延迟和成本,并提高响应质量。目标是向您展示这些特定技术,以便您可以立即将它们实施到您自己的 LLM 应用程序中。

为什么要优化提示
在很多情况下,你可能会有一个提示,该提示适用于给定的 LLM 并产生足够的结果。但是,在很多情况下,您没有花太多时间优化提示,这留下了很大的潜力。
我认为,使用我将在本文中介绍的具体技术,您可以轻松地提高响应质量并降低成本,而无需付出太多努力。仅仅因为提示和 LLM 工作并不意味着它的性能达到最佳状态,在很多情况下,您可以毫不费力地看到巨大的改进。
优化的具体技术
在本节中,我将介绍可用于优化提示的具体技术。
始终尽早保留静态内容
我将介绍的第一个技巧是始终在提示的早期保留静态内容。对于静态内容,我指的是当您进行多个 API 调用时保持不变的内容。
您应该尽早保留静态内容的原因是所有大型 LLM 提供商(例如 Anthropic、Google 和 OpenAI)都使用缓存令牌。缓存令牌是在之前的 API 请求中已经处理过的令牌,并且可以廉价且快速地处理。它因提供商而异,但缓存的输入令牌的价格通常约为正常输入令牌的 10%。
缓存令牌是在之前的 API 请求中已经处理过的令牌,并且可以比普通令牌更便宜、更快地处理
这意味着,如果您连续两次发送相同的提示,则第二个提示的输入令牌将仅花费第一个提示的输入令牌的 1/10。之所以有效,是因为 LLM 提供程序会缓存这些输入令牌的处理,这使得处理新请求的成本更低、更快捷。
实际上,缓存输入令牌是通过在提示末尾保留变量来完成的。
例如,如果您有一个很长的系统提示,其中包含一个因请求而异的问题,您应该执行如下作:
prompt = f"""
{long static system prompt}
{user prompt}
"""
例如:
prompt = f"""
You are a document expert ...
You should always reply in this format ...
If a user asks about ... you should answer ...
{user question}
"""
在这里,我们首先是提示的静态内容,然后再将变量内容(用户问题)放在最后。
在某些情况下,您希望输入文档内容。如果您要处理许多不同的文档,则应将文档内容保留在提示的末尾:
# if processing different documents
prompt = f"""
{static system prompt}
{variable prompt instruction 1}
{document content}
{variable prompt instruction 2}
{user question}
"""
但是,假设您要多次处理相同的文档。在这种情况下,您可以通过确保事先将任何变量放入提示符来确保文档的标记也被缓存:
# if processing the same documents multiple times
prompt = f"""
{static system prompt}
{document content} # keep this before any variable instructions
{variable prompt instruction 1}
{variable prompt instruction 2}
{user question}
"""
请注意,缓存的令牌通常仅在两个请求中的前 1024 个令牌相同时才会被激活。例如,如果上例中的静态系统提示短于 1024 个令牌,则不会使用任何缓存的令牌。
# do NOT do this
prompt = f"""
{variable content} < --- this removes all usage of cached tokens
{static system prompt}
{document content}
{variable prompt instruction 1}
{variable prompt instruction 2}
{user question}
"""
您的提示应始终首先使用最静态的内容(每个请求之间的内容变化最小),最动态的内容(每个请求之间的内容变化最大)
最后的问题
您应该利用的另一种提高 LLM 性能的技术是始终将用户问题放在提示的末尾。理想情况下,您可以组织它,以便系统提示包含所有一般说明,并且用户提示仅包含用户问题,如下所示:
system_prompt = "<general instructions>"
user_prompt = f"{user_question}"
在 Anthropic 的提示工程文档中,末尾包含用户提示的状态最多可将性能提高 30%,尤其是在使用长上下文时。最后包含问题可以让模型更清楚地了解它试图实现的任务,并且在许多情况下,将带来更好的结果。
使用提示优化器
很多时候,当人类编写提示时,它们会变得混乱、不一致、包含冗余内容并且缺乏结构。因此,您应该始终通过提示优化器提供提示。
您可以使用的最简单的提示优化器是提示 LLM 改进此提示 {prompt},它将为您提供更结构化的提示,减少冗余内容,等等。
然而,更好的方法是使用特定的提示优化器,例如您可以在 OpenAI 或 Anthropic 的控制台中找到的提示优化器。这些优化器是专门提示和创建的 LLM,用于优化您的提示,通常会产生更好的结果。此外,您应该确保包括:
提供这些附加信息通常会产生更好的结果,并且您最终会得到更好的提示。在许多情况下,您只会花费大约 10-15 分钟,最终会得到性能更高的提示。这使得使用提示优化器成为提高 LLM 性能的最低努力方法之一。
基准测试 LLM
您使用的 LLM 也会显着影响 LLM 应用程序的性能。不同的 LLM 擅长不同的任务,因此您需要在特定的应用领域尝试不同的 LLM。我建议至少设置对 Google Gemini、OpenAI 和 Anthropic 等最大的 LLM 提供商的访问。设置非常简单,如果您已经设置了凭据,则切换您的 LLM 提供商只需几分钟。此外,您也可以考虑测试开源 LLM,尽管它们通常需要更多的努力。
您现在需要为您尝试实现的任务设置一个特定的基准,看看哪种 LLM 效果最好。此外,您应该定期检查模型性能,因为大型 LLM 提供商偶尔会升级他们的模型,而不一定会推出新版本。当然,您还应该准备好尝试大型 LLM 提供商推出的任何新模型。
结论
在本文中,我介绍了四种不同的技术,您可以利用它来提高 LLM 应用程序的性能。我讨论了使用缓存令牌、在提示末尾提出问题、使用提示优化器以及创建特定的 LLM 基准测试。这些设置和执行起来都相对简单,并且可以显着提高性能。
