Skip to content

Latest commit

 

History

History
384 lines (234 loc) · 26.8 KB

万字长文Prompt-Engineering-解锁大模型的力量.md

File metadata and controls

384 lines (234 loc) · 26.8 KB

你知道周期性函数只要满足狄利克雷条件,傅里叶级数就能完美地表示它;

你知道在没有观测之前,原子处于衰变和未衰变的叠加状态,因此薛定谔的猫也处于既死又活的叠加状态,直到有人打开盒子进行观测;

你知道世事洞明皆学问,人情练达即文章;

你知道如何让800公斤的牛安全地通过一座承重700公斤的桥;

你知道夏目漱石将“I Love You”翻译成“今晚月色真美”;

面对喜欢的人时,你却不知道从何说起。每次打开聊天框,脑海里浮现的只有简单的“在吗?”

一,导入

现象级产品

alt text

超简单的UI

alt text

二,基本概念

alt text

alt text

alt text

Prompt Engineering==如何有效沟通(人机)

Prompt Engineering 是优化 prompts 以获得有效输出的艺术和科学。它涉及设计、编写和修改 prompts,以引导 AI 模型生成高质量、相关且有用的响应。

alt text

Prompt Engineering 的重要性

Prompt Engineering 对于有效使用AI模型至关重要,因为它可以:

  • 提高模型输出的质量和相关性
  • 减少模型生成有害或不适当响应的可能性
  • 调整模型的输出以满足特定需求
  • 探索模型的全部潜力

alt text

Prompts 的组成部分

System message(Instruction):定义LLM的角色 Human message(Question):每一次问询 History message:历史记录

alt text

alt text

个性化设置

alt text

Temperature

alt text

Top-p

alt text

上下文的消息数量上限

Memory/History

上下文的最大Token数:Token

生成回答的最大Token数

alt text

三,Prompt Engineering 实践1

1.写下清晰的指示

alt text

模型无法读懂你的想法。 如果你觉得输出太长,就要求简短答复。 觉得输出太简单,就要求专家级别的写作。 如果不喜欢这种格式,就演示希望看到的格式。 模型猜测你想要什么的次数越少,得到想要回答的可能性就越大。 PS: 如果你想让你老公买个包当礼物,就和他说想要个包,不要说:你猜猜我闺蜜的老公给他买什么了? 如果你想让你老婆买个游戏机当礼物,呃,那不好意思,你就接着想吧。。。

1.1 在查询中包含详细信息以获得更相关的答案

为了获得高度相关的回答,确保提供的是“重要且详细的信息”;不要让模型来猜测你的意思。

alt text

1.2 要求模型采用某种角色

System message可用于指定模型在其回复中使用的角色。

alt text

1.3 使用分隔符清楚地指示输入的不同部分

三引号、XML 标签、节标题等分隔符可以帮助划分要区别对待的段落。

翻译任务

Language models can confidently invent fake answers, especially when asked about esoteric topics or for citations and URLs. In the same way that a sheet of notes can help a student do better on a test, providing reference text to these models can help in answering with fewer fabrications.

谷歌翻译

alt text

结果:语言模型可以自信地发明假答案,特别是当被问及深奥的主题或引文和 URL 时。 就像一张笔记可以帮助学生在考试中取得更好的成绩一样,为这些模型提供参考文本可以帮助减少作答次数

LLM

alt text

prompts: 将下述文本翻译成中文,要用专业术语,并符合中国人的阅读习惯,''' Language models can confidently invent fake answers, especially when asked about esoteric topics or for citations and URLs. In the same way that a sheet of notes can help a student do better on a test, providing reference text to these models can help in answering with fewer fabrications.'''

completions: 语言模型可以自信地编造虚假答案,尤其是在被问及深奥的主题或引用和网址时。就像一张笔记可以帮助学生在考试中取得更好的成绩一样,为这些模型提供参考文本有助于减少虚构的回答

1.4 指定完成任务所需的步骤

有些任务最好指定为一系列步骤。明确地写出这些步骤可以使模型更容易遵循它们。 在写论文的时候,一般都需要写英文摘要。怎么让AIGC生成英文摘要呢?

