FEATURED · 精选文章

AI编程智能体实践:我用Pi Agent独立完成代码重构与测试

发布时间 / 2026/9/20 6:55:28
来源 / 创域科博编辑部
栏目 / 资讯中心
AI编程智能体实践:我用Pi Agent独立完成代码重构与测试 过去这一个月我把一个内部工具的重构任务整个丢给了一个叫 Pi Agent 的 AI 编程智能体。它在我没有逐步指挥的情况下自己把几百个文件读了一遍拆出十来个子任务逐个改代码、跑测试、修问题最后还顺手补了一批缺失的类型标注。我坐在旁边盯着它的操作日志第一次有了种“带了个能独立干活儿的实习生”的感觉。先解释一下避免误会Pi Agent不是圆周率不是树莓派Raspberry Pi也不是控制领域里那个 PI 调节器。不过你如果看过 PI 调节器的原理图会发现 Agent 的干活逻辑跟“比例—积分”反馈控制还真挺像看到报错立刻响应比例项把之前失败的教训记下来持续修正方向积分项直到测试全部通过——也就是稳态误差归零。这么一来“Pi”这个名字多少有点双关的意思。这篇就把我从零上手 Pi Agent 的过程完整捋一遍它到底是什么、怎么装、怎么配、怎么用 Skills 把个人经验灌进去以及我实际跑任务时踩过的一堆坑。适合想给手头项目配一个能顶半边天的 AI 副驾、但对 Agent 类工具还比较陌生的开发者参考。1. Pi Agent 到底是什么从“问答式助手”到“自主干活儿的智能体”1.1 助手与智能体的本质区别先说结论传统 AI 编程助手是“你问我答”的知识库加代码补全器而 Pi Agent 是一个“你给目标、它自己跑”的自动执行引擎。这两者的差距不是多几个功能的问题而是整个交互模型都变了。我习惯用一个表格来区分它们维度AI 编程助手AI 编程智能体Pi Agent交互方式每一轮都要人工喂上下文、复制粘贴代码一次性给定目标自己读仓库、拆任务上下文管理靠人手动控制给多少它看多少自己规划需要读哪些文件、裁剪无关信息代码改动给出代码片段由人粘贴回编辑器直接修改文件、执行命令、看运行结果出错处理依赖人发现问题、复述报错信息自己读日志、换方案、再验证典型场景写单点函数、解释代码、查 API 用法跨文件重构、补测试、修 Bug、处理技术债拿 Copilot 那类补全工具来对比它们的定位是“更懂你的 IDE 自动补全”本质上是把你敲键盘的速度提高但你仍然是那个决定每一步走向的人。Pi Agent 不太一样你更像一个项目经理把任务说清楚、验收标准定清楚剩下的执行链路它自己走。它甚至会自己决定先读哪个文件、先改哪个模块、用什么方式实现中间遇到报错也会自己尝试修复。我刚开始用的时候其实很不适应总觉得不看着它每一个动作不放心。后来想明白了我需要的不是另一个编码工具而是一个能把明确任务闭环掉的对象。这可能就是“智能体”和“助手”这两个词背后最大的差别——前者对结果负责后者只对答复负责。1.2 一个 Agent 任务是怎么跑起来的感知-规划-执行-验证Pi Agent 每次任务的底层逻辑其实是一个循环感知 → 规划 → 行动 → 验证然后重复直到验收标准满足或者它主动停下来。感知它先扫描项目目录读取关键文件看 git diff收集当前仓库的实际情况。规划基于感知到的内容把大目标拆成若干子任务决定先动哪个文件、后动哪个文件。行动调用 shell 执行命令、修改文件、运行脚本或者调用内部注册好的工具。验证跑测试、跑 lint、甚至启动服务看接口是否响应正常。反馈循环如果验证失败它会读报错、定位原因、调整方案再进入下一轮。这个循环看着简单但非常关键。它保证了 Agent 每一步都有校验而不是黑箱里一次性生成一大坨代码然后“听天由命”。我拿它和 PI 调节器的原理类比过比例控制是“看到偏差立刻修正”积分控制是“把偏差积累起来防止只修当下不修长期”Pi Agent 的循环里也同时存在这两种行为——当前测试挂了自己马上修同类问题反复出现它会换掉根本解法。在实际使用中这个循环跑得顺不顺很大程度取决于“验证”环节做得够不够好。如果项目完全没有测试Pi Agent 的“验证”就退化成编译不报错、lint 不报警这种弱校验那它就容易改出一个“看起来对”但功能其实是错的实现。这也是我后面反复强调“先有测试再放飞 Agent”的原因。1.3 我实际把它用在哪些场景以及哪些场景千万不要用用了大半个月我总结出 Pi Agent 表现比较好的几类场景存量代码重构比如把一个函数从 500 行拆成模块化结构Agent 能把调用方全查一遍确保不破坏行为。补测试给它一个函数清单让它自己读实现、设计用例它补的测试覆盖面比我手写还全。跨文件的小功能开发比如给 Flask 应用加一个接口加配套测试从数据库读写到路由全部自己搞定。技术债清理移除废弃代码、统一日志库、把重复代码抽成公共函数这类“脏活”AI 心态很稳。但也有几类场景我劝你千万别硬上需求本身就不明确的任务。你都没想清楚要什么Agent 就会给你一个“它以为你要什么”的版本返工成本极高。没有任何测试、也没有任何文档的老系统。Agent 在这里是盲人摸象改一处崩一处而且它自己未必发现得了。涉及数据迁移、生产环境变更这类高风险操作。不是不能做而是必须人工在旁边看着做好回滚准备。我自己的习惯是思考交给脑子执行交给 Agent。架构怎么定、边界怎么划、验收标准是什么这些我肯定亲自来具体怎么写、怎么调、怎么测放手让它干活我只在关键节点 check。2. 从零装好并跑通 Pi Agent完整上手实操2.1 环境准备与安装 Agent先说环境要求老实讲不算高。我目前的主力开发机是一台普通的 Ubuntu 工作站16G 内存没有独立显卡因为模型调用走的是 API本地只跑 Agent 进程和测试环境。你只要满足这几条就能跑起来一台能联网的开发机Windows、macOS、Linux 都行我用的是 Linux。Python 3.10 或者 Node.js 18取决于你用哪个安装渠道。Git最好装了因为 Pi Agent 会大量依赖 git diff、git status 这类能力。一个可用的模型 API 服务或者本地能跑大模型的推理服务。安装本身不复杂。核心 Agent 是一个命令行工具桌面端是独立的前端界面两者可以单独装也可以一起用# 用 Python 生态安装核心 agent pip install pi-agent # 或者用 npm 安装 npm install -g pi/agent # 初始化配置目录 pi init # 启动桌面端 pi desktop第一次跑pi init会在用户目录下创建~/.pi/配置目录里面有主配置文件、日志目录、skills 目录等。这里我提个醒安装方式按官方文档写的最准不同版本之间命令可能有差异你只需要抓住“核心 Agent 是 CLI、前端是桌面端”这个思路装起来就不会乱。关于“oh-my-pi”它本质上是 Pi Agent 生态里的一套社区配置包类似 oh-my-zsh 对 zsh 干的事装完之后会帮你配好一堆常用别名、日志主题、常用 skills 和安全策略。我的建议是新手上路先用官方裸配置跑通一个任务再上 oh-my-pi不然你都不知道哪些是 Agent 原生能力、哪些是配置包加的东西出了问题排查会很痛苦。2.2 配置模型与首次对话装完之后最重要的一步是配置模型。Pi Agent 本身就是个壳子真正干活的还是底层大模型所以你得告诉它用哪个模型、API 地址在哪儿、密钥是什么。我的配置习惯是用~/.pi/config.toml下面的示例基本覆盖了最常用字段[model] provider openai-compatible base_url http://localhost:1234/v1 # 本地推理服务地址 api_key sk-local # 本地服务通常不校验 key model qwen2.5-coder-32b # 模型名按你部署的实际名称填写 temperature 0 max_context_tokens 128000 [sandbox] workspace /home/me/projects # Agent 允许访问的项目根目录 allow_commands [python, npm, git, pip install, pytest] block_commands [rm -rf, sudo, shutdown] [session] auto_retry 3 # 测试失败后最多自动重试几轮 checkpoint true # 每完成一个子任务自动打 git 检查点这里的provider openai-compatible很关键它代表 Agent 用 OpenAI 兼容协议去调用模型服务意味着市面上绝大多数模型服务都能接进来无论是你在本地用推理框架起的服务还是你买的商用 API只要地址和模型名填对就行。我配置时踩过一个典型的坑第一次temperature没改成 0默认值偏高结果 Agent 写出来的代码每次都不太一样测试时好时坏。后来把 temperature 设成 0让它保持确定性输出整个任务稳定性一下子提升不少。如果你的 Agent 表现忽好忽坏先看一眼温度参数大概率就是它的问题。配置完成后在项目目录里直接运行pi会进入交互界面。第一次对话建议让它干活之前先做一次侦察 先分析一下这个仓库的结构列出核心模块、依赖关系和潜在的性能瓶颈不用改任何代码。这一步非常重要。让 Agent 先建立对项目的“地图”后面真正动手时它就不容易找错文件。我在一个老旧的 Django 项目上试过让它先盘了一遍仓库它列出的模块依赖关系八九不离十比我手动看代码还快。2.3 跑第一个真实任务让 Pi 自己完成一个接口开发理论聊得再多不如真跑一个任务。我挑一个之前练手用的 Flask 项目任务描述是这样的看一下当前项目理解它是个 Flask 应用。为 /api/items 加一个 POST 接口支持 JSON body {name, price}用 SQLite 存储。要求补上测试保证原有测试全部通过。我就发了这么一段话然后开始观察它的执行日志。整个流程大概是这样的它先find . -type f -name *.py扫了一遍文件然后读了app.py、models.py、requirements.txt确认项目结构。在规划阶段它决定不用 SQLAlchemy直接走 Python 标准库sqlite3理由是“现有项目依赖很简单没必要引入 ORM”。这个判断我觉得合理。修改app.py加入/api/items的路由写了参数合法性校验。自己写了tests/test_items.py覆盖了正常创建、缺字段报错、非法价格报错这三个用例。跑pytest第一次失败——因为虚拟环境里没有装pytest。它没有停下来问我要不要装而是自己执行了pip install pytest然后重新跑测试全部通过。整个过程大概 3 分钟中间唯一一次我介入是发现它想顺手改一个跟任务无关的utils.py。可能是它觉得那个文件里有个函数命名不规范想“顺手优化”一下。我在会话里给了个限制让它只动app.py、models.py和测试文件这才把改动范围按住。这个案例说明了三件事第一Agent 确实能自主规划并闭环执行一个含测试的开发任务第二它的“顺手优化”欲望很强如果你不限定边界重构范围会悄悄扩大第三人工做改动范围审核哪怕只是事后看一遍 diff仍然是不可省略的环节。看完这个日志之后我养成了一个习惯让 Agent 每次大任务前先输出“改动计划”我确认了它才动手跑完我再让它贴一份git diff --stat给我做最后审查。这套流程配合下来它的产出基本可以直接进 code review。3. Pi Skills把经验沉淀成 Agent 的“技能”3.1 Skills 到底是什么跟插件有什么区别Pi Agent 一个好用的地方在于它有 Skills技能机制。你可以理解为Skills 是给 Agent 看的“操作手册 工具箱”。一个 Skill 通常是一个目录里面有一份SKILL.md说明文件、一个plugin.json元数据以及若干可以被 Agent 调用的脚本或模板。当任务命中 Skill 描述的场景时Agent 会自动加载并使用它。比如你写了一个“代码审查”Skill以后每次任务涉及提交代码时它就会按照 Skill 里写的清单去逐项检查而不是凭感觉随机发挥。很多刚接触的人会把 Skills 和“插件”搞混。我举个例子说清楚区别插件是给 Agent 增加新工具比如接入一个发请求的 API、一个数据库客户端这是“能力扩展”Skill 是给 Agent 立规矩和教流程比如“这个项目的代码风格是什么”“合并请求前必须跑哪些检查”这是“行为扩展”。能力扩展让 Agent 能做更多事行为扩展让 Agent 把已有的事做得更符合你的要求。对老项目来说后者往往比前者更重要。因为老项目里最容易踩的坑不是“做不到”而是“用错误的方式做到了”。3.2 手写一个“代码审查”Skill光说不练假把式。下面是我自己项目里一个用了很久的 Skill 模板作用是在 Agent 完成代码改动后强制执行一轮代码审查。目录结构长这样skills/ code-review/ plugin.json SKILL.md scripts/ check_style.pyplugin.json负责声明这个 Skill 的元信息和触发场景{ name: code-review, description: 在提交前自动执行代码审查检查潜在 bug、安全问题和代码规范, version: 1.0.0, trigger: before_commit, author: your-name }SKILL.md是核心它用自然语言加步骤清单告诉 Agent 该怎么干活--- name: Code Review description: 对当前分支的改动执行代码审查 apply_to: commit, after_edit --- # 执行步骤 1. 运行 git diff --stat 和 git diff main...HEAD获取本次改动的文件列表与具体内容。 2. 逐文件审查并按以下清单打标记 - 是否存在明显的空指针或异常吞噬 - 是否把密钥、Token 等敏感信息硬编码进代码 - 新增依赖是否已在 requirements.txt 中声明 - 是否遵循项目现有的命名规范与目录结构 - 是否有明显可合并的重复逻辑 3. 如发现问题先列出问题清单和修改建议询问我是否执行修复不要直接改。 4. 若无问题输出 Code review passed。注意第 3 步我刻意让 Skill 要求 Agent“先列清单、等确认”再动手。因为审查环节的目的不是让它自己默默改掉一切而是把问题暴露出来由人来做决策。这个设计来自一次真实教训——当时它自动把一段有争议的逻辑“优化”掉了结果破坏了业务预期我在 code review 阶段花了一个小时才追回来。写完 Skill 后还要在配置文件里把 Skills 目录登记进去[skills] paths [~/.pi/skills, ./.pi/skills]重启 Pi Agent 后这个 Skill 就生效了。以后只要 Agent 判断当前任务涉及提交代码它就会自动加载这套审查清单。3.3 用 oh-my-pi 快速装备 Agent如果你不想从零攒 Skills可以看看 oh-my-pi 这个社区方案。它跟我前面说的关系不大更像一套“开箱即用”的配置集装完会帮你配好常见命令别名、优化日志输出、加载一批社区验证过的热门 Skills还会设置一些默认的安全策略。安装方式很简单参考项目主页给的一段脚本大概长这样sh -c $(curl -fsSL https://example.org/oh-my-pi/install.sh)装完之后你会多出几个常用命令pi skills list # 列出当前已加载的技能 pi skill install code-review # 从社区仓库安装指定技能 pi skill create my-skill # 用模板生成一个新技能我用 oh-my-pi 最舒服的一点是它的日志主题Agent 每一步操作在终端里被标成不同颜色读起来比裸配置直观太多。但我必须提醒一句社区配置集本质上是从别人那儿拉下来的一堆指令和脚本装之前一定要大概扫一眼内容特别是其中带 shell 脚本的 Skill。你自己不认识的命令就别让它无脑执行——这和从 npm 装包要先看 README 是一个道理。另外Skills 不是越多越好。我见过有人一口气装了五十多个 Skill结果 Agent 面对一个简单任务时反而不知道调用哪个好规划阶段就卡住了。我的建议是保持一个小而精的集合核心原则是“这个项目的痛点是什么就配什么 Skill”。目前我那个主力仓库里常驻的 Skill 只有四个代码审查、单元测试编写规范、数据库迁移指南、依赖升级检查。够用且不干扰。4. 实战中踩过的坑与排查实录4.1 高频问题速查表用了一段时间之后我把踩过的坑整理了一张速查表遇到问题照着查基本能省掉半天折腾现象可能原因处理方式任务跑一半突然停了上下文长度触及模型上限拆分任务缩小单次改动范围别让它一口气处理几十个文件提示权限被拒沙箱命令白名单没包含所需命令在[sandbox].allow_commands中显式添加并确认命令是否必要生成的代码不符合项目风格缺少项目规范和风格上下文写一个“项目规范”Skill把命名、目录、提交规范写进去测试一直失败任务目标不清晰Agent 猜错了预期行为先把测试用例写好再让 Agent 实现别让它既定预期又写实现API 调用报错或超时Key 失效、额度不足、服务端异常核对 Key 与配额查看服务状态日志必要时加大超时时间Agent 改了无关文件任务边界没写清楚在任务描述里明确“只允许改动哪些文件”或提前在配置中锁目录这里面最值得展开的是“上下文超限”。有一次我给 Pi Agent 布置了一个全仓库迁移任务涉及两百多个文件跑到一半它直接停住了日志提示超过模型上下文窗口。我一开始以为是 bug后来才明白这是模型硬限制不是 Agent 能突破的。解决办法也很朴素把大任务拆成小任务比如先迁移models/再迁移services/每跑完一个让它做一个 summary下个任务开始时把 summary 作为输入传给新会话。这样上下文永远保持可控。“测试一直失败”那条我要多说两句。Agent 有一个特点如果你没给它明确验收标准它会自己脑补一个然后按那个标准去“成功”。后果就是你看到测试全绿但业务逻辑其实跟你的预期完全不一样。我最有效的应对方式是先把期望行为写成测试用例再让它实现。测试即需求文档对人对 AI 都好使。4.2 三条最重要的使用原则踩坑踩多了慢慢总结出几条原则。不算什么高深理论但每一条都是真金白银换来的。第一上下文喂得越清楚产出的代码越靠谱。我给 Agent 布置任务时不是只丢一句“帮我优化一下”而是写成这样“这个接口在并发超过 100 时会超时先看app/routes.py和services/order.py找出热点再给出优化方案只能改这两个文件。”信息量拉满它的产出质量跟那种模糊指令完全不在一个级别。第二没有测试的仓库别让 Agent 放开手脚。Agent 的纠错能力是建立在验证手段上的它有测试可跑就能自己发现改坏了什么没有测试它只能跑通再说最后你是不是还得靠人肉回归所以我的流程是让 Agent 进入老项目的第一件事不是加功能而是把现有核心逻辑的测试补齐然后再谈别的。第三大改动前一定切分支、设检查点。Pi Agent 支持在完成每个子任务后自动打 git 检查点这个功能一定要开着。这样就算它某一步彻底改崩了你也可以回滚到上一个检查点而不是整个任务推倒重来。我唯一一次重大事故就是因为嫌检查点麻烦关了这功能结果它一次重构动了 30 个文件里面有几个我没法直接 revert 的中间态最后花了两个小时手动恢复。从那以后checkpoint true就是我配置里雷打不动的一行。这三条原则我现在写进了团队的使用规范里新同学想用 Agent 干活先过这三条再上手。它们能解决大部分悲剧。差不多用了半个多月我最直观的感受是Pi Agent 并没有让我这个工程师“失业”但它确实把我工作流里“写模板代码、查文档、补测试、反复处理报错”这类活儿吃掉了七八成。我现在的工作节奏变成先自己把架构、边界、验收标准想清楚然后丢给 Pi 实现我来做 review 和关键决策——就是那种带实习生的感觉只不过这个实习生不会累也不会因为你改了三次需求而黑脸。最后分享一个我自用的技巧每次 Agent 干完一件漂亮的活儿我会让它把整个思考过程和执行路径总结成一个SKILL.md放进项目.pi/skills/目录。积累两个月之后这个项目里所有难啃、易错、重复出现的经验就都沉淀到 Agent 脑子里了。后面不管是新人接手还是 Agent 换个仓库重新上手都能直接复用这套“操作手册”。在我看来这个由项目自身生长出来的知识库比 Agent 单独产出的某段代码价值大得多。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