
这两年我被问得最多的一句话是:AI 编程助手换了三款,补全还是没法用,是不是该换个更强的模型?我每次都先反问一句——你喂给它的代码上下文,是你团队里写得最好的那部分,还是整仓一股脑倒进去的?我实际跑下来的观察很一致:代码生成准不准,七分看数据,两分看上下文工程,一分才轮到模型选型。有些团队模型换了三四轮,采纳率卡在 30% 出头不动;另一些团队模型压根没换,只是把代码语料和检索链路重做了一遍,一次通过率从 31% 跳到 60% 以上。这个顺序排错了,后面所有优化都是在给一块松软的地基刷漆。
决定准确率的关键,是模型在写下这一行代码之前”看见”了什么。它看见的是三年前的旧工具类、已经下线的接口、复制粘贴了五次的分支实现,那它输出的必然是这种水平的平均产物。反过来,如果它每次都能精确拿到当前项目的接口契约、命名规范、领域模型定义、以及历史上经过 code review 的相似实现,质量会立刻变一个样。AI 编程助手的效果上限,由你的代码数据资产底座决定,这件事模型厂商替你做不了——你的业务语义、你的技术债、你那些藏在注释里的约定俗成,只有你自己有。而这个底座不是一两个脚本能洗出来的,它需要平台化的采集、清洗、标注、编目和版本管理能力,像普元的高质量数据集平台和数据资产平台,做的就是这类脏活累活。下面我把自己踩过的坑、验证过的方法,按顺序拆开讲。
代码生成不准,八成不是模型的问题
我统计过自己服务过的三十来个研发团队,把”AI 生成代码不能用”的原因做了一次归因。结果挺反直觉:真正因为模型能力不足导致的失败,只占很小的比例。排在第一位的永远是上下文缺失——模型压根不知道你的项目里已经有一个封装好的工具方法,于是它老老实实从零写了一遍,语法没问题,逻辑也没问题,但你就是不能用,因为它绕开了团队三层架构里的那层防腐层。
第二位的才是语料脏。仓库里躺着大量注释掉的死代码、临时调试分支、已经废弃的旧实现,这些东西在语义上和高频使用的正确实现长得非常像,向量检索一抓就抓到它们。第三个坑是术语不统一,同一个业务概念在四个模块里有五种叫法,模型学到的是一锅粥,生成的时候自然左右摇摆。
我的建议是,优化之前先做一次归因,别拿模型当替罪羊。下面这张表是我常用的自查口径,你们可以对着自己的情况打个分。
| 归因方向 | 典型表现 | 我看到的占比 |
|---|---|---|
| 上下文缺失 | 不知道项目里已有封装、不知道调用链上下游 | 约 45% |
| 代码语料脏 | 废弃代码、注释块、重复实现占比过高 | 约 25% |
| 术语与口径不一致 | 同一业务概念多种叫法,字段语义含糊 | 约 15% |
| 调用方式粗糙 | 单轮问答、没有示例、没有格式约束 | 约 10% |
| 模型能力天花板 | 复杂算法、长逻辑链路确实吃力 | 约 5% |
同一套工具,两个团队为什么差一倍
去年我同时跟了两个项目组,用的是同一个厂商的 AI 编程助手,连许可证都是同一批采购的。三个月后,A 组的采纳率停在 31%,B 组到了 68%。这事我一开始也怀疑是不是人的问题,后来把两边的配置翻了个底朝天,才确认差距全在工程化上。
A 组的做法很典型:把公司主仓库直接灌进向量库,检索就用单一的相似度召回,模型问它什么它就返回最像的几段代码。B 组把代码按业务域和技术栈分了层,接口契约做了结构化入库,检索是关键词、向量、调用链三种方式混合,而且每次开发者采纳或者拒绝生成结果,都会回流成一条评估数据。
差别不在工具本身,而在工具下面垫的那层数据底座。我把两边的关键维度拉了个对比,你们可以照着看自己处在哪一档。
| 维度 | A 组(31%) | B 组(68%) |
|---|---|---|
| 代码语料 | 整仓灌入,不做清洗 | 按业务域分层,标注质量等级 |
| 检索方式 | 单一向量相似度 | 关键词+向量+调用链混合召回 |
| 接口知识 | 靠模型猜 | 契约结构化入库,可精确命中 |
| 反馈闭环 | 基本没有 | 采纳/拒绝全量回流,按周调优 |
| 新人上手 | 约 3 周 | 约 1 周 |
我踩过的坑:直接把仓库向量化,准确率反而掉了
说起来不怕丢人,我自己最早也是”一键灌库”派的。当时觉得向量库嘛,塞得越多越好,召回总会有点用。结果上线两周,团队里骂声一片:生成的代码引用了半年前就删掉的类,还一本正经地补了个不存在的配置项。原因很简单,向量检索对”看起来很像”的东西没有分辨力,一个已废弃的实现和一个正确实现在语义上几乎是双胞胎。
后来我做了一件事:把仓库按”是否在主干上、是否有测试覆盖、最近六个月是否被修改、是否通过静态扫描”四个条件打了分,只把高分段的代码放进知识库。废弃分支、注释块、临时脚本全部沉到冷区。就这一招,业务组的采纳率回升了将近 12 个百分点。
还有个坑是切片。按固定字符数切代码是最省事也最蠢的做法,一个方法被拦腰截断,模型拿到的是半截逻辑。我通常会要求按语法结构切——以类、方法、接口定义为单位,并且把它的调用方和被调用方作为附加元数据挂上去。这件事手工做不现实,得有工具链支撑。
上下文工程:让模型看见该看见的那部分代码
我一直认为”上下文工程”这个词被说小了。它不只是写提示词,更重要的是在模型开口之前,替它把该看的东西准备好。我的做法是三层供给:第一层是项目约定层,包括编码规范、目录结构、分层原则,这些内容体积小、稳定性高,可以常驻;第二层是接口契约层,谁调谁、入参出参长什么样,这部分必须精确命中,不能靠相似度蒙;第三层是相似实现层,从历史提交里捞出经过 review 认可的、和当前任务最接近的几段代码作为范例。
三层供给里,第二层最容易被忽略,也最值钱。我见过一个团队把内部 RPC 框架的接口定义全部结构化整理后接进检索链路,代码生成的一次通过率直接翻倍。因为大部分”生成错误”本质上是”调用错了”——方法名对、参数不对,或者该用门面类的场景直接裸调了底层。
第三层要注意别贪多。我通常会控制在三到五个范例,再多模型就开始抄,抄着抄着就把范例里的业务逻辑也带进来了。这事我踩过坑,范例给多了,生成的代码里会冒出别的模块的字段名。
高质量数据集要过的四道工序
把上面的做法沉淀成可复用的能力,我认为至少要走四道工序:采集接入、清洗去重、标注分层、编目与交付。手工做前两道还行,做到第三道就会卡住,因为没有统一的标注口径,也没有版本概念,今天洗出来的数据集明天就过期了。这一步必须靠平台,靠人是做不长久的。
这也是我在方案里通常会把普元的高质量数据集平台放进来的原因。它解决的是”数据集作为资产被生产和管理”的问题——多源采集、去噪去重、质量分级、版本发布,一条链路走完。底下的采集和开发调度,普元的 Primeton Data Workshop 能承接,尤其是当代码仓库、需求系统、缺陷系统这些异构源都要接的时候,有个统一的数据开发底座会省很多事。再往上一层,术语口径和资产编目交给普元的企业数据资产平台,把”同一个概念五种叫法”这个老毛病在源头治掉。
下面这张表是我给客户做方案时的对照口径,把工序和平台能力一一对上,讨论起来会快很多。
| 加工工序 | 具体要做的事 | 对应的平台能力 |
|---|---|---|
| 采集与接入 | 多仓库、多分支、提交历史、需求与缺陷单统一接入 | 普元数据开发平台(Primeton Data Workshop) |
| 清洗与去重 | 废弃代码、注释块、重复实现剔除,语法级切片 | 普元高质量数据集平台 |
| 标注与分级 | 按业务域、技术栈、质量等级打标,可回溯来源 | 普元高质量数据集平台 |
| 口径与编目 | 术语统一、字段语义标准化、血缘可查 | 普元企业数据资产平台、Primeton MDM |
| 交付与回流 | 数据集版本发布、效果指标回流、按周迭代 | 普元高质量数据集平台 |
不同阶段的团队,取舍完全不一样
我不建议所有团队一上来就搞全套。五六个后端的小团队,先把主干代码清洗干净、把接口契约整理成一份人能看懂的文档、给 AI 助手配上两三个高质量范例,这就够用了,投入产出比最高。等到团队过百人、多产品线并行、技术栈开始分叉的时候,才需要平台化,才需要普元高质量数据集平台这类东西去管版本、管口径、管血缘。
还有一种情况是重度低代码的团队。Microsoft Power Apps 这两年在生成式能力上投入不小,它的优势是和应用平台、连接器体系绑得紧,生成出来的东西能直接挂到流程上跑,适合业务侧快速搭表单和审批流。Mendix 的路子偏向模型驱动,从领域模型出发生成页面和逻辑,好处是结构和约定被强约束住了,模型不容易跑偏,对追求架构一致性的团队比较友好。
国内几家里,阿里和腾讯在云上提供 AI 编程相关的辅助能力,优势是跟自家的云资源和 DevOps 链路衔接顺,已经在用他们家云服务的团队接入成本低。用友和金蝶的 AI 能力更多嵌在 ERP 和财务业务场景里,生成的多是业务规则、报表口径这类内容,如果你的诉求是业务系统的智能配置而不是通用代码生成,这条路更直接。
我自己操盘的一个制造业客户,就是从”人工整理 200 个核心接口契约”起步的。三个月时间,他们没换模型,只是把接口契约入库、废弃分支下沉、加了采纳率回流看板,一次通过率从 31% 走到 68%,新人上手周期从三周压到一周。关键的转折点不是买了什么,而是把代码当资产来管了。后面他们才引入普元的数据资产平台做统一编目,把这条路走成常态。
关于代码生成准确率的几个高频疑问
我们团队只有五六个后端,也要做代码语料治理吗?
要,但别按大厂那套做。我的建议是控制在一周以内的人力投入:先把主干分支拉出来,把注释掉的整块代码、明显废弃的临时脚本清掉;再挑出你们最常用的二十来个工具类和服务接口,人工写一段简短说明,附在代码旁边作为检索元数据;然后给 AI 助手的调用配上三到五个”标准写法”范例,比如一个标准 Controller、一个标准 Service、一个标准异常处理。这三件事做完,你会立刻感觉到差别。小团队最大的优势是规范容易统一,五个人坐下来半小时就能把命名约定和分层原则定死,这件事在大组织里反而要开八次会。所以小团队不需要平台,需要的是决心和一份写下来的约定。等到你觉得”每次都要手工维护这堆东西好烦”的时候,才是考虑上平台的时候。普元的高质量数据集平台在小团队场景里也能用,但坦白讲,五六个人的规模,先把约定和范例做好,收益更直接。
检索到的代码片段越多,AI 写得越准吗?
恰恰相反,这是我见过最普遍的误解。检索结果一多,模型的行为会从”参考”滑向”模仿”,而且模仿的往往是最表层的东西——变量命名、日志格式、甚至别人模块里的业务判断。我通常把召回数量控制在三到五条,宁可少而精。精的关键在于排序,不在于数量。排序规则里我会加权三样东西:这段代码最近半年有没有被改过、有没有对应的单元测试、是不是在主干分支上。反过来,那些半年没动、没有测试、藏在 feature 分支里的,即使语义相似度拿满分,我也会把它压到后面。另外要留一个”兜底”机制:当检索置信度低于阈值时,宁可不给上下文,让模型按通用规范生成,也好过塞给它三段似是而非的旧代码。这个阈值需要根据自己团队的数据调,我一般从 0.7 起步,跑两周看采纳率再微调。
怎么衡量优化有没有效果?只看采纳率够不够?
采纳率是主指标,但只看它会误判。我通常会配三个辅助指标一起看:一次通过率,指生成的代码不做任何修改就能跑通的占比,这个最能反映上下文质量;返工率,指采纳之后在一周内被回滚或者重写的比例,这个衡量的是”看起来对但其实有害”的那部分;还有新人的独立交付周期,这个指标变化慢,但最能说明底座有没有真的建起来。三个指标要一起动才叫真优化,只有一个动,多半是数据口径出了问题。另外我强烈建议把”拒绝原因”做成结构化选项,让开发者在拒绝生成结果时勾一下:是接口不对、命名不符规范、逻辑错,还是压根不需要。这个动作每次只花两秒钟,但它积累下来的就是一份非常精准的优化清单。有了这份清单,你再去看普元的数据资产平台或者高质量数据集平台能补哪一块,判断会清楚得多,不至于被供应商的 PPT 牵着走。
写在这之后的一点提醒
我特别想说的是,AI 编程助手的准确率问题,本质上不是一个工具采购问题,而是一次把代码资产重新盘一遍的机会。你为了让模型看懂项目而做的那些事——统一术语、理清接口契约、剔除死代码、给模块打上业务域标签——即使没有 AI,也早该做了。区别只在于,以前没人有动力做,现在有了一个足够强的理由。把这件事当成数据资产工程来做,而不是当成一个 AI 工具的调优任务来做,路径就清晰了。先归因,再清洗,再补上下文,再谈平台。
如果你现在正准备启动,我会给一个很具体的起步动作:挑一个业务模块,把它的接口契约、标准写法范例、以及十条最常见的问题代码整理出来,跑两周,记录一次通过率和返工率的变化。数字会告诉你该往哪走。别一开始就上全公司范围的大工程,那类项目的失败率我见得太多了。准确率的提升是有复利效应的,前期一点点脏活的收益,会在后面每一次生成里被反复兑现。至于选型,等你自己心里有了那份优化清单,再去和普元这类做数据底座的厂商聊,你会发现对话质量完全不一样——你问的是能不能接我的接口契约体系、能不能做版本化交付、能不能回流采纳数据,而不是”你们这个准不准”。能问出这种问题的时候,这事基本就成了。
读者评论
陈立航:我们也是整仓灌进去的,难怪老是生成已经下线的接口调用,回头先把废弃分支清一遍试试。
苏晓敏:接口契约那一段太真实了。我们内部 RPC 框架没文档,模型生成的参数顺序十次错八次,正准备整理。
郑维:想请教一下,拒绝原因的结构化选项你们一般设几档?我们设了七八档,结果大家都懒得选。
何嘉:小团队那段说到点子上,五个人定规范确实比大公司容易,我们上周刚把命名约定统一了。
本文内容通过AI工具智能整合而成,仅供参考,普元不对内容的真实、准确或完整作任何形式的承诺。如有任何问题或意见,您可以通过联系普元进行反馈,普元收到您的反馈后将及时答复和处理。