System :使用以下步骤说明来回答用户输入。 第1步 - 用户将为你提供三引号中的文本。 用一个句子总结这段文字,并加上前缀“摘要:”; 第2步 - 将第1步中的摘要翻译成英文,并添加前缀“翻译:”。 User:''' 上了八九年班了,也带了七八届研究生,博士生也带毕业了三届了。 形形色色的学生见了不少,有哭哭啼啼的娇小姐型的,有天资聪颖却混日子的,有锐意进取的,也有棒子打着也走不动的…… 总结下来一句话,有好结果的,都是那种爱“哭”的、主动的找“奶”吃的学生。 爱哭,不是贬义。幼儿哭,是因为饿了,所以有寻找的动力。 研究生也是一样,知道自己的不足了,有补足的愿望和动力。他们一方面会积极主动地自己去通过看文献、论坛交流的方法去补足,另一方面他们也会主动地去找导师来沟通、来寻求指导,从而使自己进步。'''

AI: 摘要: 文中描述了作者多年来带过的各种学生类型,指出那些愿意主动寻求帮助的学生通常会取得好的结果。

翻译: Summary: The text describes various types of students the author has encountered over the years, pointing out that students who are willing to seek help proactively tend to achieve good results.

alt text

1.5 提供示例

提供说明通常比通过示例更有效,但在某些情况下,提供示例可能更容易。例如,希望模型复制一种难以明确描述的特定风格来响应用户查询。这被称为“小样本”提示,Few-shot learning

alt text

1.6 指定所需的输出长度

要求模型生成具有给定目标长度的输出。 目标输出长度可以根据单词、句子、段落、要点等的计数来指定。

  • 大约

alt text

  • 不超过

alt text

  • 两句话

alt text

二,提供参考文字

语言模型可以自信地编造虚假答案,尤其是在被问及深奥的主题或引用和网址时(大模型的幻觉问题)。就像一张小抄可以帮助学生在考试中取得更好的成绩一样,为这些模型提供参考文本有助于减少虚构的回答。

2.1 指示模型使用参考文本回答

Prompts-System:使用提供的由三重引号引起来的文章来回答问题。如果在文章中找不到答案,请写“我找不到答案”。

alt text

  • case1

'''上了八九年班了,也带了七八届研究生,博士生也带毕业了三届了。 形形色色的学生见了不少,有哭哭啼啼的娇小姐型的,有天资聪颖却混日子的,有锐意进取的,也有棒子打着也走不动的…… 总结下来一句话,有好结果的,都是那种爱“哭”的、主动的找“奶”吃的学生。 爱哭,不是贬义。幼儿哭,是因为饿了,所以有寻找的动力。 研究生也是一样,知道自己的不足了,有补足的愿望和动力。他们一方面会积极主动地自己去通过看文献、论坛交流的方法去补足,另一方面他们也会主动地去找导师来沟通、来寻求指导,从而使自己进步。 比如我遇到的这三位学生: 胡某博士后,非常努力勤奋的一个人。当时她的课题陷入停滞、找不到方向,博士后出站前半年,她在组会上向大家提出请求,我当时刚入职,就说你可以试试往哪个方向做做,于是她就做了,从我提出建议到她的文章发表(Cancer Letters),不到半年,然后顺利出站。之后国自然等也顺理成章了。 博士B,大领导的博士,我带的,很积极主动,当时她做的课题是我的国自然青年课题,我们两个自然就这个课题进行了很多的探索,她更在此基础上积极探索,找到了自己的研究方向,后来也中了国自然,到了新的工作单位后也是独当一面。 博士H,也是一个很主动的学生。当时给她找了一个新基因做,一切从零开始,其实很艰难,因为一些结果是反常识的,一些结果是相互矛盾的。她是个很严谨的人,所以就觉得做不下去了,就来找我,她会提出自己的观点和疑问,然后我就得一边给她讲可能的解原因,一边给她鼓劲,我也得使劲学习才能解答她的一些问题。这样的交流持续了3、4年,按她的说法,我们是“吵了”3年。在这样的吵吵闹闹中,我们把这个基因起死回生,并且扩展了新的研究领域,提出了新的理论。虽然她因为工作需要没能做完这个课题就毕业了,但对这个基因的研究起了很大的作用。 反例似乎就是我自己了。读研究生的时候,我和导师沟通的比较少,只是凭着一股热情在那里做实验,没有预期结果,那就重复再重复,所以最后也没做出啥东西来。毕业答辩的时候,导师说对我的印象就是“你的力气挺大的”。 所以,研究生大凡想做出点成绩,主动性是不可少的。 爱哭,知道自己的需要,知道自己的不足,然后能主动,有内驱力,可以驱使自己奋力向前,能主动去寻找外部的指导和帮助,从而使工作的效率能最大化。而导师也是喜欢这样的学生的。 导师的优势在于已经建立一个相对完善的知识架构,对整体的掌控比较好,但对于某一点要做到细致的把握就比较难,因为没有那么多的精力和时间了,而且思维难免落于窠臼,正好需要学生不拘一格、不落俗套、甚至大胆、叛逆的想法来“刺激”一下,教学相长,才能出更好的成果。 如果学生积极主动地来找导师“哭诉”,导师高兴还来不及呢。相反,要是学生基本不来找导师,甚至导师主动来找他他也没啥可说的,甚至需要导师催着、逼着去探索,用不了几次,导师也心灰意冷了,带不动啊。 所以,不管是硕士还是博士,做个爱“哭”的研究生吧。'''

