提示词工程
什么是提示词工程?什么是提示词?
提示词工程就是和大模型之间的沟通技巧——怎么问,才能最大限度的提高LLM相应的有效性,准确定性和实用性,获得你想要的答案。
提示词就是引导LLM进行内容生成的命令。它可以是一句话,一个问题,或者一个计算公式。当LLM收到提示词后便开始根据提示词和之前的训练数据,生成相关的回应
什么是LLM大模型?
大语言模型,是一个读过全网所有公开文字的概率预测机器,专门处理文字理解和生成。
但是不可以把豆包,kimi,千问这些成为大语言模型。AI是一种让机器表现的像人一样智能的所有技术(包括计算机视觉,语音识别,推荐算法,机器人避障等等),而大语言模型则是AI的一个分支,专门处理文字理解与生成(比如豆包大模型,kimi的Moonshot大模型),而豆包,kimi则是一个AI产品/应用(基于LLM包装的APP)。
Base LLM and Instruction Tuned LLM
Base LLM(基础模型)
只是简单的通过读取网上所有公开的文字,进行预测,不懂“对话”和“任务”
例如:
问AI:怎么写登录接口的测试用例?
AI回答:测试用例是软件测试的基本概念,最早由Glenford Myers在1979年提出。测试用例设计方法包括.......
可以看到,大模型只是在“读课本”,而不是在回答问题
它没有学过:
“用户问问题,我应该直接回答”
“不要跑题,不要背定义”
“给出可以操作的步骤”
通过喂大量的数据,目标是“预测下一个词是什么”
Instruction Tuned LLM(指令微调模型)
在基础模型的基础上,通过专家的训练,学会怎么听话?怎么回答?
例如:
问AI:怎么写登录接口的测试用例?
AI回答:
1.正常流:输入正确的用户名和密码,断言返回token;
2.异常流:密码错误,断言返回errno=401;
3. 边界值:................
它是通过人工编写高质量的“指令-回答”对来达到学会 听懂指令+按照指令格式 输出的训练目标
指令对大概长什么样?
| 指令(Instruction) | 期望回答(Response) |
|---|---|
| 请用pytest写一个登录接口的测试用例 | def test_login_success(): ...(直接给代码) |
| 解释HTTP状态码401和403的区别 | 401是未认证,403是已认证但没权限,用校园网类比... |
| 把下面这段报错翻译成中文 | (直接翻译,不废话) |
| 请总结这段需求文档的测试点 | 1.功能测试 2.兼容性测试 3.性能测试... |
二者区别
两者的区别在于:
base llm训练时看到的是杂乱无章的网页数据
instruction tuned llm训练时看到的是“人工指令->精确回答”的成对数据
Base LLM 的脑回路:
你输入:"怎么写登录测试用例?"
模型内部:"怎么写"后面接什么概率高?
→ "测试用例"后面接什么?
→ 哦,"测试用例"在《软件测试》教材里经常跟"定义"一起出现
→ 给你背定义吧
Instruction Tuned LLM 的脑回路:
你输入:"怎么写登录测试用例?"
模型内部:检测到这是一个"HOW-TO"类指令
→ 激活"步骤化回答"模式
→ 从知识库里提取登录测试的具体操作
→ 按"1.2.3."格式组织 → 输出
万能模板:
# 角色
你是[具体角色],拥有[多少年经验],擅长[具体领域]
# 任务
请帮我完成[具体任务],目标是[达成什么效果]
# 背景
当前情况是[给AI必要的上下文]
已知信息:[列出关键信息]
# 要求
- 输出格式:[JSON/Markdown/表格/代码]
- 必须包含:[列出必须有的内容]
- 禁止出现:[列出不能有的内容]
- 风格要求:[专业/通俗/简洁/详细]
# 示例(Few-shot)
下面是一个好的输出示例:
[给AI一个参考样例]
当你让AI帮你生成测试用例的时候,你可以用这样的模板:
# 角色
你是一位拥有5年经验的软件测试工程师,擅长接口测试和边界值分析。
# 任务
请为以下登录接口生成测试用例:
接口:POST /admin/auth/login
参数:{username, password, code}
# 要求
- 按"等价类划分"和"边界值分析"分类
- 每个用例包含:用例编号、测试点、输入数据、预期结果、优先级
- 输出为Markdown表格
- 必须覆盖:空值、超长字符串、特殊字符、SQL注入、XSS攻击
问题思考
那么到这里思考一个问题,这个模板到底有什么用?就算我不加角色设定,它难道就不会正确的答案吗?
非也,就算你不给它加角色设定,它照样懂这些知识,只不过生成内容的深度,风格,格式完全不同。加角色设定的目的是让大模型从“特定的区域”读取文本,并且生成专业的回答。
底层原理:
模型内部有着海量的数据(各行各业,奇闻怪谈,生活百态,学术科学等等等等),你给它加角色设定,真正做的是三件事:
一:注意力重定向:让模型向角色相关的知识提取
二:风格控制:调整模型生成的每个字的概率,更加专业化,专业的软件测试工程师是怎么写测试用例的?
三:触发格式模板:网上有大量测试工程师写的文档,格式高度统一。加角色设定时,模型会自动联想到这些模板,输出自带格式
指令编写的原则
原则一:指令要清晰具体
1.使用分隔符
| 分隔符 | 写法 | 什么时候用 | 例子 |
|---|---|---|---|
| 三引号 | """文字""" |
包裹大段纯文本、需求文档 | """管理员登录后可以查看商品列表...""" |
| 三反引号 | ```代码/JSON``` |
包裹结构化数据、代码 | ```json {"username":"admin"} ``` |
| 三条横线 | --- |
分隔提示词的不同章节 | 角色、任务、要求之间插一条 |
| XML标签 | <tag>内容</tag> |
最强分隔符,带名字,模型最不会混淆 | <接口定义>{"url":"/login"}</接口定义> |
2.结构话输出
| 场景 | 指令写法 | 输出效果 |
|---|---|---|
| 测试用例 | 以Markdown表格输出,列:编号、测试点、输入、预期、优先级 |
直接复制到Excel/Typora |
| 接口数据 | 以JSON数组输出,每个元素包含case_name、request_body、expected |
直接粘贴到Postman/Python脚本 |
| 操作步骤 | 以编号列表输出,每步包含:步骤、操作、预期结果 |
直接当测试文档用 |
| 代码 | 输出完整代码,用 ```python 包裹 |
直接复制到PyCharm运行 |
3.检查假设
大模型有一个缺陷就是“幻觉”,即使信息不够,它也会硬编一个听起来极其逼真合理的解释。
检查假设的目的在于让大模型根据已有的条件判断能不能解决问题,不能则直说缺少什么信息而不是瞎编
❌ 不检查假设(模型可能瞎编):
请根据以下信息,分析litemall登录接口的Bug原因:
"""
用户输入username=' OR 1=1 --,系统返回了200。
"""
→ 模型可能瞎编:"根据日志分析,原因是后端使用了预编译语句..."
→ 问题:你根本没给它看后端代码,它怎么知道用了预编译还是字符串拼接?
它在硬编一个"听起来合理"的答案
✅ 检查假设(模型先判断再回答):
请根据以下信息,分析litemall登录接口的Bug原因。
注意:如果以下信息不足以判断根因,请明确说明"信息不足",并列出还需要哪些信息。
"""
已知信息:
- 接口:POST /admin/auth/login
- 异常输入:username=' OR 1=1 --
- 实际响应:HTTP 200,body中errno=0(登录成功)
- 后端框架:未知
- 数据库类型:未知
- 后端SQL写法:未知(是否预编译?是否拼接?)
"""
→ 模型输出:
"根据现有信息,可以确认存在SQL注入漏洞(因为异常输入导致登录成功)。
但根因无法确定,因为缺少以下信息:
1. 后端是预编译语句还是字符串拼接?
2. 使用的ORM框架是什么(MyBatis/JPA)?
3. 能否提供后端LoginController的代码片段?
请补充以上信息,我可以给出具体修复方案。"
→ 好处:模型承认了边界,没有瞎编
4.少样本实例
给模型看一个标准答案,让模型按照这个样式输出
❌ 不给示例(模型自由发挥,格式可能不对):
请为litemall登录接口生成测试用例,包含编号、测试点、输入、预期、优先级。
→ 模型可能输出:
1. 正常登录:输入admin/123456,预期成功,优先级高
2. 错误密码:输入admin/111111,预期失败,优先级中
...
→ 问题:格式不统一,有的有编号有的没编号,"优先级高"不是P0/P1规范写法
✅ 给示例(模型照抄格式):
请为litemall登录接口生成测试用例,格式必须严格模仿以下示例:
示例输入:
接口:POST /admin/auth/login
参数:{username, password, code}
示例输出:
| 用例编号 | 测试点 | 输入数据 | 预期结果 | 优先级 |
|---------|--------|---------|---------|--------|
| LOGIN-001 | 正常登录 | username=admin, password=123456, code=1234 | errno=0, 返回token | P0 |
| LOGIN-002 | 空用户名 | username="", password=123456, code=1234 | errmsg="参数不能为空", errno=401 | P1 |
请按同样格式,继续生成更多用例,覆盖SQL注入和XSS攻击。
→ 模型输出:
| 用例编号 | 测试点 | 输入数据 | 预期结果 | 优先级 |
|---------|--------|---------|---------|--------|
| LOGIN-003 | SQL注入-用户名 | username=' OR '1'='1, password=123456, code=1234 | errno=605, 登录失败 | P0 |
| LOGIN-004 | XSS攻击-用户名 | username=<<script>alert(1)</script>, ... | errno=401 | P1 |
→ 好处:格式100%统一,直接复制就能用
底层原理
模型生成的每个字都是概率预测,你的指令越模糊,“可以匹配的训练数据”就越多,模型就只能在各种可能性里取平均,结果就泛泛而谈
你的指令越具体,模型在神经网络里能精准定位到对应的训练数据模型,输出的方差越少,越符合你的预期
原则二:给模型时间思考
| 技巧 | 指令写法 | 作用 |
|---|---|---|
| 思维链 | "请一步一步分析" |
强迫模型走推理路径,不直接跳答案 |
| 先分析后结论 | "请先列出...再给出结论" |
让模型把中间过程显式写出来 |
| 指定步骤 | "Step 1:... Step 2:... Step 3:..." |
把复杂任务拆成模型必须按顺序执行的步骤 |
更多推荐
所有评论(0)