QCon 2026·PayPal:Agent in Practice——从支付迁移落地到评测驱动进化

主讲:郁丁鑫(PayPal,Senior Manager - Software Engineering)
主讲:耿树朋(PayPal,Staff Machine Learning Engineer)
时长:约 54 分钟

把 1-1.5 个月的支付迁移工作缩短到 10 分钟——PayPal MAIA 项目的完整实践。核心是 EERO 循环(执行→评估→反思→优化),以及通过 Noise Injection 构建 150+ 种噪声类型的测试数据工厂,让 Agent 在对抗性测试中持续进化。

背景:为什么要做 MAIA

PayPal 的支付产品已经迭代了好几轮,提供了非常好的支付体验。但很多商户还在用 10 几 20 年前的老技术栈,用户的支付体验非常不友好。PayPal 花了很大精力帮商户做迁移,但摩擦很大:

  • 代码改动大,客户很多不懂代码
  • 哪怕懂技术,理解老 API(如 NVP——一个很老的协议)的业务语义也很费劲
  • 找人来做,费用几千块,周期 1-1.5 个月

借助 AI 的热潮,我们创建了 MAIA(Multi-Agent API Integration Agent),帮助商户在升级过程中尽可能减少摩擦。

MAIA 的价值

  • 加速:把原本 1-1.5 个月的迁移工作缩短到 10 分钟
  • 鲁棒性:把老 API 的业务知识蒸馏进 Agent,商户不用关心 API 的具体用法
  • 简化:整个升级只需三行命令,token 消耗约 10 元人民币
  • 不破坏原有代码风格

MAIA Accelerate Simplify Robus

MAIA 的工作方式(Live Demo)

假设我是一个小型商户,网站用的是老版 PayPal API 技术栈。MAIA 提供了一个类似 Claude Code 的安装方式——通过命令行唤起 Agent,把安装包部署在商户自己的机器上,基于 Claude Code CLI,把相关 Skill 加载进去,逐步完成整个产品升级。

关键设计:Agent 托管在商户自己的环境里,在商户自己的网络环境中对自己的网站做升级——我们全程看不到商户的代码

迁移只是第一步。迁完之后,商户还可以继续用 MAIA 做业务场景的集成和扩展——先扔掉历史包袱,再接入更多新产品。


郁丁鑫:MAIA 的架构与演进

开发心路历程

这个项目很早就有想法,随着 AI 能力增强逐步迭代。每个阶段不是推倒重来,而是留存前一阶段的东西,在下一阶段继续迭代。

阶段一:Prompt 工程(2025 年 Q2)

当时最大的概念是”后台编程”,选取合适的 Prompt。MAIA 要分析商户代码、找到集成位置、从老版本升级到新版本,单靠 Prompt 根本做不到。这个阶段学到最重要的东西是:如何保证 guardrail——不能让 Agent 过度发散,要把它限制在最小化改造的范围内。Vibe Coding 用户应该有感受,没有足够好的 guardrail,Agent 会做出让人无法理解的事情。

阶段二:Agent 框架

这时候 Agent 概念开始普及,我们用了 LangChain 等开源框架,加入 planning → 执行 → 自我修正的循环。但受限于上下文处理能力。

阶段三:One-shot + 上下文工程

把大量精力花在如何处理上下文——提前做总结,对上下文中不好的知识提前蒸馏,减少 Agent 运行时的”脑裂”。

阶段四:Harness + Feedback Loop

最近比较火的方向。这个阶段最大的体会是:AI 有一定的欺骗性——给它一个复杂场景,它会说”我做完了”或”这个太复杂我不做”,但其实只是在大模型外面套了一层壳,没有真正完成。

解决方案:把规划者(Planner)、验证者(Verifier)、修复者(Fixer)拆开。当验证者和修复者独立存在时,Agent 就很难自我满足——必须有测试用例告诉它”你要完成这个才算真正完成”。这是我们在 Harness 一年实践中得到的最重要的总结。

MAIA 架构

核心是长期记忆 + 短期记忆的结合:

  • 长期记忆:把历史上老 API 的经验蒸馏成 Skill。这是工程师团队花精力最多的地方——很多内部文档已经丢失,需要大量时间重新蒸馏历史记忆
  • 短期记忆:Agent 运行时分析商户代码的过程,把知识反馈给执行者、验证者、测试者

Skill 的核心价值:不只是把成功案例放进去,更重要的是把 corner case——Claude Code 等模型一直会犯错的地方——提取出来,变成 Skill 中的参考。同时,正确执行的状态也要指标化,确保模型按照框架走,而不是在”蒙对”。

