Jean's Blog

一个专注软件测试开发技术的个人博客

0%

AI大模型提示词工程

与AI对话

提示词Prompt介绍

  1. 对于普通人:提示词是和 AI 沟通的桥梁,提示词的好坏决定了返回的结果是否准确。
  2. 对于开发者:提示工程是一种相对较新的学科,专门用于开发和优化提示,以高效地使用语言模型(LM)来处理各种应用和研究主题。

提示词的原则与技巧

原则 原因
写清楚需求 GPT 模型无法读懂您的想法,因此在提供需求时尽可能具体是很重要的。这包括在您的查询中包含详细信息,要求模型采用角色,以及使用定界符清楚地指示输入的不同部分。
提供参考文本 如果可以,请提供与您希望模型生成的内容相似的参考文本。这将有助于模型了解您要查找的内容并生成更准确的结果。
将复杂的任务拆分为更简单的子任务 如果您试图让模型做一些复杂的事情,将任务分解为更小、更易于管理的子任务会很有帮助。这将使模型更容易理解您的要求并生成更准确的结果。
角色扮演 这个技巧的作用是告诉ChatGPT在对话中扮演一个特定的角色或人物。这对于创造更有吸引力和沉浸感的对话,或模拟真实世界的场景特别有用。
系统地测试变化 对需求或参考文本进行更改时,重要的是系统地测试结果以了解它们如何影响模型的输出。这将帮助您确定对改进结果最有效的更改。

写清楚需求

编写有效的ChatGPT的难点之一是表达含糊不清。为了避免这个问题,有以下几个问题需要注意:

  1. 定义任何专业术语或技术术语。
  2. 避免使用模棱两可的语言。
  3. 使用清晰或简明的语言
  • 错误案例:”你是我的哈基米吗?”

    哈基米属于网络用语,而且诞生在2023年,ChatGPT是无法理解这个词的语意的。

    image-20230904153857689

  • 好的案例:”请帮我提供在深圳市宝安区所有的咖啡馆”

    简明扼要说清楚自己的需求,无需多言,ChatGPT便很好理解了。

    image-20230904154007912

提供参考文本

  1. 对于文本比较短的引用,可以直接贴到提问里面即可: 如果你有一段法律条款,并希望模型使用这段条款来解释某个概念,例如,我给ChatGPT一段代码,分析代码的Bug

    image-20230904154421304

  2. 网页链接的引用: 也可以直接将网页链接里面的内容提供给 GPT 来作为引用文本。比如可以直接给它一个链接地址,让它总结文章内的内容。(注意这个功能需要使用web插件)

拆解复杂任务

作为一个厨师,在做饭的时候需要完成这些步骤:准备食材、清理食材、处理食材、开始烹饪、摆盘。

在这个过程中,其实厨师就是把一个复杂的任务,拆解成了多个简单的任务。其实在编程的过程中,也是同样的道理。也会把一个复杂需求,拆解为N个简单的子需求。

如果需要ChatGPT帮助我们完成一个复杂的任务,那么,我们需要预先帮它把任务拆分。这样做的优点是:

  1. 更好理解每一个操作步骤。
  2. 不被上下文限制影响。
  3. 方便调整。

例如,我们提出了一个如下的复杂任务:

  • 提示词:作为一个测试工程师,我即将进行述职答辩,我想编写一个述职报告,述职报告需要包含我今年的成绩、我明年的目标、以及我在今年的工作过程中碰到的问题

ChatGPT 虽然给到了相应的回复,但是还有问题:

  1. 工作成绩没有清晰的数据也没有说服力,看着比较干瘪。报告内容没有图表。
  2. 内容太过简单空洞。
  3. 格式不够优雅。

如果我们把提问的方式做进一步优化,把这个复杂问题一步步进行拆解,并给ChatGPT一定的修改反馈,则产生的内容会更加符合我们的需求,比如我们可以把问题分解为:

  • 提示词:作为一个测试工程师,我即将进行述职答辩,我想编写一个述职报告。述职报告需要包含我今年的成绩,我今年带领测试团队将bug的逃逸率降低了10%的比例。并且我希望有一个通过echarts绘制的折线图。请将我的述职报告做进一步优化。

    image-20230904155058134

  • 提示词: echarts 折线图没有展示出来

    image-20230904155223593

借助外部工具

作为一个大语言生成模型,GPT4 并不擅长各种数学计算。比如下面的问题(来自官方 GPT 最佳指南中的示例问题):

  • 提示词:查找以下多项式的所有实值根:3x^5 - 5x^4 - 3x^3 - 7x - 10

