AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


AI 驱动的系统工程实践:提示词工程(Prompt Engineering)
发布日期:2024-09-30 21:56:02 浏览次数: 1689 来源:DevOpsMe


在人类与人类之间的对话中,提示词(Prompting)是非常重要的,因为它们可以帮助我们更好地理解对方的意图。在人类与人工智能之间的对话中,提示词也是非常重要,因为它可以帮助我们更好地指导人工智能系统执行任务。

有这样一个关于程序员的梗,老婆打电话对程序员老公说:"晚上回来买一个西瓜,如果看到西红柿,就买两个。"然后程序员晚上买了两个西瓜回来,老婆怒问他为什么只买两个西瓜。程序员说:"因为我看到西红柿了啊……"

程序员理解错了老婆下达的任务提示,因为他看到了西红柿,所以买了两个西瓜,从而产生误解。

在本文中,将学习如何有效地使用提示词,并避免因提示词设计不当而产生的常见误区。将了解提示(prompt)的要素、硬性提示(hard prompts)和软性提示(soft prompts)之间的区别,以及零样本(zero-shot)学习和少样本(few-shot)学习的技巧。所有示例都将基于 ChatGPT 演示,不过可以在所有大型语言模型中使用相同的方法。

什么是提示词(Prompting)?

提示词是指向人工智能系统发出执行任务的指令。

它可以是一个简单的问题,也可以是一组复杂的任务。提示词是一个非常敏感的过程,对提示词的微小改动都可能导致模型的反应发生重大变化。因此,设计一个任务的”完美提示“需要付出巨大的努力。

假设你希望 ChatGPT 为你提供如何提高代码开发能力的建议。

第一次尝试

如果你的提示词过于笼统、容易被误读或缺乏上下文,即使问题看似简单,大型语言模型的答案也可能不符合你的期望。

微调后

根据上下文调整提示词,这样会得到更好的结果。

对话

继续提问,就你最感兴趣的话题获取详尽的答案。

与大型语言模型的对话时要注意,不同的话题使用不同的聊天会话,以免混淆语境。

提示词结构(Prompt Structure)

一个提示可以包含以下任何元素:

  1. 指令(Instruction)

    你希望模型执行的特定任务或指令。

    例如,用 100 字或更少的字数写出《三国演义》的摘要。

  2. 上下文(Context)

    外部信息或额外的上下文可以引导模型做出更好的反应。

    例如,你是一名历史学家,现在正在写一本关于中国历史的书。请用 100 字以内的文字写出《三国演义》的摘要。

  3. 输入数据(Input Data)

    在完成任务时,模型需要纳入或考虑哪些具体数据、示例或细节?

    例如,用 100 字以内的文字总结《三国演义》,重点关注以下要点: 三顾茅庐、赤壁之战、诸葛亮的草船借箭计划。

  4. 输出格式(Output Format)

    关于如何组织或展示答复的指导原则可以包括内容长度、布局或需要涵盖的任何特定部分。

    例如,输出一篇 100 字以内的文章摘要。将摘要结构化为一个表格,包含两列: "优点" 和 "说明"。在相应的列中为每个优点提供一个标签和简要说明。

你可以通过提供简洁明了的提示来帮助大型语言模型生成所需的输出结果。并非每次提示都需要全部四个要素;格式取决于任务。我们再来看看一些案例:

提示词参数(Prompt Parameters)

提示及其参数对语言模型的输出起着至关重要的作用。它们起着控制作用,引导模型做出反应,影响输出的长度、创造性、冗余度和重点。虽然有多个参数可供探讨,但在本文中我们只讨论 temperature 参数。

temperature 参数决定了模型选择下一个词的随机性。temperature 越高,也就是越接近 1,输出就越随机,越有创造性;temperature 越低,越接近 0,输出就越确定,越有针对性。

