众所周知,当我们需要让大语言模型(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 的输出结果和定义其执行逻辑。
伪代码是一种用于描述算法的形式化描述方法,介于自然语言和编程语言之间,用于描述算法的步骤和流程。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);});通过上述例子,可以看到借助伪代码,我们可以更精准地控制 LLM 的输出结果和定义其执行逻辑,不仅局限于自然语言描述方式。当遇到复杂任务或多个子任务时,伪代码描述 Prompt 更加清晰和准确
文章的最后,如果还找不到ChatGPT原生使用站点的,关注公众号;我往期文章有提供免费直连的地址 或 直接点击阅读原文即可跳转。
参考文献:https://baoyu.io/blog/prompt-engineering/advanced-prompting-using-pseudocode-to-control-llm-output