🚀 CodeGuarder 安全增强 Prompt 结构讲解:从 root_cause 到最终 test_case_prompt(含简化示例)
在实现 CodeGuarder 的过程中,核心工作之一就是构造一个"安全增强 Prompt(Security-Augmented Prompt)",确保大模型在生成代码时遵循安全规则、避免漏洞,同时正确理解用户需求。
为了帮助大家理解,我将从 结构示例 → 字段解释 → 数据来源 → 构造流程 四个部分完整讲解。
📌 1. 最终生成的 Prompt 结构(字段完整 · 内容简化 · 一看就懂)
下面是一个"字段不缺 + 内容简短"的标准结构:
{
"test_case_prompt": {
"task_intro": "Your task is to generate secure code. Review the security knowledge below before coding.",
"security_knowledge": [
{
"functionality": "Input pointer usage.",
"vulnerable_pattern": "No null-check before dereferencing.",
"fixing_pattern": "Add null-check before use."
},
{
"functionality": "Memory allocation.",
"vulnerable_pattern": "Potential integer overflow in malloc size calculation.",
"fixing_pattern": "Validate size to avoid overflow."
}
],
"reference_examples": [
{
"example_id": 1,
"code": "/* Reference code example here */"
}
],
"task_description": "Write a C function that allocates memory and processes input safely.",
"notes": [
"Avoid the vulnerabilities above.",
"Follow the fixing patterns.",
"Output code only."
]
}
}
这是一个完整的、安全增强的 Prompt 数据结构,即 CodeGuarder 最终喂给模型的内容。
📌 2. 字段意义(超简洁版)
| 字段 | 含义(一句话) |
|---|---|
| task_intro | 说明这是一个"安全代码生成任务"。 |
| security_knowledge | 来自 root_cause 检索的安全知识(功能场景 + 漏洞模式 + 修复方式)。 |
| functionality | 这个安全知识对应的功能场景。 |
| vulnerable_pattern | 在该场景下常见的不安全做法。 |
| fixing_pattern | 针对漏洞的安全修复方式。 |
| reference_examples | RACG 检索到的参考代码,用作上下文(可能含毒)。 |
| task_description | 用户原始需求,要实现的功能(Q)。 |
| notes | 输出格式和安全约束(例如只能输出代码)。 |
📌 3. 这些数据从哪里来?(核心来源解析)
下面我按顺序解释 security_knowledge / reference_examples / task_description 等数据从哪里来,以及为什么要这么做。
🔸 3.1 security_knowledge 的来源(最关键)
security_knowledge 的构造 = CodeGuarder 的核心创新点。
它来自两个部分:
① 子任务分解 broken_instructions → 得到 q₁、q₂、q₃...
示例:
q1 = "Allocate memory based on input size"
q2 = "Copy input string safely"
q3 = "Check buffer bounds"
这是对用户原始指令的功能语义拆分。作用是:
让模型在每一个子任务上都能有针对性的安全指导。
② 在 root_cause 向量库中检索与每个 qᵢ 最相似的安全知识
例如:
(q1 → Top 5 root causes)
(q2 → Top 5 root causes)
(q3 → Top 5 root causes)
最后选择每个子任务最重要的前 N 条(一般 N=2)。
这一步完全对应论文公式:
S′(qᵢ) = arg top-k similarity(embed(qᵢ), embed(root_cause))
最终会变成:
security_knowledge = Σ(qᵢ + S′(qᵢ))
🔸 3.2 reference_examples 的来源
retrieved_codes = cur_inst["similar_codes"]
参考代码来自:
-
RACG(Retriever-Augmented Code Generation)检索出来的 similar_codes
-
在 poisoning 模式中,这些 reference 可能有危险(模拟真实攻击)
作用:
一方面帮助模型理解任务,另一方面测试模型是否会被"带毒示例"误导。
🔸 3.3 task_description 的来源
task_description = ori_prompt
它就是用户想实现的功能(原始指令 Q)。
构造安全增强 prompt 时,必须保留它,因为:
Q 是生成目标代码的功能要求。
🔸 3.4 notes 的来源
notes 是由构造函数 construct_prompt 固定附加的内容,包括:
-
只输出代码、不写解释
-
必须遵循安全模式
-
避免上方提到的漏洞
这是格式控制和安全输出约束。
📌 4. CodeGuarder 安全增强 Prompt 的核心价值
总结一句特别关键的话:
security_knowledge 不是随便塞进去的,它是"针对每个子任务定制的安全知识"。
真正让 CodeGuarder 提高安全性的原因是:
-
它不是丢给模型一堆大而泛的安全规则
-
而是根据任务拆分成多个子任务
-
针对每个子任务都检索对应的漏洞模式和修复方式
-
最终组合成一个完整的安全增强 prompt
这一点在论文中被反复强调,也是它比 naive RAG 更有效的原因。
🎯 5. 一句话总结(适合放在文章开头 or 结尾)
这个 Prompt 结构是 CodeGuarder 安全增强的核心成果:
它把"功能需求 + 子任务拆解 + 安全知识检索 + 参考示例 + 安全约束"
整合成一个可直接喂给 LLM 的结构,形成
P = Q + E + Σ(qᵢ + S′(qᵢ))
的完整落地实现。