前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ChatGPT 编写模式:如何高效地将思维框架赋予 AI ?

ChatGPT 编写模式:如何高效地将思维框架赋予 AI ?

作者头像
编程思维
发布2023-03-23 14:41:58
1.3K1
发布2023-03-23 14:41:58
举报
文章被收录于专栏:程序员面试小技巧

如何理解 Prompt ?

Prompt Enginneering

prompt 通常指的是一个输入的文本段落或短语,作为生成模型输出的起点或引导。prompt 可以是一个问题、一段文字描述、一段对话或任何形式的文本输入,模型会基于 prompt 所提供的上下文和语义信息,生成相应的输出文本。

举个例子,对于一个语言模型,prompt 可以是 "The cat sat on the",模型可以通过对接下来的词语进行预测,生成类似于 "mat"、"chair"、"sofa" 等不同的输出:

The Cat

上图为 Stable Diffusion 生成 (Prompt: The cat sat on the , Steps: 30, Sampler: Euler a, CFG scale: 7, Seed: 234310862, Size: 512x512, Model hash: d8722b4a4d, Model: neverendingDreamNED_bakedVae)

Prompt 在人工智能语言生成领域中扮演着重要的角色,因为它可以帮助模型更好地理解用户意图,并生成更准确、有意义的文本内容。诸如于如下的 prompt

women back view without face, flowing dress, edge of the sea, backview, back turned to the camera, upon the glow of the setting sun, sun below the horizon, golden light over the water, hair sways gently, Chinese style clothes, black hair,

可以在 Stable Diffusion 生成图片(配置了 negative prompt):

所以,质量看上去不错,但是可能不是你想要的。在 ChatGPT 则可以生成文本,质量上也是相似的,但是对于 AI 输出的文本来说,质量并没有这么直观。

应用好 Prompt 的核心思想:概念与类比

开始之前,可以看一下这个问题示例:

1. 设计模式的要素是哪些?

2. 对于 AI 领域的 prompt 编写来说,我们通常使用的模式有哪些?

3. 能将 AI 领域的 prompt 常见的设计模式用 "设计模式要素" 的格式一一表达吗?

核心思想,将设计模式要素作为一个概念,让 AI 类比到 prompt 里的模式。详细见:

1. design-pattern.analogy

2. design-pattern.analogy2

当然了,类比和定义概念不一定都会成功。

基础模式

四种基础模式:

1. By example (示例模式):在这种模式下,我们给模型提供一些示例文本,模型需要生成与示例文本类似的文本。这种模式通常用于生成类似于给定示例的文本,例如自动生成电子邮件、产品描述、新闻报道等。示例文本可以是单个句子或多个段落,具体取决于任务的要求。

2. By instruction template (指令模板):在这种模式下,我们给模型提供一些明确的指令,模型需要根据这些指令生成文本。这种模式通常用于生成类似于技术说明书、操作手册等需要明确指令的文本。指令可以是单个句子或多个段落,具体取决于任务的要求。

3. By specific (特定指令):在这种模式下,我们给模型提供一些特定信息,例如问题或关键词,模型需要生成与这些信息相关的文本。这种模式通常用于生成答案、解释或推荐等。特定信息可以是单个问题或多个关键词,具体取决于任务的要求。

4. By proxy(代理模式):在这种模式下,可以充当了一个代理,代表某个实体(例如人、角色、机器人等)进行操作或交互。代理模式的核心思想是引入一个中介对象来控制对实际对象的访问,从而实现一定程度上的隔离和保护。诸如于在 ChatGPT 中,"act as xxx" 可以让 ChatGPT 充当一个代理,扮演某个角色或实体的身份,以此来处理与该角色或实体相关的任务或请求。

概念模式集

Language is Language

对于 ChatGPT 来说,语言就是语言,他不区分自然语言和编程语言,甚至有可能编程语言对它更友好。所以我们可以直接通过编程语言与之交流:

我有下列遗留代码,我想在接口的函数名、参数名不变的情况下(可以新参数,旧的参数不能变)加入新功能:

代码语言:javascript
复制
module.exports = async function loadYamlFile(filepath, workdir = path.dirname(filepath)) { 
  const content = await fs.readFile(filepath, 'utf8'); // 读取文件内容
  // TODO: 将 content 看做ejs模板的字符串,进行渲染,如果传入了渲染ejs时的context值不为undefined,就进行渲染,否则不进行渲染。
 
  // TODO:将渲染后的结果传给yaml.load
  const data = yaml.load(content); // 解析YAML为JSON对象
  
 
  // 遍历JSON对象,查找$ref属性
  const processRef = async (obj) => {
    if (typeof obj === 'object' && obj !== null) { // 如果是对象
      if ('$ref' in obj) { // 如果包含$ref属性
        const refPath = path.join(workdir, obj.$ref.split('#')[0]); // 获取引用文件路径
        const pointer = obj.$ref.split('#')[1]; // 获取JSON指针
 
        // TODO: 递归调用的时候,取出context中以obj.$ref的属性值作为属性名的值作为新的context向下传递
        const refData = await loadYamlFile(refPath, path.dirname(refPath)); // 递归读取引用文件
        const value = getValueByPointer(refData, pointer); // 修复了 # 号问题
        return value;
      } else { // 如果不包含$ref属性,递归处理子属性
        for (const prop in obj) {
          obj[prop] = await processRef(obj[prop]);
        }
      }
    }
    return obj;
  };

上述描述会比纯自然语言更容易描述我们的需求,适合于更精细的指导。同时,不一定是编程语言,结构化的声明式DSL它也可以很好的解析,如:

把我给定的输入输出,按照下面的格式写成一个测试用例的描述:

代码语言:javascript
复制
{
    desc: 'Test with $p_ref returning array',
    input: {
      filepath: './test18.yml',
      workdir: './test/v2',
    },
    expected: {
        "name": "Alice",
        "age": 20
      }
  }
结果:

{
  desc: 'Test with $p_ref returning array',
  input: {
    filepath: './test19.yml',
    workdir: './test/v2',
  },
  expected: [
    {
      "name": "Bob"
    },
    {
      "name": "Alice"
    },
    {
      "name": "Bob"
    },
    {
      "name": "Alice"
    }
  ]
}

该测试用例输入了一个 YAML 文件 test19.yml,该文件中包含了一个 $flaten 属性,其值为两个 $p_ref 对象组成的数组,引用了一个返回数组的 YAML 文件 test19_ref.yml。

执行该测试用例后,期望得到的输出是一个数组,其中包含了两个 $p_ref 引用结果的 flatten 后的结果。

需要注意的是,由于该测试用例涉及到文件读取和模板渲染等操作,需要在测试前确保相关文件和依赖库已经正确安装并配置好。

通过使用DSL,还可以缩短输入和输出的token数,从而放大 ChatGPT 的能力。

其它

人类如何思考问题?

人类相对于其他动物更擅长于类比、概念抽象、符号化等高级认知活动,这些认知活动可以帮助人类在面对新问题时,从已有的知识和经验中找到相似的部分,快速理解和解决新问题。

而对于机器来说,机器学习算法通过大量的数据和计算,学习到数据中的规律和模式,并将这些规律和模式应用到新的数据中,从而实现预测和决策等功能。例如,机器学习算法可以通过大量的图像数据学习到图像的特征,并在新的图像中识别出相应的物体;也可以通过大量的自然语言数据学习到语言的规律,从而生成自然语言文本。

欢迎一起思考更多的模式:https://github.com/prompt-engineering/prompt-patterns

————————————————

版权声明:本文为CSDN博主「Phodal」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/phodal/article/details/129173369

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档