找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1003

积分

0

好友

129

主题
发表于 昨天 01:51 | 查看: 0| 回复: 0

Context Is All You Need:快手后端AI Coding的实践与思考

过去数月,我们在快手内部围绕真实的业务需求场景,深入探索了 Java 后端 AI Coding 的落地方案。经过一系列实践与迭代,主站团队已成功将真实需求的 AI 代码采纳率逐步提升至 60%~90%。我们不仅沉淀出了一套面向后端的“码图”框架,更初步摸索出一种人与 AI 协同的 AI Native 研发范式。本文将结合一个具体的真实案例,深入剖析 Java 后端 AI Coding 的核心难点,并分享我们的解决方案与思考。

一、从一个真实案例说起

在实际项目开发中,我们曾碰到这样一个需求:在一个现有的后台管理页面里,需要新增一个筛选条件,同时新增若干个字段用于列表展示。乍一看,这只是一个典型且复杂度不高的增删改查需求。

然而,当我们真正开始拆解任务时,才发现它远非表面那么简单。这个需求横跨了完整的服务端调用链路,涉及以下关键环节:

  • Controller 层负责接收、封装与校验请求参数;
  • Service 层需要协同多个服务进行数据查询与处理;
  • DAO 层执行核心的列表数据查询与总数统计;
  • VO / Helper 层负责数据的组装与结构映射;
  • DB 层则可能需要进行字段评估甚至结构调整。

最终,仅仅是“新增筛选”和“新增展示”这两个看似微小的改动点,实际涉及的工作量却相当可观:共需调整 7 个类,进行 8 处关键代码修改,并且必须确保多层隐式依赖关系保持一致。

简单的改动流程示意图

简单的改动流程示意图

详细的调用链路图

详细的调用链路图

1、把业务需求直接“扔给 AI”会发生什么?

在没有任何额外上下文和工具辅助的情况下,我们尝试直接将需求描述交给 AI,让它“帮忙改代码”。结果并不理想,暴露出的问题非常典型。

问题一:漏改——只看到函数,看不到流程

在该案例中,列表查询和计算总数是紧密关联、成对出现的逻辑。但 AI 在修改时,只调整了列表查询的条件,却完全遗漏了总数统计的逻辑。这直接导致前端分页信息与实际数据量严重不符。这表明,AI 虽然能处理局部代码逻辑,但缺乏对整体业务流程的把握能力。

问题二:错改——不理解数据结构与职责边界

新增的展示字段实际上来自多个不同的 Service,需要经过 Helper 层统一组装后才能返回。然而,AI 无法知晓哪些字段已存在于 Service 的返回中,也不清楚每个字段应该归属于哪一层的 VO 数据结构。最终生成的代码要么留下大量“TODO”或默认值,要么将字段错误地写入顶层对象,从而破坏了原有的数据架构设计。

上述问题分布在 Controller、Service、DAO、VO 各层,但究其根本,原因是一致的:AI 只能感知到被提供的局部上下文,无法感知到完整的调用链条以及隐式的依赖关系。 它能正确地修改一个函数,却无法判断这个函数是否与其他逻辑成对出现、修改是否需要沿着调用链同步传播,更不理解数据在不同层级中的真实语义和归属。

二、后端AI Coding难在哪里?

行业内普遍共识是,前端 AI Coding 的发展领先于后端。那么,为什么后端 AI Coding(尤其是 Java 领域)的推进速度相对缓慢?在不断探索中我们认识到:AI 理解前端工程,如同“搭积木”般直观;而面对后端工程,则仿佛置身于一座结构复杂的“迷宫”。如何让 AI 顺利穿越这座迷宫,正是后端 AI Coding 需要攻克的核心难题。

与前端“所见即所得”的开发模式截然不同,后端 AI Coding 面临的核心挑战在于:PRD(产品需求文档)并不等价于后端可直接执行的“工程事实”。 实际上,后端工程真正的复杂度几乎全部隐藏在 PRD 之外,这些关键信息散落在成百上千个文件、模块与配置之中,PRD 既不可能也难以完整呈现。

2.1 PRD并不是后端可以直接执行的“工程语言”

从一份 PRD 出发,经验丰富的研发人员能够自然地完成一系列“脑补”工作:明确哪些改动属于后端范畴、确定请求的入口位置、判断是否涉及数据库操作、评估是否需要联动其他模块、查找系统中是否已存在相似逻辑以供参考等。