例如,如果使用 "编写一个 Java 函数,按升序对一个列表进行排序" 的提示。如果 temperature 值是 0.2 时,模型可能会使用 Java 内置的排序功能生成一个简单明了的函数:

import java.util.Arrays;  public class Main { public static void sortList(int[] arr) { Arrays.sort(arr); } }

然而,如果温度为 0.9 时,它可以生成一个非常规或可能更冗长的版本,如冒泡排序或插入排序:

public class Main { public static void sortList(int[] array) { for (int i = 0; i < array.length; i++) { for (int j = i + 1; j < array.length; j++) { if (array[j] < array[i]) { int temp = array[i]; array[i] = array[j]; array[j] = temp; } } } } }
如前所述,temperature 值越高,模型生成的排序算法就越复杂、越不常见,而 temperature 越低,模型生成的排序算法就越简单、越常见。请记住,在调整这些参数时,总是要在创造性和给定提示的相关性之间进行权衡。每个提示和 temperature 设置都可能需要实验才能获得理想的输出结果。

Hard Prompts vs. Soft Prompts

Hard prompts 和 soft prompts 是指导 LLM 生成所需输出结果的两种方法。这些提示技术可以帮助模型更好地理解任务并生成准确的结果。

Hard prompts 是明确定义任务和预期输出格式的指令。它们往往更加具体和直接,几乎不给模型留下解释的余地。

例如,用于总结的 hard prompts 可以是:

在以下情况下使用 hard prompts:

  • 任务需要特定的格式或结构

  • 预期结果需要满足严格的标准

  • 你想限制 LLM 的范围或创作自由

Soft prompts 则不那么明确,提供的是更一般性的指导或建议。它们允许模型探索理解任务和生成输出的不同方法,这些方法可能仍然正确,但更加灵活。

例如,用于总结的 soft prompts 可以是:

在以下情况下使用 soft promtps:

  • 任务允许创造性和灵活性

  • 愿意探索各种解决方案或想法

在系统工程(systems engineering)中,结合使用硬性和软性提示可以在不同的情况下发挥作用。下面是一些先使用一种类型的提示,然后再使用另一种类型的提示的情况:

先使用 hard prompts 后使用 soft prompts:

  • 设计系统组件

    首先提供详细的提示,概述具体的设计要求、限制和预期结果。

    提示词 : 为容量为每秒 10,000 个请求的分布式网络设计一个负载均衡系统。考虑资源分配、故障转移机制和延迟优化。

    完成初步设计后,使用 soft prompts 来探索潜在的改进、优化或替代方法。

    提示词: 有哪些创新方法可以增强负载均衡系统,以处理突发的流量峰值或提高容错能力?

  • 排错系统故障问题

    从明确描述问题的重点提示开始,包括相关的系统日志或指标,并指定预期的诊断步骤。

    提示词: 通过分析以下内容,诊断高峰负载条件下分布式数据库系统吞吐量瓶颈的根本原因: 所有节点的 CPU 和内存使用率、网络流量模式和查询执行时间。提供受影响组件的详细故障,并提出有针对性的修复建议。

    解决主要问题后,进行后续 soft prompts,考虑相关问题、边缘案例或系统优化机会。

    提示词: 考虑解决吞吐量瓶颈后可能出现的潜在次要问题或边缘案例,并就整个系统性能优化的领域提出建议。

先使用 soft prompts 后使用 hard prompts
  • 头脑风暴开发新的系统功能

    从广泛的提示开始,产生创造性的想法和潜在的系统优化。

    提示词: 网络监控系统可以添加哪些创新功能来提高效率?

    在探索想法之后,提供详细提示,指导所选解决方案的实施、要求和限制。

    提示词: 详细描述在头脑风暴会话中选定的功能的实施,包括数据收集方法、分析算法和性能指标。

  • 设计系统架构或工作流

    从广泛的提示开始,探索架构概念、设计理念和整体系统工作流。

    提示词: 有哪些架构概念和方法可以提高基于云的分布式系统的可扩展性和弹性?

    确定总体架构方向后,提供具体提示,概述详细的组件、互连和技术规格。

    提示词: 详细说明所选分布式系统架构的具体组件、互连和技术规范,包括负载均衡策略、数据复制方法和容错机制。

