CodeGuarder 安全增强 Prompt 结构

🚀 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ᵢ))
的完整落地实现。


相关推荐
云泽8085 小时前
C++ List 容器详解:迭代器失效、排序与高效操作
开发语言·c++·list
CodeAmaz5 小时前
通用 List 分批切割并循环查询数据库工具类
java·数据结构·工具类·分页
消失的旧时光-19435 小时前
Kotlinx.serialization 对多态对象(sealed class )支持更好用
java·服务器·前端
云帆小二5 小时前
从开发语言出发如何选择学习考试系统
开发语言·学习
光泽雨5 小时前
python学习基础
开发语言·数据库·python
leonardee5 小时前
Spring Security安全框架原理与实战
java·后端
q***5185 小时前
Spring Cloud gateway 路由规则
java
百***06016 小时前
python爬虫——爬取全年天气数据并做可视化分析
开发语言·爬虫·python
jghhh016 小时前
基于幅度的和差测角程序
开发语言·matlab
空空kkk6 小时前
SpringMVC框架——入门
java·spring