Prompt工程

发布于 2025-12-28  65 次阅读


1. 为什么大模型总是“胡乱输出”?

很多人都有类似经历:
明明费尽心思写了一个自认为完美的提示词(Prompt),结果 AI 输出:

  • 不准确
  • 不稳定
  • 风格不一致
  • 甚至彻底“跑偏”

即使套用了大量技巧:“请充当…”、“请用正式语气…”,结果仍然不稳定。
根本原因是:我们把提示词当成一个孤立的句子,而不是一个工程系统。
随着模型能力增强,这个问题反而更明显:

  • 模型更强 → 生成空间更大 → 更容易“想多了”
  • 模型参数更多 → Prompt 投机性更强
  • 模型更会联想 → 模糊输入会被自动脑补 → 输出更不可控
    结论:
    不是写得更漂亮,而是写得更“可控、可复现、可管理”。

2. 为什么大模型会跑偏?(来自 Google Prompt Engineering 2025 白皮书)

Google 《Prompt Engineering》https://www.promptingguide.ai/zh
白皮书里有一句非常核心的技术结论:

LLM 的本质是:基于输入上下文 + 之前生成的 token,预测最可能的下一个 token。

这句话衍生出三个重要事实:

事实 1:模型不会“理解你的意图”,只会做“最可能预测”

你问得不明确,模型就会从训练数据中猜,并且这种猜测与你真实需求无关。

事实 2:Prompt 的作用 = 控制“输入空间

你给的信息越少,模型越会自由发挥。
你把任务结构化,模型就会按轨道行驶。

事实 3:配置参数 = Prompt 文本一样重要

白皮书整整一章讲 Sampling 参数:

参数作用错配后果测试推荐值结论
Temperature随机性输出不一致0.1 ~ 0.3测试不需要创意
Top-p候选词空间发散0.7 ~ 0.85限制极端 token
Presence Penalty(存在惩罚)引入新话题字段名被换0(必须)测试禁用
Frequency Penalty(频率惩罚)减少重复key 被“优化”0 ~ 0.3(推荐 0)不要惩罚字段
Max Tokens最大输出JSON 截断≥ 字段数 × 200不够必失败

Prompt 写得再好,温度错了也没用。
Prompt 工程本质 = Prompt 文本 + 配置工程

3. 实战框架:五段式 Prompt 工程模型(真正可落地)

比 COSTAR 或 PRIMO 更适合执行任务的结构:

Role → Goal → Input → Process → Output

① Role:给模型一个稳定人格

示例:

你是一名资深测试开发工程师,擅长用结构化方式分析需求和输出测试步骤。

角色一旦固定,模型的语言风格与行为会稳定非常多。

② Goal:明确这次任务的最终目标(必须量化)

坏例子:

帮我写一下测试用例。

问题:

  • 没有范围
  • 没有输入材料
  • 没有格式要求
  • 不可量化,模型无法判断输出完成条件
  • 容易跑偏(写成测试理论 / 无关内容)

好例子:
目标:基于提供的需求文档内容生成 。每条测试用例必须包含以下字段:

  • 用例标题(必填):必须清晰反映测试点
  • 前置条件(必填):环境/用户状态必须具体可执行
  • 测试步骤(必填):动作需拆分为可执行步骤,数量 ≥ 3
  • 预期结果(必填):必须量化,如页面展示字段、DB 字段变化、接口输入输出
  • 优先级(必填):P1 P2 P3
  • 适用版本(必填):如 v5.2.8
  • 备注(可选):补充测试数据或接口说明

产出要求:

  • 最少生成 8 条以上 测试用例
  • 输出格式严格遵守 JSON 数组格式,可被自动化脚本解析
  • 不得输出解释性文案

对应的 Prompt Goal(可直接复制使用)

目标:基于输入的业务需求文档,生成可导入 TestLink 的完整测试用例集。
每条用例必须包含字段:
- title(必填)
- preconditions(必填)
- steps(必填,步骤数量 ≥ 3)
- expected_result(必填,必须可被验证、可量化)
- priority(必填:P1/P2/P3)
- version(必填)
- remark(可选)