Feedback Loop:通过一系列测试和指标,让 Agent 汲取足够多的经验,反馈给长期记忆,形成闭环。


Agent A B 长短期记忆架构图

耿树朋:评测体系的设计

接下来我介绍 MAIA 的评估是怎么开展的。

MAIA 有一个特殊的挑战:Agent 托管在商户自己的环境,我们看不到商户的代码,但要做一个能准确完成 legacy 代码迁移的 Agent,还要保证执行过程稳定可复现。

这里用到了 EERO 循环:Execute(执行)→ Evaluate(评估)→ Reflect(反思)→ Optimize(优化)。

执行环节:如何摸清商户代码情况

我们对 PayPal 几百万商户的 API 调用数据做了排查,看到了清晰的长尾分布。头部是一些开源电商平台(Magento、ZenCart、Medusa 等),占了相当大比例。

基于此,我们筛选了 6-7 种开源电商平台,覆盖 Java/PHP/JavaScript/C# 四种语言和多个版本,作为 MAIA 初步开发和评估的基础。

评估环节:三个核心问题

问题一:如何提供确定性的测试?

综合了传统测试范式和新的 AI 方法:

  • Function test、Unit test
  • 基于 Playwright 的端到端测试:覆盖完整的买家→卖家链路(landing 页面→选商品→加购物车→结账→退款),完整覆盖 PayPal SDK 的调用过程

问题二:6-7 个网站够吗?

不够。我们需要覆盖更宽广的卖家可能性,确保测试空间有足够稠密度。解决方案:数据合成——通过 Noise Injection 自动生成大量测试变体。

问题三:可复现性

一次成功和多次成功的概率要保持一致。基于测试方案 + 数据合成,搭建了自己的回归测试 pipeline。

Evaluation Synthetic Test Muta

Noise Injection:Multi-Agent 驱动的测试数据工厂

这是一个类似 GAN(对抗生成网络)的设计:生成器(MAIA)负责做代码升级,判别器负责评判升级是否成功。

Noise Catalog:4 个层级,150+ 种噪声类型:

  1. 语法层噪声:把变量名换成拼音或随机字母,添加与代码逻辑不符的注释,干扰代码理解
  2. 结构层噪声:把多个类合并成一个文件,甚至合并进一个 main 函数
  3. 业务逻辑层噪声:加入红包、折扣等活动逻辑,影响支付调度链路
  4. 架构层噪声:替换支付路由和设计模式,把 PHP 代码换成 JS 写,引入新依赖

逐级增加难度,不断挑战 Agent 的代码理解能力边界。

循环流程

  • MAIA 拿到带噪声的 legacy 代码 → 尝试升级
  • 升级成功 → 加入成功 case 仓库(用于回归测试)
  • 升级失败 → 加入失败 case 仓库(用于定点 review)

为了引入更多随机性,我们还加了一个”降级”设计:让模型扮演不同风格的工程师画像(20 年经验只写 PHP 的资深工程师 vs 1 年经验只写 React 的初级工程师),从新版本再降级回旧版本,生成更多样的测试变体。

MAIA Data Synthesis Pipeline N

可观测性工具

一个 MAIA 升级过程可能有几百轮大模型交互,原始 trace 数据动辄几十 MB,人根本看不完,AI 来 review 也会撑爆上下文。

我们自己做了可观测性工具:以图识图的方式,把所有 Agent/Skill 交互以可视化视图从上往下展示,附带时间消耗、token 消耗、工具调用信息。这相当于给整个数据建索引,后续 AI 访问这些数据时效率也高很多——符合渐进式披露原则。

Evolution Engine:EERO 循环的反思与优化环节

数据收集:来源包括 Comate 执行体系、测试报告(Playwright 产生的截图/HTML)、sandbox 环境日志。用 ETL 脚本编排成预定义模板(索引文件),让后续 AI 访问时不会撑爆上下文。

多维审查:用专门的 AI Agent 对运行轨迹做多维度 review,大量使用”模型作为裁判”技术。

交叉验证

  • Confidence level 要达到阈值(如 0.75)
  • 多个 AI Agent 参与,必须全部同意才能输出(投票机制)
  • 扔掉互斥信息,聚合成有价值的通用知识

关键学到的东西:RCA 追求准确率,不追求全面。一次 RCA 只输出一个,但要它是准确的。如果这一个准确,人看了认可,下一轮迭代再补第二个。不要试图一次把毛巾里的水全拧干——每次只挤一滴水,通过迭代让这件事变轻松。

成功 case 和失败 case 同样重要:只关注失败容易过拟合。用向量空间距离筛选与当前 case 相似的历史成功 case,和失败 case 一起 review——成功的经验帮助过滤掉那些”两边都有”的噪声错误,降低幻觉率。

