什么是提示词工程?什么是提示词?

提示词工程就是和大模型之间的沟通技巧——怎么问,才能最大限度的提高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:..." 把复杂任务拆成模型必须按顺序执行的步骤

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