大家可能更关注「实时API」这种新功能,但是我特别感兴趣的,其实是「Prompt Caching」这个叫做「提示词缓存」的新功能。阅读过Openai的官方文档和做了一下实验之后,就有了本篇介绍文章,希望可以帮助到有需要的朋友。
ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;display: table;padding-right: 0.2em;padding-left: 0.2em;color: rgb(255, 255, 255);background: rgb(15, 76, 129);">场景引入ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.1em;color: rgb(63, 63, 63);">首先,引入一个AI应用的案例场景来作为本篇文章的案例。ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.1em;color: rgb(63, 63, 63);">某学校高三年级为了节省人力成本,需要引入AI,针对英语模拟考试的写作部分做自动化的阅卷。这个场景非常适合使用AI,因为写作虽然是很主观的工作,但是高考的英语写作是命题作文,写作主题是固定的,主要考察的是单词拼写、语法、和上下文的流畅性。ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;display: table;padding-right: 0.2em;padding-left: 0.2em;color: rgb(255, 255, 255);background: rgb(15, 76, 129);">简单DEMOingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.1em;color: rgb(63, 63, 63);">根据以上场景介绍,搭建一个「AI阅卷机器人」其实很简单的。ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-feature-settings: normal;font-variation-settings: normal;font-size: 14px;margin: 10px 8px;color: rgb(171, 178, 191);background: rgb(40, 44, 52);letter-spacing: normal;text-align: left;line-height: 1.5;overflow-x: auto;border-radius: 8px;">#-*-coding:utf-8-*-
fromopenaiimportOpenAI
system_content="""
##一、角色:
你是一名高考英语考试的阅卷人,需要针对考生的英语写作内容,进行阅卷。
##二、阅卷要求:
写作题目满分为25分,请以JSON格式返回阅卷结果,其中value键为得分,只需要返回分值就可以。
##三、阅卷题目:
假设你是李华,你的美术老师带你去公园上了一节美术课,请你写一封信给Chris,要帮他介绍给外国朋友去公园上了美术课之后完成的作品和感想。
##四、写作要求:
1、写作词数应为80个左右;2、写作要紧扣主题,不得偏题;
##五、详细判分规则:
1、每出现一个单词拼写错误扣1分;2、每出现一个语法错误扣2分;3、写作没有紧扣主题,最高只能得15分。4、写作词数少于60个,最高只能得10分。5、使用高级词汇、高级语法可以酌情加分,但不得超过25分。
"""
user_content="""
Naturehasalwaysbeenasourceofinspirationandtranquilityforme.Thegentlerustlingofleavesandthesoothingsoundofaflowingstreamprovideacalmingbackdroptomythoughts.Walkingthroughaforestorsittingbyalakehelpsmedisconnectfromthechaosofdailylife.Observingthechangingseasonsremindsmeoflife'scyclesandthebeautyintransformation.Whetherit'sthevibrantcolorsofautumnorthefreshbloomsofspring,natureoffersendlessbeautyandlessonsinresilience.Embracingthesemomentsofserenityenrichesmysoulandrejuvenatesmyspirit.
"""
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消耗。ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.1em;color: rgb(63, 63, 63);">代码解释:ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;padding: 1em;border-radius: 8px;color: rgba(0, 0, 0, 0.5);background: rgb(247, 247, 247);">ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 1em;letter-spacing: 0.1em;color: rgb(80, 80, 80);">1、变量 system_content 存储的是给AI的提示词。2、变量 user_content 存储的是考试的答案。
3、在调用AI时,使用JSONmodel,这样模式返回的内容,就会是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消耗,降低成本,某些情况下,我们还需要增加「输入提示词」的长度。
| 欢迎光临 链载Ai (https://www.lianzai.com/) | Powered by Discuz! X3.5 |