如果直接提问的话,通常没法直接给出答案,如下图所示,虽然借助Python,给出了运算过程,但是其实ChatGPT无法像人类数学家一样,给出直接的推导过程:

image-20230904155335208

所以可以将提示词改为:

  • 提示词:查找以下多项式的所有实值根:3x^5 - 5x^4 - 3x^3 - 7x - 10 ,使用Python 实现

    image-20230904155551020

角色扮演

角色扮演的过程就更为简单了,我们在编写提示词的时候,只需要给它加上一些角色的设定。

ChatGPT甚至可以扮演领导,面试官,浏览器的console插件等各种各样我们可以想象到的角色:

  • 提示词:我希望你作为一个 javascript 控制台。我将输入命令,你回复javascript 控制台应显示的内容。我希望您只在一个唯一的代码块内回复终端输出,而不是其他任何内容。不要写解释。我的第一个命令是 console.log(“Hello World”);

    image-20230904155950703

系统的测试变化

正如人在回复信息的时候,也无法保证所有的回复都是正确的,ChatGPT 也无法保证每次给到的信息都是“靠谱的”或者是满足需求的。

所以ChatGPT的每一次回复,在确认没有问题之后,再使用。如果有问题的话,可以进一步进行提问,ChatGPT会根据提示词不停的纠正回复。以达到一个满意的效果。

image-20230904160046303

比如这个示例:

  • 提示词:请问 App 的产品在测试的过程中需要注意什么

    image-20230904160251993

  • 提示词:请针对兼容性测试再做一些补充

    image-20230904160422314

通过不停的测试以及纠正 ChatGPT 的回复,即可最终获得一个满意的回复。

提示词相关概念

通过上面内容对大模型如何进行对话介绍,下面内容则是详细介绍提示词相关具体内容

什么是提示词(Prompt)?

概念说明:

  • 提示词是用户与大模型交互的输入指令,用于告诉模型你希望它完成什么任务。
  • 它既可以是一句话,也可以是一段上下文或示例。

举例:

请撰写一份关于用户注册功能的测试用例。

什么是 Token?

概念说明:

  • 模型处理的最小单位,通常是词的一部分、一个单词,甚至一个符号*。

举例:

  • “Deepseek 是厉害的。” → 分词可能为: ["Deepseek", " 是", " 厉", "害", "的", "。"]

上下文窗口(Context Window)

1
128K 的上下文==128000 个 token

概念说明:

  • 指模型每次处理输入 + 输出的最大 token 数量
  • 超出后旧内容将被“遗忘”

注意点💡

  • 长 prompt ≠ 好效果,要“信息密度高且结构清晰”。
  • 内容越多,token 消耗越多 → 成本 ↑、速度 ↓。

常见大模型的上下文最大Token记忆数量:

  • GPT4 —-> 128K
  • DeepSeekV3 —->128K

Prompt 与响应的关系

基本流程:

  1. 用户发出 Prompt
  2. 模型理解并生成响应
  3. 模型根据上下文和历史对话生成“合理推测”

模型生成原理:

  • 本质是下一个最可能的 token 预测
  • 模型没有“理解”,而是基于概率选择“合适的词”。

Prompt 与输出质量的关系:

  • Prompt 不清晰 → 响应不确定甚至出现“幻觉”
  • Prompt 精准 → 响应更专业、格式更一致

什么是提示词工程?

概念说明:

提示词工程是指系统性地设计、优化与测试提示词的技术和方法,以引导大语言模型产生预期、高质量、可控的输出。

作用:

  • 增强模型可靠性一致性
  • 控制模型输出格式风格
  • 降低“胡编乱造”(幻觉)的风险

提示词角色设定

role 的类型及语义说明

角色(role) 说明 示例场景
system 系统设定。用来告诉模型它的角色、行为风格、语境范围等。 设定模型是“测试专家”、“英语老师”、“客服机器人”等
user 用户输入。代表人类给模型提的问题或指令。 提问、请求、任务说明
assistant 模型回复。由大语言模型根据前文生成的回答。 模型生成输出,如回答问题、给建议
tool(可选) 工具调用(部分模型支持)。用于中间调用工具函数或API时的中间交互。 使用函数调用插件、调用代码执行器等
  • 在多数常见应用中,仅需关注前三种角色:system、user 和 assistant。

基础角色设定

给模型“扮演”某个角色,设定行为风格与语言风格

特点:

  • 模拟身份让输出更真实、更符合特定语境
  • 非常适合教育、技术、客服等行业场景

示例1:标准问答流程

