花期易逝
Go back

使用Gemini产出idea

Published:  at  06:00 AM

一个原则:尽信书则不如无书,要根据模型特性把握prompt引导方向;要对模型幻觉始终保持警惕。

最简单的方式:不同大模型的幻觉程度和智力水平不一致,交叉验证。

最有效的方式:对问题领域有着深入的了解,能自主判断答案的合理性。

Gemini前段时间帮我写代码出了一个slient bug:加载高分辨率训练集入内存时候意外地做了一个resize操作,导致模型学习很差(学的是resize2resize的映射)所以后面还会新开一篇说辅助coding的事情。


本文是验证idea合理性的一段简单chat。

Q:想起本科毕设,随口问起一个开放问题“我记得以前有人微调BERT或者CLIP做程序代码缺陷分析”?

虽然我知道基本只有CodeBERT在这个领域能做,CLIP就是随口一聊,因为它做的是跨模态的工作,显然不适合代码缺陷分析,除了关于BERT的常规分析外,出于好奇截取了它给了关于CLIP的回答。(开放性问题起步

一种思路是将代码片段渲染成一张图片。是的,你没看错,就是像截图一样。这样,代码的缩进、结构、长度等视觉特征就可以被CLIP的图像编码器捕捉到。

更高级的方法是将代码转换成一种结构化的图形表示,比如抽象语法树(AST)或代码属性图(CPG),然后将这些树或图进行可视化,生成图片。这张图片就蕴含了代码的语法和逻辑结构。

将代码的“图片”输入图像编码器,得到图像向量。

将描述缺陷类型的文本(或者仅仅是“vulnerable code”和“safe code”这样的提示)输入文本编码器,得到文本向量。

CLIP的任务就变成了判断代码图片和哪个缺陷描述最“匹配”。如果代码图片的向量与“a buffer overflow vulnerability”的文本向量余弦相似度最高,模型就认为代码存在该缺陷。

我觉得这个idea非常的幻觉,不能work;于是接下来引申追问是否有这样的工作?(关键:批判追问开放问题下的收束回答

然后结合之前提升对BERT调研呢,发现GRAPHCODEBERT这一篇代码分析的大模型鼻祖,基本已经杀死了它对CLIP的想法(利用它调研查到的工作缩小空间

再次追问这个回答是否来自于模型幻觉,它给出回答:“之前的回答侧重于解释“如何可能”用CLIP,但你的追问触及了更深层次的“哪个更好,为什么”。(还挺逻辑自洽)

GraphCodeBERT: 它从根本上将代码视为一种结构化文本。它不仅处理代码的token序列(像BERT),还通过数据流图(Data Flow Graph)额外学习了变量之间如何传递和影响的结构信息。这种设计完美契合了代码的本质——既有序列性,又有严谨的逻辑结构。缺陷的产生往往就和数据流的异常(如污点分析)或语法结构的误用息息相关

CLIP: 它的设计初衷是连接自然图像和自然语言。将代码强制渲染成一张“图片”,实际上是一种信息的降维和损失。代码的逻辑关系、变量的精确名称、API的调用顺序等关键语义信息,在变成像素点的过程中很难被完美保留。图像编码器(如ViT)擅长捕捉空间纹理、形状和布局,但它是否能从一张代码截图中反推出strcpy函数的缓冲区溢出风险,这就非常困难且绕远路了

你可以搜索 "Contrastive Learning for Code Retrieval" 或 "Code-Text Pre-training"。虽然很多模型不直接叫CLIP,但其核心思想(双编码器+对比学习)与CLIP同源。例如,前面提到的UniXcoder就是这类工作的代表。

最贴近CLIP核心思想、也是最具潜力的一条路径。它不把代码看作“图像”,而是尝试建立代码的语义表示与缺陷的自然语言描述之间的联系,并最终实现zero-shot。

不直接用CLIP,而是类似的双编码器架构+对比学习找工作,这样的想法其实就合理了。(自己提炼核心并利用它的协助再次聚焦

代码属性图作为一个模态,source、sink、reason作为自然语言文本过一个模型,二者交叉算注意力。

继续事实性探索,问它如何调研,在搜索关键词中”Contrastive learning for code vulnerability”真的找到了一篇比较水的ACL的findings paper,CLeVeR: Multi-modal Contrastive Learning for Vulnerability Code Representation。(最终事实性探索


启示:在“想法”本身获取成本极低的时代:工作的核心价值正从“提出Idea”向“验证Idea”迁移。

Pipeline:设计扎实且全面的实验->对齐idea严格的工程落地->串联实验结果出一个好故事。

(最重要的是第二步,如果一个解决问题的intuition是合理的,做不出来最大可能是写出了bug,没有严格对齐方法)

附录(一个月前的简单想法)