这些示例说明了如何有效地结合 hard prompts 和 soft prompts,使用 ChatGPT 或任何其他 LLM 解决各种系统工程任务或问题。

零样本(Zero-shot)和少样本(Few-shot)提示词

零样本和少样本提示是机器学习中使用的技术,尤其是在 LLM(以及 ChatGPT 等基于 LLM 的工具)中,用于在极少或没有先前样本的情况下完成任务。

  • Zero-shot Prompting

    依赖于模型的固有知识,使其能够在没有样本的情况下执行任务。之所以能做到这一点,是因为在大量数据的基础上进行了广泛的训练,这使得模型能够理解上下文并遵循指令。

  • Few-shot Prompting

    为模型提供有限的样本来指导其执行任务。这些样本有助于模型更好地理解任务并生成更准确的响应。

提示词最佳实践

以下是一些与 ChatGPT 或其他 LLM 有效沟通的最佳实践。

清晰具体

应该清楚地说明你的问题或请求,以确保模型理解你的意图。提供上下文也有助于生成更准确的回复。通过明确说明问题的背景和目的,你可以从 ChatGPT 和其他 LLM 那里获得更多相关和有用的信息。

  1. 要具体详细地说明背景、目的和风格,并使用高质量的输入数据以确保输出的准确性和相关性。提供适当的背景有助于生成更精确的回复。

    Bad Example

    总结文章。

    Good Example

    以{特定出版物}的风格,用 100 字以内的文字概括《三国演义》,重点关注以下要点: 三顾茅庐、赤壁之战、诸葛亮的草船借箭计划。

  2. 用实例强调所需的输出格式。在寻求信息或解决方案时,提供示例以明确你的要求,并帮助引导模型实现所需的输出。

    Bad Example

    提取下面文本中提到的实体。提取以下四种实体类型:公司名称、人名、主题。

    文本: {text}

    Good Example

    提取以下文本中提到的重要实体。首先提取所有公司名称,然后提取所有人名,接着提取与内容相符的特定主题。

    期望的格式:

    公司名称: <以逗号分隔的公司名称列表>

    人名: -||-

    具体主题: -||-

    文本: {text}

  3. 尽量减少含糊不清或不准确的描述,重点关注 "做什么" 而不是 "不做什么"。

    Bad Example

    设计用户界面时应避免什么?

    Good Example

    在设计无障碍、用户友好的网页界面时,有哪些最佳实践?

  4. 保持合理的输入长度,以避免无关或不准确的输出。减少 "浮夸"、不精确的描述。

    Bad Example

    我正在编写一些与从外部源访问数据有关的代码,我不知道如何处理出现的错误。你能给我指出正确的方向吗?

    Good Example

    从外部 API 访问数据时,如何实现错误处理?

  5. 让你的问题与当前对话上下文相关。如果你在之前讨论的是网络故障排错,那么问软件架构设计的问题可能会引起混淆。保持注意力集中可以让模型提供更准确、更相关的回复。

  6. 如果对话偏离了方向或失去了上下文,请开始一个新的会话。如果你正在讨论网络协议,而模型的回复变得无关紧要,请开始新的会话以重新聚焦对话。这有助于保持模型信息的相关性和准确性。

  7. 如果你对模型的输出结果不满意,并且正在使用具有 "重新生成结果" 功能的平台,请单击该功能以获得新的输出结果。这可以让你尝试不同的回复,并选择最符合你需求的回复。