1
2
3
messages = [
{"role": "user", "content": "请用通俗易懂的方式讲解“时态”概念?"}
]

示例2:英语教学风格

1
2
3
4
5
6
messages = [
{
'role': 'user',
'content': '你是一个专业的英语老师,请用通俗易懂的方式讲解“时态”概念。'
}
]

示例3:测试主管角色扮演

1
2
3
4
messages = [
{'role': 'user',
'content': '你是一个经验丰富的软件测试主管,请评审以下测试用例是否合理,并提出优化建议:\n用例:用户注册时输入无效邮箱应提示错误信息。'}
]

使用system设定角色

示例1:设定身份与风格(使用 system)

1
2
3
4
messages = [
{"role": "system", "content": "你是一名严谨且有经验的软件测试工程师,回答需清晰、专业、有条理。"},
{"role": "user", "content": "请列出注册功能的边界测试用例。"}
]

示例2:错误场景分析

1
2
3
4
messages = [
{"role": "system", "content": "你是一个擅长分析测试日志的QA专家,能快速定位问题根源。"},
{"role": "user", "content": "测试报告显示登录接口返回500错误,可能是什么原因?"}
]

示例3:技术方案咨询

1
2
3
4
messages = [
{"role": "system", "content": "你是自动化测试工具专家,熟悉主流测试框架。"},
{"role": "user", "content": "如何用Pytest对API响应做Schema验证?"}
]

对比

  1. 角色设定的位置不同:system消息用于长期角色设定,而user消息中的角色指示是即时的
  2. 结构规范性:按照官方的最佳实践,角色和风格应该放在system消息中,这样更清晰和持久。
  3. 效率:使用system消息可以避免重复指定角色,提高对话效率。
  4. 清晰度:system消息明确区分角色设定和具体请求,而user中的角色指示可能混合了指令和角色设定,不够清晰

提示词优化的技巧

技巧1:明确指令

  • 模型更擅长处理任务明确的请求。
  • 含糊的描述容易导致输出不符合预期。

示例一:写接口测试代码

1
2
# 模糊提示:
messages = [{"role": "user", "content": "帮我写个接口测试代码"}]
1
2
3
4
5
# 明确提示:
messages = [{
"role": "user",
"content": "请使用 Python 和 requests 编写一个 POST 接口的测试脚本,接口地址为 https://api.mstest.vip/login,参数包括 username 和 password,校验响应中 code 是否为 200。"
}]

技巧2:控制风格与格式

  • 通过提示控制模型以 Markdown、表格、列表、JSON 等格式输出。
  • 用于生成日报、Bug列表、测试报告、接口说明等结构化内容。

示例一:Markdown报告

1
2
3
4
messages = [
{"role": "user",
"content": "请用Markdown生成用户中心测试报告,必须包含:\n## 模块名称\n## 测试范围\n## 通过率\n## 关键缺陷\n## 剩余风险"}
]

示例二:表格用例

1
2
3
4
messages = [
{"role": "user",
"content": "请用表格展示5条注册测试用例,列名包括:\n| 用例ID | 测试点 | 测试数据 | 预期结果 |"}
]

示例三:JSON接口用例

1
2
3
messages = [
{"role": "user", "content": "请生成JSON格式的'修改密码'接口测试用例,字段包含:\ntest_case_id, description, request_data, expected_response"}
]

技巧3:加入约束,减少幻觉

  • 模型在生成实时性内容时可能产生“幻觉”(虚假或伪造内容)。
  • 限定“来源、时间、事实标准”等可以有效降低这种风险。

示例一:对比Selenium版本新特性

1
2
3
4
5
# 宽泛提示
messages = [{"role": "user", "content": "请介绍 Selenium 的最新变化"}]

# 高约束提示
messages = [{"role": "user", "content": "请根据 Selenium 4.20 官方文档,总结 Python 中相较 Selenium 3 的五个主要变化,并附对应代码示例。"}]

示例二:生成测试用例

1
2
3
4
5
6
7
# 宽泛提示
messages = [{"role": "user", "content": "请为用户注册功能设计5条测试用例"}]
# 高约束提示
messages = [
{"role": "user",
"content": "请为用户注册功能设计 5 条测试用例,要求:\n- 包含有效与无效邮箱输入\n- 密码边界值测试(6~20位)\n- 每条用例需包含:用例名称、前置条件、输入、预期输出\n- 输出为纯文本描述,不包含自动化脚本"}
]

示例三:生成Bug报告

1
2
3
4
5
6
7
8
9
messages = [
{"role": "user",
"content": "请撰写一份缺陷报告模版"}
]

