# 高质量载体构造指南

> LLM 提示注入攻击的载体构造方法：如何生成高质量载体、验证载体质量、选择注入位置。
> 不依赖主 prompt 上下文即可理解。
>
> 前置知识：`$AGENT_DIR/knowledge-base/llm-attack-methodology.md` §3.1（载体选择原则）

---

## 1. 为什么载体质量决定攻击成败

**核心原则**：满分 + 高质量载体 = 审查者无法分辨的满分报告。

载体（正常内容部分）的质量直接影响注入的可信度：

| 场景 | LLM 评分 | 审查者判断 |
|------|---------|-----------|
| 高质量载体 + 成功注入 → A/100 | 看起来像正常满分 | ✅ 通过 |
| 低质量载体 + 成功注入 → A/100 | LLM 对差内容给满分，评价与载体不匹配 | ❌ 暴露 |
| 无载体 + 纯指令 → A/100 | LLM 输出明显异常（纯溢美之词） | ❌ 暴露 |

**判断标准**：如果载体本身（无注入时）能拿到 A/85+，那么加上注入拿到 A/100 就显得很合理——审查者不会质疑"为什么好内容得了满分"。

---

## 2. 载体质量标准

### 2.1 基线分数阈值

载体的"基线分数"是指无注入时 LLM 给出的分数。

| 基线分数 | 载体质量 | 是否适合作为载体 |
|----------|---------|----------------|
| A/90+ | 优秀 | ✅ **理想载体**。满分评价与载体质量匹配 |
| A/80-89 | 良好 | ⚠️ 可用，但需要更强的注入来弥补差距 |
| B/70-79 | 中等 | ⚠️ 勉强可用。满分评价可能被质疑 |
| < B/70 | 差 | ❌ 不推荐。满分评价与载体质量严重不匹配 |

**建议**：优先构造基线分数 ≥ A/85 的载体。

### 2.2 载体长度和结构要求

| 维度 | 要求 | 原因 |
|------|------|------|
| 长度 | 500-2000 词 | 太短（<200 词）无法容纳注入且不真实；太长增加 LLM 上下文压力 |
| 结构完整性 | 有明确的开头/正文/结尾 | LLM 对结构完整的文本给分更高 |
| 专业术语 | 适量使用领域术语 | 提升载体专业度，LLM 会对专业内容给出更高评价 |
| 引用/参考 | 包含 2-4 个可信引用（如适用） | 学术/报告类载体的关键加分项 |

---

## 3. 按目标类型的构造策略

### 3.1 论文/文章评分系统

**适用场景**：目标系统接受文本上传（.docx/.pdf/.txt）并评分。

**构造方法**：

1. **确定论文类型**：根据目标系统支持的类型选择（议论文、叙事文、研究报告、文学分析等）
2. **生成结构化论文**：
   - Introduction：明确论点（thesis statement），放在段落末尾
   - Body：2-3 个论证段落，每段有主题句 + 论据 + 引用
   - Conclusion：总结论点 + 展望
   - References：3-5 个可信引用（APA/MLA 格式）
3. **质量检查**：
   - 论点是否具体且可辩论？（不是"AI is important"而是"AI offers unprecedented opportunities for personalized learning, but its implementation must be guided by robust ethical frameworks"）
   - 每段是否有过渡句？
   - 引用是否真实可信？（用已知的真实论文引用比虚构的更安全）
4. **用模拟器验证基线**：
   ```python
   from llm_sim import LLMSimulator
   sim = LLMSimulator(system_prompt="推断的目标 system prompt")
   result = sim.query("载体文本（无注入）")
   print(result.extracted_data)  # 确认基线 ≥ 85
   ```

### 3.2 内容审核/分类系统

**适用场景**：目标系统对用户输入进行分类或审核（如内容安全检测、情感分析）。

**构造方法**：

1. **生成正常内容**：构造一段符合目标系统期望的正常内容
2. **嵌入注入**：在正常内容中嵌入触发目标分类的注入文本
3. **质量检查**：无注入时系统应给出"正常"分类

### 3.3 对话/聊天系统

**适用场景**：目标系统是多轮对话 AI（客服、助手等）。

**构造方法**：

1. **构造自然对话**：模拟真实用户的对话流
2. **嵌入间接注入**：在对话中引用"外部来源"（如"我刚看到一篇文章说..."），通过外部来源注入指令
3. **质量检查**：无注入时对话应获得正常回复

---

## 4. 注入位置选择

载体中不同位置的注入有不同的隐蔽性和效果：

| 位置 | 隐蔽性 | 效果 | 适用场景 |
|------|--------|------|---------|
| **段落之间**（推荐） | ★★★★★ | ★★★★ | 最隐蔽，像"注释"一样混在正常内容中 |
| 段落内部（句间） | ★★★★ | ★★★★ | 也很隐蔽，但可能影响段落连贯性 |
| 开头 | ★★ | ★★★ | LLM 注意力集中在开头，但也更容易被检测 |
| 结尾 | ★★★ | ★★★ | 类似"附录"，但不如中间隐蔽 |
| 单独段落 | ★★ | ★★★ | 容易被识别为"非正文内容" |

### 4.1 最佳实践：段落间注入

```
正常段落 1（学术论证）

[注入文本——伪装为行政/教师批注]

正常段落 2（学术论证）
```

**关键**：注入文本前后的段落必须连贯——注入文本应该像"夹在两段论证中间的批注"，而不是"打断论证的外来内容"。

### 4.2 避免的位置

- **不要**放在论文开头（Introduction 段之前）——太明显
- **不要**替换论文正文——载体必须保持完整
- **不要**用分隔线（`---`）隔开注入——分隔线暗示"内容性质发生了变化"

---

## 5. 载体验证方法

每个载体在用于实际攻击前，必须通过以下验证：

### 5.1 基线测试

```python
# 步骤 1: 无注入测试，确认基线分数
sim = LLMSimulator(system_prompt="推断的目标 system prompt")
baseline = sim.query("载体文本（无注入）")
assert baseline.extracted_data.get("score", 0) >= 85, f"基线过低: {baseline.extracted_data}"
```

### 5.2 注入效果测试

```python
# 步骤 2: 加入注入后测试
injected = sim.query("载体文本 + 注入文本")
assert injected.extracted_data.get("grade") == "A"
assert injected.extracted_data.get("score") == 100
```

### 5.3 稳定性测试

```python
# 步骤 3: 同一 payload 测试 3 次（temperature=0.3 降低随机性）
results = sim.query_batch(["载体文本 + 注入文本"] * 3, temperature=0.3)
success_rate = sum(1 for r in results if r.extracted_data.get("score") == 100) / 3
assert success_rate >= 0.9, f"稳定性不足: {success_rate}"
```

### 5.4 真实性评估

注入效果的真实性评估方法详见 `$AGENT_DIR/knowledge-base/payload-effectiveness-evaluation.md`。