然而,这些对人类而言属于开发常识的信息,对 AI 来说却如同巨大的信息断层。 PRD 通常只会表述“前端需要改动,后端接口也要扩展字段”,却不会进一步说明:后端的开发边界具体在哪里?改动是发生在 Controller 层、某个定时任务,还是一个 RPC 接口?字段是来源于数据库、下游服务,还是历史计算结果?这次改动是否会对缓存、搜索引擎索引或异步数据处理链路产生影响?

这些在日常开发中属于后端交付的最小必要信息,对 AI 而言,并非是“没看清楚”,而是压根就没有被提供。

PRD与AI理解之间的信息断层

PRD与AI理解之间的信息断层

2.2 后端真正的复杂度,几乎全部藏在 PRD 之外

更为关键的是,后端的复杂度并非直观地体现在接口签名上,而是深藏在业务流程和隐式约束之中。 以一次常见的“数据提交”操作为例,在真实的分布式系统架构里,其背后往往涉及一连串复杂逻辑:

  1. Service 内部的同步 RPC 调用;
  2. 本地数据库事务控制与回滚逻辑;
  3. 数据库写入操作及由此产生的 binlog;
  4. 异步消息链路的触发(如发送 Kafka 消息、更新 Elasticsearch 索引、刷新分布式缓存);
  5. 跨模块的数据最终一致性与状态收敛。

这些逻辑构成了后端工程的“主体结构”和血脉,但 PRD 既不会也无法对这些复杂流程进行详细描述。这就导致 AI 虽然能够看到“需要修改某个接口”,却完全无法预见一次简单的改动会在整个系统中引发多少连锁反应。

真实服务端调用与异步链路示意图

真实服务端调用与异步链路示意图

三、从 Context 到 Control :后端 AI Coding 的两阶段演进

在探索 Java 后端 AI Coding 的实践中,我们并非一帆风顺,而是经历了两次明显的“卡住—反思—重构”过程。回顾这两次演进,背后对应着两个逐渐清晰的认知:

  • 第一阶段,我们致力于解决 AI 能否看到系统全貌(Context)的问题;
  • 第二阶段,则聚焦于即便 AI 能看到系统全貌,能否实现稳定、可靠执行(Control)的挑战。

3.1 第一阶段:解决上下文(Context)问题

回顾前文的案例,核心问题是:AI 能修改局部代码,却无法理解这些代码在整个系统中的位置。 这并非模型不够“聪明”,而是因为它缺乏像人类研发者那样的系统级视角。这种视角,在后端工程中,源于对三件事的理解:

  1. 代码是如何分层组织的;
  2. 各类代码元素(类、方法、字段)之间是如何关联的;
  3. 一次具体需求,会沿着怎样的调用路径与数据流进行传播。

3.1.1 明确代码层级结构

在研发人员的认知里,一个后端工程天然存在多种划分方式。从职责视角看,Controller、Service、DAO、Helper 各自承担明确的职责;从系统边界视角看,又可划分为本服务、下游依赖服务以及公共组件。

然而,这些划分往往仅存在于团队的“共识”之中,并未被机器显式地感知和理解。因此,我们的第一步并非急于让 AI 写代码,而是将这些隐性的层级结构显性化,明确每一层的职责、规定哪些层之间允许直接交互、识别哪些改动天然具有“扩散效应”。

以下是从两种不同视角梳理的代码层级结构:

按照系统内部功能职责划分

按照系统内部功能职责划分

按照系统边界和服务/组件间职责划分

按照系统边界和服务/组件间职责划分

3.1.2 从“类文件”到“代码元素”

仅仅知道“这是 Service,那是 DAO”还远远不够。在真实的工程改动中,变化并非发生在“类”这个粗粒度层面,而是发生在更细粒度的代码元素之间。比如,一个方法调用了谁、一个字段被哪些逻辑依赖、一个构造器是否隐式影响了初始化流程。

因此,我们进一步将分析的粒度下沉到类内部的字段、方法、构造器以及它们之间的关系上,目的是让 AI 能够理解“修改这一行代码,究竟会牵动系统中的哪些地方”。

类及其内部元素关系示意

类及其内部元素关系示意

3.1.3 构建“代码元素关系图谱”(Code Graph)

当我们将关注点从“文件”转向“代码元素及其关系”后,一种更自然的抽象方式出现了:整个代码库本质上就是一张庞大的有向依赖图。其中,节点代表字段、方法、构造器等具体代码元素;边则代表调用、引用、继承、实现等关系。

简化的代码元素关系图示例

简化的代码元素关系图示例

我们选择从项目编译后的字节码入手,来构建这张代码元素关系图谱,并将其持久化存储到图数据库中。这样做的好处是,系统的“隐式结构”第一次变成了可查询、可遍历、可计算的实体。

