Prompt是一种用于指导以大语言模型为代表的生成式人工智能生成内容(文本、图像、视频等)的输入方式。它通常是一个简短的文本或问题,用于描述任务和要求。
Prompt可以包含一些特定的关键词或短语,用于引导模型生成符合特定主题或风格的内容。例如,如果我们要生成一篇关于“人工智能”的文章,我们可以使用“人工智能”作为Prompt,让模型生成一篇关于人工智能的介绍、应用、发展等方面的文章。
Prompt还可以包含一些特定的指令或要求,用于控制生成文本的语气、风格、长度等方面。例如,我们可以使用“请用幽默的语气描述人工智能的发展历程”作为Prompt,让模型生成一篇幽默风趣的文章。
总之,Prompt是一种灵活、多样化的输入方式,可以用于指导大语言模型生成各种类型的内容。
提示工程是一种通过设计和调整输入(Prompts)来改善模型性能或控制其输出结果的技术。
在模型回复的过程中,首先获取用户输入的文本,然后处理文本特征并根据输入文本特征预测之后的文本,原理为next token prediction。
提示工程是模型性能优化的基石,有以下六大基本原则:
指令要清晰
提供参考内容
复杂的任务拆分成子任务
给 LLM“思考”时间(给出过程)
使用外部工具
系统性测试变化
LangGPT 是 Language For GPT-like LLMs 的简称,中文名为结构化提示词。LangGPT 是一个帮助你编写高质量提示词的工具,理论基础是我们提出的一套模块化、标准化的提示词编写方法论——结构化提示词。我们希望揭开提示工程的神秘面纱,为大众提供一套可操作、可复现的提示词方法论、工具和交流社群。我们的愿景是让人人都能写出高质量提示词。LangGPT社区文档:
LangGPT框架参考了面向对象程序设计的思想,设计为基于角色的双层结构,一个完整的提示词包含模块-内部元素两级,模块表示要求或提示LLM的方面,例如:背景信息、建议、约束等。内部元素为模块的组成部分,是归属某一方面的具体要求或辅助信息,分为赋值型和方法型。
一个好的结构化 Prompt 模板,某种意义上是构建了一个好的全局思维链。 如 LangGPT 中展示的模板设计时就考虑了如下思维链:
Role (角色) -> Profile(角色简介)—> Profile 下的 skill (角色技能) -> Rules (角色要遵守的规则) -> Workflow (满足上述条件的角色的工作流程) -> Initialization (进行正式开始工作的初始化准备) -> 开始实际使用
提示设计框架
CRISPE,参考:https://github.com/mattnigh/ChatGPT3-Free-Prompt-List
Capacity and Role (能力与角色):希望 ChatGPT 扮演怎样的角色。
Insight (洞察力):背景信息和上下文(坦率说来我觉得用 Context 更好)
Statement (指令):希望 ChatGPT 做什么。
Personality (个性):希望 ChatGPT 以什么风格或方式回答你。
Experiment (尝试):要求 ChatGPT 提供多个答案。
Context (背景): 提供任务背景信息
Objective (目标): 定义需要LLM执行的任务
Style (风格): 指定希望LLM具备的写作风格
Tone (语气): 设定LLM回复的情感基调
Audience (观众): 表明回复的对象
Response (回复): 提供回复格式
完成的提示如下:
# CONTEXT #
我是一名个人生产力开发人员。在个人发展和生产力领域,对系统的需求日益增长,这些系统不仅能帮助个人设定目标,还能将这些目标转化为可操作的步骤。许多人在从愿望转变为具体行动的过程中遇到困难,这凸显了对有效的目标到系统转换过程的需求。
#########
# OBJECTIVE #
你的任务是指导我创建一个全面的系统转换器。这涉及将流程分解为不同的步骤,包括确定目标、采用 5 个为什么技术、学习核心操作、设定意图和进行定期审查。目的是提供分步指南,以便无缝地将目标转化为可操作的计划。
#########
# STYLE #
以信息性和指导性风格撰写,类似于个人发展指南。确保每个步骤的呈现清晰连贯,迎合那些渴望提高生产力和实现目标技能的受众。
#########
# Tone #
自始至终保持积极和激励的语气,培养一种赋权和鼓励的感觉。它应该感觉像一个友好的向导,提供有价值的见解。
# AUDIENCE #
目标受众是对个人发展和生产力提高感兴趣的个人。假设读者寻求实用建议和可行步骤,以将目标转化为切实成果。
#########
# RESPONSE FORMAT #
提供目标到系统转换过程的结构化步骤列表。每个步骤都应明确定义,并且总体格式应易于遵循,以便快速实施。
#############
# START ANALYSIS #
如果你明白的话,就问我我的目标吧。
了解以上背景知识后,如果单纯让我们按照规范编写提示词还是有一点难度的。我们可以借助gpt 来给我们创造和生成LangGPT结构格式的提示词,然后在此基础上修改一下这样就能大大加快提示词编写为我所用了。
举例:
我们有一个SQL 语句:
select
m.ip_address,
m.name,
count(*)
from
(
select
a.id,
a.ip_address,
b.name,
a.create_time
from
dwa_user_ip a
left join dwa_user_name b on
a.ip_address = b.ip_address
where
a.create_time >'2024-01-19') m
group by
m.ip_address,
m.name
order by
count(*) desc
我们希望通过GPT 帮我 优化一下。传统的做法是这样的
用户输入一段SQL语句比如‘select m.ip_address,m.name,count(*) from (SELECT a.id, a.ip_address, b.name, a.create_time
FROM dwa_user_ip a
LEFT JOIN dwa_user_name b ON a.ip_address = b.ip_address
where a.create_time >'2024-01-19') m group by m.ip_address,m.name order by count(*) desc
’ 请帮我们优化一下SQL语句。
这样我们发给GPT 他给我们返回
GPT 会给我们返回SQL 语句优化的解释,并给我们返回优化后的SQL 语句。总体来说这个回答还是不错的,有解释,有优化后的答案。这里面有一个问题就是我们问的问题如果非常简单GPT 随机性比较大回答每次可能不一样,这样就不一定能满足用户的需求。另外对用户来说 问题中每次夹杂着相关要求,对用户体验来说不够友好。所以我们需要改进一下,也就是利用LangGPT结构格式的提示词变成系统提示词。
我们发如下的对话,发给GPT
用户输入一段SQL语句比如"select m.ip_address,m.name,count(*) from (SELECT a.id, a.ip_address, b.name, a.create_time
FROM dwa_user_ip a
LEFT JOIN dwa_user_name b ON a.ip_address = b.ip_address
where a.create_time >'2024-01-19') m group by m.ip_address,m.name order by count(*) desc
" 只返回优化后的SQL,用markdown格式输出,其他不要输出。 请根据以上内容编写提示词,使用LangGPT提示词(prompt)语法编写一个SQL语句优化提示词专家。
GPT 给我返回生成好的符合LangGPT结构格式的系统提示词
# Role: SQL优化专家
## Profile
- 名称: SQL优化器
- 专长: SQL语句分析和优化
- 输出: 仅优化后的SQL语句,使用markdown格式
## Background
你是一位精通SQL优化的专家,能够快速分析SQL语句并提供优化方案。你的任务是接收用户输入的SQL查询,进行分析和优化,然后仅输出优化后的SQL语句,不提供其他解释或评论。
## Goals
- 分析用户提供的SQL语句
- 识别并解决性能问题
- 重写SQL以提高效率
- 仅输出优化后的SQL语句
## Constraints
- 只输出优化后的SQL语句,使用markdown代码块格式
- 不提供解释、评论或其他额外信息
- 保持SQL的原始功能和结果不变
- 如果SQL已经是最优的,则原样返回
## Skills
- 深入理解SQL语法和优化技巧
- 能够识别和解决常见的SQL性能问题
- 熟悉各种SQL优化策略,如索引优化、查询重写等
## Workflows
1. 仔细阅读用户提供的SQL语句
2. 分析SQL结构,识别潜在的性能问题
3. 应用适当的优化技术重写SQL
4. 使用markdown代码块格式输出优化后的SQL
## Output Format
```sql
[此处是优化后的SQL语句]
通过以上的方式我们就让GPT理解我们需要生成LangGPT结构格式的提示词了,让他给我编写系统提示词。
我们将以上GPT 生成的LangGPT结构格式的提示词复制到chatbox系统提示中,让其设定成"SQL专家"
打开chatbox- 专属设定
我们将GPT生成好的系统提示词复制到,这个角色设定输入框中。保存设置,关闭窗口。
接下来我们只输入需要输入的SQL
select m.ip_address,m.name,count(*) from (SELECT a.id, a.ip_address, b.name, a.create_time
FROM dwa_user_ip a
LEFT JOIN dwa_user_name b ON a.ip_address = b.ip_address
where a.create_time >'2024-01-19') m group by m.ip_address,m.name order by count(*) desc
将上诉SQL 语句输入到chatbox 聊天对话窗口中
这样通过系统提示的限定,这样我们就打造出一个SQL优化的专家了。对用户来说输入的条件变少了,返回信息也是按照我要求的信息返回了。
有的小伙伴可能觉得这样操作不方便,不能批量实现能不能通过编码的方式批量来实现呢。下面给出测试代码
OptimizingSQL.py
from openai import OpenAI
client = OpenAI(
api_key='EMPTY',
base_url='http://101.126.xx.xx:7002/v1',
)
model_type = "/tmp/pretrainmodel/Qwen2-7B-Instruct"
print(f'model_type: {model_type}')
messages = [
{"role": "system", "content": "你是一个SQL优化专家。你的任务是分析给定的SQL查询,并提供优化后的版本。只返回优化后的SQL,使用markdown格式输出,不要提供任何其他解释或评论。"}
]
for query in ['select m.ip_address,m.name,count(*) from (SELECT a.id, a.ip_address, b.name, a.create_time\nFROM dwa_user_ip a\nLEFT JOIN dwa_user_name b ON a.ip_address = b.ip_address\nwhere a.create_time >\'2024-01-19\') m group by m.ip_address,m.name order by count(*) desc']:
messages.append({
'role': 'user',
'content': query
})
resp = client.chat.completions.create(
model=model_type,
messages=messages,
seed=42)
response = resp.choices[0].message.content
print(f'query: {query}')
print(f'response: {response}')
messages.append({'role': 'assistant', 'content': response})
# 流式
for query in ['select m.ip_address,m.name,count(*) from (SELECT a.id, a.ip_address, b.name, a.create_time\nFROM dwa_user_ip a\nLEFT JOIN dwa_user_name b ON a.ip_address = b.ip_address\nwhere a.create_time >\'2024-01-19\') m group by m.ip_address,m.name order by count(*) desc']:
messages.append({'role': 'user', 'content': query})
stream_resp = client.chat.completions.create(
model=model_type,
messages=messages,
stream=True,
seed=42)
print(f'query: {query}')
print('response: ', end='')
response = ''
for chunk in stream_resp:
if chunk.choices[0].delta.content is not None:
response += chunk.choices[0].delta.content
print(chunk.choices[0].delta.content, end='', flush=True)
print()
messages.append({'role': 'assistant', 'content': response})
以上代码实际工作中流式输出和非流输出 2个保留一个即可,另外可以注释掉。
依赖包安装
# 安装openai 客户端调用依赖包
pip install openai
执行代码
python OptimizingSQL.py