使用正确的提示结构和格式
  1. 将指令放在开头,并用 ### 或 """ 将 instructions 和 context 分开。

    Bad Example

    将下面的文字概括为一个要点列表。

    {文本}

    Good Example

    将下面的文字概括为一个要点列表。

    文本: """

    {text}

    """

  2. 使用 "引导词" 引导模型走向特定的代码模式以生成代码。

    添加 import 提示,模型应使用该提示开始用 Python 编写代码。同样,SELECT 也是 SQL 语句开头的好提示。

    Bad Example

    编写一个简单的 Python 函数:

    1. 要求输入一个以英里为单位的数字

    2. 将英里转换为公里

    Good Example

    编写一个简单的 Python 函数:

    1. 要求输入一个以英里为单位的数字

    2. 将英里转换为公里

    import

  3. 将复杂的查询分解为更小、更集中的子问题。模型将更容易针对问题的各个方面提供更具体、更准确的回复。

    Bad Example

    如何清理、预处理和分析我的数据集?

    Good Example

    清理有缺失值和异常值的数据集有哪些常用技术?

    在分析数据集之前,我应该考虑哪些预处理步骤?

    哪些分析技术适合具有分类和数字特征的数据集?

  4. 如果最初的回答不令人满意,可以使用 "Zero-shot" 和 "Few-shot" 技术重构你的问题或提示结构。在重新措辞你的查询、提出后续问题并不断迭代时,你可以提高所提供信息的准确性和相关性。此外,不要害怕尝试不同的措辞(同时保持正确的语法和标点符号)。请记住,重复相同的提示可以得到不同的回复,这可以让你选择最合适的回复。

    Bad Example

    如果你的提示没有达到预期效果,第一次尝试后就放弃。

    Good Example

    从 "zero-shot" 开始,然后尝试 "few-shot";如果不成功,再进行微调。

    zero-shot: 从下面的文字中提取关键词。

    文本: {text}

    few-shot:

    从以下相应文本中提取关键词。

    文本 1: Stripe 为网络开发人员提供 API,以便将支付处理整合到他们的网站和移动应用程序中。

    关键词 1: Stripe、支付处理、API、网络开发人员、网站、移动应用程序

    ##

    文本 2: {text}

    关键词 2:

  5. 使用列表列出问题、目标和限制等关键细节,从而组织你的查询。这有助于模型更好地理解你的问题结构,并提供更准确、更相关的回复。以这种方式组织你的查询还可以让你更容易查看和完善你的提示。

    Bad Example

    你能帮我写一个 Python 函数,以半径为输入值计算圆的面积,并确保能处理输入值为负数或非数字的情况吗?

    Good Example

    请帮我写一个计算圆面积的 Python 函数,并考虑以下因素:

    1. 输入: 半径值

    2. 输出: 圆的面积

    3. 错误处理:

    a. 负值输入
    b. 非数字输入
请注意,当多次询问同一个问题时,会话式人工智能工具可能会提供不同的答案或解决方案。这在考虑其他观点或解决方案时很有用。如果对最初的回答不满意,可以重新提问,看看模型是否能生成更合适的答案。你还可以使用 "重新生成答案" 按钮。

在使用 ChatGPT 这类大语言模型对话时,优先考虑安全性和评估对于保护敏感信息、确保输出的可靠性和促进有效决策至关重要。定期评估和监控模型的性能,以满足要求,保持相关性,并在安全的环境中保护好隐私。

结语

现在,你已经知道为每个任务找到正确的提示策略有多么重要,很明显,对提示词稍作修改就会使模型的反应产生很大的变化。但是,一旦你找到了适合常规任务的 "完美提示",你就会明白所花的时间和精力是值得的。

深入研究提示词工程,还有非常多的知识点,例如要想从生成式人工智能中获得最佳效果,有八个组成部分起着至关重要的作用。

还有,提示词除了参数 temperature,还有其它参数 Top P, Stop sequences, Frequency Penalty, Presence Penalty 和 Best of。提示词微调,提示词格式化和获得格式化输出,等等。欢迎大家评论探讨学习。



53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询