基本概念
prompt: prompt包括system prompt和user prompt。system prompt会持续性影响模型的回复,常用于人设的设定; user prompt就更偏向于我们平时提供的输入。
completion: 模型给你的回复。
temperature: 用于控制模型的创意性程度,0最保守,1则更具有创意性
调用大模型API
调用大模型API使用的prompt主要包含两个原则,分别是使用清晰,具体的指令和给模型时间去思考。使用清晰具体的指令很好理解,但给模型时间去思考并不是说sleep等待的意思,我的理解是将任务分解,让模型的逻辑更加清晰。
使用清晰,具体的指令
-
使用分割符
一开始我使用官方的prompt得到回答使用分割符和没使用分割符没有区别。之后我换了自己的问题,将“你是谁”换成了“你有意识吗”。使用分割符和不使用分割符的差别马上可以分辨出来。第一张图是使用分割符的运行截图,第二张图是没有使用分割符的运行截图。(第一张图的回答有点吓人)
-
结构化输出
为了方便python处理大模型的输出,常常会让模型输出的结果以JSON的格式返回。记得要指定JSON输出的键值,不然可能键值不是你想要的。如下图所示是指定了键值和没指定键值的运行结果
-
要求模型检查是否满足条件
如果模型不满足条件则停止执行后面的步骤,防止意外和错误发生。有点像写程序里的if最后总要跟个else来兜底,处理一些异常情况。例如教程里给的例子就很好的处理了没有与其指令的输入。 -
提供少量实例
“Few-shot” prompting(少样本提示),即在要求模型执行实际任务之前,给模型提供一两个参考样例,让模型了解我们的要求和期望的输出样式。这个也很好理解,我们学习的时候也会通过例子来加深理解。
给模型时间去思考
- 指定完成任务所需的步骤
教程里给的例子很详细,也很容易理解,此处不再赘述。总之就是尽量把复杂的问题细分成一个个简单的问题。模型生成的结果还是不错的。
- 在模型下结论前先找到自己的解法
对比下面两种prompt,第一种让模型直接得出对错的结论有点难,甚至可能得出错误的结论。
prompt = f"""
判断学生的解决方案是否正确。
问题:
我正在建造一个太阳能发电站,需要帮助计算财务。
土地费用为 100美元/平方英尺
我可以以 250美元/平方英尺的价格购买太阳能电池板
我已经谈判好了维护合同,每年需要支付固定的10万美元,并额外支付每平方英尺10美元
作为平方英尺数的函数,首年运营的总费用是多少。
学生的解决方案:
设x为发电站的大小,单位为平方英尺。
费用:
土地费用:100x
太阳能电池板费用:250x
维护费用:100,000美元+100x
总费用:100x+250x+100,000美元+100x=450x+100,000美元
"""
prompt = f"""
请判断学生的解决方案是否正确,请通过如下步骤解决这个问题:
步骤:
首先,自己解决问题。
然后将您的解决方案与学生的解决方案进行比较,对比计算得到的总费用与学生计算的总费用是否一致,
并评估学生的解决方案是否正确。
在自己完成问题之前,请勿决定学生的解决方案是否正确。
使用以下格式:
问题:问题文本
学生的解决方案:学生的解决方案文本
实际解决方案和步骤:实际解决方案和步骤文本
学生计算的总费用:学生计算得到的总费用
实际计算的总费用:实际计算出的总费用
学生计算的费用和实际计算的费用是否相同:是或否
学生的解决方案和实际解决方案是否相同:是或否
学生的成绩:正确或不正确
问题:
我正在建造一个太阳能发电站,需要帮助计算财务。
- 土地费用为每平方英尺100美元
- 我可以以每平方英尺250美元的价格购买太阳能电池板
- 我已经谈判好了维护合同,每年需要支付固定的10万美元,并额外支付每平方英尺10美元;
作为平方英尺数的函数,首年运营的总费用是多少。
学生的解决方案:
设x为发电站的大小,单位为平方英尺。
费用:
1. 土地费用:100x美元
2. 太阳能电池板费用:250x美元
3. 维护费用:100,000+100x=10万美元+10x美元
总费用:100x美元+250x美元+10万美元+100x美元=450x+10万美元
实际解决方案和步骤:
"""
如果引导模型先自己自主思考解决问题,再来判断正确与否,可以得到更准确的结果。模型的输入结果如下图所示。第一张是直接判断对错,第二张图是引导模型自己县先解决问题再判断对错。第二种prompt得到的结果是对的。但对于这种问题感觉还是目前大模型的一个缺陷,只能通过prompt来修复这个缺陷,希望后面能够有办法解决这个问题。
大语言模型的幻觉问题:模型一本正经的胡说八道。