messages = [
{"role": "user",
"content": "请撰写一份缺陷报告模版,要求:\n- 模块:登录页\n- 问题描述:输入错误密码后无提示信息\n- 必须包含字段:缺陷标题、环境、重现步骤、实际结果、预期结果\n- 使用中性客观语言"}
]

技巧4:少量样本提示

  • 通过示例“教”模型学会相应的分类或转换任务。
  • 非常适合缺陷分类、日志解析、测试案例格式转换等。

示例一:测试步骤转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
messages = [
{"role": "user", "content": """
将自然语言测试步骤转换为结构化步骤:
---
示例1:
输入:用户输入错误的密码点击登录
输出:
1. 在密码输入框输入错误密码
2. 点击登录按钮

示例2:
输入:选择商品加入购物车并结算
输出:
1. 在商品页点击「加入购物车」
2. 进入购物车页面
3. 点击「结算」按钮
---
请转换以下步骤:
输入:上传JPG文件后检查预览图显示
输出:
"""}
]

示例二:自动化测试故障分析

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
instruction = """
作为资深测试开发工程师,请分析自动化测试失败日志:
1. 失败类型分类:
- 定位问题(元素/XPath失效)
- 环境问题(服务/网络异常)
- 脚本缺陷(逻辑/断言错误)
2. 标记可疑代码位置(文件+行号)
3. 给出修复方案(含代码示例)
"""

examples = """
输入:
[ERROR] ElementNotVisibleException:
Failed to locate element #submit-btn
at line 42 of login_test.py

输出:
失败类型:定位问题(元素ID变更)
可疑位置:login_test.py第42行
修复方案:
原代码:driver.find_element(By.ID, "submit-btn")
改为:WebDriverWait(driver,10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "[data-testid=submit]"))
)
"""

input_text = '[FAIL] AssertionError: Expected 200, got 404 at api_healthcheck.py:17'

prompt = f"""
{instruction}

{examples}

输入:
{input_text}

输出:
"""

技巧5:链式思维

示例一:基础算术(分步推理)

1
2
3
4
5
6
7
8
9
10
11
messages = [
{"role": "user", "content": """
请逐步解决以下数学问题,并展示推理过程:
问题:如果3个人5天能挖15米水沟,6个人10天能挖多少米?

分步思考:
1. 计算单人单天效率:15米 ÷ 3人 ÷ 5天 = 1米/人天
2. 计算6人10天总效率:1米/人天 × 6人 × 10天 = ?
3. 最终结果:
"""}
]

示例二:测试点分析

1
2
3
4
5
6
7
8
messages = [
{"role": "user", "content": """请逐步分析登录功能的测试点,
按以下逻辑展开:
1. 识别输入字段(用户名/密码)
2. 列出每个字段的合法/非法输入情况
3. 分析页面交互流程(按钮状态、错误提示等)
最终输出结构化测试点列表"""}
]

提示词指令模板

作用:通过结构化模板控制模型输出,实现高效可复现的任务处理

特点

  • 直接高效 - 减少模糊指令导致的无效输出
  • 可复现性强 - 固定模板确保结果一致性
  • 动态适配 - 支持变量插值灵活填充内容

模板结构

字段名 作用 示例
{instruction} 定义任务目标和输出格式要求 “生成法语翻译,保留专业术语”
{examples} 提供输入-输出样本(可选) “输入:Hello → 输出:Bonjour”
{input_text} 用户实际需要处理的内容 “How are you?”
{output} 模型生成结果的占位符 (留空由模型填充)

使用案例

自动化测试故障分析

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
instruction = """
作为资深测试开发工程师,请分析自动化测试失败日志:
1. 失败类型分类:
- 定位问题(元素/XPath失效)
- 环境问题(服务/网络异常)
- 脚本缺陷(逻辑/断言错误)
2. 标记可疑代码位置(文件+行号)
3. 给出修复方案(含代码示例)
"""

examples = """
输入:
[ERROR] ElementNotVisibleException:
Failed to locate element #submit-btn
at line 42 of login_test.py

输出:
失败类型:定位问题(元素ID变更)
可疑位置:login_test.py第42行
修复方案:
原代码:driver.find_element(By.ID, "submit-btn")
改为:WebDriverWait(driver,10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "[data-testid=submit]"))
)
"""

input_text = '[FAIL] AssertionError: Expected 200, got 404 at api_healthcheck.py:17'

prompt = f"""
{instruction}

{examples}

测试日志:
{input_text}

分析报告:
"""