以下是关于提示词工程的教程:
(a)提示词工程教程。为了帮助大型语言模型更好地理解提示词工程的任务,我们在元提示词中提供了一个提示词工程的在线教程²。(b)两步任务描述。提示词工程的任务可以分解为两个步骤,如Pryzant等人(2023)之前所做:在第一步中,模型预期检查当前提示词和一批样本。在第二步中,模型预期编写一个改进的提示词。³然而,在Pryzant等人(2023)中,每个步骤是即兴解释的。相比之下,我们考虑在元提示词中明确这两个步骤,并提前传达期望。(c)逐步推理模板。为了鼓励模型仔细检查批次B中的每个示例,并反思当前提示词的局限性,我们指导提案模型$$M_{proposal}$$回答一系列问题。例如:输出是否正确?提示词是否正确描述了任务?是否有必要编辑提示词?(d)上下文规定。实际操作中,提示词插入整个输入序列的位置是灵活的。它可能位于输入文本之前,用于描述任务,例如,“将英语翻译成法语”。它也可能出现在输入文本之后,例如,“让我们逐步思考”,以激发推理能力。识别这些不同的上下文,我们在元提示词中明确指出提示词和输入之间的相互作用。例如,“Q:<input> A:让我们逐步思考”。
您可以通过简单的提示词(Prompts)获得大量结果,但结果的质量与您提供的信息数量和完善度有关。一个提示词可以包含您传递到模型的_指令_或_问题_等信息,也可以包含其他详细信息,如_上下文_、_输入_或_示例_等。您可以通过这些元素来更好地指导模型,并因此获得更好的结果。看下面一个简单的示例:提示词输出结果如果使用的是OpenAI Playground或者其他任何LLM Playground,则可以提示模型,如以下屏幕截图所示:需要注意的是,当使用OpenAI的gpt-4或者gpt-3.5-turbo等聊天模型时,您可以使用三个不同的角色来构建prompt:system、user和assistant。其中system不是必需的,但有助于设定assistant的整体行为,帮助模型了解用户的需求,并根据这些需求提供相应的响应。上面的示例仅包含一条user消息,您可以使用user消息直接作为prompt。为简单起见,本指南所有示例(除非明确提及)将仅使用user消息来作为gpt-3.5-turbo模型的prompt。上面示例中assistant的消息是模型的响应。您还可以定义assistant消息来传递模型所需行为的示例。您可以在[此处(opens in a new tab)](https://www.promptingguide.ai/models/chatgpt)了解有关使用聊天模型的更多信息。从上面的提示示例中可以看出,语言模型能够基于我们给出的上下文内容`"The sky is"完成续写。而输出的结果可能是出人意料的,或远高于我们的任务要求。但是,我们可以通过改进提示词来获得更好的结果。让我们试着改进以下:提示词输出结果结果是不是要好一些了?本例中,我们告知模型去完善句子,因此输出的结果和我们最初的输入是完全符合的。提示工程(Prompt Engineering)就是探讨如何设计出最佳提示词,用于指导语言模型帮助我们高效完成某项任务。以上示例基本说明了现阶段的大语言模型能够发挥的功能作用。它们可以用于执行各种高级任务,如文本概括、数学推理、代码生成等。
本文采用的提示词工程主要有两部分代码组成:提示词注入和工具结果回传。提示词注入用于将工具信息以及使用工具的提示词添加到系统提示中。工具结果回传则是解析tool calling的输出,并将工具返回的内容再次嵌入LLM。[heading2]1、提示词注入阶段[content]INSTRUCTION为最后注入到系统提示中的字符串,他又包含了TOOL_EAXMPLE、tools_instructions、REUTRN_FORMAT三个部分。TOOL_EAXMPLE用于提示LLM如何理解tool以及如何使用tool。在编写TOOL_EAXMPLE时,请注意用一些无关紧要的工具作为示例,例如本文使用的将数字加一和数字减一的工具,从而避免LLM混淆真正可以使用的工具与示例工具。tools_instructions是由目前通用的工具字典转换成LLM可读的工具列表。实际使用LLM时,可以通过输入不同的工具来动态调整tools_instructions,让LLM得知目前可用的工具有哪些以及如何使用。REUTRN_FORMAT定义了调用API的格式。[heading2]2、工具结果回传阶段[content]利用正则表达式抓取输出中的"tool"和"parameters"参数。对于interpreter工具,使用了另一种正则表达式来提取LLM输出的代码,提高LLM使用interpreter工具的成功率。本文使用代码如下:通过识别LLM返回的调用工具的字典,提取出对应的值,再传入相应的工具函数,最后将工具返回的结果以observation的角色返回给LLM。对于一些不接受observation、tool、function角色的LLM接口,可以改为回传给user角色,例如:通过以上提示词工程,可以避免微调,让完全没有tool calling能力的LLM获得稳定的tool calling能力。