提示工程的定义:提示工程是指设计和优化提示(prompts)的一套技术与方法,旨在让用户对语言模型(LLMs)的输出有更高程度的控制,从而引导语言模型生成符合预期的高质量输出,以满足各种自然语言处理任务的需求.
提示的结构:
- 指令:告诉模型大概要做什么、怎么做
- 上下文:模型的额外知识来源,可以通过手动插入、检索、调用api等方式
- 提示输入:具体的问题,可以和“指令”合二为一
- 输出指示器:标记要生成的文本的开始
langchain的提示模版类型:
两种基本类型的提示模板:string和chat
通过string和chat构建的提示模板:
- prompttemplate:包含了一些固定的文本部分以及特定的占位符或变量
- chatprompttemplate:组合各种角色的消息模板
- fewshotprompttemplate:通过示例来教模型如何回答
- pipelineprompt:把几个提示组合在一起使用
- 自定义模板
以上模板可以通过langchain包导入。
prompttemplate的使用:
- 定义一个原始模板template,原始模板就是基本的文本结构框架,里面需要包含固定的描述性文本(文字部分)和可动态替换的变量(例如{product})
- 利用prompttemplate中的from_template方法,基于原始模板生成一个提示模板
- 使用prompttemplate的format方法把原始模板中的变量进行替换,进而生成一个具体的提示
langchain可以从传入的字符串中自动提取变量名称,如扫到{product}就提取到了变量product,而无需刻意指定。
chatprompttemplate的使用:
- 构建消息列表:一个列表含有一个或多个对象,每个对象都有一个角色(system,user,assistant)和内容。
- 通过chatprompttemplate的from_message方法构建聊天提示模板。
- 与prompttemplate类似,利用from_messages格式化模板,构建提示模板
- 使用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 )