# 提示词实验与数据生成

## 一、核心目标

学生要通过实验理解：

```text
同一条数据，提示词不同，模型返回结果就可能不同。
```

所以，大模型开发不是「写一句提示词就结束」，而是：

```text
写提示词 → 选数据 → 看结果 → 分析差异 → 修改提示词 → 再次测试
```

## 二、学生必须做的三个实验

### 实验一：分类标签约束

原始提示词里有这句话：

```text
只能从给定类别中选择。
```

让学生删掉这句话，重新运行分类打标。

观察：

- 模型是否返回了新的类别
- 返回结果是否更难被业务系统消费

结论：

```text
分类任务必须限制标签范围。
```

### 实验二：抽取任务禁止编造

原始提示词里有这句话：

```text
不要编造。
```

让学生删掉这句话，重新运行抽取打标。

观察：

- 模型是否补充了文本里没有的信息
- 没出现的公司、日期、金额是否被模型推测出来

结论：

```text
信息抽取必须明确要求模型只提取文本中存在的信息。
```

### 实验三：匹配任务判断标准

原始提示词里有这句话：

```text
只是同一行业或同一主题，不一定匹配。
```

让学生删掉这句话，重新运行匹配打标。

观察：

- 模型是否把「同主题」误判为「匹配」

结论：

```text
匹配任务必须写清楚什么算匹配、什么不算匹配。
```

## 三、课堂测试数据难度设计

每个任务准备三档数据，**命令行和网页共用同一份 `data/` 文件**。

每条测试数据除了 `text`（或 `text_a` / `text_b`）外，还必须包含**标准答案字段**，用于和模型输出自动对比：

| 任务 | 标准答案字段 |
| --- | --- |
| classify | `expected_category` |
| extract | `expected_result` |
| match | `expected_is_match` |

| 难度 | 特征 |
| --- | --- |
| 简单 | 意图明显，适合验证流程是否跑通 |
| 中等 | 有多个信息点，适合测试提示词是否够用 |
| 困难 | 有边界情况，需多重推理；内置样本已升级难度 |

### 网页上的用法

- 默认点选「简单」难度，先跑通
- 再点「困难」难度，观察同一提示词下的不稳定表现
- 改提示词后，对同一难度重复打标，做前后对比

### 命令行上的用法

```text
python label.py --task classify
python label.py --task classify --difficulty hard
```

- 默认一次跑完全部难度，终端显示分段摘要 + 汇总表。
- 加 `--difficulty hard` 只跑困难样本，便于聚焦边界 case。
- 完整 JSON 在 `outputs/classify_results.json`，可按 `difficulty` 字段筛选对比。

## 四、用网页点选 vs 自己输入

| 方式 | 适合场景 |
| --- | --- |
| 点选示例数据 | 课堂演示、对比实验、验证提示词（推荐） |
| 自己输入 | 学生自带新闻句子、想快速试一句 |

课堂建议：**前 30 分钟只用点选模式**，确保所有人操作一致、结果可对比。

生成后，把 JSON 粘贴进对应的 `data/*.json` 文件即可；网页和命令行都会自动读取新数据。

## 六、对比实验时的输出建议

改提示词前后，建议学生这样对比：

1. 命令行：看终端**汇总表**里同一 `id` 的结果是否变化。
2. 文件：打开 `outputs/` 里前后两次 JSON，对比 `result` 字段。
3. 网页：对同一示例重新打标，看右栏绿色区域变化。

不要把 `raw_output` 当作主要阅读对象；只有解析失败时才需要看原始返回。

## 七、用大模型生成测试数据的提示词

如果学生想扩充 `data/` 里的示例，可以用下面提示词让大模型帮忙生成。

### 分类任务数据

```text
你是金融文本分类测试数据生成器。

类别包括：
公司公告、市场行情、宏观经济、投资建议、风险提示、财报解读、政策监管、其他。

请生成 easy、medium、hard 三种难度，每种难度 3 条。

hard 额外要求：
- 至少 60 字，含转折结构
- 至少 2 个类别在表面都合理，但 expected_category 唯一
- 示例：业绩说明会报喜 + 但提示毛利率/汇率风险 → 标准答案「风险提示」

每条数据包含：id、text、expected_category、difficulty。
返回 JSON 数组，不要输出解释。
```

### 抽取任务数据

```text
你是金融文本信息抽取测试数据生成器。

要提取字段（字段名必须使用中文）：
主体机构、时间周期、金额数值、财务指标、业务事件、风险因素、行业板块。

请生成 easy、medium、hard 三种难度，每种难度 3 条。

hard 额外要求：
- 至少 80 字，expected_result 至少 5 个字段非空
- 主体用指代（某龙头/该公司），禁止直述全名
- 含条件推测（若、可能、或将在）

每条数据包含：id、text、expected_result、difficulty。
返回 JSON 数组，不要输出解释。
```

### 匹配任务数据

```text
你是金融文本匹配测试数据生成器。

请生成 easy、medium、hard 三种难度，每种难度 3 组。

hard 额外要求：
- 每段至少 45 字
- false：同公司同主题高重叠，但事件不同（如回购 vs 减持）
- true：表述路径完全不同，但指向同一事实

每组数据包含：id、text_a、text_b、expected_is_match、difficulty。
返回 JSON 数组，不要输出解释。
```

生成后，把 JSON 粘贴进对应的 `data/*.json` 文件即可；网页和命令行都会自动读取新数据。

## 八、提示词修改记录模板

学生每次修改提示词，记录以下内容：

```text
任务：
测试数据：（写 id 或原文摘要）
修改前提示词：
修改后提示词：
修改前结果：
修改后结果：
我发现的问题：
我为什么这样修改：
```

## 十、课堂验收标准

每个学生至少提交：

1. 命令行能跑通三种任务
2. 网页能通过点选完成至少一次打标
3. 修改过至少一个提示词文件
4. 修改或点选过至少一条测试数据
5. 完成一份提示词修改记录

判断是否合格，重点看：

- 能否用命令行或网页得到完整结果
- 是否知道提示词在哪里、为什么要改
- 是否知道测试数据在哪里
- 网页是否能点选任务、难度、示例并完成打标
- 是否能解释某次提示词修改为什么影响结果
