Prompt Engineering(提示工程)
1、提示工程
https://prompt-engineering.xiniushu.com/guides/guidelines
https://www.promptingguide.ai/zh
prompt提示词模板:本章的主要内容为编写 Prompt 的原则,在本章中,我们将给出两个编写 Prompt 的原则与一些相关的策略,你将练习并基于这两个原则来编写有效的 Prompt。
技巧:可以将初步写好的模板丢给chatgpt,让chatgpt提供更多模板进行测试筛选。
2、分隔符
策略一:使用分隔符清晰地表示输入的不同部分
分隔符可以是:```、“”、<>、<tag><\tag>、:等。
你可以使用任何明显的标点符号将特定的文本部分与提示的其余部分分开,这可以是任何可以使模型明确知道这是一个单独部分的标记。使用分隔符是一种可以避免提示注入的有用技术,提示注入是指如果用户将某些输入添加到提示中,则可能会向模型提供与您想要执行的操作相冲突的指令,从而使其遵循冲突的指令而不是执行您想要的操作。即,输入里面可能包含其他指令,会覆盖掉你的指令。对此,使用分隔符是一个不错的策略。
以下是一个例子,我们给出一段话并要求 GPT 进行总结,在该示例中我们使用 ```来作为分隔符。
text = f"""
你应该提供尽可能清晰、具体的指示,以表达你希望模型执行的任务。\
这将引导模型朝向所需的输出,并降低收到无关或不正确响应的可能性。\
不要将写清晰的提示与写简短的提示混淆。\
在许多情况下,更长的提示可以为模型提供更多的清晰度和上下文信息,从而导致更详细和相关的输出。
"""
# 需要总结的文本内容
prompt = f"""
把用三个反引号括起来的文本总结成一句话。
```{text}```
"""
# 指令内容,使用 ```来分隔指令和待总结的内容
response = get_completion(prompt)
print(response)
策略二:要求一个结构化的输出
结构化输出可以是 JSON、HTML 等格式。
第二个策略是要求生成一个结构化的输出,这可以使模型的输出更容易被我们解析,例如,你可以在 Python 中将其读入字典或列表中。
在以下示例中,我们要求 GPT 生成三本书的标题、作者和类别,并要求 GPT 以 JSON 的格式返回给我们,为便于解析,我们指定了 JSON 的键。
输入:
prompt = f"""
请生成包括书名、作者和类别的三本虚构书籍清单,\
并以 JSON 格式提供,其中包含以下键:book_id、title、author、genre。
"""
response = get_completion(prompt)
print(response)
3、翻译案例
可以自己先写一些例子,然后丢个给chatgpt回答相关模板。
#单条
prompt= f"""将以下消息翻译成中文,如果是中文直接输出:```{issue}```"""
#多条
prompt=[[{"role": "user", "content": f"""将以下消息翻译成中文,如果是中文直接输出:```{issue}```"""},] for issue in user_messages]
4、词库扩展
#多词
prompt = f"""请根据提供的'''{issue}'''内容,编写一个详细具体的句子,包含以下关键词:{issue}。""" #ok ok
prompt = f"""编写一个详细具体的句子,包含以下关键词:{issue}。""" #ok ok
prompt = f"""编写一个句子,包含以下关键词:{issue}。""" #ok ok
prompt = f"""编写一个含负面信息切详细具体的句子,包含以下关键词:{issue}。""" #ok ok
# prompt = f"""编写一个正面详细具体的句子,包含以下关键词:{issue}。""" #ok ok
prompt = f"""内容带负面消极信息,编写一个详细具体的句子,包含以下关键词:{issue}。""" #ok ok
prompt = f"""内容含正面积极信息,编写一个详细具体的句子,包含以下关键词:{issue}。""" #ok ok
prompt = f"""内容描述清晰生动,编写一个详细具体的句子,包含以下关键词:{issue}。""" #ok ok
prompt = f"""内容负面,编写一个详细具体的句子,包含以下关键词:{issue}。""" #ok ok
#多个关键字,多个prompt组合
prompt1=[[{"role": "user", "content": f"""请根据提供的'''{x}'''内容,编写一个详细具体的句子,包含以下关键词:{x}。"""},] for x in user_messages]
prompt2=[[{"role": "user", "content": f"""请根据提供的'''{x},{y}'''内容,编写一个详细具体的句子,包含以下关键词:{x},{y}。"""},] for x,y in list(zip(*[iter(user_messages)]*2))]
prompt3=[[{"role": "user", "content": f"""请根据提供的'''{x},{y},{z}'''内容,编写一个详细具体的句子,包含以下关键词:{x},{y},{z}。"""},] for x,y,z in list(zip(*[iter(user_messages)]*3))]
prompt4=[[{"role": "user", "content": f"""内容带负面消极信息,编写一个详细具体的句子,包含以下关键词:{x}。"""},] for x in user_messages]
prompt5=[[{"role": "user", "content": f"""内容带负面消极信息,编写一个详细具体的句子,包含以下关键词:{x},{y}。"""},] for x,y in list(zip(*[iter(user_messages)]*2))]
prompt6=[[{"role": "user", "content": f"""内容带负面消极信息,编写一个详细具体的句子,包含以下关键词:{x},{y},{z}。"""},] for x,y,z in list(zip(*[iter(user_messages)]*3))]
prompt7=[[{"role": "user", "content": f"""内容描述清晰生动,编写一个详细具体的句子,包含以下关键词:{x}。"""},] for x in user_messages]
prompt8=[[{"role": "user", "content": f"""内容描述清晰生动,编写一个详细具体的句子,包含以下关键词:{x},{y}。"""},] for x,y in list(zip(*[iter(user_messages)]*2))]
prompt9=[[{"role": "user", "content": f"""内容描述清晰生动,编写一个详细具体的句子,包含以下关键词:{x},{y},{z}。"""},] for x,y,z in list(zip(*[iter(user_messages)]*3))]
prompt = prompt1 + prompt2+prompt3+ prompt4 + prompt5+prompt6 + prompt7 + prompt8+prompt9
print('\n合并:',prompt) # 输出 [1, 2, 3, 4, 5, 6]
zip对list分组:
z=[1, 2, 3, 4, 5, 6, 7, 8, 9,10,11]
print(list(zip(*[iter(z)])))
print(list(zip(*[iter(z)]*2)))
print(list(zip(*[iter(z)]*3)))
print(list(zip(z)))
# https://blog.csdn.net/p1279030826/article/details/110384827
a = [1,2,3,4]
b = ['a','b','c']
c = ['h','12','k']
e = [a,b,c]
e = [y+','+x for x in c for y in b]
print(e)
5、Langchain 提示模板 PromptTemplate(用封装库)
https://python.langchain.com/v0.1/docs/modules/model_io/prompts/
https://cookbook.langchain.com.cn/docs/langchain-prompt-templates/
https://github.com/XingYu-Zhong/LangChainStudy/blob/master/03Prompts.ipynb
from langchain.prompts import PromptTemplate
prompt_template = PromptTemplate.from_template(
"Write a delicious recipe for {dish} with a {flavor} twist."
)
# Formatting the prompt with new content
formatted_prompt = prompt_template.format(dish="pasta", flavor="spicy")
print(formatted_prompt)
带例子的聊天提示词模板
from langchain.prompts import (
FewShotChatMessagePromptTemplate,
ChatPromptTemplate,
)
#zh:这是一个聊天提示词模板,它将输入变量作为输入,并将其格式化为包含示例的提示词。
examples = [
{"input": "2+2", "output": "4"},
{"input": "2+3", "output": "5"},
]
# This is a prompt template used to format each individual example.
# zh:这是一个提示词模板,用于格式化每个单独的示例。
example_prompt = ChatPromptTemplate.from_messages(
[
("human", "{input}"),
("ai", "{output}"),
]
)
few_shot_prompt = FewShotChatMessagePromptTemplate(
example_prompt=example_prompt,
examples=examples,
)
print(few_shot_prompt.format())
#最后,组装您的最终提示并将其与模型一起使用。
final_prompt = ChatPromptTemplate.from_messages(
[
("system", "You are wonderous wizard of math."),
few_shot_prompt,
("human", "{input}"),
]
)
from langchain.chat_models import ChatOpenAI
chain = final_prompt | ChatOpenAI()
chain.invoke({"input": "What's the square of a triangle?"})
6、langchain结构化输出(用封装库)
官方教程:https://langchain114.com/docs/modules/model_io/output_parsers/types/structured/
https://github.com/liaokongVFX/LangChain-Chinese-Getting-Started-Guide
https://blog.csdn.net/qq_38628046/article/details/137466961
例如:
有时候我们希望输出的内容不是文本,而是像 json 那样结构化的数据。
from langchain.output_parsers import StructuredOutputParser, ResponseSchema
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI
llm = OpenAI(model_name="text-davinci-003")
# 告诉他我们生成的内容需要哪些字段,每个字段类型式啥
response_schemas = [
ResponseSchema(name="bad_string", description="This a poorly formatted user input string"),
ResponseSchema(name="good_string", description="This is your response, a reformatted response")
]
# 初始化解析器
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
# 生成的格式提示符
# {
# "bad_string": string // This a poorly formatted user input string
# "good_string": string // This is your response, a reformatted response
#}
format_instructions = output_parser.get_format_instructions()
template = """
You will be given a poorly formatted string from a user.
Reformat it and make sure all the words are spelled correctly
{format_instructions}
% USER INPUT:
{user_input}
YOUR RESPONSE:
"""
# 将我们的格式描述嵌入到 prompt 中去,告诉 llm 我们需要他输出什么样格式的内容
prompt = PromptTemplate(
input_variables=["user_input"],
partial_variables={"format_instructions": format_instructions},
template=template
)
promptValue = prompt.format(user_input="welcom to califonya!")
llm_output = llm(promptValue)
# 使用解析器进行解析生成的内容
output_parser.parse(llm_output)