之前已经讲过结构化提示词,但是在实际工作中,提示词这个东西基本不可能写出来就一定是可用的,很多时候都是 1 天写提示词,一周优化。。。
zero-shot
第一个版本的提示词如果写得比较简单的话,很可能是没有样本的,也就是示例,这种一般叫 zero-shot,其实就是定了规则,让模型随意发挥。
few-shot
就是给一些示例,让模型有个参考,能更好规范模型的输出,我们都知道抄作业比自己想自己写要快多了,要是抄的学霸的作业,那就是标准答案了,又快又稳,这是一个道理。
系统提示词 & 用户提示词
- 系统提示词,是对智能体预置的一些提示词,用来规范角色、行为等,还能用来做一些限制,比如禁止生成政治敏感、不道德的内容等等。
- 用户提示词,是用户输入的提示词,用来告诉模型要做什么。
比如现在打开 chatgpt 的设置,可以找到有地方能够设置回答的风格,我之前就特别不喜欢它的无限夸夸机风格,所以我切换成了一个比较严肃的风格。这个其实就是系统提示词的一部分。
和 chatgpt 对话时,我们发送的消息就是用户提示词,生成回复的时候,是优先遵循系统提示词的规则的。
我没在真正试过,但是也有网友说在各大厂商提供的聊天入口里面,其实很难让 LLM 输出敏感内容的,但是接入大模型的 api 的时候,相对就容易很多,我想这就是系统提示词的威力。
示例的位置
有论文研究表明示例放在提示词不同位置,效果也会收到影响。果然大模型还是硅基生物,所有人味都是伪装的。
我们都知道,好吧或许不是都知道,现在的 LLM 都是基于几年前 google 提出的注意力机制研发的,上下文也是有限的,而 LLM 通常更容易记住首尾两部分的内容。
论文讨论示例放在 4 个位置对模型输出的影响:
- ssp, Start of System Prompt,放在系统提示词开始的地方。
- esp, End of System Prompt,放在系统提示词结束的地方。
- sum, Start of User Message,放在用户提示词开始的地方。
- eum, End of User Message,放在用户提示词结束的地方。
最后发现 ssp 效果更好,模型越小,这几种的效果差距越明显。
COT-思维链
Chain Of Thinking,思维链,让模型一步步思考之后再得到答案,而不是直接给出答案。
最无聊的方式就是提示词中加一句“你要一步一步思考得到答案”,再进阶的玩法就是给出一步一步思考的示例,如果需要调用工具,最好是把每一步要调用的工具也给出来。
自我一致性
Self-Consistency,自我一致性,多次调用生成不同的答案,然后取其中最一致的那个作为最终答案。
- 多次调用 LLM 生成回答,最好是基数次调用,这样肯定会是一边多一边少。
- 汇总分析,写代码分析,或者直接扔给大模型分析都可以,能找出来出现频次最高的结论即可。
- 最后取出现频次最高的结论作为最终答案。
因为需要多次生成不同的回答,所以可以调节 LLM 的 temperature、top-p 参数来让大模型的回答更加具备多样性。有条件的话,甚至也可以调用多个模型生成回答,也能提升回答的多样性。
TOT-思维树
让模型探索多种方案,并对比优劣,评估给出最优的方案,防止最开始就给出错误的回答。
反思-Reflection
其实就是: 生成->反思->修订->反思->修订->…->最终答案 建立一个循环,每次生成答案后都进行反思和修订,直到最终得到一致的答案为止。
推理+行动 ReAct
ReAct,推理+行动,让模型在生成答案时,先进行推理思考,然后再执行行动得到答案。
- 思考推理:做规划,复杂推理,生成具体的执行计划,这一步可以通过 Cot 来做。
- 执行行动:根据推理结果执行具体的行动,得到结果。
- 观察反馈:根据执行结果观察反馈,判断是否得到正确的结果,如果没有则进行下一轮思考+行动,直到达成目标结果,进入总结阶段。
- 总结:根据执行结果,总结出最终的答案。