提示词工程

Prompt 是一种在自然语言处理(NLP)中用于引导语言模型生成特定类型文本的技术。它的基本原理是通过向语言模型提供一个包含任务相关信息的输入文本片段(即 Prompt),利用语言模型在预训练阶段学到的语言知识和模式,引导模型生成符合预期的输出。例如,对于一个文本生成任务,Prompt 可以是一个问题、一个主 题描述或者一个部分完成的句子,模型会根据这个 Prompt 来续写或生成完整的文本。

https://blog.csdn.net/qq_56438555/article/details/144886517

1 提示词案例

1.1 翻译软件

可以通过提示词的设计让大模型变为翻译工具

1.2 让Deepseek绘画

Deepseek本身是没有提供绘画功能的,可以通过提示词的功能增强。让大模型具备生成图片的功能。

1
你现在是一个可以进行AI图片生成的机器人,等待我给你一些提示,然后发挥你的想象力去完善这幅图片的描述,并转换成英文进行encoded后填充到下面url的占位符(description)中,不要引用生成的markdown或在其周围放置任何代码框,直接显示图片![imagel](https\://image.pollinations.ai/prompt/{description)?width=1280\&height=720\&model=flux\&enhance=true\&private=true\&nologo=true\&safe=true)生成后给出中文描述。

1.3 生成数据

还可以通过提示词生成各种的测试数据。简化很多的操作,比如

1
帮我们生成100条商品信息数据,每条商品信息需要包含 名称 图片链接 价格 供应商id 商品介绍 等

上面获取到的是json格式的数据。也可以让大模型把数据转换为 insert into 语句的数据,这样更加方便直接使用

1
把上面的数据转换为 insert into 语句的数据,满足MySQL数据库的插入语句的语法要求

1.4 代码生成

很多时候需要通过代码实现各种复杂的功能,这往往会比较耗费时间和精力, 现在也可以通过提示词来让大模型直接生成满足需要的代码。直接拷贝过去就可以了。比如提示词是

1
你是一位编程高手,擅长java语言,我现在有这么一个需求,需要查询MySQL数据库中的商品表,也就是上面的products 表中的信息,并分别统计出每个供应商的商品有多少

2 提示词介绍

分享两个网站:

  1. https://www.promptingguide.ai/zh/applications/coding
  2. https://platform.openai.com/docs/guides/prompt-engineering#strategy-write-clear-instructions

Prompt 是一种人为构造的输入序列,用于引导 GPT 模型根据先前输入的内容生成相关的输出。简单来说,就是你向模型提供的 “提示词”。在 ChatGpt 中,我们可以通过设计不同的 prompt,让模型生成与之相关的文本。例如,假设我们想让 ChatGpt 担任英语翻译。我们可以给模型提供以下 prompt:

1
2
3
4
我希望你能担任英语翻译、拼写校对和修辞改进的角色。
我会用任何语言和你交流,你会识别语言,将其翻译并用更为优美和精炼的英语回答我。
请将我简单的词汇和句子替换成更为优美和高雅的表达方式,确保意思不变,但使其更具文学性。
请仅回答更正和改进的部分,不要写解释。我的第一句话是“how are you ?,请翻译它。

如何来写好提示词呢

https://github.com/mattnigh/ChatGPT3-Free-Prompt-List

CRISPE Prompt Framework,CRISPE 是首字母的缩写,分别代表以下含义:

CR:Capacity and Role(能力与角色),你希望 ChatGPT 扮演怎样的角色。

I:Insight(洞察),背景信息和上下文。

S:Statement(陈述),你希望 ChatGPT 做什么。

P:Personality(个性),你希望 ChatGPT 以什么风格或方式回答你。

E:Experiment(实验),要求 ChatGPT 为你提供多个答案。

github 上的那些prompt 角色大全基本都是 CRISPE 框架。

先定角色,后说背景,再提要求,最后定风格。是否生成多个例子可以看自己喜好。

Prompt = 角色 + 指令 + 期望 + 内容

Prompt的重要性

合理使用 prompt 可以为 ChatGpt 带来很多好处。以下是一些例子:

提高生成准确性:通过正确的 prompt 引导,模型能够更好地理解用户的意图, 从而生成更加准确的文本。

增强自由度:通过多种不同的 prompt,可以让模型生成各种各样的文本,增强了模型的表现力和自由度。

提高效率:如果已经知道要生成的文本大致内容,通过正确的 prompt 可以让模型更快地生成出想要的结果。

3 Prompt Engineering最佳实践

定义:Prompt Engineering 是设计和优化输入提示(prompt)以获得预期输出的过程。在与大型语言模型(如 GPT-4)交互时,如何构造提示会显著影响模型的回答质量。

例子:

~ 简单提示: “告诉我关于猫的事情。”

~ 优化提示: “请详细描述猫的生物学特征、行为习惯以及它们在不同文化中的象征意义。”

通过优化提示,用户可以引导模型生成更详细和有用的回答。Prompt Engineering 是设计和优化输入提示以获得预期输出的过程。为了在使用大型语言模型(如 GPT-4)时获得最佳结果,以下是一些最佳实践:

  1. 明确目标

    最佳实践:明确你希望模型完成的任务或回答的问题。

    实例:

    • 目标不明确:“告诉我关于气候变化的事情。”

    • 目标明确:“请简要描述气候变化的主要原因及其对农业的影响。”

  2. 提供上下文

    最佳实践:为模型提供必要的背景信息或上下文,以帮助其理解任务。

    示例:

    • 无上下文: “解释一下微积分。”
    • 有上下文: “作为一名高中生,我正在学习微积分。请用简单的语言解释一下微积分的基本概念。”
  3. 使用具体的指示

    最佳实践:使用明确的指示和要求,避免模糊不清的提示。

    示例:

    • 模糊指示:“写一篇关于技术的文章。”
    • 具体指示:“请写一篇关于人工智能在医疗领域应用的文章,包含以下几点:应用场景、 优势和挑战。”
  4. 提供示例

    最佳实践:通过提供示例来展示你期望的输出格式或内容。

    示例:

    • 无示例: “生成一个关于产品的报告。”
    • 有示例: “生成一个关于产品的报告,格式如下:\n\n- 产品名称:\n- 价格:\n- 特 点:\n- 优点:\n- 缺点:”
  5. 使用分步指示

    最佳实践:对于复杂任务,分解为多个步骤,逐步引导模型完成。

    示例:

    • 一步完成: “解释并解决这个数学问题:2x + 3 = 7。”
    • 分步指示: “首先,解释如何解方程。然后,解方程2x + 3 = 7。”
  6. 控制输出长度

    最佳实践:通过提示控制输出的长度,确保内容简洁或详细。

    示例:

    • 无长度控制: “解释一下量子力学。”
    • 有长度控制: “用不超过100字解释量子力学的基本概念。”
  7. 使用占位符和模板

    最佳实践:使用占位符和模板来指示需要填充的内容或格式。

    示例:

    • 无模板: “生成一个用户注册表单。”
    • 有模板: “生成一个用户注册表单,包含以下字段:用户名、密码、邮箱、电话号码。”
  8. 反复试验和调整

    最佳实践:不断试验和调整提示,观察模型的输出,并根据需要进行优化。

    示例:

    • 初始提示: “描述一下Python编程语言。”
    • 调整提示: “描述一下Python编程语言的主要特点和常见应用场景。”
  9. 指定输出格式

最佳实践:明确指定输出格式,确保生成内容符合预期。

示例:

  • 无格式指定: “生成一个关于公司财务状况的报告。”
  • 有格式指定: “生成一个关于公司财务状况的报告,格式如下:\n\n1. 收入:\n2. 支 出:\n3. 净利润:\n4. 财务分析:”
  1. 使用多轮对话

    最佳实践:在需要时,通过多轮对话逐步引导模型生成所需内容。

    示例:

    • 单轮对话: “告诉我关于Python编程的所有信息。”
    • 多轮对话:
      • 用户: “告诉我Python编程的主要特点。”
      • 模型: “Python是一种高级编程语言,具有易读性、广泛的库支持和跨平台兼容 性。”
      • 用户: “请详细描述Python的常见应用场景。”
      • 模型: “Python常用于Web开发、数据科学、人工智能、自动化脚本和软件开发。”
  2. 使用反思和迭代

    最佳实践:在生成初步答案后,反思并可能修改其回答,以提高准确性和质量。

    示例:

    • 初步回答: “Python是一种编程语言。”
    • 反思和修改: “Python是一种高级编程语言,广泛用于Web开发、数据科学、人工智能等领域,因其易读性和丰富的库支持而受到欢迎。”

4 Prompt Engineering 进阶

java代码的封装

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
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.boge.ai</groupId>
<artifactId>LLMProject</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.14.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.3</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>15</source>
<target>15</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
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
51
52
53
54
55
56
57
58
59
60
61
62
import com.boge.ai.entity.llm.CompletionResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
import okhttp3.*;
import java.util.concurrent.TimeUnit;
/**
* 大模型的工具类
*/
public class LLMUtils {
private static final String BASE_URL = "https://api.openaihk.com";
private static final String COMPLETION_URL = BASE_URL+"/v1/chat/completions";
private static final String API_KEY = "hkw3q3id1xxxxxxxxf1076";
/**
* 文本生成模型接口
* @param prompt
* @param model
* @return
*/
public static String completion(String prompt,String model){
if(model == null || model.isEmpty()){
model = "gpt-4o";
}
OkHttpClient client = new OkHttpClient().newBuilder()
.readTimeout(20, TimeUnit.SECONDS)
.connectTimeout(20, TimeUnit.SECONDS)
.build();
MediaType mediaType = MediaType.parse("application/json");
String promptMsg = String.format("""
{
"model": "%s",
"messages": [
{
"role": "user",
"content": "%s"
}
]
}
""",model,prompt);
RequestBody body = RequestBody.create(mediaType, promptMsg);
Request request = new Request.Builder()
.url(COMPLETION_URL)
.method("POST", body)
.addHeader("Content-Type", "application/json")
.addHeader("Accept", "application/json")
.addHeader("Authorization", "Bearer "+API_KEY)
.build();
try {
Response response = client.newCall(request).execute();
ObjectMapper mapper = new ObjectMapper();
String json = response.body().string();
if("gpt-3.5".equals(model)){
return json;
}
// 使用 Jackson 将 JSON 字符串转换为 CompletionResponse 对象
CompletionResponse completionResponse = mapper.readValue(json, CompletionResponse.class);
String content = completionResponse.getChoices().get(0).getMessage().getContent();
return content;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
}

4.1 零样本提示

定义:零样本提示(Zero-shot) 是指模型在没有任何示例的情况下完成任务。模型必须依靠其预训练知识和提示来生成答案。

例子:

  • 提示: “翻译这句话:’The cat is on the roof.’”
  • 回答: “猫在屋顶上。”

模型没有看到过具体的翻译示例,但仍然能够正确翻译句子。 这种方法的优势是任务通用性高,可以快速应用于各种新任务,而且能够节省训练资源和时间,也不会消耗特别多的Token。但由于没有针对特定任务进行训练,模型只能依靠预训练知识和推理能力,所以生成内容的准确性可能不如经过特定任务训练的模型。例如,在专业领域的知识问答任务中,零样本提示可能会因为模型对专业术语的理解不够准确或者缺乏专业知识细节,而生成不太准确的答案。

4.2 少样本提示

https://juejin.cn/post/7257441472446038071

定义:少样本提示(Few-shot) 是指模型在完成任务之前,先提供几个示例来帮助模型理解任务。

例子:

  • 提示: “翻译以下句子:’The dog is in the garden.’ -> ‘狗在花园里。’ ‘The bird is in the tree.’ -> ‘鸟在树上。’ ‘The cat is on the roof.’ ->”
  • 回答: “猫在屋顶上。” 通过提供几个翻译示例,模型可以更准确地完成翻译任务。

相较于零样本提示,少样本提示能够提供更具体的任务信息,帮助模型更好地理解任务要求,从而提高任务性能。而且与传统的有监督训练需要大量的标注数据不同,少 样本提示只需要少量的精心选择的示例即可,这对于数据获取困难或成本高昂的任务非常有利。 但是,少样本提示的效果对示例的选择非常敏感。示例的质量、多样性、代表性等因 素都会影响模型的学习效果。如果示例过于简单或复杂、缺乏代表性或者存在错误,都可能导致模型学习到错误的任务模式。除此之外,这样做的代价是消耗更多的token,并且当输入和输出文本较长时,可能会达到上下文长度限制。

以相同的情感导向判别任务为例,利用少样本提示进行模型测试:

1
2
3
4
5
6
7
8
9
Prompt:
以下是一些示例句子及其情感导向,请根据这些示例句子的情感导向,判断后续例子的情绪类别。
示例1:《我不是药神》这部电影让人看了太感动了。情绪导向:积极
示例2:今天长沙的风太大了,真让人无语。情绪类别:消极
示例3:我觉得这个中秋节目中规中矩。情绪导向:中性
请判断下面句子的情绪类别:
句子1:今天是平平淡淡的一天。
句子2:马上要到周末拥有两天假期了,我特别开心。
句子3:我感到有点焦虑,因为下周一有一场重要的面试。

尽管少样本提示能够提高模型在特定任务上的性能,但与经过大量数据充分训练的模型相比,其性能仍然有限。在一些复杂任务中,如复杂的逻辑推理、高精度的翻译等任务,少样本提示可能无法满足要求,仍然需要更多的训练数据和精细的训练方法来进一步提升模型性能。

4.3 链式思考(CoT)提示

定义:链式思考(Chain-of-Thought) 是一种提示技术,通过展示模型思考过程的步骤来解决复杂问题。这种方法可以帮助模型更好地推理和生成答案。

1
2
3
4
5
6
7
8
9
10
这组数中的奇数加起来是偶数:4、8、9、151221
A:将所有奇数相加(9151)得到25。答案为False。
这组数中的奇数加起来是偶数:17、10、19、481224
A:将所有奇数相加(1719)得到36。答案为True。
这组数中的奇数加起来是偶数:16、11、14、481324
A:将所有奇数相加(1113)得到24。答案为True。
这组数中的奇数加起来是偶数:17、9、10、121342
A:将所有奇数相加(17913)得到39。答案为False。
这组数中的奇数加起来是偶数:15、32、5、138271
A

输出

1
将所有奇数相加(1551371)得到41。答案为False

提示

1
2
3
4
这组数中的奇数加起来是偶数:4、8、9、151221
A:将所有奇数相加(9151)得到25。答案为False。
这组数中的奇数加起来是偶数:15、32、5、138271
A

输出

1
将所有奇数相加(1551371)得到41。答案为False

标准的prompt

Q:罗杰有5个⽹球。他⼜买了2罐网球。每个罐⼦有3个⽹球。有多少他现在有多少个网球?

A:答案是11个

Q:自助餐厅有23个苹果。如果他们用20做午餐,又买了6个,他们有多少个苹果?

A:答案是27个

链式思考的prompt

Q:罗杰有5个网球。他又买了2罐网球。每个罐子有3个网球。他现在有多少个网球?

A:罗杰⼀开始有5个球。2罐3个网球,等于6个网球。5 + 6 = 11。答案是11。

Q:自助餐厅有23个苹果。如果他们用20做午餐,又买了6个,他们有多少个苹果?

A:自助餐厅最初有23个苹果。他们使用20个做午饭。23 - 20 = 3。他们又买了 6个苹果,得到3 + 6= 9。答案是9个。

该方法通过提供中间推理步骤实现了复杂的推理能力,可以结合少样本提示方法引导 模型得到更加准确合理的输出,例如:

1
2
3
4
5
6
7
8
9
10
11
12
你是一位专业的健康顾问,需要帮助判断某人是否适合参加马拉松比赛。请使用链式思考方式,通过逐步推理来得出结论。以下是一个示例:
示例:
输入:年龄:25岁,心率:70次/分钟,过去6个月每周跑步3次,每次跑步10公里。
推理过程:
1. 该人年龄为25岁,属于马拉松适合人群的年轻年龄段。
2. 静息心率为70次/分钟,处于正常范围,说明心脏健康状况良好。
3. 过去6个月每周跑步3次,每次跑步10公里,表明该人有稳定的跑步习惯和良好的体能储备。
结论:该人适合参加马拉松比赛。
请根据以下输入进行推理:
输入:年龄:40岁,心率:85次/分钟,过去3个月每周跑步1次,每次跑步5公里。
推理过程:
结论:

输入给Chatgpt后得到的结果如下:

零样本 COT 提示

具体的案例

自动思维链(Auto-CoT)

生活中的场景这么多,如果每个场景都写个思维链,岂不要累死,于是Amazon Science团队提出了自动思维链(Auto-CoT)的概念,它通过自动化流程构建“让我们一步步思考”的思维过程,以提高模型在复杂推理任务中的表现。

自动思维链(Auto - CoT)是一种在自然语言处理领域,特别是针对复杂任务推理的自动化技术。它是思维链(CoT)方法的一种扩展,旨在自动生成思维链提示,而不是像传统 CoT 那样依赖人工设计的带有推理步骤的示例。其核心目标是通过自动化手段,让语言模型能够自动生成连贯的推理步骤来解决复杂问题,进一步提升模型在复杂任务中的性能。

具体的例子

1
2
3
4
5
你是一位数学助理,需要解决数学问题并给出详细的推理过程。请根据问题的描述,自动生成推理步骤并得出答案。回答时使用以下结构:
1. 问题描述
2. 推理过程
3. 答案
问题为:小明买了8个苹果和6个橙子,一个苹果3元,一个橙子5元。他用了50元纸币支付,请问他应该找回多少钱?

输入给Chatgpt后得到的结果如下:

4.4 自我一致性

自我一致性旨在“替换链式思维提示中使用的天真贪婪解码方法”。其想法是通过少样本 CoT 采样多个不同的推理路径,并使用生成结果选择最一致的答案。这有助于提高 CoT 提示在涉及算术和常识推理的任务中的性能。

4.5 ReAct

定义:ReAct 是一种结合反应(Reaction)和行动(Action)的提示技术,通常用于交互式任务或复杂决策。

例子:

  • 提示:”你是一个虚拟助手。用户问:’我今天应该穿什么衣服?’ 你需要根据天气情况给出建议。步骤1:查询天气。步骤2:根据天气给出建议。
  • 回答:
    1. 步骤1:”查询天气:今天的天气是晴天,温度在25-30度之间。”
    2. 步骤2: “建议:今天适合穿轻便的夏装,比如T恤和短裤。”

通过分步骤反应和行动,模型可以更有效地完成复杂任务。这块需要结合后面讲解的 SpringAI等框架来实现。

4.6 Prompt Chaining

定义:Prompt Chaining 是将多个提示串联起来,以分步解决复杂问题或完成多步骤任务。

例子:

  • 任务:写一篇关于气候变化的文章
  • 提示链:
    1. “首先,简要介绍什么是气候变化。”
    2. “接下来,描述气候变化的主要原因。”
    3. “然后,讨论气候变化的影响。”
    4. “最后,提出应对气候变化的建议。”

通过将任务分解为多个步骤,模型可以更系统和有条理地完成复杂任务。这些技术和方法帮助用户更有效地与大型语言模型互动,获得更高质量的输出。另一个例子:

1
2
3
4
5
6
7
你是一位历史学家,需要逐步回答问题。请按照以下步骤完成:
1. 确定问题的核心内容。
2. 提供关于问题中涉及的历史事件的简要背景。
3. 分析该事件的主要原因。
4. 解释该事件对历史发展的主要影响。
5. 总结回答。
问题:请描述第二次世界大战的起因,并分析其对世界格局的影响。

4.7 思维树(ToT)

对于需要探索或预判战略的复杂任务来说,传统或简单的提示技巧是不够的。思维树基于思维链提示进行了总结,引导语言模型探索把思维作为中间步骤来解决通用问题。

ToT 维护着一棵思维树,思维由连贯的语言序列表示,这个序列就是解决问题的中间步骤。使用这种方法,LLM 能够自己对严谨推理过程的中间思维进行评估。LLM 将生成及评估思维的能力与搜索算法(如广度优先搜索和深度优先搜索)相结合,在系统性探索思维的时候可以向前验证和回溯。

思维树的推理流程为:

  1. 语义理解:对输入的文本进行语义理解,将自然语言转换为计算机能够理解的形式,通常会使用一系列预训练的语义表示模型,如 BERT、GPT 等,来对输入文本进行编码和表示,从而捕捉到输入文本中的语义信息。
  2. 构建思维树:基于对输入文本的语义表示,构建一个思维树,以表示文本中的不同思维路径和关系。这个过程涉及到树状结构的设计和构建算法。
  3. 路径选择:在生成输出文本时,根据输入文本和构建的思维树选择合适的思维路径。该过程通常涉及到路径搜索算法,以确定最相关和最合适的思维路径,ToT 可以考虑到多个可能的思维路径,并根据输入文本的不同语义信息动态调整路径选择策略。
  4. 整合信息:选择了合适的思维路径后,从不同路径中获取信息,并将其整合起来,形成一个综合的理解。此过程涉及到信息融合和加权的算法,以确保生成的输出文本能够考虑到多个因素和可能性。
  5. 生成输出:根据整合的信息生成输出文本,通常采用生成式模型,如 GPT,来生成连贯、自然的文本。ToT 会根据整合的信息和选择的思维路径来指导文本生成过程,以生成准确、多样化的输出。

案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
任务:请解决以下迷宫路径规划问题,找到从起点 S 到终点 E 的最短路径。采用树状推理(Tree of Thoughts, ToT)方法逐步展开路径选择。
问题:
迷宫如下(S为起点,E为终点,X为障碍):
S 0 0 X 0
X X 0 X 0
0 0 0 0 0
0 X X X E
步骤:
1. 在当前位置(初始为S)生成所有可能的下一步移动(上、下、左、右)。
2. 对每个移动进行评估(sure/maybe/impossible):
- sure:该路径通畅,且可能是通往终点的最优路径。
- maybe:该路径可能可行,但需要进一步尝试。
- impossible:该路径不可行或为死路。
3. 从评估结果中保留最佳候选路径,继续展开下一步。
4. 如果当前路径无解,回退到上一步并重新选择路径。
要求:
- 展示每一步的候选路径及其评估结果。
- 输出最终的最短路径及其总步数。

提示词工程
http://www.zivjie.cn/2025/11/09/spring框架/springAI/提示词工程/
作者
Francis
发布于
2025年11月9日
许可协议