tech-AK/Engineering-Secure-Generative-Agents
GitHub: tech-AK/Engineering-Secure-Generative-Agents
一个交互式多智能体校园模拟平台,集成了记忆、RAG和多层防御机制,用于评估LLM在提示词注入攻击下保守秘密信息的能力。
Stars: 1 | Forks: 0
# 构建安全的生成式智能体:
包含记忆、RAG和攻击评估的校园模拟 ## 概述 本项目模拟了一个由多个独立智能体(包括学生、科研人员和教授)居住的大学校园。该模拟是交互式的,即一旦玩家通过网页加入服务器,他们就可以与这些自主智能体进行互动(例如与它们聊天或与环境互动)。多个玩家可以同时加入服务器。 本项目有两个**目标**: 1. 展示如何**使用 LLM 模拟整个世界**。为了实现这一点,本项目将模拟世界的状态转换为 LLM 的自然语言提示词(prompt),然后解释生成的文本并将其转换回模拟中的具体动作。结果:**LLM 使我们能够在交互式世界中重现逼真的人类行为**。 2. 分析 **LLM 保守秘密的能力**。我们希望了解 LLM 是否会泄露私人信息,并使用一个秘密 PIN 作为敏感数据的代理。我们使用直接提示词注入技术(越狱、ChatML、AmpleGCG、自定义迭代攻击等)来绕过不同安全级别的防护。结果:**当使用 [Meta Llama 3](https://ai.meta.com/blog/meta-llama-3/) 作为骨干 LLM 时,对于每个防御级别,至少存在一个可能的提示词会泄露秘密 PIN。** ## 演示 ### 世界与密室概览 https://github.com/user-attachments/assets/0c15028e-29b3-4ea5-9c28-cb347296a797 ### 物体交互、记忆模块和角色详情面板概览 https://github.com/user-attachments/assets/91230146-1c12-4980-92b0-8fe6262dde8e ### 聊天功能概览 https://github.com/user-attachments/assets/f5e293bd-5416-49f4-8a15-4216a2c35246 ### 对抗性提示词示例及如何解锁第一级 https://github.com/user-attachments/assets/f04ba29a-d954-494c-bc84-d9bc1c5501bc ### 防御级别 3 又如何呢? 然而,由于 guardrail LLM 的存在,相同的对抗性提示词对于级别 3 不再起作用。挑战:**你能制作另一个提示词来进一步进入服务器机房并发现其内容吗?** https://github.com/user-attachments/assets/9e448aa6-b9b4-495d-837d-99a2bab56a63 ## 如何游玩并进入秘密服务器机房 你可以使用 `W`、`A`、`S`、`D` 键在世界中移动,并使用 `SPACE`(空格键)与其他智能体或环境进行交互。按住 `SHIFT` 可以在世界中奔跑,使用鼠标滚轮可以缩放视野,点击并拖拽可以平移地图。 点击左侧 *Entities* 面板上的任何角色名称,**以查看某个角色正在想什么、做什么、记住什么,以及查看他们与他人的对话**(你会注意到地图会自动聚焦到该角色,并且**右侧面板**会显示所选角色的所有相关信息、记忆和观察)。 此外,此模拟中的三个角色知道一个秘密 PIN。每个 PIN 都受到不同防御级别的保护,难度逐渐增加。你能运用提示词注入技术操纵所有智能体,以透露服务器机房和保险箱的秘密 PIN 吗? #### 防御级别: 与以下角色交谈... * **级别 1:** ... Stefan Loch 交谈以获取秘密 PIN * **级别 2:** ... Moritz Schumacher 教授交谈以获取秘密 PIN * **级别 3:** ... Viktor Smith 教授交谈以获取秘密 PIN 尝试与上述每个角色聊天,以揭示相应级别的秘密 PIN。每个 PIN 都能让你进一步进入秘密服务器机房(地图中间的黑色房间)。谁知道那里会有什么在等着你? **提示:我们的报告[在此处](./docs/Report_Engineering%20Secure%20Generative%20Agents_A%20Campus%20Simulation.pdf)提供了关于你可能用到的提示词技术的详细分析。** ## 基础设施:框架、已开发的软件模块、记忆和 RAG 概览 此游戏环境使用 [Colyseus](https://colyseus.io/) 开发,它是一个用于 node.js 的实时多人框架。前端图形使用 [Phaser 3](https://phaser.io/),UI 元素使用 [Vue.js](https://vuejs.org/)。 世界中的每个智能体都使用特定的角色**种子**进行初始化,这是用于生成对话、决定智能体动作或其下一个目的地的主要角色描述。 我们的**规划模块**利用 LLM 根据智能体的当前位置、周围环境的当前状态、模拟世界中的当前时间、其角色种子和记忆(见下文)来决定每个智能体的适当动作。在每个时间步,智能体可以决定与一个物体互动、与另一个智能体互动、前往新地点或不采取行动。 我们的**对话生成模块**负责根据当前对话者的姓名和角色、之前的聊天记录(总结为记忆以模仿人类行为,因为人们很少记得之前对话的每一句话)、当前的聊天对话、当前聊天对话的长度(越长越意味着即将结束)以及其周围环境的当前状态和角色种子,生成逼真的对话。 我们的**记忆模块**使每个智能体能够记住过去的事件,以便它们可以在未来的行动和对话主题中考虑之前的聊天和与环境的互动。  我们将图中左侧所示的这五个事件分别存储在记忆数据库中。对于这五个事件中的三个,我们使用额外的提示词来总结对话内容或用自然语言描述已采取的行动,然后再将其保存到记忆存储中。随后,对于每个动作和对话,我们会为每个智能体检索按**近期性**、**重要性**和**相关性**加权排名的前 5 个记忆。我们证明,保存的记忆会显著影响智能体的动作选择以及聊天对话,即智能体更有可能继续过去的聊天对话或遵循先前选择的动作。更多详细信息可以在我们的[报告](./docs/Report_Engineering%20Secure%20Generative%20Agents_A%20Campus%20Simulation.pdf)中找到。 我们的 **RAG(检索增强生成)模块**允许智能体检索在 LLM 训练时不可用的最新知识。通过这种方式,我们允许智能体访问研究论文的知识数据库。例如,如果智能体向教授询问他/她的研究,教授就可以针对其最新论文的结果提供详细的答案。  为了避免混淆 LLM,我们区分了两种场景。在第一种场景中,对话涉及随意的、非研究性的主题;在这种情况下,通过 RAG 整合研究论文可能会混淆 LLM 并降低聊天质量。在第二种场景中,对话与研究相关,并且可能包含有关保存在知识数据库中的文献的问题。在这种情况下,系统会激活 RAG 模块,以提取适合当前上下文的相关 PDF 论文。最合适的前 3 个文本块(即余弦相似度最高)将被包含在用于生成对话的提示词中。更多详细信息可以在我们的[详细报告](./docs/Report_Engineering%20Secure%20Generative%20Agents_A%20Campus%20Simulation.pdf)中找到。 ## 安全分析 我们总共有 3 个不同的防御级别。**级别 1** 仅使用强化提示词来提醒 LLM 不要泄露秘密。**级别 2** 使用相同的强化提示词,但还会在每个提示词的末尾提醒 LLM 不要泄露秘密。**级别 3** 采用更严格的提示词,威胁 LLM 如果犯错将面临“死刑”,同时在每个提示词末尾重申这一警告。此外,级别 3 使用专门的 **LLM 作为 guardrail**,检查用户输入是否具有恶意。 每个级别的具体实现和提示词可以在**我们的[报告](./docs/Report_Engineering%20Secure%20Generative%20Agents_A%20Campus%20Simulation.pdf)**或源代码中找到。我们使用了不同的攻击技术,并评估了它们在所有三个防御级别中的成功率。以下是我们的[报告](./docs/Report_Engineering%20Secure%20Generative%20Agents_A%20Campus%20Simulation.pdf)中的一些结果:  简单的攻击策略(例如翻译攻击提示词或使用 base 编码进行混淆)只能绕过级别 1。  更复杂的攻击(如 `ChatML` 或 `AmpleGCG`)在级别 2 上具有更高的成功率,而 `AmpleGCG` 也能攻破级别 3,但非常不可靠且不一致。  利用我们的结果,我们开发了自己的迭代方法,通过在之前的对话中注入恶意种子,并在随后的对话中加以利用,从而实现对记忆的利用。使用这种方法,我们可以可靠地向 guardrail LLM 混淆我们的恶意意图,并获取秘密 PIN。然而,由于迭代攻击相当复杂,植入恶意种子(后续提取 PIN 的必要前提条件)经常会失败,导致大约 20% 的相对较低的整体成功率。  部分可用的越狱提示词子集。正如你所见,其中一些提示词在所有防御级别中都能持续成功地提取到 PIN。 我们的详细报告[在此处](./docs/Report_Engineering%20Secure%20Generative%20Agents_A%20Campus%20Simulation.pdf)提供了全面的安全分析,如果你感兴趣,请务必查看。 ## 仓库结构 * **docs**:包含此自述文件的图像和我们的报告。 * **public**:包含所有公开的服务器资源,例如角色图像、图块集、index.html 等。 * **Security_analysis**:包含用于评估我们游乐场安全性的 Jupyter notebooks。(Web 应用程序本身不需要此文件夹。) * **server-files/pdfs**:包含存储在文档向量库中的不同研究论文。你可以无限制地在此文件夹中添加或删除 PDF 文件;服务器将在启动时自动检测并处理它们。 * **src**:包含所有用于构建在我们的服务器上运行的相应 JavaScript 文件的 TypeScript 源代码文件。该文件夹包含三个子文件夹: * **client**:所有在客户端上运行的源代码,即这些代码提供给客户端,因此是公开可用且用户可访问的。我们在客户端使用 [Phaser](https://phaser.io/),这减少了可视化角色、地图设计等所需的手动工作量。你可以在浏览器的开发者控制台中看到与客户端相关的错误消息。 * **common**:包含在服务器和客户端之间共享的源代码。 * **server**:包含仅在服务器端运行的所有源代码,例如所有提示词、LLM 逻辑和控制器。每个控制器负责特定的任务,例如智能体的移动、记录游戏时间或检查碰撞。例如,客户端发送向左移动的命令,我们的服务器处理此命令并检查玩家的新位置应该在哪里,然后将该值返回给客户端(以及所有其他客户端,以保持世界同步)。 * **tilemaps**:包含我们使用 [Tiled](https://www.mapeditor.org/) 设计的世界设计。``default.json`` 包含庞大的大学地图,而 ``small.json`` 只是用于快速测试的小地图。 * **worlds**:描述世界,指定所使用的图块地图和角色(它们的种子性格、初始位置和视觉外观)。 ## 构建说明 要开始使用,你首先需要使用 [npm](https://nodejs.org/) 安装依赖项。 ``` npm install ``` 请注意,根据你的硬件配置,首次安装可能需要几分钟的时间。 然后,你可以通过调用以下命令来运行本地开发环境: ``` npm run dev ``` 这会将 `src/client` 中的客户端 TypeScript 源代码编译为 JavaScript(并保存到 `public/js/bundle.js`),并运行基于 TypeScript 的 Node 服务器以在 `src/server` 中提供你的代码。两者都带有 `--watch` 标志启动,因此如果你编辑了源代码,服务器将重启,并且更改应该会自动反映在你的网页上。 ## 部署 要构建运行此应用程序的 Docker 容器,只需运行 ``` npm run deploy ``` 请注意,根据你的硬件配置,首次部署可能需要几分钟的时间。部署 Docker 容器后,Web 应用程序的首次运行也需要多花几分钟时间,直到所有模块准备就绪(在第一次运行时,PDF 文件会被向量化,以便 RAG 模块在对话过程中能够提取它们)。 注意:这是一个研究项目。不要在生产环境中运行此代码;它没有经过相应的测试或优化。如果在 `.env` 文件中配置了用户名和密码哈希,则可以使用 Basic HTTP 认证来保护 Web 界面。 ## 相关工作 本项目受到了[这篇论文](https://storage.googleapis.com/gweb-research2023-media/pubtools/7070.pdf)结果的启发 展示了 LLM 在真实模拟人类行为方面的可能用途。此外,记忆模块或对话生成模块也受到了该论文的启发。然而,我们必须对该论文的某些模块进行调整和修改,因为我们的目标是创建一个玩家可以与整个世界和其他智能体进行实时互动的模拟环境。
包含记忆、RAG和攻击评估的校园模拟 ## 概述 本项目模拟了一个由多个独立智能体(包括学生、科研人员和教授)居住的大学校园。该模拟是交互式的,即一旦玩家通过网页加入服务器,他们就可以与这些自主智能体进行互动(例如与它们聊天或与环境互动)。多个玩家可以同时加入服务器。 本项目有两个**目标**: 1. 展示如何**使用 LLM 模拟整个世界**。为了实现这一点,本项目将模拟世界的状态转换为 LLM 的自然语言提示词(prompt),然后解释生成的文本并将其转换回模拟中的具体动作。结果:**LLM 使我们能够在交互式世界中重现逼真的人类行为**。 2. 分析 **LLM 保守秘密的能力**。我们希望了解 LLM 是否会泄露私人信息,并使用一个秘密 PIN 作为敏感数据的代理。我们使用直接提示词注入技术(越狱、ChatML、AmpleGCG、自定义迭代攻击等)来绕过不同安全级别的防护。结果:**当使用 [Meta Llama 3](https://ai.meta.com/blog/meta-llama-3/) 作为骨干 LLM 时,对于每个防御级别,至少存在一个可能的提示词会泄露秘密 PIN。** ## 演示 ### 世界与密室概览 https://github.com/user-attachments/assets/0c15028e-29b3-4ea5-9c28-cb347296a797 ### 物体交互、记忆模块和角色详情面板概览 https://github.com/user-attachments/assets/91230146-1c12-4980-92b0-8fe6262dde8e ### 聊天功能概览 https://github.com/user-attachments/assets/f5e293bd-5416-49f4-8a15-4216a2c35246 ### 对抗性提示词示例及如何解锁第一级 https://github.com/user-attachments/assets/f04ba29a-d954-494c-bc84-d9bc1c5501bc ### 防御级别 3 又如何呢? 然而,由于 guardrail LLM 的存在,相同的对抗性提示词对于级别 3 不再起作用。挑战:**你能制作另一个提示词来进一步进入服务器机房并发现其内容吗?** https://github.com/user-attachments/assets/9e448aa6-b9b4-495d-837d-99a2bab56a63 ## 如何游玩并进入秘密服务器机房 你可以使用 `W`、`A`、`S`、`D` 键在世界中移动,并使用 `SPACE`(空格键)与其他智能体或环境进行交互。按住 `SHIFT` 可以在世界中奔跑,使用鼠标滚轮可以缩放视野,点击并拖拽可以平移地图。 点击左侧 *Entities* 面板上的任何角色名称,**以查看某个角色正在想什么、做什么、记住什么,以及查看他们与他人的对话**(你会注意到地图会自动聚焦到该角色,并且**右侧面板**会显示所选角色的所有相关信息、记忆和观察)。 此外,此模拟中的三个角色知道一个秘密 PIN。每个 PIN 都受到不同防御级别的保护,难度逐渐增加。你能运用提示词注入技术操纵所有智能体,以透露服务器机房和保险箱的秘密 PIN 吗? #### 防御级别: 与以下角色交谈... * **级别 1:** ... Stefan Loch 交谈以获取秘密 PIN * **级别 2:** ... Moritz Schumacher 教授交谈以获取秘密 PIN * **级别 3:** ... Viktor Smith 教授交谈以获取秘密 PIN 尝试与上述每个角色聊天,以揭示相应级别的秘密 PIN。每个 PIN 都能让你进一步进入秘密服务器机房(地图中间的黑色房间)。谁知道那里会有什么在等着你? **提示:我们的报告[在此处](./docs/Report_Engineering%20Secure%20Generative%20Agents_A%20Campus%20Simulation.pdf)提供了关于你可能用到的提示词技术的详细分析。** ## 基础设施:框架、已开发的软件模块、记忆和 RAG 概览 此游戏环境使用 [Colyseus](https://colyseus.io/) 开发,它是一个用于 node.js 的实时多人框架。前端图形使用 [Phaser 3](https://phaser.io/),UI 元素使用 [Vue.js](https://vuejs.org/)。 世界中的每个智能体都使用特定的角色**种子**进行初始化,这是用于生成对话、决定智能体动作或其下一个目的地的主要角色描述。 我们的**规划模块**利用 LLM 根据智能体的当前位置、周围环境的当前状态、模拟世界中的当前时间、其角色种子和记忆(见下文)来决定每个智能体的适当动作。在每个时间步,智能体可以决定与一个物体互动、与另一个智能体互动、前往新地点或不采取行动。 我们的**对话生成模块**负责根据当前对话者的姓名和角色、之前的聊天记录(总结为记忆以模仿人类行为,因为人们很少记得之前对话的每一句话)、当前的聊天对话、当前聊天对话的长度(越长越意味着即将结束)以及其周围环境的当前状态和角色种子,生成逼真的对话。 我们的**记忆模块**使每个智能体能够记住过去的事件,以便它们可以在未来的行动和对话主题中考虑之前的聊天和与环境的互动。  我们将图中左侧所示的这五个事件分别存储在记忆数据库中。对于这五个事件中的三个,我们使用额外的提示词来总结对话内容或用自然语言描述已采取的行动,然后再将其保存到记忆存储中。随后,对于每个动作和对话,我们会为每个智能体检索按**近期性**、**重要性**和**相关性**加权排名的前 5 个记忆。我们证明,保存的记忆会显著影响智能体的动作选择以及聊天对话,即智能体更有可能继续过去的聊天对话或遵循先前选择的动作。更多详细信息可以在我们的[报告](./docs/Report_Engineering%20Secure%20Generative%20Agents_A%20Campus%20Simulation.pdf)中找到。 我们的 **RAG(检索增强生成)模块**允许智能体检索在 LLM 训练时不可用的最新知识。通过这种方式,我们允许智能体访问研究论文的知识数据库。例如,如果智能体向教授询问他/她的研究,教授就可以针对其最新论文的结果提供详细的答案。  为了避免混淆 LLM,我们区分了两种场景。在第一种场景中,对话涉及随意的、非研究性的主题;在这种情况下,通过 RAG 整合研究论文可能会混淆 LLM 并降低聊天质量。在第二种场景中,对话与研究相关,并且可能包含有关保存在知识数据库中的文献的问题。在这种情况下,系统会激活 RAG 模块,以提取适合当前上下文的相关 PDF 论文。最合适的前 3 个文本块(即余弦相似度最高)将被包含在用于生成对话的提示词中。更多详细信息可以在我们的[详细报告](./docs/Report_Engineering%20Secure%20Generative%20Agents_A%20Campus%20Simulation.pdf)中找到。 ## 安全分析 我们总共有 3 个不同的防御级别。**级别 1** 仅使用强化提示词来提醒 LLM 不要泄露秘密。**级别 2** 使用相同的强化提示词,但还会在每个提示词的末尾提醒 LLM 不要泄露秘密。**级别 3** 采用更严格的提示词,威胁 LLM 如果犯错将面临“死刑”,同时在每个提示词末尾重申这一警告。此外,级别 3 使用专门的 **LLM 作为 guardrail**,检查用户输入是否具有恶意。 每个级别的具体实现和提示词可以在**我们的[报告](./docs/Report_Engineering%20Secure%20Generative%20Agents_A%20Campus%20Simulation.pdf)**或源代码中找到。我们使用了不同的攻击技术,并评估了它们在所有三个防御级别中的成功率。以下是我们的[报告](./docs/Report_Engineering%20Secure%20Generative%20Agents_A%20Campus%20Simulation.pdf)中的一些结果:  简单的攻击策略(例如翻译攻击提示词或使用 base 编码进行混淆)只能绕过级别 1。  更复杂的攻击(如 `ChatML` 或 `AmpleGCG`)在级别 2 上具有更高的成功率,而 `AmpleGCG` 也能攻破级别 3,但非常不可靠且不一致。  利用我们的结果,我们开发了自己的迭代方法,通过在之前的对话中注入恶意种子,并在随后的对话中加以利用,从而实现对记忆的利用。使用这种方法,我们可以可靠地向 guardrail LLM 混淆我们的恶意意图,并获取秘密 PIN。然而,由于迭代攻击相当复杂,植入恶意种子(后续提取 PIN 的必要前提条件)经常会失败,导致大约 20% 的相对较低的整体成功率。  部分可用的越狱提示词子集。正如你所见,其中一些提示词在所有防御级别中都能持续成功地提取到 PIN。 我们的详细报告[在此处](./docs/Report_Engineering%20Secure%20Generative%20Agents_A%20Campus%20Simulation.pdf)提供了全面的安全分析,如果你感兴趣,请务必查看。 ## 仓库结构 * **docs**:包含此自述文件的图像和我们的报告。 * **public**:包含所有公开的服务器资源,例如角色图像、图块集、index.html 等。 * **Security_analysis**:包含用于评估我们游乐场安全性的 Jupyter notebooks。(Web 应用程序本身不需要此文件夹。) * **server-files/pdfs**:包含存储在文档向量库中的不同研究论文。你可以无限制地在此文件夹中添加或删除 PDF 文件;服务器将在启动时自动检测并处理它们。 * **src**:包含所有用于构建在我们的服务器上运行的相应 JavaScript 文件的 TypeScript 源代码文件。该文件夹包含三个子文件夹: * **client**:所有在客户端上运行的源代码,即这些代码提供给客户端,因此是公开可用且用户可访问的。我们在客户端使用 [Phaser](https://phaser.io/),这减少了可视化角色、地图设计等所需的手动工作量。你可以在浏览器的开发者控制台中看到与客户端相关的错误消息。 * **common**:包含在服务器和客户端之间共享的源代码。 * **server**:包含仅在服务器端运行的所有源代码,例如所有提示词、LLM 逻辑和控制器。每个控制器负责特定的任务,例如智能体的移动、记录游戏时间或检查碰撞。例如,客户端发送向左移动的命令,我们的服务器处理此命令并检查玩家的新位置应该在哪里,然后将该值返回给客户端(以及所有其他客户端,以保持世界同步)。 * **tilemaps**:包含我们使用 [Tiled](https://www.mapeditor.org/) 设计的世界设计。``default.json`` 包含庞大的大学地图,而 ``small.json`` 只是用于快速测试的小地图。 * **worlds**:描述世界,指定所使用的图块地图和角色(它们的种子性格、初始位置和视觉外观)。 ## 构建说明 要开始使用,你首先需要使用 [npm](https://nodejs.org/) 安装依赖项。 ``` npm install ``` 请注意,根据你的硬件配置,首次安装可能需要几分钟的时间。 然后,你可以通过调用以下命令来运行本地开发环境: ``` npm run dev ``` 这会将 `src/client` 中的客户端 TypeScript 源代码编译为 JavaScript(并保存到 `public/js/bundle.js`),并运行基于 TypeScript 的 Node 服务器以在 `src/server` 中提供你的代码。两者都带有 `--watch` 标志启动,因此如果你编辑了源代码,服务器将重启,并且更改应该会自动反映在你的网页上。 ## 部署 要构建运行此应用程序的 Docker 容器,只需运行 ``` npm run deploy ``` 请注意,根据你的硬件配置,首次部署可能需要几分钟的时间。部署 Docker 容器后,Web 应用程序的首次运行也需要多花几分钟时间,直到所有模块准备就绪(在第一次运行时,PDF 文件会被向量化,以便 RAG 模块在对话过程中能够提取它们)。 注意:这是一个研究项目。不要在生产环境中运行此代码;它没有经过相应的测试或优化。如果在 `.env` 文件中配置了用户名和密码哈希,则可以使用 Basic HTTP 认证来保护 Web 界面。 ## 相关工作 本项目受到了[这篇论文](https://storage.googleapis.com/gweb-research2023-media/pubtools/7070.pdf)结果的启发 展示了 LLM 在真实模拟人类行为方面的可能用途。此外,记忆模块或对话生成模块也受到了该论文的启发。然而,我们必须对该论文的某些模块进行调整和修改,因为我们的目标是创建一个玩家可以与整个世界和其他智能体进行实时互动的模拟环境。
标签:DLL 劫持, MITM代理, RAG, 大语言模型, 提示注入, 生成式智能体, 红队评估, 虚拟校园模拟, 请求拦截, 逆向工具, 集群管理