提示工程Prompt——Fewshot

163 阅读3分钟

Prompt

正如上一节所说,outparser的本质就是在prompt里加入了一个提示词,让大模型遵循这个格式输出内容。因此我们可以知道,对于智能程度较高的模型,一个好的prompt可以激发大模型无限的潜力。

对于如何书写一个好的prompt,不同人有不同的看法。吴恩达老师的看法是:

第一条原则是写出清晰而具体的指示,第二条原则是给模型思考的时间。

OpenAI给出的看法是:

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

这是一个实用的指令模板

image.png

包含了指令,上下文,问题和输出格式。 指令更多的可能是大模型的身份介绍,能力介绍。问题则是具体的问题。

image.png

在Langchain中,给我们定义了四种模板,其中PromptTemplate我们在之前已经用过了。

Langchain提供了各种各样的模板

from langchain.prompts.prompt import PromptTemplate
from langchain.prompts import FewShotPromptTemplate
from langchain.prompts.pipeline import PipelinePromptTemplate
from langchain.prompts import ChatPromptTemplate
from langchain.prompts import (
    ChatMessagePromptTemplate,
    SystemMessagePromptTemplate,
    AIMessagePromptTemplate,
    HumanMessagePromptTemplate,
)

FewShot

Few-Shot(少样本)、One-Shot(单样本)和与之对应的 Zero-Shot(零样本)的概念都起源于机器学习。如何让机器学习模型在极少量甚至没有示例的情况下学习到新的概念或类别,对于许多现实世界的问题是非常有价值的。

我们可以创建一个样例列表,保存着一个一个的样例,然后通过一个fewshotprompt输入模型内。

# 1. 创建一些示例
samples = [
  {
    "flower_type": "玫瑰",
    "occasion": "爱情",
    "ad_copy": "玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。"
  },
  {
    "flower_type": "康乃馨",
    "occasion": "母亲节",
    "ad_copy": "康乃馨代表着母爱的纯洁与伟大,是母亲节赠送给母亲的完美礼物。"
  },
  {
    "flower_type": "百合",
    "occasion": "庆祝",
    "ad_copy": "百合象征着纯洁与高雅,是你庆祝特殊时刻的理想选择。"
  },
  {
    "flower_type": "向日葵",
    "occasion": "鼓励",
    "ad_copy": "向日葵象征着坚韧和乐观,是你鼓励亲朋好友的最好方式。"
  }
]


# 2. 创建一个提示模板
from langchain.prompts.prompt import PromptTemplate
template="鲜花类型: {flower_type}\n场合: {occasion}\n文案: {ad_copy}"
prompt_sample = PromptTemplate(input_variables=["flower_type", "occasion", "ad_copy"], 
                               template=template)
print(prompt_sample.format(**samples[0]))

# 3. 创建一个FewShotPromptTemplate对象
from langchain.prompts.few_shot import FewShotPromptTemplate
prompt = FewShotPromptTemplate(
    examples=samples,
    example_prompt=prompt_sample,
    suffix="鲜花类型: {flower_type}\n场合: {occasion}",
    input_variables=["flower_type", "occasion"]
)
print(prompt.format(flower_type="野玫瑰", occasion="爱情"))

  1. 首先生成一个样例模板,说明每条Prompt是怎么样的
  2. 传入所有的examples以及对应的样例模板prompt_sample
  3. suffix代表我们需要的模板
  4. input_variables是我们最后需要的输入变量

fewshot里的变量最终都是会被填充的,不需要我们在输入时候再输入,fewshot相当于先验知识。

示例选择器

有时候samples多了,也不可能全部丢入Prompt,那就太浪费Tokens了,于是我们可以像RAG一样,只丢入几个最相近的做Fewshot。

# 5. 使用示例选择器
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings

# 初始化示例选择器
example_selector = SemanticSimilarityExampleSelector.from_examples(
    samples,
    OpenAIEmbeddings(),
    Chroma,
    k=1
)

# 创建一个使用示例选择器的FewShotPromptTemplate对象
prompt = FewShotPromptTemplate(
    example_selector=example_selector, 
    example_prompt=prompt_sample, 
    suffix="鲜花类型: {flower_type}\n场合: {occasion}", 
    input_variables=["flower_type", "occasion"]
)
print(prompt.format(flower_type="红玫瑰", occasion="爱情"))