AI
大模型RAG简介
Langchain简介
ollama安装指南
OpenAI Key
提示词
Huggingface 下载GGUF大模型的方法
使用说明
本文档使用 MrDoc 发布
-
+
首页
提示词
## 前言 提⽰⼯程是⼀门新兴的学科,专注于以最佳实践构建 LLM 的最佳输⼊,从⽽尽可能以程序化⽅式⽣成⽬标输出。AI ⼯程师必须知道如何与 AI 进⾏交互,以获取可⽤于应⽤程序的有利结果。此外,AI ⼯程师还必须知道如何正确提问和编写⾼质量的提⽰词。这些都是本节的主题。 需要注意的是,提⽰⼯程可能会影响 OpenAI API 的使⽤成本。该成本与你发送给 OpenAI 并从其接收的标记数成正⽐。强烈建议使⽤ max_tokens 参数,以避免费⽤超出预期。 另请注意,你应该考虑在 openai 库的⽅法中使⽤不同的参数,因为如果使⽤ temperature、top_p 和 max_tokens 等参数,那么即使使⽤相同的提⽰词,你也可能得到截然不同的结果。 ## 设计提示词 很多任务可以通过提⽰词来完成,包括摘要、⽂本分类、情感分析和问题回答。在所有这些任务中,我们通常需要在提⽰词中定义三⼤要素:⾓⾊、上下⽂和任务  这三⼤要素并⾮都是必需的,它们的顺序也不是固定的。但是如果能够构造好提⽰词的结构并明确定义这三⼤要素,你就能够得到不错的结果。需要注意的是即使使⽤了这三⼤要素,对于复杂的任务,你也可能需要采⽤更⾼级的技巧,如零样本学习、少样本学习和微调。我们稍后探讨这些⾼级技巧。 ### 上下文 提⽰词的第⼀⼤要素是上下⽂。在为 LLM 编写输⼊⽂本时,必须尽可能详细地描述上下⽂。为了说明这⼀点,假设我们想使⽤ GPT-4 创建⼀个应⽤程序,⽤于推荐午餐的主菜。接下来,我们将⽐较在两个上下⽂中获得的结果。第⼀个上下⽂提供较少的细节,第⼆个上下⽂则提供较多的细节。 假设使⽤以下较短的提⽰词: ``` chat_completion("Give me a suggestion for the main course for today's lunch.") ``` 我们得到以下输出消息: ``` Grilled chicken with roasted vegetables and quinoa. ``` 现在,在提⽰词中加⼊更多上下⽂信息: ```python prompt = """ Context: I do 2 hours of sport a day. I am vegetarian, and I don't like green vegetables. I am conscientious about eating healthily. Task: Give me a suggestion for a main course for today's lunch. """ chat_completion(prompt) ``` 我们得到以下输出: ``` For today's lunch, you can try a Chickpea and Sweet Potato Curry served with Quinoa. This dish is packed with protein, fiber, and essential nutrients, while also being vegetarian and not relying on green vegetables. The curry can be made with chickpeas, sweet potatoes, tomatoes, onions, garlic, and a blend of spices like turmeric, cumin, and coriander. Cook the quinoa separately and serve it alongside the curry for a delicious and healthy meal. ``` 在第⼆个例⼦中,由于提⽰词含有更多上下⽂,因此模型给出的句⼦更详细:它推荐了⼀道富含蛋⽩质的健康素⾷菜肴。 上下⽂通过引导 GPT 模型进⾏思考来使其输出更有价值的回答。构建含有良好上下⽂的提示词是⼀个迭代过程,通常需要试错。确定上下⽂必须包含的关键点有时会有些棘⼿。为了找到可改进之处,你可以请 GPT-4 提些意⻅。在下⾯的示例中,我们修改提⽰词,不再要求模型回答问题,⽽是指⽰它以增强补全效果为目标来向我们提出关于上下⽂的问题。 使⽤以下提⽰词: ```python prompt = """ Context: I do 2 hours of sport a day. I am vegetarian and I don't like green vegetables. I am very careful to eat healthily. Task: Give me a suggestion for a main course for today's lunch? Do not perform the requested task! Instead, can you ask me questions about the context so that when I answer, you can perform the requested task more efficiently? """ chat_completion(prompt) ``` GPT-4 向我们提出以下问题: ``` Sure, I have a few questions to help me suggest a suitable main course for you: 1. What type of sport do you do, and do you have any specific nutritional requirements related to it? 2. Are there any other vegetables or ingredients that you particularly enjoy or dislike? 3. Do you prefer a hot or cold meal for lunch? 4. Are you open to trying new recipes or do you prefer sticking to familiar dishes? ``` 模型提出的问题通常与提⽰词相关。根据这些问题,我们可以在提⽰词中更新上下⽂。总之,我们建议你在构建提⽰词时经常使⽤这个技巧。 ### 任务 任务定义了你对 GPT-4 模型的⽤法,并且应该明确且具体。你应该提供⾜够的任务信息,并在提⽰词中使⽤合适的短语来引导模型给出你所期望的结果。 在前⾯的例⼦中,任务是让模型为午餐推荐⼀道主菜。我们可以为该任务添加细节,以说明我们想要的内容。在本例中,我们要求模型添加⼀张表格,列出每种⾷材所需的克数: ```python prompt = """ Context: I do 2 hours of sport a day. I am vegetarian, and I don't like green vegetables. I am conscientious about eating healthily. Task: Give me a suggestion for a main course for today's lunch. With this suggestion, I also want a table with two columns where each row contains an ingredient from the main course. The first column of the table is the name of the ingredient. The second column of the table is the number of grams of that ingredient needed for one person. Do not give the recipe for preparing the main course. """ chat_completion(prompt) ``` 模型给出以下输出结果: ``` Suggestion for today's lunch: Stuffed Bell Peppers with Quinoa and Black Beans | Ingredient | Grams per person | |---------------------|------------------| | Bell peppers | 200g | | Quinoa | 60g | | Black beans | 75g | | Onion | 50g | | Garlic | 5g | | Olive oil | 10g | | Tomato sauce | 50g | | Cumin | 1g | | Chili powder | 1g | | Salt | 1g | | Pepper | 1g | | Shredded cheese | 30g | ``` ### 角色 在撰写提⽰词时,影响模型的最后⼀种⽅式是赋予其⼀个⾓⾊。当然,⾓⾊和上下⽂可以独⽴使⽤,但同时使⽤可以加强对模型输出的控制。在以下⽰例中,我们赋予模型运动营养专家的⾓⾊: ```python prompt = """ Role: You are a nutritionist designing healthy diets for highperformance athletes. You take into account the nutrition needed for a good recovery. Context: I do 2 hours of sport a day. I am vegetarian, and I don't like green vegetables. I am conscientious about eating healthily. Task: Based on your expertise defined in your role, give me a suggestion for a main course for today's lunch. With this suggestion, I also want a table with two columns where each row in the table contains an ingredient from the main course. The first column of the table is the name of the ingredient. The second column of the table is the number of grams of that ingredient needed for one person. Do not give the recipe for preparing the main course. """ chat_completion(prompt) ``` 我们得到以下结果: ``` Main Course Suggestion: Quinoa and Chickpea Stuffed Bell Peppers Ingredient Table: | Ingredient | Grams per Person | |---------------------|------------------| | Quinoa | 60 | | Chickpeas | 100 | | Bell Peppers | 200 | | Olive Oil | 10 | | Onion | 50 | | Garlic | 5 | | Tomato | 100 | | Feta Cheese | 30 | | Kalamata Olives | 20 | | Fresh Basil | 5 | | Salt | 2 | | Black Pepper | 1 | ``` 正如你所见,提示词可用于调整像 GPT 模型这样的 LLM 的概率分布集。它们可以被视为模型指南,引导模型⽣成特定类型的结果。虽然没有必须遵守的提示词设计结构,但不妨考虑结合使用上下文、角色和任务。 注意,这只是⼀种方法,你完全可以创建不明确定义这些要素的提示词。根据应⽤程序的具体需求,⼀些提示词可能采用不同的结构,或者采用更具创造性的方法。因此,不要受限于“上下⽂−任务−角色”框架,而应将其视为帮助你有效设计提示词的⼯具。 ## 逐步思考 GPT-4 不擅长计算。比如,它⽆法计算369 × 1235 ```python prompt = "How much is 369 * 1235?" chat_completion(prompt) ``` 模型给出的答案是 454 965,但正确答案是 455 715。GPT-4 不能解决复杂的数学问题吗?请记住,该模型从左侧开始,通过依次预测答案中的每个标记来给出完整的答案。这意味着 GPT-4 首先生成最左侧的数字,然后将其作为上下文的⼀部分生成下⼀个数字,以此类推,直到形成完整的答案。挑战在于,每个数字都是独⽴预测的,与最终的正确值⽆关。GPT-4 将数字视为标记,它没有数学逻辑。 >**LLM是没有数学逻辑能力,但是LLM的应用是可以有计算能力的** 提高语言模型的推理能⼒有⼀个诀窍。比如,当要求模型计算 369 × 1235时,我们可以看到模型试图⼀次性直接回答。考虑到即使是我们自己,也很难在没有纸和笔的情况下计算这个乘法算式,因此我们可以通过提示词鼓励模型进行中间推理。就像我们使⽤纸和笔计算⼀样,如果给模型足够的时间进行推理,它也可以解决复杂的问题。 在提示词的末尾添加“让我们逐步思考”这样的话,已被证明可以使模型解决更复杂的推理问题这种技术称为**零样本思维链策略** 思维链是指使用提示词鼓励模型逐步模仿推理的技术。零样本这个术语意味着模型不依赖于特定任务的示例来执⾏这种推理,它已经准备好根据其⼀般的训练结果来处理新任务。与我们稍后就会讨论的少样本学习等技术不同,零样本学习试图在不需要特定任务示例的情况下进行泛化。 正如我们将看到的,在提⽰词末尾添加逐步思考的字样(比如示例中的“Let's think step by step”)后,模型开始通过拆分问题来进⾏推理。它可能需要⼀些时间来进⾏推理,从而解决之前⽆法在⼀次尝试中解决的问题。让我们来看看具体的效果: ``` prompt = "How much is 369 * 1235? Let's think step by step." chat_completion(prompt) ``` 模型的输出如下所示: ``` Step 1: Multiply 369 by 5 (the last digit of 1235). 369 * 5 = 1845 Step 2: Multiply 369 by 30 (the second last digit of 1235 is 3, so multiply by 3 and add a 0 at the end). 369 * 30 = 11070 Step 3: Multiply 369 by 200 (the third digit of 1235 is 2, so multiply by 2 and add two 0s at the end). 369 * 200 = 73800 Step 4: Multiply 369 by 1000 (the first digit of 1235 is 1, so multiply by 1 and add three 0s at the end). 369 * 1000 = 369000 Step 5: Add the results from steps 1 to 4. 1845 + 11070 + 73800 + 369000 = 455715 So, 369 * 1235 = 455,715. ``` 模型所⽤的⽅法发⽣了显著的改变。现在它将主要问题分解为更小、更容易管理的步骤,而不是试图直接解决问题。 >尽管提⽰模型逐步思考,但仍需注意,要仔细评估其回答,因为 GPT-4 并非绝对可靠。对于更复杂的算式,⽐如 3695 × 123 548,即使使用这个技巧,GPT-4 也可能无法算出正确答案。 ### 实现少样本学习 **少样本学习(few-shot learning)** 指的是 LLM 仅通过提⽰词中的几个示例就能进行概括并给出有价值的结果。在使⽤少样本学习技巧时,你可以给模型提供几个示例,如图所示。这些示例指导模型输出所需的格式  在本例中,我们要求 LLM 将特定的单词转换成表情符号。很难想象如何通过提示词给模型下达这种“指令”。但是通过少样本学习,这变得很容易。模型⼀些例⼦,它将自动尝试复制它们的模式:  我们得到以下输出消息:  我们可以看到,仅凭几个示例,模型就能够复现模式。通过利用在训练阶段所获得的海量知识,LLM 可以根据少量例⼦迅速适应并⽣成准确的答案 在提示词中提供示例时,务必确保上下文清晰且相关。清晰的示例有助于模型匹配所需输出格式并解决问题。相反,信息不充分或模棱两可的示例可能导致意外或错误的结果。因此,仔细编写示例并确保它们传达正确的信息,对模型准确执⾏任务至关重要。 指导 LLM 的另⼀种⽅法是单样本学习(one-shot learning)。顾名思义,在单样本学习中,我们只提供⼀个示例来帮助模型执行任务。尽管这种方法提供的指导比少样本学习要少,但对于简单的任务或 LLM 已经具备丰富背景知识的主题,它可能很有效。单样本学习的优点是更简单、生成速度更快、计算成本更低(因而 API 使用成本更低)。然⽽,对于复杂的任务或需要更深入理解所需结果的情况,少样本学习的效果可能更好。 虽然本节探讨了各种可以单独使⽤的提示工程技巧,但请注意,你可以将这些技巧结合起来使⽤,以获得更好的效果。开发⼈员的⼯作是找到最有效的提示词来解决特定的问题。请记住,提示工程是⼀个**反复试错的迭代过程**。 ### 指示模型提出更多问题 在提示词的末尾,询问模型是否理解问题并指示模型提出更多问题。如果你正在构建基于聊天机器⼈的解决⽅案,那么这样做⾮常有效。 举例来说,你可以在提示词的末尾添加如下⽂本: ``` 你清楚地理解我的请求了吗?如果没有,请问我关于上下⽂的问 题。这样⼀来,当我回答时,你就能够更高效地执行我所请求的 任务 ``` ### 格式化输出 有时,你可能希望在⼀个较长的过程中使⽤ LLM 的输出。在这种情况下,输出格式很重要。如果你想要⼀个 JSON 输出 ,那么模型往往会在 JSON 代码块之前和之后写⼊输出。如果你在提示词中说输出必须被 json.loads 接受,那么模型给出的结果可能更好。这种技巧适用于许多场景。 比如,使用此脚本: ```python prompt = """ Give a JSON output with 5 names of animals. The output must be accepted by json.loads. """ chat_completion(prompt, model='gpt-4') ``` 我们得到以下 JSON 代码块。 ```json { "animals": [ "lion", "tiger", "elephant", "giraffe", "zebra" ] } ``` ### 重复指示 经验表明,重复指示会取得良好的效果,尤其是当提示词很长时。基本思路是,在提示词中多次添加相同的指令,但每次采⽤不同的表述方式 这也可以通过负面提示来实现。 ### 使用负面提示 在文本生成场景中,**负面提示是指通过指定不希望在输出中看到的内容来引导模型**。负面提示作为约束或指南,用于滤除某些类型的回答。对于复杂任务,这种技巧特别有用:当以不同的表述方式多次重复指令时,模型往往能够更准确地遵循指令。 ### 添加长度限制 限制长度通常是不错的做法。如果你只希望模型回答 1 个词或者 10 个句子,那么不妨将要求添加到提示词中:我们指示模型⽤ 100 个单词生成⼀篇内容翔实的新闻稿。
admin
2024年10月24日 13:38
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码