青训营X豆包MarsCode 技术训练营 提示工程

77 阅读3分钟

提示工程的定义:提示工程是指设计和优化提示(prompts)的一套技术与方法,旨在让用户对语言模型(LLMs)的输出有更高程度的控制,从而引导语言模型生成符合预期的高质量输出,以满足各种自然语言处理任务的需求.

提示的结构

  • 指令:告诉模型大概要做什么、怎么做
  • 上下文:模型的额外知识来源,可以通过手动插入、检索、调用api等方式
  • 提示输入:具体的问题,可以和“指令”合二为一
  • 输出指示器:标记要生成的文本的开始

langchain的提示模版类型:

两种基本类型的提示模板:string和chat

通过string和chat构建的提示模板:

  1. prompttemplate:包含了一些固定的文本部分以及特定的占位符或变量
  2. chatprompttemplate:组合各种角色的消息模板
  3. fewshotprompttemplate:通过示例来教模型如何回答
  4. pipelineprompt:把几个提示组合在一起使用
  5. 自定义模板

以上模板可以通过langchain包导入。

prompttemplate的使用:

  1. 定义一个原始模板template,原始模板就是基本的文本结构框架,里面需要包含固定的描述性文本(文字部分)和可动态替换的变量(例如{product})
  2. 利用prompttemplate中的from_template方法,基于原始模板生成一个提示模板
  3. 使用prompttemplate的format方法把原始模板中的变量进行替换,进而生成一个具体的提示

langchain可以从传入的字符串中自动提取变量名称,如扫到{product}就提取到了变量product,而无需刻意指定。

chatprompttemplate的使用:

  1. 构建消息列表:一个列表含有一个或多个对象,每个对象都有一个角色(system,user,assistant)和内容。
  2. 通过chatprompttemplate的from_message方法构建聊天提示模板。
  3. 与prompttemplate类似,利用from_messages格式化模板,构建提示模板
  4. 使用format_prompt格式化提示消息

fewshotprompttemplate: few shot learning:在只给定少量训练样本(通常远少于传统机器学习方法所需的样本量)的情况下,能够学习并对新的样本进行准确分类或生成等任务。

少样本提示模板的使用:

1.创建几个提示的样本, 每个示例都是一个字典,key是输入变量,value是输入变量的值。

例如: samples = [   {     "flower_type": "玫瑰",     "occasion": "爱情",     "ad_copy": "玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。"   },   {     "flower_type": "康乃馨",     "occasion": "母亲节",     "ad_copy": "康乃馨代表着母爱的纯洁与伟大,是母亲节赠送给母亲的完美礼物。"   }] samples这个列表中的字典就作为例子传递给模型的参考信息。

2.配置一个提示模板 (先创建原始模板再基于原始模板创建提示模板),创建一个prompttemplate,将一个示例格式化为字符串,

例如template="鲜花类型: {flower_type}\n场合: {occasion}\n文案: {ad_copy}" prompt_sample = PromptTemplate(input_variables=["flower_type", "occasion", "ad_copy"], template=template)

3.创建fewshotprompttemplate:

from langchain.prompts.few_shot import FewShotPromptTemplate prompt = FewShotPromptTemplate( examples=examples, example_prompt=example_prompt, suffix="问题: {input}", input_variables=("input") )

examples参数:必须的,传入一个包含示例的可迭代对象(列表、元组等),每个示例是一个字典。

example_prompt参数: 必须的,接收一个prompttemplate对象,传入参数的input_variables指定了从字典中获取的键,template定义了如何将键对应的内容组合成字符串。

suffix参数: 不是必须得,但大部分时候还是会用。定义在所有实例之后添加的内容。

input_variables参数: 是必须的,定义了提示模板中使用的变量的名称。

FewShotPromptTemplate模板可以使用多个示例来指导模型生成对应的输出。

拓展:示例选择器的使用

示例选择器:当有很多示例时,选择最合适的样本。

代码:example_selector = SemanticSimilarityExampleSelector.from_examples(     samples,     OpenAIEmbeddings(),     Chroma,     k=1 )