LangChain --- Prompt

Prompt是指对于大模型的提示工程(输入)。

提示的结构

image.png

这个实用的提示框架,分成多个部分:

  • 指令(Instuction)告诉模型这个任务大概要做什么、怎么做。这通常是一个提示模板中比较固定的部分。
    • 如何使用提供的外部信息
    • 如何处理查询以及如何构造输出
    • 一个常见用例是告诉模型“你是一个有用的XX助手”,这会让他更认真地对待自己的角色。
  • 上下文(Context)则充当模型的额外知识来源。
    • 这些信息可以手动插入到提示中
    • 通过矢量数据库检索得来
    • 通过其他方式(如调用API、计算器等工具)拉入。
    • 一个常见的用例是把从向量数据库查询到的知识作为上下文传递给模型。
  • 提示输入(Prompt Input)通常就是具体的问题或者需要大模型做的具体事情,这个部分和“指令”部分其实也可以合二为一。
    • 拆分出来作为一个独立的组件,能够更加结构化,便于复用
    • 这通常是作为变量,在调用模型之前传递给提示模板,以形成具体的提示。
  • 输出指示器(Output Indicator)标记要生成的文本的开始。
    • 这就像我们小时候的数学考卷,先写一个“解”,就代表你要开始答题了。
    • 如果生成 Python 代码,可以使用 “import” 向模型表明它必须开始编写 Python 代码(因为大多数 Python 脚本以import开头)。
    • 这部分在我们和ChatGPT对话时往往是可有可无的,当然LangChain中的代理在构建提示模板时,经常性的会用一个“Thought:”(思考)作为引导词,指示模型开始输出自己的推理(Reasoning)。

LangChain 提示模板的类型

序号提示模板含义导入
1PromptTemplate最常用的String提示模板from langchain.prompts.prompt import PromptTemplate
2ChatPromptTemplate常用的Chat提示模板,一般用于组合各种角色的消息模板from langchain.prompts import ChatPromptTemplate
3FewShotPromptTemplate少样本提示模板,通过示例的展示教模型如何如何回答from langchain.prompts import FewShotPromptTemplate
4PipelinePromptTemplate用于组合多个提示模板from langchain.prompts.pipeline import PipelinePromptTemplate
5自定义模板LangChain允许自定义自己的提示模板---

提示模板的使用

PromptTemplate

from langchain import PromptTemplate

template = """\
你是业务咨询顾问。
你给一个销售{product}的电商公司,起一个好的名字?
"""
prompt = PromptTemplate.from_template(template)

print(prompt.format(product="鲜花"))
# 你是业务咨询顾问。
# 你给一个销售鲜花的电商公司,起一个好的名字?
prompt = PromptTemplate(
    input_variables=["product", "market"], 
    template="你是业务咨询顾问。对于一个面向{market}市场的,专注于销售{product}的公司,你会推荐哪个名字?"
)

print(prompt.format(product="鲜花", market="高端"))
# 你是业务咨询顾问。对于一个面向高端市场的,专注于销售鲜花的公司,你会推荐哪个名字?

两种方式创建,一种是通过格式化字符串自动获取需要替换的内容(product),一种则是通过构造函数,手动指定需要替换的变量。两者创建的效果是一样的。

ChatPromptTemplate

OpenAI推出的ChatGPT这一类的聊天模型,LangChain也提供了一系列的模板,这些模板的不同之处是它们有对应的角色

 import openai
 openai.ChatCompletion.create(
   model="gpt-3.5-turbo",
   messages=[
         {"role": "system", "content": "You are a helpful assistant."},
         {"role": "user", "content": "Who won the world series in 2020?"},
         {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
         {"role": "user", "content": "Where was it played?"}
     ]
 )

OpenAI对传输到gpt-3.5-turbo和GPT-4的messsage格式说明如下:

消息必须是消息对象的数组,其中每个对象都有一个角色(系统、用户或助理)和内容。对话可以短至一条消息,也可以来回多次。

通常,对话首先由系统消息格式化,然后是交替的用户消息和助理消息。

系统消息有助于设置助手的行为。例如,你可以修改助手的个性或提供有关其在整个对话过程中应如何表现的具体说明。但请注意,系统消息是可选的,并且没有系统消息的模型的行为可能类似于使用通用消息,例如“你是一个有用的助手”。

用户消息提供助理响应的请求或评论。

助理消息存储以前的助理响应,但也可以由你编写以给出所需行为的示例。

示例:

# 导入聊天消息类模板
from langchain.prompts import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)
# 模板的构建
template="你是一位专业顾问,负责为专注于{product}的公司起名。"
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template="公司主打产品是{product_detail}。"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
prompt_template = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])

# 格式化提示消息生成提示
prompt = prompt_template.format_prompt(product="鲜花装饰", product_detail="创新的鲜花设计。").to_messages()
print(prompt)
# [SystemMessage(content='你是一位专业顾问,负责为专注于鲜花装饰的公司起名。', additional_kwargs={}, response_metadata={}), HumanMessage(content='公司主打产品是创新的鲜花设计。。', additional_kwargs={}, response_metadata={})]

FewShotPromptTemplate

# 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)

# 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="爱情"))
鲜花类型: 玫瑰
场合: 爱情
文案: 玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。

鲜花类型: 康乃馨
场合: 母亲节
文案: 康乃馨代表着母爱的纯洁与伟大,是母亲节赠送给母亲的完美礼物。

鲜花类型: 百合
场合: 庆祝
文案: 百合象征着纯洁与高雅,是你庆祝特殊时刻的理想选择。

鲜花类型: 向日葵
场合: 鼓励
文案: 向日葵象征着坚韧和乐观,是你鼓励亲朋好友的最好方式。

鲜花类型: 野玫瑰
场合: 爱情

FewShot,是指在提出具体任务前,提供少量样本供大模型参考,通过FewShotPromptTemplate可以快速初始化对应的模板。

posted @ 2024-11-25 16:51  ling-yuan  阅读(19)  评论(0)    收藏  举报  来源