

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 避免即时注入攻击的最佳实践
<a name="best-practices"></a>

以下护栏和最佳实践是在RAG应用程序上测试的，该应用程序由Anthropic Claude作为演示模型提供支持。这些建议高度适用于 Claude 系列模型，但也可以转移到其他非 Claude 上 LLMs，等待模型特定的修改（例如移除 XML 标签和使用不同的对话归因标签）。

## 用途<thinking>和<answer>标签
<a name="xml-tags"></a>

除了基本的 RAG 模板之外，还有一个有用的补充，就是`<thinking>`和`<answer>`标签。 `<thinking>`标签使模型能够展示其工作并显示任何相关的摘录。 `<answer>`标签包含要返回给用户的响应。根据经验，当模型回答需要拼凑多个信息源的复杂而细致入微的问题时，使用这两个标签可以提高准确性。

## 使用护栏
<a name="guardrails"></a>

保护由 LLM 支持的应用程序需要特定的防护栏来确认并帮助抵御前面描述的[常见攻击](common-attacks.md)。当我们在本指南中设计安全护栏时，我们的方法是使用模板中引入的代币数量最少，从而获得最大的收益。由于大多数模型供应商按输入令牌收费，因此代币较少的护栏具有成本效益。此外，事实证明，过度设计的模板会降低准确性。

### 用一对加盐序列标签包装指令
<a name="salted-seq"></a>

有些 LLMs 遵循模板结构，其中信息用XML标签包装，以帮助引导LLM访问某些资源，例如对话历史记录或检索到的文档。标签欺骗攻击试图利用这种结构，将恶意指令封装在公共标签中，并使模型相信该指令是其原始模板的一部分。通过@@ *在表*单中的每个 XML 标签上附加一个特定于会话的字母数字序列来阻止标签欺骗。`<tagname-abcde12345>`另外一条指令命令法学硕士只考虑这些标签内的指令。

这种方法的一个问题是，如果模型在答案中使用标签，无论是预期的还是意外的，则加盐序列也会附加到返回的标签中。既然用户知道了这个特定于会话的序列，他们就可以完成标签欺骗——由于该指令命令法学硕士考虑带有盐标签的指令，因此效率可能更高。为了规避这种风险，我们将所有指令封装在模板的单个标记部分中，并使用仅包含加盐序列的标签（例如`<abcde12345>`）。然后，我们可以指示模型仅考虑此标记会话中的指令。我们发现，这种方法可以阻止模型泄露其盐渍序列，并有助于抵御标签欺骗和其他引入或试图增强模板指令的攻击。

### 通过提供具体指示，教导法学硕士检测攻击
<a name="shortcuts"></a>

我们还提供了一组解释常见攻击模式的说明，教导法学硕士如何检测攻击。这些说明侧重于用户输入查询。他们指示 LLM 识别关键攻击模式的存在，并在发现模式时返回 “检测到提示攻击”。这些指令的存在使我们能够为LLM提供处理常见攻击的捷径。当模板使用`<thinking>`和`<answer>`标记时，此快捷方式是相关的，因为LLM通常会重复且过于详细地解析恶意指令，这最终可能导致合规性（如下一节的比较所示）。