原文:https://baoyu.io/blog/prompt-engineering/advanced-prompting-using-pseudocode-to-control-llm-output
众所周知,当我们需要让大语言模型(LLM)执行任务时,需要输入 Prompt 来指导其执行,而 Prompt 是使用自然语言描述的。对于简单的任务,自然语言能够描述得很清楚,比如:“请翻译以下内容为简体中文”或“请生成以下内容的摘要”等。
然而,当我们遇到一些复杂的任务,比如要求模型生成特定的 JSON 格式,或者任务有多个分支,每个分支需要执行多个子任务,子任务之间还相互关联时,自然语言描述就显得力不从心了。
在继续阅读之前,这里有两道思考题可以先试试看:
有多个长句子,需要将每一个都拆分成不超过 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."
]
}
]
一段原始字幕文稿,只有对话信息,现在需要从中提取章节、发言人,然后按照章节和段落列出对话内容。如果是多个发言人,每段对话前需要标明发言人;如果是同一个发言人连续发言,则不需要。实际应用中可以使用整理视频文稿的 GPT。
Prompt 的本质是一种对 LLM 的控制指令,用自然语言描述,让 LLM 理解我们的要求,然后按照要求将输入转化为我们期望的输出结果。常用的 few-shot 技巧通过举例子让 LLM 理解我们的要求,然后参考样例输出我们期望的结果。比如 CoT(思维链,Chain of Thought),通过人为地对任务进行分解并限定执行流程,让 LLM 按照指定的流程和步骤执行,从而得到更好的结果。
既然 Prompt 的本质是一种对 LLM 的控制指令,我们可以不局限于传统的自然语言描述方式,还可以借助伪代码来精准地控制 LLM 的输出结果和定义其执行逻辑。
伪代码对于程序员来说非常熟悉,对于非程序员,只需要记住一些基本规则,就可以写出简单的伪代码:
例如:
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 一次生成多张图片:
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 更加清晰和准确