提示词工程

引用自:Prompt Engineering Guide

背景

提示工程(Prompt Engineering)是一门较新的学科,关注提示词开发和优化,帮助用户将大语言模型(Large Language Model, LLM)用于各场景和研究领域。

提示工程不仅仅是关于设计和研发提示词。它包含了与大语言模型交互和研发的各种技能和技术。

例如:在一些应用场景中,具备特定领域的知识(如编程、医学、法律等)可以帮助设计更有效的提示和任务

模型参数

使用提示词时,我们通常会通过 API 或直接与大语言模型进行交互,而它支持配置多种参数以获得不同的提示结果。

OpenAI投喂的语料中涉及到了markdown文档,使用md格式文本进行投喂训练效果可能很好!

调整这些设置对于提高响应的可靠性非常重要,可能需要进行一些实验才能找出适合您的用例的正确设置。

实验可以包括多种形式,例如在 Playground 中直接输入不同的提示词、调整参数,观察模型生成的响应;或者模型在与用户的交互中逐步优化提示。

以下是使用不同LLM提供程序时会遇到的常见设置:

Temperature:简单来说,temperature 的参数值越小,模型就会返回越确定的一个结果。如果调高该参数值,大语言模型可能会返回更随机的结果,也就是说这可能会带来更多样化或更具创造性的产出。(调小temperature)实质上,你是在增加其他可能的 token 的权重。在实际应用方面,对于质量保障(QA)等任务,我们可以设置更低的 temperature 值,以促使模型基于事实返回更真实和简洁的结果。 对于诗歌生成或其他创造性任务,适度地调高 temperature 参数值可能会更好。

Top_p:同样,使用 top_p(与 temperature 一起称为核采样(nucleus sampling)的技术),可以用来控制模型返回结果的确定性。如果你需要准确和事实的答案,就把参数值调低。如果你在寻找更多样化的响应,可以将其值调高点。

  • 使用Top P意味着只有词元集合(tokens)中包含top_p概率质量的才会被考虑用于响应,因此较低的top_p值会选择最有信心的响应。这意味着较高的top_p值将使模型考虑更多可能的词语,包括不太可能的词语,从而导致更多样化的输出。

一般建议是改变Temperature和Top P其中一个参数就行,不用两个都调整。

Max Length:可以通过调整 max length 来控制大模型生成的 token 数。指定 Max Length 有助于防止大模型生成冗长或不相关的响应并控制成本。

Stop Sequences:stop sequence 是一个字符串,可以阻止模型生成 token,指定 stop sequences 是控制大模型响应长度和结构的另一种方法。例如,您可以通过添加 “11” 作为 stop sequence 来告诉模型生成不超过 10 个项的列表。

Frequency Penalty:frequency penalty 是对下一个生成的 token 进行惩罚,这个惩罚和 token 在响应和提示中已出现的次数成比例, frequency penalty 越高,某个词再次出现的可能性就越小,这个设置通过给 重复数量多的 Token 设置更高的惩罚来减少响应中单词的重复。

Presence Penalty:presence penalty 也是对重复的 token 施加惩罚,但与 frequency penalty 不同的是,惩罚对于所有重复 token 都是相同的。出现两次的 token 和出现 10 次的 token 会受到相同的惩罚。 此设置可防止模型在响应中过于频繁地生成重复的词。 如果您希望模型生成多样化或创造性的文本,您可以设置更高的 presence penalty,如果您希望模型生成更专注的内容,您可以设置更低的 presence penalty。

与 temperature 和 top_p 一样,一般建议是改变 frequency penalty 和 presence penalty 其中一个参数就行,不要同时调整两个。

ChatGPT模型的文本生成实践

当使用 OpenAI 的 gpt-4 或者 gpt-3.5-turbo 等聊天模型时,你可以使用三个不同的角色来构建 prompt: system、user 和 assistant。他们共同构建了一个对话的意图与身份,表名了聊天机器人在其中的背景、语气风格以及响应。

不过从o1-2024-12-17开始,o1模型支持developer消息而不是system消息,详见https://cdn.openai.com/spec/model-spec-2024-05-08.html#follow-the-chain-of-command

也可以参考阿里云的提示词实践

多轮对话

这个示例实践中,使用一系列聊天消息作为输入,并使用这些消息生成响应。

输入:

1
2
3
4
系统:你是一个AI研究助手。你使用技术和科学的语气。
用户:你好,你是谁?
助手:问候!我是AI研究助手。我今天能帮你什么忙吗?
用户:你能告诉我黑洞的形成吗?

输出:

1
助手:当一个巨大的恒星耗尽燃料并在自身的引力下坍塌时,就会形成黑洞。这种坍塌使星体变得极其密集,具有极强的引力场,甚至连光都无法逃脱。这个无法逆转的点被称为事件视界。一旦一颗恒星穿过事件视界,它就被认为是一个黑洞...

如图:

CHATGPT1

代码为:

1
2
3
4
5
6
7
8
9
10
11
import openai

openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are an AI research assistant. You use a tone that is technical and scientific."},
{"role": "user", "content": "Hello, who are you?"},
{"role": "assistant", "content": "Greeting! I am an AI research assistant. How can I help you today?"},
{"role": "user", "content": "Can you tell me about the creation of black holes?"}
]
)

单轮任务

输入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
系统:
#背景# 您是一位有用的爬虫代码助手,专注于安全运营场景下的自动化任务。您选择的语言是Python,版本是3.6.0,使用的HTTP请求库是requests。
#目的# 根据API文档的请求示例,您需要编写功能完整的爬虫代码。您将从API文档中提取请求URL、请求方法、请求体、请求头和响应数据格式的一个或多个样例,以便实现数据采集。也可能涉及认证登录。
#风格# 请确保输出的代码技术上准确,结构清晰,遵循PEP-8标准,让代码易于阅读和理解,注重中文注释的使用以阐明关键逻辑和功能。涉及异常处理部分捕获后直接raise。
#受众# 目标用户是其他开发者,他们希望快速掌握并有效且直接的应用爬虫代码到实际项目中,具备一定的Python基础。
#输出# 仅生成代码块,不进行代码解释。确保代码段具有可执行性,并且包含必要的导入语句和环境设置。

用户:
#参考代码#
下面为demo参考代码,使用~~~标记开始和结束。请基于下面demo代码以及API文档示例,输出bound method(保留self)。如有多个示例请输出多个方法。
请勿输出示例代码中的class_name_demo、__init__、session_init_demo,以及__name__=='__main__'部分,仅输出根据API文档自定义的函数。
确保保留的自定义函数中,入参arguments中包含self参数,并且不输出上述类函数。注意不要进行代码解释,仅生成代码块。
~~~
class class_name_demo():
def __init__(self, assets):
self.host = assets['host']
self.port = assets['port']
self.apikey = assets['apikey']
# 如果API文档给出了username、password,请使用该认证方式 并且在headers中根据字段要求设置认证。 #
self.username = username
self.password = password
self.session = self.session_init_demo(self.api_key)

@staticmethod
def session_init_demo(api_key):
session = requests.session()
session.verify = False
session.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36'
session.headers['custom_authorization'] = ...
return session

# 下面为伪代码,根据API文档定义输入参数和输出结果。 #
def custom_action_demo(self, ...):
url = f"self.host/v1/..."
data = ...
try:
self.session.method(url=url, data=data)
return ...
except Exception as e:
raise Exception(...)
~~~
#API文档# ...

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
助手:
def send_task(self, task_type, params):
url = f"{self.host}:{self.port}/api/edr/v3/task?token={self.apikey}"
data = {
"type": task_type,
"params": params
}
try:
response = self.session.post(url, json=data)
return response.json()
except Exception as e:
raise Exception(f"Failed to send task: {str(e)}")

def query_task_state(self, task_type, params):
url = f"{self.host}:{self.port}/api/edr/v3/task/taskstate?_method=GET&token={self.apikey}"
data = {
"type": task_type,
"params": params
}
try:
response = self.session.post(url, json=data)
return response.json()
except Exception as e:
raise Exception(f"Failed to query task state: {str(e)}")

def query_task_result(self, task_type, params):
url = f"{self.host}:{self.port}/api/edr/v3/task/taskresult?_method=GET&token={self.apikey}"
data = {
"type": task_type,
"params": params
}
try:
response = self.session.post(url, json=data)
return response.json()
except Exception as e:
raise Exception(f"Failed to query task result: {str(e)}")

def cancel_task(self, task_type, task_ids, uuid=None):
url = f"{self.host}:{self.port}/api/edr/v3/task?_method=DELETE&token={self.apikey}"
data = {
"type": task_type,
"taskId": task_ids
}
if uuid:
data["uuid"] = uuid
try:
response = self.session.post(url, json=data)
return response.json()
except Exception as e:
raise Exception(f"Failed to cancel task: {str(e)}")

对话中实践

如果你平时经常使用国内各镜像站提供的GPT-3.5对话站点,你可以针对自己的需求在对话中添加属于本次自己的prompt,以及控制对话时是否继承上下文(开启时 国内大部分镜像站框架提供的对话继承,通常只会继承上一轮的对话),为避免自己输入简短内容如make([]T)时被大模型误解,或者输出为你不希望的语言,你可以添加属于本轮对话的system。

例如你正在学习golang相关的知识点,并且希望参考你之前的技能经验进行输出,你可以这样设计提示词:

1
2
3
4
5
6
7
你是一个GO语言助手,你可以根据输入的信息给出相应的简要解释。
# 背景
面向正在初学go语言的初学者,且具有python开发能力、javascript开发能力、typescript开发能力的用户进行阐述和解释,使得他们可以更好的学习go语言。
# 风格
使用中文,必要时列举python中的例子。
# 输出
用户询问函数使用时只输出简要用法,不要输出较长代码块的示例。

这样就可以使得你在输出简短英文短句时,避免AI输出英文或者其他语言的代码,使得可以达成期望效果。


提示词工程
https://www.fishingrodd.cn/2025/01/13/提示词工程/
作者
FishingRod
发布于
2025年1月13日
更新于
2026年3月23日
许可协议