原文:https://baoyu.io/blog/prompt-engineering/advanced-prompting-using-pseudocode-to-control-llm-output

众所周知,当我们需要让大语言模型(LLM)执行任务时,需要输入 Prompt 来指导其执行,而 Prompt 是使用自然语言描述的。对于简单的任务,自然语言能够描述得很清楚,比如:“请翻译以下内容为简体中文”或“请生成以下内容的摘要”等。

然而,当我们遇到一些复杂的任务,比如要求模型生成特定的 JSON 格式,或者任务有多个分支,每个分支需要执行多个子任务,子任务之间还相互关联时,自然语言描述就显得力不从心了。


思考题

在继续阅读之前,这里有两道思考题可以先试试看:

  1. 有多个长句子,需要将每一个都拆分成不超过 80 个字符的短句子,然后输出成一个 JSON 格式,清晰地描述长句子和短句子之间的对应关系。例如:

    [
      {
        "long": "This is a long sentence that needs to be split into shorter sentences.",
        "short": [
          "This is a long sentence",
          "that needs to be split",
          "into shorter sentences."
        ]
      },
      {
        "long": "Another long sentence that should be split into shorter sentences.",
        "short": [
          "Another long sentence",
          "that should be split",
          "into shorter sentences."
        ]
      }
    ]
    
  2. 一段原始字幕文稿,只有对话信息,现在需要从中提取章节、发言人,然后按照章节和段落列出对话内容。如果是多个发言人,每段对话前需要标明发言人;如果是同一个发言人连续发言,则不需要。实际应用中可以使用整理视频文稿的 GPT。


    Prompt 的本质

    Prompt 的本质是一种对 LLM 的控制指令,用自然语言描述,让 LLM 理解我们的要求,然后按照要求将输入转化为我们期望的输出结果。常用的 few-shot 技巧通过举例子让 LLM 理解我们的要求,然后参考样例输出我们期望的结果。比如 CoT(思维链,Chain of Thought),通过人为地对任务进行分解并限定执行流程,让 LLM 按照指定的流程和步骤执行,从而得到更好的结果。


    伪代码的应用

    既然 Prompt 的本质是一种对 LLM 的控制指令,我们可以不局限于传统的自然语言描述方式,还可以借助伪代码来精准地控制 LLM 的输出结果和定义其执行逻辑。


    如何写伪代码 Prompt

    伪代码对于程序员来说非常熟悉,对于非程序员,只需要记住一些基本规则,就可以写出简单的伪代码:

    例如:

    Array<{
    sentence: string;
    segments: string[]
    }>
    

    实例应用

    用伪代码整理字幕文稿

    整理字幕文稿这个任务相对复杂,可以将其分解成几个子任务,并逐步执行:

    伪代码示例

    function extract_subject(transcript) {
      // 在转录中找到主题并返回
    }
    
    function extract_chapters(transcript) {
      // 找到剧本中的章节并返回
    }
    
    function extract_speakers(transcript) {
      // 在文本中找到发言者并返回
    }
    
    function find_paragraphs_and_speakers_in_chapter(chapter) {
      // 找到章节中的段落和发言者并返回
    }
    
    function format_transcript(transcript) {
      subject = extract_subject(transcript);
      console.log("Subject:", subject);
      speakers = extract_speakers(transcript);
      console.log("Speakers:", speakers);
      chapters = extract_chapters(transcript);
      console.log("Chapters:", chapters);
    }
    

    借助伪代码让 ChatGPT 一次画多张图片

    通过伪代码可以让 ChatGPT 一次生成多张图片:

    javascript复制代码
    images_prompts = [
      {
        style: "可爱",
        prompt: "画一只可爱的狗",
        aspectRatio: "宽屏"
      },
      {
        style: "现实主义",
        prompt: "画一只逼真的狗",
        aspectRatio: "正方形"
      }
    ]
    
    images_prompts.forEach((image_prompt) => {
      console.log("Generating image with style: " + image_prompt.style + " and prompt: " + image_prompt.prompt + " and aspect ratio: " + image_prompt.aspectRatio);
      image_generation(image_prompt.style, image_prompt.prompt, image_prompt.aspectRatio);
    });
    

    Untitled


    通过上述例子,可以看到借助伪代码,我们可以更精准地控制 LLM 的输出结果和定义其执行逻辑,不仅局限于自然语言描述方式。当遇到复杂任务或多个子任务时,伪代码描述 Prompt 更加清晰和准确