赞
踩
本文旨在让无大模型开发背景的工程师或者技术爱好者无痛理解大语言模型应用开发的理论和主流工具,因此会先从与LLM应用开发相关的基础概念谈起,并不刻意追求极致的严谨和完备,而是从直觉和本质入手,结合笔者调研整理及消化理解,帮助大家能够更容易的理解LLM技术全貌,大家可以基于本文衍生展开,结合自己感兴趣的领域深入研究。若有不准确或者错误的地方也希望大家能够留言指正。
本文体系完整,内容丰富,由于内容比较多,分多次连载。
第一部分 基础概念
1.机器学习场景类别
2.机器学习类型(LLM相关)
3.深度学习的兴起
4.基础模型
第二部分 应用挑战
1.问题定义与基本思路
2.基本流程与相关技术
1)Tokenization与Embbeding
2)向量数据库
3)finetune(微调)
4)模型部署与推理
5)prompt
6)编排与集成
7)预训练
第三部分 场景案例
常用参考
2.基本流程与相关技术
4)Prompt
在前面的内容里,我们提到过要使用模型完成下游任务,有两种方式,一种是通过收集标记样本针对不同的任务进行指令微调,另一种方式便是大模型特有的,可以通过将指令以对话的方式提供给模型,期待模型能够给我们返回预期的结果。相较于前者,后者具有更高的灵活性,使用成本也更低,因此,这一方式成了如今大语言模型区别于传统NLP模型的重要标志。
在本章你将学习到:
1)Prompt,In-Context-Learning,Prompt engineering等相关概念
2)如何写好一个Prompt及相关Prompt调试工具
3)基于Prompt催生的一些新的编程范式
为什么要学习提示词?
提示词是大模型的”魔法杖“,是人类与大模型交流的桥梁,大大的简化了使用模型的复杂度,从原本的训练和编程调用进化成为自然语言,而在实际效果上却并不输于面向具体下游任务微调的模型,也正是来自于类似GPT 3.5或者GPT 4这样的优秀模型超预期的感受,让大模型AI备受追捧。提示词学习并不限于开发者用来构建LLM应用,对于普通用户来讲也十分有必要学习,这样能够更好的让模型理解你的意图,从而给予高质量的回复,这对于利用AI来帮忙解决问题,提升学习工作效率都有非常大的意义。更进一步,掌握了提示词工程,还可以通过编写合适的提示词,生成一些专门解决某一类问题的领域机器人,分享给需要的朋友,可以进一步地放大其价值,而这样的bot不管是在国外还是国内都是非常的受欢迎。
@poe
@文心一言
应用领域:
得益于大模型的泛化能力,通过prompt能够完成很多常见的下游处理任务,常见的有:
信息检索:这些 prompt 用于从模型中检索特定信息,如回答问题、提供事实或解释概念。用途包括问答、信息检索、事实核实等。比如“周杰伦写过什么样的歌?”
创意生成:通过prompt激发大模型产生富有想象力和艺术性的内容。这些提示鼓励AI创作故事、诗歌、歌词、编程等。比如,近日百度在其发布会上就演示通过提示词让大模型编写武侠故事。
问题解决:通过prompt来让大模型寻找特定问题或挑战的解决方案。这些提示可能包括询问建议、策略或建议。例如,你可能会问人工智能,“我如何提高我的时间管理技能?”
讨论反思:反思性提示鼓励人工智能提供深思熟虑的见解或参与哲学讨论。这些提示包括提出开放式问题,促使人工智能思考抽象概念或发表个人观点。你可以问人工智能:"生命的意义是什么?"或 “你对意识的本质有什么看法?”
预测:预测性提示包括要求人工智能根据现有数据或模式进行预测或推测。这些提示可用于预测趋势、分析数据或做出明智决策。预测性提示的一个例子是:"根据目前的增长率,到 2050 年全球人口将达到多少?
学习助手:可以利用一些类似于“你是某某方面的专家,我希望你能是我的老师,教我xx技能,给我制定学习计划“等等prompt,让大模型作为你的老师帮助你快速提高某一方面的技能。
陪伴对话:通过一些角色扮演类 prompt模拟对话或聊天,并回应用户提出的问题或评论,比如聊天机器人、虚拟助手等,其中c.ai这样的角色聊天机器人便是这方面的代表产品。
除了这些大模型特有复合任务之外,传统的NLP任务也不再话下,比如:翻译、情感分析、摘要、总结等等。
大模型能做的事情很多,这也是prompt engineering的乐趣之一,有越来越多的能力被挖掘出来,甚至成为一种生态资源。大模型时代,大模型一家独大的当下,区分应用体验如何,很大程度上和prompt的编写质量有关。langchain为了更好的管理这些prompt,方便开发者和用户交流,最近还推出了自己的langchain hub专门用来存放这些优质的prompt。
编写技巧
我们以大模型代表chatGPT为例,探索prompt在编写过程需要了解的事情。
通常一个好的prompt应该包含一些关键要素,从重要性高低角度依次为:任务(task)、上下文(context)、范例(exemplar)、角色(persona)、格式(format)和语气(tone)。
这里task是必选的,其次需要提供大模型相关的上下文及示例。而角色、格式和语气就是在此之上按需添加的修饰,但并不表示没有作用,其中以角色为例,参看这篇文章《夸夸ChatGPT可提升回答质量,原来是有依据的,来看OpenAI创始成员Andrej的解释。下面一一解释这几个构成部分及范例。
1.Task
对于Task部分来讲,关键原则是,任务句总是以动作动词(生成(generate)、驱动(drive)、写作(write)、分析(analyze)等)开头,并清楚地说明最终目标,多个任务(Muti-task)应将这些形成一段动作字句,清晰表达其目标。例如,我们可以生成一个3个月的培训计划或复杂的3步任务(包括分析、总结和分类)。
对于上下文来讲,可以提供的内容非常多,受限于prompt的长度以及对于大模型完成任务的实际帮助,围绕下面三个问题来提供最有效果。
以健身计划为例,下图在这个例子中,提供了我的背景(1),写出了我想要取得的成功目标(2),最后描述了所有这一切将发生的环境(3)。
正是通过这样的上下文约束,可以避免大模型的自由发挥,避免回答泛泛而谈,似是而非。
根据前面提到的COT技术可知,在提示语中加入示例可以获得更高质量的答案。比如:如果想为团队中的某个职位撰写一份职位描述,您可以先向 ChatGPT 提供一份情况描述(上下文),然后再根据已经准备好的描述(示例)提供一份参考。
在这种情况下,您可以使用 招聘网站上 的角色描述,因为 ChatGPT 会模仿其格式和专业语言的表达方式生成符合人力资源专家语气的回复。
Prompt:``You’re a hiring manager in the marketing team responsible for writing the job description for a B2B product marketing manager job opening`` ``Your team primarily focuses on increasing brand awareness for Netflix’s adverting platform with the goal of acquiring new advertising partners`` ``Please draft the job description using the format of this existing job description below:``[put the job description here]`` ``
可以看到chatGPT的输出质量还是很不错的。但要说明的是,并非每条提示都需要示例,但包含相关示例可大大提高输出质量。
4.角色(persona)
通过给大模型以一个角色定位,甚至夸一夸,比如:你是一个非常有经验的招聘专家。能够很好地让大模型进入角色从而提升回答质量。
不仅如此,也可以指定一个特定的角色,但前提是这个角色必须足够有名,能够获得独特风格的回答,进而得到的效果会更好,比如:假如你是苏格拉底…。
为了便于阅读或者编程使用,也可以增加一些格式要求,让大模型以某种指定的格式输出。比如表格。在本例中,我们要分析即将去秘鲁旅行的典型菜肴的价格,我要求它向我展示一张表格,其中包含游览地点、典型菜肴及其价格等栏目。
输出:
使用不同的语气,对于大模型输出来讲,也有一定作用,可以使得输出的内容风格更符合用户的需求。
还可以通过咨询chatGPT具体任务需要使用的语气,进而提升回答质量。
输出:
最后,通过一个实际例子将所有要素结合起来。下面是一个完整的例子:
以上是关于大模型prompt编写的基本结构介绍。作为大模型的标杆,OpenAI给开发者指出了6个可以提升回答质量的最佳实践(https://platform.openai.com/docs/guides/gpt-best-practices),这些实践经验已经被应用在langchain等应用框架中,是当前大模型的权威实践,值得大家参考。
在介绍之前,先介绍一下OpenAI对话接口的格式,其中,消息必须是一组消息对象,每个对象都有一个角色(“system”、“user”或“assistant”)和内容。对话可以短到一条信息,也可以多次来回,如下:
response = openai.ChatCompletion.create(` `model="gpt-3.5-turbo",` `messages=[` `{"role": "system", "content": "You are a helpful assistant."},` `{"role": "user", "content": "Who won the world series in 2020?"},` `{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},` `{"role": "user", "content": "Where was it played?"}` `]``)
可以看到,实际上openai将一个完整的prompt内容上做了拆分,但本质上还是遵守前面的模式。
以下是具体prompt编写最佳实践的具体内容:
GPT无法读懂你的心思。如果输出太长,请要求简短答复。如果输出过于简单,请要求专家级的写作。如果您不喜欢这种格式,请演示您希望看到的格式。GPT对你想要的东西猜测得越少,你得到它的可能性就越大。
技巧1:在询问中包含详细信息,以获得更多相关回答
为了得到高度相关的响应,请确保请求提供任何重要的细节或上下文。不要让大模型猜心。
Worse | Better |
How do I add numbers in Excel? | How do I add up a row of dollar amounts in Excel? I want to do this automatically for a whole sheet of rows with all the totals ending up on the right in a column called "Total". |
Who’s president? | Who was the president of Mexico in 2021, and how frequently are elections held? |
Write code to calculate the Fibonacci sequence. | Write a TypeScript function to efficiently calculate the Fibonacci sequence. Comment the code liberally to explain what each piece does and why it's written that way. |
Summarize the meeting notes. | Summarize the meeting notes in a single paragraph. Then write a markdown list of the speakers and each of their key points. Finally, list the next steps or action items suggested by the speakers, if any. |
技巧2:让大模型做角色扮演。
可在open接口的系统消息里指定模型在回复中使用的角色。
SYSTEM | When I ask for help to write something, you will reply with a document that contains at least one joke or playful comment in every paragraph. |
USER | Write a thank you note to my steel bolt vendor for getting the delivery in on time and in short notice. This made it possible for us to deliver an important order. |
技巧3:使用分隔符清楚地指示输入的不同部分。
利用三引号、XML标记、节标题等分隔符可以帮助划分要区别对待的文本节。
USER | Summarize the text delimited by triple quotes with a haiku. """insert text here""" |
SYSTEM | You will be provided with a pair of articles (delimited with XML tags) about the same topic. First summarize the arguments of each article. Then indicate which of them makes a better argument and explain why. |
USER | <article> insert first article here </article> <article> insert second article here </article> |
SYSTEM | You will be provided with a thesis abstract and a suggested title for it. The thesis title should give the reader a good idea of the topic of the thesis but should also be eye-catching. If the title does not meet these criteria, suggest 5 alternatives. |
USER | Abstract: insert abstract here Title: insert title here |
对于这类简单的任务,使用分隔符可能不会影响输出质量。但是,任务越复杂,明确任务细节就越重要。不要让 GPT 费尽心思去理解您对它们提出的确切要求。
技巧3:指定完成任务所需的步骤
某些任务最好指定为一系列步骤。明确地写出步骤可以使模型更容易地遵循它们。
SYSTEM | Use the following step-by-step instructions to respond to user inputs. Step 1 - The user will provide you with text in triple quotes. Summarize this text in one sentence with a prefix that says "Summary: ". Step 2 - Translate the summary from Step 1 into Spanish, with a prefix that says "Translation: ". |
USER | """insert text here""" |
技巧4:提供示例
提供适用于所有示例的通用指令通常比通过示例演示任务的所有排列更有效,但在某些情况下,提供示例可能更容易。例如,如果您打算让模型复制一种很难明确描述的响应用户查询的特定样式。这就是所谓的“few-shot”提示。
SYSTEM | Answer in a consistent style. |
USER | Teach me about patience. |
ASSISTANT | The river that carves the deepest valley flows from a modest spring; the grandest symphony originates from a single note; the most intricate tapestry begins with a solitary thread. |
USER | Teach me about the ocean. |
技巧5:制定输出的长度
您可以要求模型生成具有给定目标长度的输出。目标输出长度可以根据单词、句子、段落、项目符号等的数量来指定。但是,请注意,指示模型生成特定数量的单词并不具有高精度。该模型可以更可靠地生成具有特定段落数或项目符号数的输出。
USER | Summarize the text delimited by triple quotes in about 50 words. """insert text here""" |
USER | Summarize the text delimited by triple quotes in 2 paragraphs. """insert text here""" |
USER | Summarize the text delimited by triple quotes in 3 bullet points. """insert text here""" |
2)提供参考内容
GPT 可以自信地编造虚假答案,尤其是在被问及深奥的话题或引用和 URL 时。就像一张笔记能帮助学生在考试中取得更好的成绩一样,为 GPT 提供参考文本也能帮助他们在作答时减少无中生有的情况。
技巧1:指导模型使用参考文本进行回答
如果我们可以为模型提供与当前查询相关的可信信息,那么我们可以指示模型使用所提供的信息来组成其答案。
SYSTEM | Use the provided articles delimited by triple quotes to answer questions. If the answer cannot be found in the articles, write "I could not find an answer." |
USER | <insert articles, each delimited by triple quotes> Question: <insert question here> |
鉴于GPT的上下文窗口有限,为了应用这种策略,我们需要某种方式来动态查找与所问问题相关的信息。实际上这就是RAG。
技巧2:指导模型引用参考文献回答问题
如果输入内容中已经补充了相关知识,那么就可以直接要求模型通过引用所提供文档中的段落来为其答案添加引文。请注意,输出中的引用可以通过所提供文档中的字符串匹配进行编程验证。
SYSTEM | You will be provided with a document delimited by triple quotes and a question. Your task is to answer the question using only the provided document and to cite the passage(s) of the document used to answer the question. If the document does not contain the information needed to answer this question then simply write: "Insufficient information." If an answer to the question is provided, it must be annotated with a citation. Use the following format for to cite relevant passages ({"citation": …}). |
USER | """<insert document here>""" Question: <insert question here> |
3)将复杂任务拆分成较简单的子任务
技巧1:使用意图分类来识别用户查询的最相关指令
对于需要大量独立指令集来处理不同情况的任务,首先对查询类型进行分类,并利用该分类来确定需要哪些指令,可能会有所帮助。这可以通过定义固定类别和硬编码与处理特定类别任务相关的指令来实现。这一过程也可以递归应用,将任务分解为一系列阶段。这种方法的优势在于,每次查询只包含执行任务下一阶段所需的指令,与使用单次查询执行整个任务相比,错误率更低。这还可以降低成本,因为运行较大的提示需要花费更多的成本
例如,假设对于客户服务应用程序,查询可以有效地分类如下:
SYSTEM | You will be provided with customer service queries. Classify each query into a primary category and a secondary category. Provide your output in json format with the keys: primary and secondary. Primary categories: Billing, Technical Support, Account Management, or General Inquiry. Billing secondary categories: - Unsubscribe or upgrade - Add a payment method - Explanation for charge - Dispute a charge Technical Support secondary categories: - Troubleshooting - Device compatibility - Software updates Account Management secondary categories: - Password reset - Update personal information - Close account - Account security General Inquiry secondary categories: - Product information - Pricing - Feedback - Speak to a human - Password reset - Update personal information - Close account - Account security General Inquiry secondary categories: - Product information - Pricing - Feedback - Speak to a human |
USER | I need to get my internet working again. |
根据客户查询的分类,可以向 GPT 模型提供一组更具体的指令,以处理下一步工作。例如,假设客户需要 "故障排除 "方面的帮助。
SYSTEM | You will be provided with customer service inquiries that require troubleshooting in a technical support context. Help the user by: - Ask them to check that all cables to/from the router are connected. Note that it is common for cables to come loose over time. - If all cables are connected and the issue persists, ask them which router model they are using - Now you will advise them how to restart their device: -- If the model number is MTD-327J, advise them to push the red button and hold it for 5 seconds, then wait 5 minutes before testing the connection. -- If the model number is MTD-327S, advise them to unplug and replug it, then wait 5 minutes before testing the connection. - If the customer's issue persists after restarting the device and waiting 5 minutes, connect them to IT support by outputting {"IT support requested"}. - If the user starts asking questions that are unrelated to this topic then confirm if they would like to end the current chat about troubleshooting and classify their request according to the following scheme: <insert primary/secondary classification scheme from above here> -- If the model number is MTD-327S, advise them to unplug and replug it, then wait 5 minutes before testing the connection. - If the customer's issue persists after restarting the device and waiting 5 minutes, connect them to IT support by outputting {"IT support requested"}. - If the user starts asking questions that are unrelated to this topic then confirm if they would like to end the current chat about troubleshooting and classify their request according to the following scheme: <insert primary/secondary classification scheme from above here> |
USER | I need to get my internet working again. |
请注意,当对话的状态发生变化时,模型被指示发出特殊的字符串来表示。这样,我们就能把系统变成一个状态机,由状态决定注入哪些指令。通过跟踪状态、与该状态相关的指令以及允许从该状态进行的状态转换,我们可以在用户体验周围设置防护栏,而这是结构化程度较低的方法难以实现的。
技巧2:对于需要长对话的对话应用程序,需要总结或过滤之前的对话
由于 GPT 的上下文长度是固定的,因此用户和助手之间的对话(整个对话都包含在上下文窗口中)不可能无限期地进行下去。
解决这个问题有多种变通方法,其中之一就是总结对话中的前几轮对话。一旦输入的大小达到预定的阈值长度,就会触发一个对部分对话进行总结的查询,而之前对话的总结可以作为系统消息的一部分。或者,也可以在整个对话过程中在后台异步总结之前的对话。
另一种解决方案是动态选择与当前查询最相关的先前对话部分,即RAG的思路。
技巧3:对长文档进行分段摘要,并递归构建完整摘要
由于 GPT 有固定的上下文长度,因此在单次查询中,GPT 无法用于摘要长度超过上下文长度减去生成摘要长度的文本。要总结一本书等超长文档,我们可以使用一系列查询来总结文档的每个部分。章节摘要可以串联起来并进行总结,从而产生摘要的摘要。这个过程可以递归进行,直到整个文档汇总完毕。如果需要使用前面章节的信息来理解后面章节的内容,那么还有一个有用的技巧,那就是在总结书中任何给定内容的同时,对该内容之前的文本进行流水账式总结。OpenAI 在之前的研究中使用 GPT-3 的变体研究了这一程序在总结书籍方面的有效性。
3)让 GPT 有时间 “思考”
技巧1:鼓励模型,避免匆忙得出结论,指导模型找出自己的解决方案
有时,当我们明确指示模型在得出结论之前先从第一性原理进行推理时,我们会得到更好的结果。例如,假设我们想要一个模型来评估学生对数学问题的解答。最明显的方法是直接问模型学生的解法是否正确。
SYSTEM | Determine if the student's solution is correct or not. |
USER | Problem Statement: 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. 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 |
ASSISTANT | The student's solution is correct. |
但实际上学生的解并不正确!我们可以通过提示模型先生成自己的解决方案,让模型成功注意到这一点。
SYSTEM | 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. |
USER | Problem Statement: 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. 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 |
ASSISTANT | Let x be the size of the installation in square feet. 1. Land cost: 100x 2. Solar panel cost: 250x 3. Maintenance cost: 100,000 + 10x Total cost: 100x + 250x + 100,000 + 10x = 360x + 100,000 The student's solution is incorrect. They made an error in the maintenance cost calculation, using 100x instead of 10x. The correct total cost for the first year of operations is 360x + 100,000. |
技巧2:使用内心独白或一系列查询来隐藏模型的推理过程
前面的策略表明,在回答具体问题之前,模型有时必须对问题进行详细推理。对于某些应用,模型得出最终答案的推理过程不宜与用户共享。例如,在辅导应用中,我们可能希望鼓励学生自己找出答案,但模型对学生解决方案的推理过程可能会向学生透露答案。
内心独白是一种可以用来缓解这种情况的策略。内心独白的原理是指示模型将输出结果中不对用户公开的部分转化为结构化格式,以便于解析。然后,在向用户展示输出结果之前,先对输出结果进行解析,只让部分输出结果可见。
SYSTEM | Follow these steps to answer the user queries. Step 1 - First work out your own solution to the problem. Don't rely on the student's solution since it may be incorrect. Enclose all your work for this step within triple quotes ("""). Step 2 - Compare your solution to the student's solution and evaluate if the student's solution is correct or not. Enclose all your work for this step within triple quotes ("""). Step 3 - If the student made a mistake, determine what hint you could give the student without giving away the answer. Enclose all your work for this step within triple quotes ("""). Step 4 - If the student made a mistake, provide the hint from the previous step to the student (outside of triple quotes). Instead of writing "Step 4 - ..." write "Hint:". |
USER | Problem Statement: <insert problem statement> Student Solution: <insert student solution> |
另外,也可以通过一系列查询来实现这一目标,其中除最后一个查询外,其他查询的输出结果都不对最终用户公开。
首先,我们可以要求模型自己解决问题。由于这个初始查询不需要学生的解决方案,因此可以省略。这样做的另一个好处是,模型的解法不会因学生尝试的解法而产生偏差。
USER | <insert problem statement> |
接下来,我们可以让模型利用所有可用信息来评估学生解法的正确性。
SYSTEM | Compare your solution to the student's solution and evaluate if the student's solution is correct or not. |
USER | Problem statement: """<insert problem statement>""" Your solution: """<insert model generated solution>""" Student’s solution: """<insert student's solution>""" |
最后,我们可以让模型通过自己的分析,以一个乐于助人的导师的角色来构建一个回复。
SYSTEM | You are a math tutor. If the student made an error, offer a hint to the student in a way that does not reveal the answer. If the student did not make an error, simply offer them an encouraging comment. |
USER | Problem statement: """<insert problem statement>""" Your solution: """<insert model generated solution>""" Student’s solution: """<insert student's solution>""" Analysis: """<insert model generated analysis from previous step>""" |
技巧3:询问模型在之前的过程中是否有遗漏
假设我们正在使用一个模型来列出与特定问题相关的信息源摘录。在列出每个摘录后,模型需要确定是否应该开始写另一个摘录,还是应该停止。如果源文件很大,模型很容易过早停止,无法列出所有相关摘录。在这种情况下,通常可以通过提示模型进行后续查询来找到之前遗漏的摘录,从而获得更好的性能。
SYSTEM | You will be provided with a document delimited by triple quotes. Your task is to select excerpts which pertain to the following question: "What significant paradigm shifts have occurred in the history of artificial intelligence." Ensure that excerpts contain all relevant context needed to interpret them - in other words don't extract small snippets that are missing important context. Provide output in JSON format as follows: [{"excerpt": "..."}, ... {"excerpt": "..."}] |
USER | """<insert document here>""" |
ASSISTANT | [{"excerpt": "the model writes an excerpt here"}, ... {"excerpt": "the model writes another excerpt here"}] |
USER | Are there more relevant excerpts? Take care not to repeat excerpts. Also ensure that excerpts contain all relevant context needed to interpret them - in other words don't extract small snippets that are missing important context. |
5)使用外部工具
技巧1:利用向量搜索实现高效知识检索(RAG)
如果将外部信息源作为输入的一部分,模型可以利用外部信息源。这可以帮助模型生成更多信息和最新回复。例如,如果用户询问有关特定电影的问题,那么在模型输入中添加有关电影的高质量信息(如演员、导演等…)可能会很有用。嵌入可用于实现高效的知识检索,从而在运行时将相关信息动态添加到模型输入中。
文本嵌入是一个可以衡量文本字符串之间相关性的向量。相似或相关的字符串会比不相关的字符串靠得更近。这一事实以及快速向量搜索算法的存在,意味着嵌入可以用来实现高效的知识检索。特别是,文本语料库可以分割成若干块,每个块都可以嵌入和存储。然后,可以嵌入给定的查询,并执行向量搜索,从语料库中找到与查询最相关的嵌入文本块(即在嵌入空间中最接近的文本块)。
技巧2:使用代码执行来执行更精确的计算或调用外部应用程序接口(code interpreter)
不能依靠 GPT 自行准确执行算术运算或长时间计算。在需要的情况下,可以指示模型编写和运行代码,而不是自己进行计算。特别是,可以指示模型将需要运行的代码放入指定格式(如三重回溯)中。产生输出后,可提取并运行代码。最后,如有必要,可将代码执行引擎(即 Python 解释器)的输出作为下一次查询的模型输入。
SYSTEM | You can write and execute Python code by enclosing it in triple backticks, e.g. ```code goes here```. Use this to perform calculations. |
USER | Find all real-valued roots of the following polynomial: 3*x**5 - 5*x**4 - 3*x**3 - 7*x - 10. |
代码执行的另一个良好用例是调用外部应用程序接口。如果一个模型在正确使用 API 方面得到了指导,它就可以编写使用该 API 的代码。可以通过向模型提供说明如何使用 API 的文档和/或代码示例,指导模型如何使用 API。
SYSTEM | You can write and execute Python code by enclosing it in triple backticks. Also note that you have access to the following module to help users send messages to their friends: ```python import message message.write(to="John", message="Hey, want to meetup after work?")``` |
技巧3:让模型访问特定函数(function call)
Chat completions API 允许在请求中传递函数描述列表。这样,模型就能根据提供的模式生成函数参数。生成的函数参数由 API 以 JSON 格式返回,可用于执行函数调用。然后,函数调用提供的输出可以在下一个请求中反馈到模型中,以结束循环。这是使用 GPT 模型调用外部函数的推荐方式。
6)系统地测试每一个prompt变更
有时,很难说清一项改变(如新指令或新设计)会使系统变好还是变坏。通过观察一些示例可能会发现哪个更好,但在样本量较小的情况下,很难区分是真正的改进还是随机的运气。也许改变有助于提高某些输入的性能,但会降低其他输入的性能。
评估有助于优化系统设计。好的“评估”包括:
能代表真实世界的使用情况(或至少具有多样性)
包含许多测试用例,以提高统计能力(准则见下表)
易于自动化或重复
DIFFERENCE TO DETECT | SAMPLE SIZE NEEDED FOR 95% CONFIDENCE |
30% | ~10 |
10% | ~100 |
3% | ~1,000 |
1% | ~10,000 |
对输出结果的评估可以由计算机、人工或混合方式完成。计算机可以根据客观标准(例如只有一个正确答案的问题)以及一些主观或模糊标准自动进行评估,其中模型输出由其他模型查询进行评估。OpenAI Evals 是一个开源软件框架,提供创建自动 evals 的工具。
当存在一系列被认为质量同样高的可能输出时(例如,对于答案较长的问题),基于模型的 evals 就会非常有用。哪些内容可以通过基于模型的评估进行实际评估,哪些内容需要人工评估,这两者之间的界限是模糊的,并且随着模型能力的提高而不断变化。我们鼓励通过实验来了解基于模型的评估在您的使用案例中的效果如何。
技巧1:参照黄金标准答案评估模型输出结果
假设已知问题的正确答案应参考一组特定的已知事实。那么我们就可以使用模型查询来计算答案中包含了多少所需的事实。
例如,使用以下系统信息:
SYSTEM | You will be provided with text delimited by triple quotes that is supposed to be the answer to a question. Check if the following pieces of information are directly contained in the answer: - Neil Armstrong was the first person to walk on the moon. - The date Neil Armstrong first walked on the moon was July 21, 1969. For each of these points perform the following steps: 1 - Restate the point. 2 - Provide a citation from the answer which is closest to this point. 3 - Consider if someone reading the citation who doesn't know the topic could directly infer the point. Explain why or why not before making up your mind. 4 - Write "yes" if the answer to 3 was yes, otherwise write "no". Finally, provide a count of how many "yes" answers there are. Provide this count as {"count": <insert count here>}. 1 - Restate the point. 2 - Provide a citation from the answer which is closest to this point. 3 - Consider if someone reading the citation who doesn't know the topic could directly infer the point. Explain why or why not before making up your mind. 4 - Write "yes" if the answer to 3 was yes, otherwise write "no". Finally, provide a count of how many "yes" answers there are. Provide this count as {"count": <insert count here>}. |
下面是一个输入示例,两点都满足:
SYSTEM | <insert system message above> |
USER | """Neil Armstrong is famous for being the first human to set foot on the Moon. This historic event took place on July 21, 1969, during the Apollo 11 mission.""" |
以下是仅满足一点的示例输入:
SYSTEM | <insert system message above> |
USER | """Neil Armstrong made history when he stepped off the lunar module, becoming the first person to walk on the moon.""" |
下面是一个输入示例,没有一个输入是满足的:
SYSTEM | <insert system message above> |
USER | """In the summer of '69, a voyage grand, Apollo 11, bold as legend's hand. Armstrong took a step, history unfurled, "One small step," he said, for a new world.""" |
这种基于模型的评估有许多可能的变体。考虑以下变体,它可以跟踪候选答案和黄金标准答案之间的重叠类型,还可以跟踪候选答案是否与黄金标准答案的任何部分相矛盾。
SYSTEM | Use the following steps to respond to user inputs. Fully restate each step before proceeding. i.e. "Step 1: Reason...". Step 1: Reason step-by-step about whether the information in the submitted answer compared to the expert answer is either: disjoint, equal, a subset, a superset, or overlapping (i.e. some intersection but not subset/superset). Step 2: Reason step-by-step about whether the submitted answer contradicts any aspect of the expert answer. Step 3: Output a JSON object structured like: {"type_of_overlap": "disjoint" or "equal" or "subset" or "superset" or "overlapping", "contradiction": true or false} |
下面是一个输入示例,答案不标准,但与专家的答案并不矛盾:
SYSTEM | <insert system message above> |
USER | Question: """What event is Neil Armstrong most famous for and on what date did it occur? Assume UTC time.""" Submitted Answer: """Didn't he walk on the moon or something?""" Expert Answer: """Neil Armstrong is most famous for being the first person to walk on the moon. This historic event occurred on July 21, 1969.""" |
下面是一个输入示例,其答案与专家答案直接矛盾:
SYSTEM | <insert system message above> |
USER | Question: """What event is Neil Armstrong most famous for and on what date did it occur? Assume UTC time.""" Submitted Answer: """On the 21st of July 1969, Neil Armstrong became the second person to walk on the moon, following after Buzz Aldrin.""" Expert Answer: """Neil Armstrong is most famous for being the first person to walk on the moon. This historic event occurred on July 21, 1969.""" |
以下是一个带有正确答案的示例输入,它还提供了比所需更多的细节:
SYSTEM | <insert system message above> |
USER | Question: """What event is Neil Armstrong most famous for and on what date did it occur? Assume UTC time.""" Submitted Answer: """At approximately 02:56 UTC on July 21st 1969, Neil Armstrong became the first human to set foot on the lunar surface, marking a monumental achievement in human history.""" Expert Answer: """Neil Armstrong is most famous for being the first person to walk on the moon. This historic event occurred on July 21, 1969.""" |
在openAI的cookbook中还有更多prompt设计的技巧介绍,感兴趣可以查看(https://cookbook.openai.com/)。
由于篇幅限制,将在下一节介绍prompt设计和调试评估工具,欢迎关注。
未完待续。。。
大模型时代,企业对人才的需求变了,AIGC相关岗位人才难求,薪资持续走高,AI运营薪资平均值约18457元,AI工程师薪资平均值约37336元,大模型算法薪资平均值约39607元。
掌握大模型技术你还能拥有更多可能性:
• 成为一名全栈大模型工程师,包括Prompt,LangChain,LoRA等技术开发、运营、产品等方向全栈工程;
• 能够拥有模型二次训练和微调能力,带领大家完成智能对话、文生图等热门应用;
• 薪资上浮10%-20%,覆盖更多高薪岗位,这是一个高需求、高待遇的热门方向和领域;
• 更优质的项目可以为未来创新创业提供基石。
可能大家都想学习AI大模型技术,也想通过这项技能真正达到升职加薪,就业或是副业的目的,但是不知道该如何开始学习,因为网上的资料太多太杂乱了,如果不能系统的学习就相当于是白学。为了让大家少走弯路,少碰壁,这里我直接把全套AI技术和大模型入门资料、操作变现玩法都打包整理好,希望能够真正帮助到大家。
-END-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。