从字节码构建代码图谱的流程

从字节码构建代码图谱的流程

3.1.4 从图谱到智能:AI 借助代码图谱获得系统视角

当代码关系以图的形式存在后,AI 不再需要“猜测”系统结构。通过图数据库查询语言(如 Cypher),AI 可以明确地知道:一个类的上下游依赖有哪些、一个方法被哪些调用路径所使用、一次代码改动可能的影响范围有多大。这一步,标志着 Context 不再只是静态的文本描述,而是结构化、可推理的工程事实

通过Cypher查询代码图谱

通过Cypher查询代码图谱

最终,我们解决 Context 问题的整体设计分为三层:内容基座层信息补充层以及大模型执行层

  • 内容基座层:将整个代码库抽象为代码元素关系图谱,把工程事实转化为可计算的结构。
  • 信息补充层:引入面向 AI 的 Context 约束与规范(如可用字段、关系约束、使用规范),补齐 AI 做出准确判断所需的关键信息,同时对其“发挥空间”进行合理控制。
  • 大模型执行层:大模型基于代码图谱生成精确的 Cypher 查询,通过查询结果获取上下游依赖、影响范围与修改路径,在明确的约束和规范下做出工程级决策。

意图生成Cypher查询的架构图

意图生成Cypher查询的架构图

3.2 第二阶段:解决可控性(Control)问题

成功解决 Context 问题后,AI Coding 的效果确实有了显著提升。但很快,新的挑战接踵而至。

3.2.1 单Agent,无法稳定承载复杂任务

当我们尝试用一个大模型(单Agent)串联起需求理解、方案推导、代码生成、多文件修改这整个复杂流程时,问题开始集中爆发:上下文长度迅速膨胀,Prompt 变得冗长而脆弱,不同阶段的信息相互干扰,模型的“幻觉”开始在看似合理的地方出现。这让我们意识到:Context 解决的是“看不看得到”的问题,但并没有解决“看到之后能不能被稳定、可靠地使用”的难题。

3.2.2 从 Prompt 驱动,到代码驱动的 Multi-Agent

真正的转折点在于我们放弃了“一个万能 Prompt 解决所有问题”的思路,转而引入了 Multi-Agent / SubAgent 的协作架构。该架构的核心目标有两个:一是严格控制单个 Agent 的上下文长度和职责范围,避免信息过载;二是让不同阶段、不同类型的任务彼此隔离,减少相互干扰。

在这种架构下:

  • 主控 Agent 只负责任务的宏观拆解与最终结果的汇总。
  • 各个子 Agent 则专注于单一的、明确的目标(如图谱检索、语义检索、方案生成)。
  • 具体的代码修改动作,交由 kwaipolit(快手内部自研的 Copilot 工具)在严格的工程约束下完成,而非由大模型自由生成。

如此一来,整个工作流从“由冗长的 Prompt 驱动”转向了 “由清晰的任务代码和 API 调用驱动” ,整个过程的确定性和可控性得到了质的提升。

Multi-Agent 主流程示意图

Multi-Agent 主流程示意图

Multi-Agent 并行执行流程示意

Multi-Agent 并行执行流程示意

四、从“写代码”到“设计执行”:后端 AI Coding 的新范式

前面我们讨论了如何通过 Context 和 Control 让 AI 在后端工程中“看得见、走得稳”。接下来要探讨的是,当 AI 真正具备了工程级的可靠执行能力后,工程师的角色和工作内容会发生怎样的根本性变化?

4.1 当AI成为工程执行者,工程师在做什么

在传统的研发模式下,工程师往往一人分饰三角:需求理解者、方案设计者和具体实现者。而在后端 AI Coding 成熟之后,这三者开始出现清晰的角色分离。在新的研发范式中,AI 不再仅仅是“补全代码的辅助工具”,而是转变为可靠的“工程执行者”;而工程师的核心职责,则开始前移并上移,聚焦于更高价值的设计与决策。

AI Coding 全流程与角色演进

AI Coding 全流程与角色演进

在新的研发流程中,工程师不再直接编写最终的业务代码,而是将主要精力集中在以下三方面:

  1. 从 PRD 中拆解模块边界:明确哪些改动属于同一个工程问题,哪些是独立的不同子问题,为后续的自动化工作划定清晰的范围。
  2. 运用流程图描述主干逻辑:通过 Mermaid 等工具,把核心的调用路径、数据流和状态转换显性化,让复杂的系统逻辑一目了然。
  3. 补齐关键参考类与入口信息:提供系统中现有的、与本次改动相关的“锚点”类或方法,帮助 AI 系统快速定位工程上下文。

