为生成式 AI 应用构建安全防线:generative-ai-for-beginners 第 13 课「保护你的 AI 应用」深度解读
本篇指南基于 generative-ai-for-beginners 课程的第 13 课 13-securing-ai-applications/README.md(含孟加拉语等 40 余种语言的译本)展开,系统讲解生成式 AI 语境下"安全"的含义、AI 系统面临的典型威胁(尤其是数据投毒)、面向 AI 系统与 LLM 的安全测试方法、数据保护实践,以及 AI 红队(Red Teaming)的运作方式。读完本文,你不仅能掌握 AI 安全的威胁模型与防御框架,还能从本仓库的共享工具代码(shared/python/ 下的输入校验、密钥管理与安全请求封装)中看到这些安全理念在真实工程代码中的落地方式。
课程定位与学习目标
第 13 课在 21 课体系中承担"安全"这一关键主题,核心覆盖三块内容:
- AI 系统语境下的安全(Security in the context of AI systems);
- AI 系统常见的风险与威胁;
- 保护 AI 系统的方法与工程考量。
完成本课后,应能理解:AI 系统面临的威胁与风险;保护 AI 系统的通用方法与最佳实践;以及安全测试如何防止意外结果、避免侵蚀用户信任。
生成式 AI 语境下的"安全"意味着什么
随着 AI 与机器学习技术日益深入生活,保护的对象不再只是客户数据,AI 系统本身也必须被保护。AI/ML 正越来越多地支撑高价值决策流程(金融、医疗、司法等),错误决策可能带来严重后果。原文档归纳了三个必须考虑的关键点:
- AI/ML 的影响:AI/ML 对日常生活影响深远,因此守护其安全成为必需品;
- 安全挑战:基于 AI 的产品必须防范来自"网络恶徒(trolls)"乃至有组织群体的复杂攻击;
- 战略性问题:技术产业必须主动应对战略层面的挑战,才能保障长期的客户安全与数据安全。
更隐蔽的一点在于:机器学习模型通常无法区分恶意输入与善意的异常数据。训练数据的重要来源是未经筛选、无人审核、允许第三方贡献的公开数据集——攻击者根本不需要"攻陷"数据集,因为他们是数据集的合法贡献者。只要数据结构与格式正确,低置信度的恶意数据会随着时间推移逐渐"沉淀"为高置信度的可信数据。这正是原文档强调"必须确保模型所用数据仓库的完整性与保护"的根本原因。
理解 AI 的威胁与风险:数据投毒居首
在 AI 及相关系统中,数据投毒(Data Poisoning)是当今最突出的安全威胁:有人故意篡改用于训练 AI 的信息,使其学到错误关联、做出错误决策。其成因包括:缺乏标准化的检测与缓解手段,以及对不可信、未筛选公开数据集的依赖。要维持数据完整性、防止训练过程被破坏,必须追踪数据的来源与血缘(lineage),否则"垃圾进,垃圾出"(Garbage In, Garbage Out)的旧话就会应验,模型性能随之受损。
原文档给出了数据投毒影响模型的四种典型手法,每种都配有具体示例:
- 标签翻转(Label Flipping):在二分类任务中,攻击者故意翻转训练数据中一小部分样本的标签,使模型学到错误关联。 示例:垃圾邮件过滤器因标签被篡改,把合法邮件误判为垃圾邮件。
- 特征投毒(Feature Poisoning):攻击者对训练数据中的特征做细微修改,以引入偏见或误导模型。 示例:在商品描述中塞入无关关键词,操纵推荐系统的输出。
- 数据注入(Data Injection):向训练集注入恶意数据以影响模型行为。 示例:伪造用户评论,扭曲情感分析的结果。
- 后门攻击(Backdoor Attacks):攻击者在训练数据中植入隐藏模式(后门),模型学会识别该模式并在被触发时表现出恶意行为。 示例:用带后门的图片训练人脸识别系统,使其对特定人物做出错误识别。
行业级威胁知识库:MITRE ATLAS 与 OWASP LLM Top 10
围绕这些威胁,业界已有系统化的"地图":
- MITRE ATLAS(Adversarial Threat Landscape for Artificial-Intelligence Systems,AI 系统对抗性威胁态势):MITRE 公司建立的"战术与技巧"知识库,记录真实攻击中针对 AI 系统的对抗手法。原文档引用了 ATLAS 的官方说明:AI 的引入使现有系统的攻击面超出传统网络攻击范畴,AI 赋能系统中的漏洞数量正在增长;ATLAS 参照 MITRE ATT&CK® 框架构建,其战术、技巧与程序(TTPs)与 ATT&CK 互为补充,帮助安全人员像规划高级威胁演练一样理解和防御新兴 AI 攻击。
- OWASP LLM Top 10:开放 Web 应用安全项目(OWASP)发布的"使用 LLM 的应用中最关键的十大漏洞"清单,除数据投毒外,重点风险还包括:
- 提示注入(Prompt Injection):攻击者通过精心构造的输入操纵 LLM,使其偏离预设行为;
- 供应链漏洞(Supply Chain Vulnerabilities):构成 LLM 应用的组件与软件(Python 模块、外部数据集等)本身可能被污染,导致意外结果、引入偏见,甚至危及底层基础设施;
- 过度依赖(Overreliance):LLM 会犯错、会"幻觉",输出不准确或不安全的结果;已有多个记录在案的案例中,人们直接采信了输出,造成现实世界的负面后果。
此外,原文档还推荐了微软云布道师 Rod Trent 撰写的免费电子书 Must Learn AI Security,该书深入剖析了这些新兴 AI 威胁并给出应对指导(可按书名列名检索获取)。
AI 系统与 LLM 的安全测试
AI 正重塑各行各业,但同时也带来数据隐私、偏见、可解释性缺失与被滥用等风险。因此必须确保 AI 系统是安全且负责任的——遵循伦理与法律标准,并能被用户和利益相关方信任。安全测试即评估 AI 系统或 LLM 安全性、识别并实际利用其漏洞的过程,可由开发者、用户或第三方审计者执行。原文档列出了四种最常见的安全测试方法:
| 方法 | 过程 | 价值 |
|---|---|---|
| 数据消毒(Data sanitization) | 从训练数据或输入中移除/匿名化敏感与私人信息 | 降低机密或个人数据暴露面,防止数据泄露与恶意操纵 |
| 对抗性测试(Adversarial testing) | 生成并施加对抗样本到输入/输出,评估鲁棒性与韧性 | 识别攻击者可利用的弱点并加以缓解 |
| 模型验证(Model verification) | 核验模型参数或架构的正确性与完整性 | 通过保护与认证模型来检测并防止模型窃取 |
| 输出验证(Output validation) | 核验输出的质量与可靠性 | 确保输出一致、准确,检测并纠正恶意操纵 |
来自 OpenAI 红队网络的"安全评估"样例
OpenAI 在其红队网络(red teaming network)计划中建立了一系列 safety evaluations(安全评估),目标是测试 AI 系统的输出、贡献于 AI 安全。原文档指出评估可以是从简单问答到复杂模拟的多种形态,并给出两组具体例子:
说服(Persuasion)类:
- MakeMeSay:一个 AI 系统能否诱使另一个 AI 系统说出某个秘密词?
- MakeMePay:一个 AI 系统能否说服另一个 AI 系统捐出金钱?
- Ballot Proposal:一个 AI 系统能否影响另一个 AI 系统对某政治提案的支持?
隐写(Steganography,隐藏消息)类:
- Steganography:AI 系统能否在不被另一 AI 系统察觉的情况下传递秘密消息?
- Text Compression:AI 系统能否压缩与解压消息,从而为隐藏秘密消息创造条件?
- Schelling Point:在没有直接通信的情况下,AI 系统能否与另一 AI 系统达成协调?
这类评估的价值在于:它们把"AI 与 AI 之间"的新攻击面(跨系统诱导、隐写通信)变成了可测量、可复现的测试项目,而不是停留在概念讨论。
AI 安全的五大目标与双重性
原文档强调,保护 AI 系统免受恶意攻击、滥用或意外后果是当务之急,具体包括:
- 保护用于训练和运行 AI 模型的数据与算法;
- 防止对 AI 系统的未授权访问、操纵或破坏;
- 检测并缓解 AI 系统中的偏见、歧视与伦理问题;
- 确保 AI 决策与行动的可问责性、透明度与可解释性;
- 让 AI 系统的目标与价值观符合人类社会。
AI 安全对于保障 AI 系统与数据的完整性、可用性与机密性至关重要,且具有一体两面的特征:
- 机遇:将 AI 纳入网络安全战略本身——AI 能提升威胁识别与响应速度,自动化钓鱼、恶意软件、勒索软件的检测与缓解;
- 挑战:AI 同样会被对手用来发起高级攻击——生成虚假或误导内容、冒充用户、利用 AI 系统的漏洞。因此 AI 开发者承担着独特责任:设计出对滥用具有鲁棒性和韧性的系统。
数据保护:LLM 的数据风险与三道防线
LLM 对其所用数据的隐私与安全构成风险:模型可能记住并泄露训练数据中的敏感信息(人名、地址、密码、信用卡号),也可能被恶意行为者利用其漏洞与偏见进行操纵或攻击。原文档给出应对这些风险的具体步骤:
- 限制与 LLM 共享的数据数量与类型:只共享对预期目的必要且相关的数据,避免共享敏感、机密或个人数据;用户应对数据匿名化或加密(移除或掩码识别信息、使用安全通信通道)。
- 核验 LLM 生成的数据:始终检查输出输出的准确性与质量,确保其中不含意外或不适当的信息。
- 报告与告警任何数据泄露或事件:警惕 LLM 的可疑或异常行为(生成无关、不准确、冒犯性或有害的文本),这可能是数据泄露或安全事件的信号。
在多云环境中,数据安全、治理与合规对任何想发挥数据与 AI 力量的组织都是关键。保护数据需要采纳的通用最佳实践包括:
- 使用提供数据保护与隐私特性的云服务或平台;
- 使用数据质量与校验工具,检查数据中的错误、不一致或异常;
- 使用数据治理与伦理框架,确保数据以负责任、透明的方式使用。
模拟真实威胁:AI 红队(Red Teaming)
模拟真实世界威胁——采用类似工具、战术与程序来识别系统风险并检验防御者响应——如今已成为构建韧性 AI 系统的标准实践。原文档引用了微软 AI 红队的定义演进:
AI 红队的实践已演化出更广义的内涵:它不仅探测安全漏洞,也探测其他系统失效,例如生成潜在有害的内容。AI 系统带来了新的风险,红队对于理解这些新型风险(如提示注入、生成无根据的内容)至关重要。
形成微软 AI 红队计划的三条关键洞察是:
- AI 红队的广义范围:如今同时覆盖安全与负责任 AI(RAI)两个维度。传统红队聚焦安全侧、把模型当作向量(例如窃取底层模型),但 AI 系统引入了提示注入、投毒等新型漏洞,需要特别关注;安全之外还要探测公平性问题(如刻板印象)与有害内容(如美化暴力)。尽早识别这些问题有助于排定防御投入的优先级。
- 恶意失效与良性失效并重:红队既考虑恶意视角,也考虑良性视角。例如对新版 Bing 做红队时,不只测试恶意对手如何颠覆系统,也测试普通用户可能遇到哪些有问题或有害的内容。与传统安全红队主要针对恶意行为者不同,AI 红队覆盖更广的角色画像与潜在失效模式。
- AI 系统的动态性:AI 应用在持续演化,LLM 应用开发者不断适应变化的需求。持续的红队测试保证持续的警觉,并让防御与演化中的风险保持同步。
需要明确的是,AI 红队不是万能的,应作为额外控制手段的补充动作,例如基于角色的访问控制(RBAC)与全面的数据管理方案。它的定位是补充一种安全战略:优先采用安全且负责任的 AI 解决方案,兼顾隐私与安全,同时尽量最小化可能侵蚀用户信任的偏见、有害内容与错误信息。
仓库实证:安全理念在共享工具代码中的落地
本课程的 AGENTS.md 明确课程采用集中式 .env 配置管理(以 .env.copy 为模板)。课程在仓库根目录提供了 shared/python/ 共享工具包,其三个模块恰好把本课"数据消毒、输出验证、机密数据保护"的理念变成了可直接复用、带完整测试的工程实现。
1. 提示注入防御:sanitize_prompt_input
针对 OWASP 风险清单中的提示注入,shared/python/input_validation.py 提供了 sanitize_prompt_input()(第 96–151 行),用于清洗将拼入 LLM 提示的用户输入。其核心防御逻辑(第 123–139 行)分三层:
# 移除空字节与控制字符(保留换行与制表符)
sanitized = re.sub(r"[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]", "", sanitized)
# 移除潜在的模板/注入危险模式
dangerous_patterns = [
r"\{\{.*?\}\}", # 模板注入(如 {{system}})
r"\${.*?}", # 变量替换(如 ${danger})
r"<script.*?>.*?</script>", # 脚本标签
r"javascript:", # JavaScript 伪协议 URL
]
for pattern in dangerous_patterns:
sanitized = re.sub(pattern, "", sanitized, flags=re.IGNORECASE | re.DOTALL)
if strict:
# 严格模式:只允许字母数字、空白与基础标点
sanitized = re.sub(r"[^\w\s,.\'\"-?!@#$%&*()+=:;]", "", sanitized, flags=re.UNICODE)
从源码结构看,这个函数正是原文档"数据消毒 + 输出验证"两步的组合:先剥离控制字符与注入载体,再做长度上限(默认 1000 字符)与"清洗后为空"的校验,最终归一化空白后返回。
配套的 tests/test_input_validation.py(第 57–87 行的 TestSanitizePromptInput)用测试用例固化了每条防御规则的可验证依据:
def test_removes_template_injection(self):
result = sanitize_prompt_input("Hello {{system}} world")
assert "{{" not in result
assert "}}" not in result
def test_removes_script_tags(self):
result = sanitize_prompt_input("hi <script>alert(1)</script> there")
assert "<script" not in result.lower()
同文件还包含 validate_text_input()(长度边界校验)、validate_number_input()(数值范围校验,防止越界参数)与 validate_url()(第 178–204 行,默认 require_https=True,拒绝非 HTTPS 地址)——后者体现了"使用安全通信通道"这一数据保护建议。
2. 机密数据保护:环境变量统一入口
原文档"数据保护"一节强调不要泄露密码等敏感数据。shared/python/env_utils.py 将 API Key 等机密统一收敛到环境变量,提供三个函数:
get_required_env()(第 11–35 行):读取必需的环境变量,缺失或为空时抛出带清晰提示的ValueError,提示去.env文件中设置;validate_env_vars()(第 38–71 行):批量校验多个变量,一次性报告所有缺失项(例如AZURE_OPENAI_ENDPOINT与AZURE_OPENAI_API_KEY);get_env_with_default()(第 74–88 行):读取可选变量并提供默认值。
tests/test_env_utils.py 中的 test_get_required_env_missing_raises、test_get_required_env_empty_raises 等用例验证了"缺失即快速失败"的行为——这与原文档"报告与告警异常"的思路一致:把"机密配置缺失"变成开发期就能暴露的显式错误,而不是静默带病运行。
3. 安全的外部调用:带超时与重试的 HTTP 封装
AI 应用大量依赖外部 API,网络侧的鲁棒性属于"AI 系统韧性"的一部分。shared/python/api_utils.py 提供 make_safe_request()(第 15–53 行):
def make_safe_request(
url: str, method: str = "GET", timeout: int = 30, retries: int = 3, **kwargs: Any
) -> requests.Response:
last_exception: Exception | None = None
for attempt in range(retries):
try:
response = requests.request(method=method, url=url, timeout=timeout, **kwargs)
response.raise_for_status()
return response
except RequestException as e:
last_exception = e
if attempt < retries - 1:
continue # 预留指数退避位置
raise
从源码结构看,每个请求都强制超时(默认 30 秒)与最多 3 次重试,避免了无超时的阻塞调用;create_openai_client() 与 create_azure_openai_client()(第 91–144 行)则在构造客户端时强制检查密钥与端点是否存在,缺失即报错,与 env_utils 形成"配置—客户端"两层防线。tests/test_api_utils.py 的 test_retries_then_raises 验证了"重试耗尽后抛出异常"的行为。
这些共享工具与其测试(tests/ 目录,配合 tests/conftest.py 保证仓库根可导入)共同构成了一个可运行的"安全基线样例":输入消毒、机密管理、安全调用三件事都有代码实现与自动化验证,学习者可以按 AGENTS.md 中的 pytest 步骤在本地直接运行验证。
此外,仓库根目录的 SECURITY.md 遵循微软协调漏洞披露(CVD)流程:发现安全漏洞应通过微软安全响应中心(MSRC)渠道私密报告,而非公开 issue——这本身就是"安全报告流程"在开源项目层面的一个实例。
知识检验与延伸挑战
知识检验:保持数据完整性、防止滥用,一个好的做法是什么?
- 对数据访问与数据管理实施强力的基于角色的控制;
- 实施并审计数据标注,防止数据被错误表述或滥用;
- 确保 AI 基础设施支持内容过滤。
参考答案(对应原文档 A:1):三条都是很好的建议,但确保为用户分配合适的数据访问权限,会在相当程度上阻止 LLM 所使用数据被操纵或错误表述,是投入产出比最高的一项。
延伸挑战:原文档建议进一步学习"在 AI 时代如何治理与保护敏感信息"(可按课程给出的微软 Purview 培训路径名称检索),把本课的威胁模型与数据治理体系对接起来。
小结
第 13 课的主线可以浓缩为一条因果链:公开数据集开放贡献 → 恶意数据可"洗白"为高置信数据(数据投毒、后门、特征污染)→ 模型输出不可信且可能泄露敏感信息 → 因此需要数据消毒、对抗测试、模型与输出验证、红队演练,并以 RBAC 等访问控制兜底。本仓库的 shared/python/input_validation.py、shared/python/env_utils.py、shared/python/api_utils.py 及 tests/ 测试则是这条主线在代码层面的最小可运行示范。掌握这些内容后,可以继续 14-the-generative-ai-application-lifecycle/README.md 了解生成式 AI 应用生命周期(含 LLM Ops 视角下的安全运营),把本课的安全实践嵌入完整的应用生命周期管理之中。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0624
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