问题:什么样的研究生才会有发展?

Completion: 爱“哭”的、主动的找“奶”吃的研究生才会有发展。这种研究生不仅知道自己的需要和不足,而且能够主动寻求外部的指导和帮助,具有内驱力,能够驱使自己努力向前。他们会积极主动地通过各种途径补足知识,与导师沟通交流,不断探索和进取,从而提高工作效率,取得更好的成果。这样的研究生能够激发导师的兴趣和潜力,促进双方共同进步,取得更好的研究成果。

alt text

  • case2

alt text

2.2 指示模型通过引用参考文本来回答

Prompt-system: 使用提供的由三重引号引起来的文章来回答问题。如果在文章中找不到答案,请写“我找不到答案”。如果提供了问题的答案,则必须附有引文注释。 使用以下格式引用相关段落({“引用”:…})。

alt text

  • case3

'''上了八九年班了,也带了七八届研究生,博士生也带毕业了三届了。 形形色色的学生见了不少,有哭哭啼啼的娇小姐型的,有天资聪颖却混日子的,有锐意进取的,也有棒子打着也走不动的…… 总结下来一句话,有好结果的,都是那种爱“哭”的、主动的找“奶”吃的学生。 爱哭,不是贬义。幼儿哭,是因为饿了,所以有寻找的动力。 研究生也是一样,知道自己的不足了,有补足的愿望和动力。他们一方面会积极主动地自己去通过看文献、论坛交流的方法去补足,另一方面他们也会主动地去找导师来沟通、来寻求指导,从而使自己进步。 比如我遇到的这三位学生: 胡某博士后,非常努力勤奋的一个人。当时她的课题陷入停滞、找不到方向,博士后出站前半年,她在组会上向大家提出请求,我当时刚入职,就说你可以试试往哪个方向做做,于是她就做了,从我提出建议到她的文章发表(Cancer Letters),不到半年,然后顺利出站。之后国自然等也顺理成章了。 博士B,大领导的博士,我带的,很积极主动,当时她做的课题是我的国自然青年课题,我们两个自然就这个课题进行了很多的探索,她更在此基础上积极探索,找到了自己的研究方向,后来也中了国自然,到了新的工作单位后也是独当一面。 博士H,也是一个很主动的学生。当时给她找了一个新基因做,一切从零开始,其实很艰难,因为一些结果是反常识的,一些结果是相互矛盾的。她是个很严谨的人,所以就觉得做不下去了,就来找我,她会提出自己的观点和疑问,然后我就得一边给她讲可能的解原因,一边给她鼓劲,我也得使劲学习才能解答她的一些问题。这样的交流持续了3、4年,按她的说法,我们是“吵了”3年。在这样的吵吵闹闹中,我们把这个基因起死回生,并且扩展了新的研究领域,提出了新的理论。虽然她因为工作需要没能做完这个课题就毕业了,但对这个基因的研究起了很大的作用。 反例似乎就是我自己了。读研究生的时候,我和导师沟通的比较少,只是凭着一股热情在那里做实验,没有预期结果,那就重复再重复,所以最后也没做出啥东西来。毕业答辩的时候,导师说对我的印象就是“你的力气挺大的”。 所以,研究生大凡想做出点成绩,主动性是不可少的。 爱哭,知道自己的需要,知道自己的不足,然后能主动,有内驱力,可以驱使自己奋力向前,能主动去寻找外部的指导和帮助,从而使工作的效率能最大化。而导师也是喜欢这样的学生的。 导师的优势在于已经建立一个相对完善的知识架构,对整体的掌控比较好,但对于某一点要做到细致的把握就比较难,因为没有那么多的精力和时间了,而且思维难免落于窠臼,正好需要学生不拘一格、不落俗套、甚至大胆、叛逆的想法来“刺激”一下,教学相长,才能出更好的成果。 如果学生积极主动地来找导师“哭诉”,导师高兴还来不及呢。相反,要是学生基本不来找导师,甚至导师主动来找他他也没啥可说的,甚至需要导师催着、逼着去探索,用不了几次,导师也心灰意冷了,带不动啊。 所以,不管是硕士还是博士,做个爱“哭”的研究生吧。'''