通过完成上述工作,工程师最终产出的是一份 “概要设计” ,而非一行行实现代码。这份概要设计就如同建筑行业的施工蓝图,为后续的自动化工程实施提供了清晰、无歧义的指导。

在概要设计交付之后,后续工作便交由 AI 系统自动执行。核心主控 Agent 读取这份设计文档,调度多个子 Agent 分别完成图检索、代码检索、语义检索,进行深度的场景理解与动作决策,最终生成一份可执行、可校验的“编码计划”。最后,在 IDE 中,编码计划被转化为真实的代码修改。

简而言之,在新范式下,人类工程师负责“想清楚要做什么以及为什么这么做”(设计),而 AI 则负责“在严格的工程约束下把事情高效、准确地做完”(执行),二者优势互补,各司其职。

在新的研发范式下,前文那个最初落地失败的案例,其工程师产出的概要设计示例如下:

案例的概要设计与Mermaid流程图

案例的概要设计与Mermaid流程图

4.2 整体架构:“码图”框架

这套新研发范式并非停留在理论或流程约定,而是由一整套称为 “码图” 的工程架构所托底。

“码图”服务端工程级AI Coding框架

“码图”服务端工程级AI Coding框架

从系统视角看,整个码图体系被清晰地拆分为 准备阶段实施阶段

  • 在准备阶段,系统会对目标代码仓库进行一次全面的工程级建模。

    • 一方面,通过编译时分析生成 Java 代码的精细化调用依赖图谱,并存储到 Neo4j 等图数据库中。
    • 另一方面,借助大模型以及内部的结构化知识库(如DeepWiki),解析仓库的整体结构、业务领域术语与工程开发规范,形成领域知识并进行向量化存储。
    • 最终,代码从“一堆文本文件的集合”被转化为 “一张可检索、可推理、可计算的工程地图”
  • 在实施阶段,研发人员先基于 PRD 产出模块拆分图和概要设计。码图的核心主控 Agent 读取这些设计输入后,通过一个由 Python 驱动的、高度可控的执行引擎,按需调度图检索、代码检索与语义检索等工具子 Agent。这些 Agent 协同工作,进行深度的场景理解与连贯的动作决策,最终生成一份 伪代码级别的、步骤清晰的编码计划

当编码计划生成后,系统便将最终的控制权交给 Kwaipilot,由其在具体的工程约束下,将计划转化为安全、合规的真实代码。

五、总结

计算机科学领域有一句广为流传的话:“任何复杂问题,都可以通过引入一个中间层来解决。” 在后端 AI Coding 的探索上,我们同样验证了这一点。在码图体系中,我们引入了两个关键的“中间层”:

  • PRD → 概要设计:由人完成,用于保证需求理解的准确性与高层次架构决策的质量。
  • 概要设计 → 编码计划:由独立的 SubAgent 系统完成,用于将人类的设计意图翻译为可执行、可自动化校验的工程步骤。

正是这两个中间层,把“模糊需求”与“具体代码”之间那段最容易失控、最依赖个人经验的“黑盒过程”,拆解成了 可理解、可验证、可约束的标准化工程路径。AI 也因此从“根据描述猜测并编写代码”,转变为“按照明确的工程计划严格执行代码生成”。

经过多轮方案迭代和真实生产环境的验证,我们逐渐形成了两个非常清晰且至关重要的共识:

第一,精准、结构化的 Context 是后端 AI Coding 能否成功落地的决定性因素。 如果缺乏上下文,AI 只能困在局部文件中进行补全和改写,如同盲人摸象,难以把握系统的全貌。只有当代码被图谱化、语义化、工程化之后,AI 才能真正获得系统级视角,从而承担起真实、复杂需求的实现工作。

第二,提升可控性(Control),是所有“AI Coding 产品”必须优先解决的核心能力。 可控性并非随着模型能力增强而自然获得,它是由模型能力、精妙的 Prompt/工具设计、稳固的系统框架以及严格的工程校验共同构成的一种 体系化能力。只有当 Context 被工程化地构建,AI 的行为被系统化地约束,AI 才第一次真正具备了成为“可靠工程执行者”的资格。

希望快手在后端 AI Coding 领域的这些实践与思考,能为同行们带来一些启发。技术的发展永远在迭代中前进,关于人与AI如何更好地协同创作,欢迎在云栈社区继续交流探讨。




上一篇:寻找Shopify平替?这3款开源电商平台值得一试
下一篇:REDMI Turbo5 MAX评测:天玑9500s性能实测,游戏续航全面解析
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-1 01:28 , Processed in 0.310123 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表