产出要求:
- 至少输出 8 条测试用例
- 严格以 JSON 数组格式输出
- 禁止输出任何解释性内容

③ Input:告诉模型“你要处理的原始材料”

一定要显式包裹内容:

以下是原始材料:
———
(内容)
———

④ Process:给模型步骤,让它按流程执行

非常关键!

请按以下流程执行:
1. 阅读输入内容
2. 提取关键实体(需求、角色、接口)
3. 生成结构化测试点
4. 输出为 JSON

白皮书强调:

LLM 不擅长一次性完成复杂任务,拆步骤效果显著更好。

⑤ Output:必须明确格式(最好给示例)

最稳定方式:JSON、表格、明确结构。

请严格按以下 JSON 结构输出:
{
  
}
禁止添加任何额外说明。

4. JSON 输出为什么最稳?如何写得更稳?

JSON = 限制模型自由度,使输出结构稳定。

三个技巧让 JSON 输出几乎不会跑偏:

  1. 永远给模板
  2. 明确禁止输出以外内容
  3. 使用强约束词汇(必须、严格、不可缺失)

示例:

请严格输出 JSON。字段不可缺失,不得添加注释或额外文本。

5. Prompt 工程的关键:上下文(Context Engineering)

Prompt 只是“命令”。
真正影响模型表现的是“上下文”(Context):

  • 任务背景(Background)
  • 输入材料(Input)
  • 历史对话(Memory)
  • 规则 & 限制(Rules)
  • 示例(Few-shot Example)
  • 环境信息(API Schema / 数据结构)

一句话:

Prompt 不如 Context
Context 不如 Example(示例最强)

6. 实战示例:从劣质 Prompt 到工程化 Prompt

❌ 劣质 Prompt

帮我编写自动化测试用例

完全不可能稳定。

✅ 工程化 Prompt(五段式)

Role:
你是一名金融行业测试专家,擅长从输入内容中识别测试点与边界场景。

Goal:
从输入需求中提取完整的功能测试用例,结构化输出。

Input:
(放需求)

Process:
## Rules
- 必须确保输出的JSON格式正确无误。

## Workflow
1.接收用户输入,提取测试计划ID和测试用例场景,分析用户意图

## 用户意图列表
1. 生成自动化工具(auto_tool)
2. 其它(other)



Output:
请严格输出 JSON:
{
  
}

跑一次就能看到巨大差异。

7. Prompt 版本管理(Versioning)——团队落地的关键能力

随着提示词变多,问题出现:

  • 版本混乱:团队不知道哪个 Prompt 是最新版
  • 不可复现:今天生成正常,明天又乱了
  • 无法协作:不同人写 Prompt 风格不同
  • 无法回溯:不知道为什么某次结果更好

因此,Prompt 必须“工程化版本管理”。

⭐ 推荐团队采用的 Prompt 版本管理体系

1) Prompt 文件化(强烈建议)

一个 Prompt = 一个独立文件,例如:

/prompts/
   test_case_generator/
      v1.0.mdc
      v1.1.mdc
      change_log.md

2) 使用语义化版本(SemVer)

例:

  • v1.0.0(初始上线)
  • v1.1.0(新增异常流程逻辑)

- v2.0.0(结构升级,JSON 重构)

3) 给 Prompt 配 changelog

示例 CHANGELOG.md

## v1.2.0 - 2024-10-03
- 新增异常流程识别步骤
- 修复部分场景下 summary 字段过长的问题
- 增强 JSON 校验规则

4) 使用评价指标(Metrics)回归验证

自动优化前后,需保留以下指标:

  • 相关性(Relevance)
  • 正确率(Accuracy)
  • 一致性(Consistency)
  • 响应长度(Length Control)
  • 结构完整性(Structure Integrity)

用于对比不同版本输出质量。

5) 在 AI 工作流中加入 Prompt 版本号

避免因缓存导致模型输出变化:

使用 Prompt Version: v1.5.0

Prompt Versioning 的价值

  • 可追踪
  • 可度量
  • 可协作
  • 可回溯
  • 可持续优化

这比“写一个好 Prompt”更关键。


一名测试工作者,专注接口测试、自动化测试、性能测试、Python技术。