Andrew 春风满面,亲自参与的这个提示工程的课程,很浅显易懂,肯定会风行。Andrew 说,稍微复杂一点的任务,没有一个好的 prompt 是一枪命中的,总要反复尝试 最后才满意。这与码农编程序一样,谁不经过反复调试就能写出好的程序呢。
然后他说,LLM 的好处是你可以反复跟它磨叽,不管啥事。要是以前的 AI,你得一个一个的任务去建模,每个任务从标注数据,培训模型,测试,部署,好不容易上线了,结果换了个任务,所有的过程要重来一遍。现在这样一个 LLM 你反复“压榨”它,它的知识和学问如此之大,好像榨取不完,可以做各种任务,的确是范式转变。
【原则1: 提示要具体】
提示工程首先要 “write clear and specific instructions”. 这个其实大家都有体会,跟 chat 这种庞然大物玩,它脑袋那么大,里面的“知识/思想/意义”的电路各种节点,纵横交错,相互勾连,密密麻麻。要想用提示词激发让你满意的回应,就需要确保所激发的那一小块电路对应了你所想得到的答案。你的提示词越具体(表达了你心中的疑问就越确切),chat 的回答自然也越对路。这个道理和体验很容易get,但具体的技巧需要细化,这就是上课的好处。
【原则1技巧1:使用分隔符】
“The first tactic is to use delimiters to clearly indicate distinct parts of the input.” 什么意思?就是要求提示词中首先要把任务指令与任务的处理对象分开,要求用分隔符把处理对象明确标出来。这一点,多数人容易忽略,结果是,chat 经常把任务的某些描述词也当成了任务的对象,或者把任务的处理对象当成指令的一部分,这在逻辑上叫做层次纠缠(任务是“元语言”,对象是待处理的输入语言,不可混淆)。这个毛病我以前也常见,一直没意识到这其实是因为对提示词层次不够注意,违反了第一原则的第一技巧实操(best practice)。
这里 delimiters 就是引号。chat 就知道这是其摘要处理的对象。否则,如果提示词中任务描述较长,模型有可能把任务本身也当成所要处理的对象,以前遭遇过这种后果的。
【原则1技巧2】让模型输出表格化。
“This tactic is to ask for a structured output.” 提示词任务中最后加一句:in tabular/json/html format with the following keys: Key1, Key2, Key3。很多时候,表格化输出看上去更酷,也更方便后续存贮和处理。
【原则1技巧3】可以用 IF ... THEN ...
原讲义说的是:“to ask the model to check whether conditions are satisfied”. 这实际上就把编程中最重要的条件分叉能力带入了自然语言提示词的指令。一般人想不到提示词还可以这么做。可以用自然语言模拟程序代码,让机器分别不同条件决定采取何种动作。
if-then 你学会了吗?
宋柔:你问它:第一步中洗净五花肉的动作者是哪个,第六步中把什么下入温水,第十步中出锅食用的是什么。
难不住它吧,它不仅仅是大号鹦鹉,它有(一些)常识。
宋柔:但是我估计最后一个问题“第十步出锅食用的是什么”它答不对。它可能说“五花肉”,但实际上应该是“红烧肉”。生的是五花肉,做熟了是红烧肉。
是红烧五花肉呀。一定要说红烧熟了的五花肉吗?
孺子可教。其实不能怪它缺乏常识,要怪就怪中文,cooked 与 cooking 全不分。“红烧肉”实际上既是名词(定中结构)也是动词短语(动宾结构),到哪里说理去。
宋柔:如果有食谱知识,应该说红烧肉,五花肉是材料,红烧是做法,成品是红烧肉。“面粉1斤,加水和好,发酵搓揉后切成5段,切成长方块,放入笼屉中,大火蒸30分钟,掀开笼屉便可吃了”。请问可吃的是什么?
宋柔:不容易。确实有常识了。但是仅凭长方块而排除包子显然不大正确。包子一定有馅,但制作过程没加馅。
总之,除了缺了口热乎气儿,它就是个人,是个会犯懒,也会犯错误的人。
【原则1技巧4】可以用 few shots 示例。
所谓 few-shot prompting,基本上就是用案例让模型知道要做什么,要求照葫芦画瓢。例如:
曾几何时,还在 GPT3 刚放出来的时候,圈子内的粉丝们都到它的 playground 去玩,当时的主要技巧就是 few shots,因为 ChatGPT 之前,zero shot 的能力还没成熟。等到 ChatGPT 能直接听懂人的指令,zero shot 很好使,用户自然而然就不再使用啰嗦的 few shots。但实际上,并不影响你继续使用 few shots,或与 zero shot 一起用。在有些不大容易说清楚的任务上,拿 few shots 补充 zero shot 可以加强效果。
【原则2: 让模型有时间“思考”】
【原则2技巧1】为复杂的任务列出步骤。
这项技巧的原文这样要求:“specify the steps required to complete a task.”
上述提示词遵循了 best practice:1. 用了分隔符三个反引号;2. 任务分解为一系列步骤或子任务;3. 对输出提出了格式化要求。
感觉这就是在编程序,是自然语言的低代码形式,自然语言让人人可以成为程序猿,指挥机器做我们想要它做的事儿。
【原则2技巧2】要求模型独立解题。
看上去就是以前说的 step by step (思维链)解题指令,原文说得更像个对于辅导员的要求:“Our next tactic is to instruct the model to work out its own solution before rushing to a conclusion.” 尤其是在智能教育场景,希望模型先独立一步一步做题,然后再去充当老师给学生评判作业。
所示范的案例是评阅数学问题。有一个数学问题,也有学生的解答。
Determine if the student's solution is correct or not. Question: I'm building a solar power installation and I need help working out the financials. - Land costs $100 / square foot - I can buy solar panels for $250 / square foot - I negotiated a contract for maintenance that will cost me a flat $100k per year, and an additional $10 / square foot What is the total cost for the first year of operations as a function of the number of square feet. Student's Solution: Let x be the size of the installation in square feet. Costs: 1. Land cost: 100x 2. Solar panel cost: 250x 3. Maintenance cost: 100,000 + 100x Total cost: 100x + 250x + 100,000 + 100x = 450x + 100,000
学生的解答实际上是错误的,因为他们将维护成本计算为10万美元加上100x,但实际上应该是10x,因为每平方英尺只要10美元($10 / square foot),其中x是安装面积的大小,按平方英尺算。所以这实际上应该是360x加上10万美元。让模型评判,它会说学生的解答是正确的。模型只是浏览了一下,就同意了学生的看法。可以通过指示模型先自己解决问题并将其解决方案与学生的解决方案进行比较来解决这个问题。看提示词是怎么指示的:
prompt = f""" Your task is to determine if the student's solution is correct or not. To solve the problem do the following: - First, work out your own solution to the problem. - Then compare your solution to the student's solution and evaluate if the student's solution is correct or not. Don't decide if the student's solution is correct until you have done the problem yourself. Use the following format: Question: ``` question here ``` Student's solution: ``` student's solution here ``` Actual solution: ``` steps to work out the solution and your solution here ``` Is the student's solution the same as actual solution just calculated: ``` yes or no ``` Student grade: ``` correct or incorrect ``` Actual solution: """
这个提示很长。因此,我们在这个提示中告诉模型要做什么。你的任务是确定学生的解决方案是否正确。为了解决这个问题,请执行以下操作。首先,解决问题。然后将你的解决方案与学生的解决方案进行比较,并评估学生的解决方案是否正确。在你自己做完问题之前不要决定学生的解决方案是否正确。确保你自己做了这个问题。因此,我们已经使用了相同的技巧来使用以下格式。因此,格式将是问题、学生的解决方案、实际的解决方案。然后是解决方案是否一致,是或否。然后是学生的成绩,正确或不正确。
如你所见,模型实际上会先计算出自己的答案。然后,它得到了正确的答案。然后,在被要求与学生的解决方案进行比较时,它意识到它们不一致。因此,学生实际上是不正确的。这是一个例子,说明学生的解决方案是正确的,而实际上学生的解决方案是错误的。这是如何要求模型自己进行计算,并将任务分解为步骤以给模型更多时间来思考,从而帮助您获得更准确的响应的示例。
《AI浪潮博客目录》
抄吴恩达的课程不注明出处
本文第一句话加上超链就是出处。不过没像学术论文那么严谨。文末现在也加上了。thanks