ACL 2024 文章选读:基于统一表示的代码生成与检索
随着cursor等代码助手工具的兴起,代码生成与检索成为了研究的热点。本文介绍ACL 2024的三篇文章,这三篇文章都非常有意思,关注在代码生成与检索的统一表示上。 [ReCo] Rewriting the Code: A Simple Framework for Large Language Model Augmented Semantic Code Search 首先介绍的是ReCo,这篇文章提出了一个非常非常简单但是有效的方法,用LLM去「翻译」代码,统一代码的风格,然后再去做检索。它想解决的问题,其实就是语义搜索这个问题,比如 Query: 实现UserDAO的函数 以往我们去用类似双塔结构,直接尝试对齐 Query 和 Code 的 embedding,但是这其实很难,因为代码的结构和自然语言的结构非常不一样。比如这里的 Ground Truth 是: class UserDAO { constructor(private db: Database) {} async findByEmail(email: string): Promise<User | null> { const result = await this.db.query(`SELECT * FROM users WHERE email = $1`, [email]); return result.rows[0] || null; } } 通过计算 Query 和 Code 的 embedding 的余弦相似度,$ \cos(q, c) $,来衡量 Query 和 Code 的相似度。之后,学者们提出了生成增强检索(Generative Augmented Retrieval, GAR),通过 LLM 生成更加准确的 Query,然后再去做检索。比如我们可以让 LLM 先自己根据 Query 生成对应的代码,再去计算 生成的代码片段 和 代码库中的代码片段 的相似度。这样就避免了自然语言和代码之间天然的差异。 ...