AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


「提示词缓存」如何让Token消耗降低80%
发布日期:2024-10-07 22:22:40 浏览次数: 1568


Openai最近发布又发布了一波新的功能。包括「实时API」「模型蒸馏」「多模态模型微调」「模型评估」和「提示词缓存」等。

大家可能更关注「实时API」这种新功能,但是我特别感兴趣的,其实是「Prompt Caching」这个叫做「提示词缓存」的新功能。阅读过Openai的官方文档和做了一下实验之后,就有了本篇介绍文章,希望可以帮助到有需要的朋友。

场景引入

首先,引入一个AI应用的案例场景来作为本篇文章的案例。

某学校高三年级为了节省人力成本,需要引入AI,针对英语模拟考试的写作部分做自动化的阅卷。这个场景非常适合使用AI,因为写作虽然是很主观的工作,但是高考的英语写作是命题作文,写作主题是固定的,主要考察的是单词拼写、语法、和上下文的流畅性。

简单DEMO

根据以上场景介绍,搭建一个「AI阅卷机器人」其实很简单的。

# -*- coding: utf-8 -*-
from openai import OpenAI
system_content = """
## 一、角色:
你是一名高考英语考试的阅卷人,需要针对考生的英语写作内容,进行阅卷。
## 二、阅卷要求:
写作题目满分为25分,请以JSON格式返回阅卷结果,其中value键为得分,只需要返回分值就可以。
## 三、阅卷题目:
假设你是李华,你的美术老师带你去公园上了一节美术课,请你写一封信给Chris,要帮他介绍给外国朋友去公园上了美术课之后完成的作品和感想。
## 四、写作要求:
1、写作词数应为80个左右;2、写作要紧扣主题,不得偏题;
## 五、详细判分规则:
1、每出现一个单词拼写错误扣1分;2、每出现一个语法错误扣2分;3、写作没有紧扣主题,最高只能得15分。4、写作词数少于60个,最高只能得10分。5、使用高级词汇、高级语法可以酌情加分,但不得超过25分。
"""
user_content = """
Nature has always been a source of inspiration and tranquility for me. The gentle rustling of leaves and the soothing sound of a flowing stream provide a calming backdrop to my thoughts. Walking through a forest or sitting by a lake helps me disconnect from the chaos of daily life. Observing the changing seasons reminds me of life's cycles and the beauty in transformation. Whether it's the vibrant colors of autumn or the fresh blooms of spring, nature offers endless beauty and lessons in resilience. Embracing these moments of serenity enriches my soul and rejuvenates my spirit.
"""
client = OpenAI()
completion = client.chat.completions.create(
    model="gpt-4o-mini",
    response_format={"type": "json_object"},
    messages=[
        {"role": "system", "content": system_content},
        {"role": "user", "content":user_content}
    ]
)
result = completion.choices[0].message.content
tokens_cost = completion.usage
print(result) #打印AI返回的具体结果。
print(tokens_cost) #打印AI的token消耗。

代码解释:

1、变量 system_content 存储的是给AI的提示词。

2、变量 user_content 存储的是考试的答案。

3、在调用AI时,使用JSON model,这样模式返回的内容,就会是JSON格式,方便程序做后续的进一步处理。

随便代入一篇文章,返回的结果如下。

{
  "value": 10
}
CompletionUsage(completion_tokens=9, prompt_tokens=373, total_tokens=382, prompt_tokens_details={'cached_tokens': 0}, completion_tokens_details={'reasoning_tokens': 0})

返回结果解释:

1、{"value": 10} ,AI正常返回了JSON格式的分值,格式没问题。因为我是用AI生成了一篇随机的文章,所以单词语法都没问题,但是和写作主题一点关系都没有,所以给了10分,也是合适的。

2、继续查看Token消耗的情况,我们看到总消耗是382,其中输入是373,输出是9。因为我们只要求AI返回一个分值,所以输出消耗是非常小的,占大头的是输入消耗。

现有的问题

以上的结果只是针对一个考生的结果进行阅卷,如果要针对成千上万的答卷进行阅卷,就会发现成本居高不下的问题。

1、输出token,由于我们约束了输出的内容和格式,每次都只消耗9个左右token,占总消耗的2.4%左右。

2、输入token中的user_content是考生的写作内容,示例中的大概为123个token,占总消耗的32.2%。

3、输入token中的system_content是给AI的提示词,示例中大概为250个token,占总消耗的65.4%。

4、user_content和system_content的token,是通过在线token计算器得到的。地址是:https://platform.openai.com/tokenizer

由此可以看出,输入token中的固定不变的system_content占据了总消耗的一半以上,也就是说成本上也占据了一半以上。累计成千上万的考生,这部分的成本消耗是非常高的。

提示词缓存如何解决这个问题

之前如果要解决上述的问题,一个可行的方案就是微调一个专有的小模型来处理类似的任务,但是微调模型的时间、技术、金钱成本也都不低。现在呢,使用「提示词缓存」就可以优雅解决这个问题,可以说是省心、省力、省钱。

1、根据官方文档,输入提示词的token数量大于1024时,会自动启用提示词缓存。示例中输入提示词只有373,所以,我们把system_content的内容通过简单地复制粘贴,变为原来的5倍,总的输入token变为1373。

2、同样的请求内容,先后快速请求两次,前后两次的token消耗结果如下。

CompletionUsage(completion_tokens=9, prompt_tokens=1373, total_tokens=1382, prompt_tokens_details={'cached_tokens': 0}, completion_tokens_details={'reasoning_tokens': 0})

CompletionUsage(completion_tokens=9, prompt_tokens=1373, total_tokens=1382, prompt_tokens_details={'cached_tokens': 1152}, completion_tokens_details={'reasoning_tokens': 0})

3、从两次的请求结果来看,两次的输入、输出、总消耗token都是一致的,第一次的cached_tokens为0 ,第二次的cached_tokens为1152,看起来已经自动触发了「提示词缓存」的功能。

4、第一次计费的输入token为1373,计费输出token为9,总token为1382。第二计费的输入token为221(prompt_tokens - cached_tokens),计费输出token为9,总token为230。

5、如果总共有1000份试卷需要阅卷。

(1)原先,每次需要消耗1382的token,总共需要1,382,000的token, (2)现在,第一次请求需要消耗1382的token,后续如果每次都触发提示词缓存就只有230的token。总共需要230×999+1382=231,152的token。

(3)相比来说,使用提示词缓存后,token消耗只有原先的16.7%左右。

其他问题

根据官方文档,提示词缓存还有一些其他的注意事项:

1、目前只有特定模型支持提示词缓存,如gpt-4o、gpt-4o-mini、o1-preview、o1-mini。

2、提示词缓存,不仅可以减少token消耗,还可以提升AI生成的速度。

3、提示词缓存,在符合条件下会自动启用,不需要对现有的程序做任何的改动。

4、提示词输入token大于1024时,才会触发。小于1024时,不会触发提示词缓存的功能。

5、提示词缓存的最小为1024,然后以128的单位增加,也就是cached_tokens的值为1024,1152,1280,依类推的这些128的倍数。

6、触发提示词缓存的两个重要条件是 「输入提示词的内容」 和「时间」,输入提示词要大于1024个token,且两次的请求的提示词前缀需要匹配。其次,时间上,提示词缓存在服务高峰期大于只保留5到10分钟,低峰期可以保留最多一个小时。且开发者无法手动清除这个缓存。

7、提示词缓存功能,并不会影响模型的输出效果。

总结

综上,我们可以得出一个比较反常识的结论:为了减少token消耗,降低成本,某些情况下,我们还需要增加「输入提示词」的长度。



53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询