我们正在构建一个AI应用安全工程师,帮助开发者自动排查并修复不安全的代码。我们的技术能够减少30%的SAST发现中的误报,并将修复时间加速约80%。为了在大型企业中实现这一目标,我们不得不对模型进行微调,以确保其部署是安全且私密的。
我们为什么对自己的LLM进行微调?
企业,尤其是那些处于受监管行业的企业,对于数据驻留、隐私和安全有着严格的要求。这些组织通常需要私有云部署,并需要避免依赖可能带来数据暴露风险的第三方LLM。我们的微调LLM通过提供完全的数据隔离并避免客户需要签署《商务伙伴协议》(BAAs)来实现HIPAA合规性。此外,这种方法允许我们以低成本的方式部署模型,同时在相关基准测试中甚至超越像OpenAI这样的大规模模型。
模型结构:我们解决方案的核心
我们的解决方案核心为Llama 3.1 8B,这是一个拥有80亿参数的主模型。我们对所有流行的较小模型(包括Mistral、Mixtral、Codestral mamba和Deepseek coder)进行了对照。我们选择Llama 3.1 8B是因为其规模、易于微调、在我们需要的关键领域的可测量性能以及新特性。
该模型有多套微调权重,针对特定任务如误报检测、自动修复和质量检查进行了优化。这种模块化方法使我们在推理时可以使用每项任务的最佳权重。结果表明,合并并扁平化模型会导致效果更差。
你可能会问,你们会部署五次模型吗?不是的,我们会部署核心模型并将请求路由到所需的实际权重。例如,在进行修复时,模型会加载实际的修复权重,并在需要时切换到其他任务。这样我们可以仅用一块A10 24GB GPU 即能实现高性能的切换,延迟约为10毫秒。
这一切为什么重要呢?因为这能节省客户在其私有云端托管大型模型所需的资源。需要更多GPU内存和更强GPU的大型模型是非常昂贵的。而我们的解决方案则极具成本效益。
微调过程:从假设到部署
微调起初看起来像是一个巨大的任务。“垃圾进,垃圾出”,因此对我们来说,挑选最适合跨多种编程语言、框架和漏洞的各种修正方案并尽量减少误报至关重要。作为一家初创公司,我们没有大量人员来标记问题为误报并挑选最佳修复方案来喂给模型进行训练。我们必须创新解决。
我们的数据集是什么?
我们的模型是在一个多样化的数据集上进行训练的,其中包括数百个存储库:我们的闭源项目、设计上易受攻击的开源项目(如Juice Shop),以及其他开源代码库。重要的是,我们在训练过程中从不使用任何客户数据。该数据集涵盖了多种编程语言,包括Python、JavaScript、TypeScript、Java、Go、Ruby和C#,反映了我们客户所在的不同生态系统。我们还需要考虑各种不同框架(如Ruby-on-rails、Django、Flask、Kotlin等)如何处理安全漏洞,因为不同的框架处理方式不同。例如,修复SQL注入漏洞的方法多达30种,这取决于使用的编程语言、框架和数据库。
训练是如何工作的?
通过使用无监督训练技术及我们的误报检测功能和测试框架,我们建立了微调系统,使我们能够扩大数据集的选择范围。
微调过程始于基于要构建或改进的具体领域所形成的一个假设。我们从上述数据集中生成了数千个漏洞。然后利用Corgea中的自动化误报功能排除坏的发现结果。这是至关重要的一步,以确保模型不会被未受攻击的代码的修复方案误导。
随后,我们自动