如何撰写出询问大模型好的prompt 提示

我们在询问大模型问题的时候,需要遵循一定规则,才能让大模型输出的答案更加准确,这个在OpenAI的官方文档中有详细的说明,概括起来就是如下六项。

  • 写清晰的指示
  • 给模型提供参考(也就是示例)
  • 将复杂任务拆分成子任务
  • 给 GPT 时间思考
  • 使用外部工具
  • 反复迭代问题

    问大模型prompt 提示的组成结构

    ``` 在使用ChatGPT时,一个完整的提示示例

背景信息

你将得到一份用三引号包含的文章,你的任务是只用所提供的文章来回答问题,并引用文件中用来回答问题的段落。如果该文章中不包含回答该问题所需的信息,那么只需背景信息号上:”信息不充分,无法回答”。

用户输入的提示

请总结出TCL将如何实现碳中和,每一条一行。

上下文内容

‘’’ 7月6日,TCL正式发布碳中和白皮书,提出“不晚于2030年实现碳达峰,不晚于2050年实现碳中和”的“3050”承诺目标及碳中和行动计划TCLGreen,旨在以自身科技创新驱动产业绿色制造,打造制造业绿色生态标杆,推动产业链加快绿色变革。 本次发布了TCL科技、TCL华星、TCL中环及TCL实业共四份碳中和白皮书,TCL创始人、董事长李东生及各产业负责人在TCL全球生态合作伙伴大会主题报告中,也提出碳中和实践目标及行动计划。 ‘’’

  1. - 背景信息 告诉模型这个任务大概要做什么、怎么做,比如如何使用提供的外部信息、如何处理查询以及如何构造输出。这通常是一个提示模板中比较固定的部分。一个常见用例是告诉模型“你是一个有用的 XX 助手”,这会让他更认真地对待自己的角色。
  2. - 上下文内容 则充当模型的额外知识来源。这些信息是用户输入的,或者聊天历史记录,也可以通过向量数据库检索得来,或通过其他方式(如调用 API、计算器等工具)获取。一个常见的用例是把从向量数据库查询到的知识作为上下文传递给模型。
  3. - 用户输入的提示 通常就是具体的问题或者需要大模型做的具体事情,在使用ChatGPT时候,这个部分和“背景信息”部分作为一体。但是我们开发的自己的AI应用,一般会将背景信息和用户输入的提示拆分成为两部分,形成便于复用的提示模板。
  4. <a name="kN0wl"></a>
  5. ### 与ChatGPT对话中的三个主要角色
  6. - SYSTEM LangChain中用SystemMessagePromptTemplate表示,可以把它看成“提示的组成结构”中的“背景信息”,system角色有助于使模型了解如何回应用户提出的问题。
  7. - USER LangChain中用HumanMessagePromptTemplate表示,就是用户输入的问题内容。
  8. - ASSISTANT LangChain中用AIMessagePromptTemplate表示,就是AI大模型的回复内容。
  9. <a name="rLzIw"></a>
  10. ### 什么是 LangChain 的 prompt
  11. LangChainprompt是一种可复制、可重复使用的制作提示模版的组件,每个提示模版都可以包含占位符,这些占位符可以在运行的时候被动态替换成实际终端用户输入的内容,最终形成调用模型时输入的内容。
  12. <a name="lx9Av"></a>
  13. ### 区分LangChain的prompt和询问大模型的prompt
  14. LangChainprompt是对询问大模型的prompt内容的管理组件,它的重点是如果高效管理提示模版,由很多的Python类组成。<br />询问大模型的prompt是用户与大模型交互的具体输入内容,例如在ChatGPT中,用户输入的内容就是prompt提示(包含问题、背景信息等);而在我们自己开发的AI应用中,用户输入的内容,会结合AI应用中内置的提示模版,组成输入给大模型的提示内容。
  15. <a name="jZthd"></a>
  16. ### 常用的prompt类
  17. <a name="KcJKl"></a>
  18. #### prompt 提示类之间的继承关系
  19. ![](https://cdn.nlark.com/yuque/0/2024/png/43891257/1714271192509-04b45224-57c4-4f92-90be-6997d3d9ab30.png#averageHue=%23f7f7f7&clientId=uc079d0ef-d38d-4&from=paste&id=uee033f5c&originHeight=337&originWidth=940&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=u27497024-2010-46b2-bbd9-8bad7b4915a&title=)
  20. <a name="pU4gz"></a>
  21. #### prompt 相关类
  22. | **名称** | **说明** |
  23. | --- | --- |
  24. | PromptTemplate | 用于创建字符串提示的提示模板。它支持任意数量的变量,包括没有变量。您可以创建自定义提示模板,以任何您想要的方式格式化提示。 |
  25. | ChatPrompTemplate | 用于创建聊天模型的提示模版,它是一系列聊天消息列表。每个聊天消息具有对应的角色消息模版,如SystemMessagePromptTemplateHumanMessagePromptTemplateAIMessagePromptTemplate;也可以用角色消息SystemMessageHumanMessageAIMessage |
  26. | FewShotPromptTemplate | 用于构建少量样本学习(Few-shot learning)的提示模版。这种模板通常用于在提示中列举几个例子,让模型参照例子进行学习后,输出类似回答结果。 |
  27. | ExampleSelector | ExampleSelector不是一个提示模板,而是一个用于从大量例子中选择最相关例子的工具(大量的例子存在向量数据库中,如果我们的示例很多,那么一次性把所有示例发送给模型是不现实而且低效的),通常与FewShotPromptTemplate结合使用,以实现更有效的少量样本学习。 |
  28. | PipelinePromptTemplate | 将多个提示模版合并为一个提示对象,在实践中,发现对提示进行问题排除检测非常麻烦。 |
  29. | PromptValue | <br />- to_string方法输出的字符串提示,示例如下: 秋水札记,定位于 LangChain AI 编程推广,分享 AI 商业与技术。<br />- to_messages方法输出的聊天提示,它是一个HumanMessage对象,示例如下: [HumanMessage(content='秋水札记,定位于 LangChain AI 编程推广,分享 AI 商业与技术。\\n')]<br /> |
  30. <a name="bo8cA"></a>
  31. ###
  32. <a name="sqXo3"></a>
  33. ###
  34. <a name="wdQLu"></a>
  35. ###
  36. <a name="kRor1"></a>
  37. ### PipelinePromptTemplate 多个模版合并为一个提示词
  38. <a name="U6UGg"></a>
  39. ### LangChain 的prompt 提示模版的好处
  40. 代码的可读性:使用模板的话,提示文本更易于阅读和理解,特别是对于复杂的提示或多变量的情况。<br />可复用性:模板可以在多个地方被复用,让你的代码更简洁,不需要在每个需要生成提示的地方重新构造提示字符串。<br />维护:如果你在后续需要修改提示,使用模板的话,只需要修改模板就可以了,而不需要在代码中查找所有使用到该提示的地方进行修改。<br />变量处理:如果你的提示中涉及到多个变量,模板可以自动处理变量的插入,不需要手动拼接字符串。<br />参数化:模板可以根据不同的参数生成不同的提示,这对于个性化生成文本非常有用。
  41. Model I/O ,主要是封装了用户与大模型之间的交互,包含了输入(prompts 输入提示)、模型交互(Models 模型)、输出(Output Parser 输出解析器)三大部分。
  42. <a name="eC0It"></a>
  43. ## 概览
  44. 暂时无法在飞书文档外展示此内容<br />交互流程说明:
  45. 1. 输入(prompts 输入提示),在LangChain中提供了对用户输入内容的prompts提示管理,在上图示例中,可以在提示中使用变量替代变化的内容。
  46. 2. 模型调用(Models 模型),通过prompts组件可以将组装后的提示内容发送给不同的模型,LangChain已经对接了很多大模型,例如OpenAI,谷歌的Palm,微软云的OpenAI模型等,从而方便开发者开发的AI应用调用不同的模型。
  47. 3. 解析,对于模型输出的内容,LangChain提供了解析组件,例如解析成字符串、JSON格式,或者其他类似函数调用的格式等。
  48. 代码示例:

一段入门代码示例,体现输入、交互、解析

  1. <a name="dWuXH"></a>
  2. ## Models 模型
  3. <a name="DcrQF"></a>
  4. ### LLMs 模型
  5. LLM(Large Language Model),大语言模型,在这里指的LangChain封装的LLM核心组件,指的是纯文本补全模型。Langchain封装的 API 将字符串提示作为输入,输出为补全后的字符串。例如对接的OpenAI 的 GPT-3。
  6. <a name="IdyHh"></a>
  7. ### ChatModels 聊天模型
  8. 聊天模型是LangChain封装的基于 LLM 的对话聊天模式核心组件,LangChain封装的 API 与LLM不同。Chat Model是将聊天对话消息表作为输入,输出的是 AI 消息,而不是字符串。例如对接的GPT-4 和 Anthopic 的 Claude-2 。<br />不同大模型在与其对话的时候有不同的提示策略,与Anthropic对话输入提示用XML效果最好,而OpenAI用JSON效果。这意味着用于一个LLM大模型的提示词可能不会转移到其他模型,因为转移后的回答效果可能会变差。LangChain提供了许多默认提示,目前大多数提示在 OpenAI 上运行良好,但其他模型上不一定,也没有进行大量测试。
  9. <a name="n06qd"></a>
  10. ## Messages 消息
  11. 在LangChain中,ChatModel 将消息(Messages)作为输入和返回的数据格式(在OpenAI中,消息就是一个json数组),消息中每个对象都包含两个基本属性:角色(role)和内容(content),以及一个可选的属性additional_kwargs,这个additional_kwargs属性主要提供不是常规的输入参数,例如OpenAI的function_call函数,角色(role)对应的就是user(用户发送的问题)、system(系统级提示)、assistant(AI回答内容)。

messages = [ SystemMessage(content=”You are Micheal Jordan.”), HumanMessage(content=”Which shoe manufacturer are you associated with?”), ]

  1. Message中主要的Python类:
  2. <a name="MhroL"></a>
  3. ### HumanMessage
  4. 用户发送的消息。
  5. <a name="wHlYh"></a>
  6. ### **SystemMessage**
  7. 系统消息,与用户发送的消息一起作为输入内容,用于设定让LLM回答的时候按照一定的规则要求输出,部分大模型不支持。
  8. <a name="PClJX"></a>
  9. ### **AIMessage**
  10. LLM输出消息,即回答的内容。它可以作为输入传递给其他工具或模型,以进一步处理或生成响应。例如,一个AIMessage可以包含一个问题,然后传递给另外一个回答问题的工具,以获取答案。
  11. <a name="KusgW"></a>
  12. ### **FunctionMessage**
  13. 工具输出消息,它包含了工具执行的函数调用信息。FunctionMessage中的function_call字段描述了工具执行的函数名称和参数。FunctionMessage可以作为输入传递给其他工具或模型,以执行特定的功能。例如,一个FunctionMessage可以包含一个文件移动工具的函数调用,将文件从一个位置移动到另一个位置。
  14. <a name="a27yX"></a>
  15. ### **ToolMessage**
  16. 工具调用结果消息,它包含了工具执行的结果信息。ToolMessage中的too_call_id字段表示调用工具的唯一标识符。ToolMessage可以用于跟踪工具调用的状态和结果。例如,一个ToolMessage可以包含一个文件移动工具的调用结果,指示文件是否成功移动。
  17. <a name="D1hbD"></a>
  18. ## Prompts 提示
  19. 用户询问大模型(例如chatGPT)的问题内容就是提示。在ChatGPT平台上我们是直接输入内容的,但是在开发AI应用的时候,用户输入的内容未必就是直接传给ChatGPT,而是经过AI应用的转换(转换的过程中我们会增加更多的提示内容,例如系统级提示)。<br />在LangChain中,LangChain提供一系列管理提示的功能组件,用于指导LLM生成相关的输出。Prompt可以是一个问题、一句话、一段文字或一组指令,旨在引导LLM生成特定的响应或完成特定的任务。<br />Prompt在语言模型中起到了重要的作用,它可以帮助模型理解上下文、生成相关的回答、完成句子或参与对话。通过提供清晰、明确的Prompt,可以引导模型生成更准确、相关的输出。<br />Message中主要的Python类:
  20. <a name="sY6N9"></a>
  21. ### **PromptValue**
  22. 用于将用户输入内容转换为字符串(适用于LLMs),也可以转换为消息列表(适用于Chat Models)。

prompt_value = PromptValue(“欢迎关注我的公众号秋水札记。”)

LLMs

text_input = prompt_value.to_string()

ChatModel

chat_input = prompt_value.to_messages()

  1. <a name="FrOU0"></a>
  2. ### **PromptTemplate**
  3. 用于将用户输入格式化为适合模型处理的字符串消息。

prompt_template = PromptTemplate(“你好,{name}。”) formatted_text = prompt_template.format(name=”秋水札记”)

  1. <a name="KlOHe"></a>
  2. ### **MessagePromptTemplate**
  3. 基于PromptTemplate的扩展,用于生成具有特定角色(如system或user)的消息。

创建基本的提示模板

basic_template = PromptTemplate(“欢迎关注我的公众号{gzh}。”)

定义用户消息模板

user_message_template = MessagePromptTemplate(role=”user”, template=basic_template)

生成用户消息

user_message = user_message_template.format(gzh=”秋水札记”)

  1. - HumanMessagePromptTemplate
  2. 生成用户输入的消息。

basic_template = PromptTemplate(“欢迎关注我的公众号{gzh}。”) human_message_template = HumanMessagePromptTemplate(template=basic_template) human_message = human_message_template.format(gzh=”秋水札记”)

  1. - SystemMessagePromptTemplate
  2. 生成系统级(system)消息。

basic_template = PromptTemplate(“欢迎关注我的公众号{gzh}。”) system_message_template = SystemMessagePromptTemplate(template=basic_template) system_message = system_message_template.format(gzh=”秋水札记”)

  1. - AIMessagePromptTemplate
  2. AI回复的内容封装成AI类型的消息,用于识别消息列表中每条消息的类型。

basic_template = PromptTemplate(“我是一个秋水札记的AI助手,非常高兴为你提供帮助。”) ai_message_template = AIMessagePromptTemplate(template=basic_template) ai_message = ai_message_template.format()

  1. <a name="dAURX"></a>
  2. ### **MessagesPlaceholder**
  3. 用作在对话消息列表中的一个占位符,它允许在动态地引入一系列之前的消息,即该会话的历史记录。这些消息可以是用户发送的、AI生成的,或是系统消息。

prompt = ChatPromptTemplate.from_messages([ SystemMessagePromptTemplate.from_template(“You are a nice chatbot having a conversation with a human.”),

指定一个变量名为 “chat_history”,这个变量名将在后续的对话中用来存储历史聊天消息。

  1. MessagesPlaceholder(variable_name="chat_history"),
  2. HumanMessagePromptTemplate.from_template("{input}")
  3. ]

)

  1. <a name="ZfJiy"></a>
  2. ### **ChatPromptTemplate**
  3. 生成完整聊天对话消息列表,包括多个不同类型的消息和占位符。

定义消息列表

chat_template = ChatPromptTemplate.from_messages( [ (“system”, “你是公众号的AI助手,你的名称叫{name}.”), (“human”, “你可以做什么?”), (“ai”, “我可以帮你查询公众里的内容”), (“human”, “{user_input}”), ] )

格式化数据

formatted_messages = chat_template.format_messages(name=”秋水札记”, user_input=”LangChain如何快速入门?”) ```

Output Parsers 输出解析器

模型的输出要么是字符串,要么是消息,输出解析器用于接收模型的返回结果,并格式化成我们需要的数据格式,便于我们后期我们继续使用,例如:JSON、XML、CSV、DateTime、枚举等