问题:什么样的研究生才会有发展??

Completion: 根据提供的文章内容,一个会有发展的研究生是那种爱“哭”的、主动的找“奶”吃的学生。这种学生会积极主动地寻找外部的指导和帮助,知道自己的需要和不足,并有内驱力来奋力向前。他们会与导师沟通,寻求指导,并努力补足自己的不足,以提高工作效率和取得更好的成果。总的来说,主动性和愿意寻求帮助的态度是一个研究生能够取得发展的关键因素。 {“引用”:'''总结下来一句话,有好结果的,都是那种爱“哭”的、主动的找“奶”吃的学生。''','''如果学生积极主动地来找导师“哭诉”,导师高兴还来不及呢。相反,要是学生基本不来找导师,甚至导师主动来找他他也没啥可说的,甚至需要导师催着、逼着去探索,用不了几次,导师也心灰意冷了,带不动啊。''','''所以,不管是硕士还是博士,做个爱“哭”的研究生吧。'''}

alt text

三,将复杂的任务拆分为更简单的子任务

正如软件工程中将复杂系统分解为一组模块化组件是良好实践一样,提交给语言模型的任务也是如此。 复杂的任务往往比简单的任务具有更高的错误率。 此外,复杂的任务通常可以被重新定义为更简单任务的工作流程,其中早期任务的输出用于构造后续任务的输入。

大模型基础应用框架 (ReACT\SFT\RAG) 创新及零售业务落地

alt text

3.1 使用意图分类来识别与用户查询最相关的指令

对于需要大量独立指令集来处理不同情况的任务,首先对查询类型进行分类并使用该分类来确定需要哪些指令可能是有用的。 产品,研发 Attention!!!:接下来你会看到两组不同的QA,我们最终会把它们组合成状态机。

alt text

根据客户查询的分类,可以向模型提供一组更具体的指令,以供其处理后续步骤。 例如,假设客户需要“故障排除”方面的帮助。

alt text

alt text

alt text

Attention! 请注意,模型已被指示发出特殊字符串来指示对话状态何时发生变化。 这使我们能够将我们的系统变成一个状态机,其中状态决定注入哪些指令。 思考:如果让你来设计一个智能客服产品,你该如何做?如果让你开发一个智能客服,你有什么想法吗?

3.2 对于需要很长对话的对话应用程序,总结或过滤以前的对话分段

由于模型具有固定的上下文长度,因此用户和助手之间的对话(其中整个对话都包含在上下文窗口中)无法无限期地继续。 解决此问题有多种解决方法,其中之一是总结对话中的先前回合。 一旦输入的大小达到预定的阈值长度,这可能会触发总结部分对话的查询,并且先前对话的摘要可以作为系统消息的一部分包括在内。 或者,可以在整个对话过程中在后台异步总结之前的对话。 另一种解决方案是动态选择与当前查询最相关的对话的先前部分。

3.3 总结长文档并递归地构建完整的摘要