Reflection Learning from Exper

技术架构演进

Claude Sonnet 4 时代:模型的指令跟随能力比较差,需要很多手动操作。执行引擎:Claude Code;长时运行 Harness:Claude Agent SDK;上层控制图:LangGraph。

Claude 4.5/4.6 时代:迁移到纯 Skill 方案,去掉 LangGraph 依赖。好处:

  • 依赖变少
  • Skill 里可以嵌入大量 reference 文档和确定性脚本,提供确定性信号
  • 新业务来了,一两天就能校验原有 Skill 重新组合后能否满足要求(原来要一两周)

Journey Recap 5 Levels of SDLC

Multi-Agent 协作的关键工程经验

经验一:Agent 间接口必须强约束

多个 Skill 协作时,必须写清楚交接接口——输出文件叫什么名字、放在什么位置、开头有哪些字段。

不这么做的后果:Agent A 输出时没按预定格式写某个字段,Agent B 来读时,Claude 会”脑补”——“虽然他没写,但我觉得应该是这样”——然后基于 A 的局部信息 + 脑补内容继续运行,非常不稳定。

通过 hook 和外部 shell 脚本在特定阶段做确定性校验,才能保证信号可靠。

经验二:每个阶段结束后主动压缩上下文

MAIA 这种长时运行、多轮交互的任务很容易触发上下文压缩。每个 Agent/Skill 执行结束后,主动做一次清晰的阶段性压缩,是非常有效的方式。

经验三:多模型辩论优于单模型

实验结论:同时用 Claude Opus 4.6 + GPT-5.2 Codex + Gemini 3 Pro 扮演相同角色进行辩论,效果优于同一家模型的多个实例辩论。不同家的模型在各自擅长的领域不同,综合多个模型的输出,能得到更全面、更有深度的报告。

SDLC 自动化的五个层级

这个框架可以推广到 SDLC 的任何子模块:

层级描述
L1工程师手动与 AI 对话,指导完成任务
L2把经验固化成 Skill,执行自动化
L3有了自动化执行,就要有自动化测试
L4验证自动化,AI 能自己判断 Skill 是否成功,开始自我修复
L5AI 自己提取变更内容,推新一轮测试,验证是否比过去更好——落入 RLRO 范式

L5 就是 RLRO 范式:Setup(L2)= RL 的数据准备;Rollout(L3/L4)= 执行与评估;Rollback = 失败时回退;Optimize = 基于奖励触发下一轮实验。

核心原则:永远面向未来做 Skill。做一个 Skill 时,不要太关注这次执行成功还是失败,而是想:如果未来要做同样的事,我从这个 case 里应该学到什么?


Q&A

观众:交付给 Agent 的业务知识具体是什么形式?

郁丁鑫:主要是 workshop(工作流文档)+ reference(参考文档)+ 解决方案。

以 NVP 为例,我们写了大量 reference,让 AI 读懂 NVP 里各个字段的含义。针对 PHP、Java 等不同语言,我们会用伪代码把 API 的语义描述清楚,作为参考。当 Agent 识别到用户在某个特定业务领域时,通过伪代码生成对应语言的实现。

本质上有两个概念:老代码 + 伪代码(业务语义),加上转换后的新代码。Agent 在运行中同时参考这两个,根据我们的要求完成转化。


观众:动态构建的参数怎么处理?迁移后的线上验证怎么做?

郁丁鑫

动态参数:第一次让 Agent 先走完整个流程,定义好所有测试标准和期望值。如果没达到期望,结合历史迭代循环告诉它要往哪个方向走,最终把动态参数塞进去。这个过程需要打补丁,不是一次就能成功的——目前 MAIA 大约 90% 的情况能一次成功,5-10% 需要自己迭代 2-3 轮。

线上验证:测试包和整个 conversion 过程是独立的,商户可以在自己的机器上保留测试包,把结果反馈回来。实际上,迁移和升级过程中我们都会让用户先走沙盒环境,走完整路径后再复制到线上。


观众:未来的软件交付方式会变成什么样?

郁丁鑫

我们现在的交付不只是一个产品,而是 Skills 集合 + 测试集

未来的设想:针对某个支付场景(比如 PayPal),我们给一套标准的商户集成方案,定义完整的测试策略。只要这套完整测试都能达标,集成就是完美的。

未来交付给用户的不只是支付产品,而是一个完整的验证生态——这才是新的软件包交互方式。测试集是核心,比 Skill 本身更关键。

这个平台本身是一个 CLI 工具,通过 CLI 才能把完整的端到端流程走通。