由于模型具有固定的上下文长度,因此它们不能用于总结长特别长的长文本。 要总结一个很长的文档(例如一本书),我们可以使用一系列查询来总结文档的每个部分。 章节的摘要可以再次连接和总结,生成摘要的摘要。 这个过程可以递归地进行,直到总结整个文档。

四,给模型时间“思考”

alt text

如果要求将 13 乘以 19,你可能不会立马算出来,但给点时间还是可以的。 同样,模型在尝试立即回答而不是花时间找出答案时会犯更多推理错误。 在给出答案之前询问COT“思维链”可以帮助模型更可靠地推理出正确答案。

下面我们来看一个辅导作业的案例

alt text

4.1指示模型在急于得出结论之前找出自己的解决方案

有时,当我们明确指示模型在得出结论之前要从第一性原理进行推理时,我们会得到更好的结果。 假设我们想要一个模型来评估学生对数学问题的解决方案。 解决这个问题最明显的方法是简单地询问模型学生的解决方案是否正确。但这样真的会得到正确的回答吗?

错误的案例

alt text

正确的案例

alt text

alt text

4.2使用内心独白或一系列查询来隐藏模型的推理过程

前面的策略表明,模型有时在回答特定问题之前详细推理问题很重要。 对于某些应用程序,模型用于得出最终答案的推理过程不适合与用户共享。 例如,在辅导应用程序中,我们可能希望鼓励学生得出自己的答案,但模型关于学生解决方案的推理过程可能会向学生揭示答案。 内心独白是一种可以用来缓解这种情况的策略。 内心独白的想法是指示模型将原本对用户隐藏的部分输出放入结构化格式中,以便于解析它们。 然后,在向用户呈现输出之前,将解析输出并且仅使部分输出可见。

alt text

alt text

4.3询问模型是否错过了之前的任何内容

假设我们正在使用一个模型来列出与特定问题相关的来源的摘录。 列出每个摘录后,模型需要确定是否应该开始编写另一个摘录或者是否应该停止。 如果源文档很大,模型通常会过早停止并且无法列出所有相关摘录。 在这种情-况下,通过使用后续查询提示模型查找之前传递中错过的任何摘录,通常可以获得更好的性能。

五,使用外部工具

通过向模型提供其他工具的输出来弥补模型的弱点。 例如,文本检索系统(有时称为 RAG 或检索增强生成)可以告诉模型相关文档。 像 OpenAI 的代码解释器这样的代码执行引擎可以帮助模型进行数学运算并运行代码。

5.1使用基于嵌入的搜索来实现高效的知识检索

Embedding

如果作为输入的一部分提供,模型可以利用外部信息源。 这可以帮助模型生成更明智和最新的响应。 例如,如果用户询问有关特定电影的问题,则将有关电影的高质量信息(例如演员、导演等)添加到模型的输入中可能会很有用。 Embedding 可用于实现高效的知识检索,从而可以在运行时动态地将相关信息添加到模型输入中。

Text Embedding是一个可以衡量文本字符串之间相关性的向量Vector。 相似或相关的字符串比不相关的字符串更接近。 这一事实以及快速向量搜索算法的存在意味着Embedding可以用于实现高效的知识检索。

5.2使用代码执行来进行更精确的计算或调用外部API

不能依赖语言模型自行准确地执行算术或长时间计算。 在需要的情况下,可以指示模型编写和运行代码,而不是进行自己的计算。 P.S. 使用工具的demo在文末的GitHub链接里

Prompt高阶--ReAct展示:

Combining reasoning and action in LLMs

人类是怎么解决复杂问题的?Q-T-A-O

  • Question

alt text

  • Thought

alt text

  • Action

alt text

  • Observation

alt text

  • Again

alt text

alt text

如何进行ReAct? Prompts!

alt text

alt text

Demo:Talk is Cheap,Show Me the Code:

alt text

给出了使用工具并进行ReAct的小demo

https://github.com/luhengshiwo/LLMForEverybody/blob/main/ReAct/PromptEngineeringReAct.ipynb

总结

希望大家能够提高和LLM的沟通效率,多多搞钱!

Before:

alt text

After:

alt text

参考

[1] openai prompt engineering guides

[2] generative-ai-with-llms

[3] GitHub: LLMForEverybody