Pi编码智能体实战:subagent编排、skill导入与本地RAG搭建
1. 先把这个pi说清楚最近这段时间pi在我的开发者朋友圈里出现频率高得吓人。有人在群里晒 pi agent 自动改完一个 PR 的截图有人讨论 pi coding agent 拆 subagent 的技巧还有人问 oh my pi 桌面版在哪下载。我做开发十几年第一反应是又一个套壳工具但实际用了一周之后我承认这工具确实有独到的地方。这篇文章不讲产品发布稿里那套话就从普通用户的角度把 Pi 是什么、能解决什么问题、怎么上手、subagent 和 skill 怎么玩、有哪些坑全部摊开讲一遍。你可能刚听说这个词也可能已经在用同类工具想横向对比这两种读者我都尽量照顾到。文章里的路径、配置和操作步骤基于我本地实测和官方文档整理出来不同版本之间可能有细微差别但整体思路是通用的换到别的 agent 工具上也能参考。1.1 它不是一个聊天窗口而是一个能自己动手的实习生Pi 最简单的理解是一个能自主执行任务的编码智能体。它和聊天 AI 最大的区别在于它不只是你问一句它答一句而是能自己读代码库、搜索文件、修改代码、执行命令、看测试结果再根据结果继续迭代。你交代一个目标它会自己走完理解需求、查资料、动手改、自我验证、汇报结果这一整条链路。我用一个比喻跟朋友解释这就像你给团队招了个实习生。你把任务交代清楚他自己去翻资料、动手做把成果拿给你 review。你要做的是把需求拆到足够清楚并且在他跑偏的时候及时喊停。这个定位决定了它的使用方式——不是问问题而是派活。你负责判断方向他负责执行和试错配合得好效率是成倍的。反过来如果需求本身一团浆糊那再强的 agent 也只会给你交出一团更精致的浆糊。1.2 和 Cursor、Claude Code 这类工具相比它的差异在哪市面上的 AI 编程工具很多按干活方式大体能分三类。对话式助手只给答案不碰你的工程IDE 内嵌 AI 在你写代码的时候补全、改文件终端里的 agent 类工具能独立执行任务。Pi 属于第三类但它的特点在于多智能体设计你可以拆出专门的 subagent让它们像不同岗位的工程师一样并行工作由主 agent 做统一协调。我按自己平时使用的体感做个直观对比工具类型典型代表干活方式最适合的场景对话式助手各类聊天 AI只输出文字答案查资料、写小片段IDE 内 AICursor、Copilot 系在编辑器里补全、改代码人主导编码AI 当副驾终端编码智能体Pi、Claude Code 这类自主读代码、执行命令、多角色协作把完整任务交给 AI 自动完成实际体验下来Pi 最抓我的一点不是单次代码生成质量而是它能把一个大任务拆成若干子任务交给不同身份的 subagent 并行处理。这种模式在处理跨模块重构、批量补测试、查历史 bug 这类牵一发动全身的任务时优势特别明显。单点写代码的能力各家差距其实不大真正比拼的是编排能力也就是让多个角色各干各的、最后还能严丝合缝拼起来的能力。1.3 什么人适合马上上手我觉得下面三类人可以重点试试。第一类是日常写代码经常要跨多个文件改动的开发者这类活儿最费神刚好是 agent 的强项。第二类是做技术调研和落地验证的人让 Pi 自己拉代码、跑示例、写总结效率比手动搜索高一个量级。第三类是刚入门、还在犹豫怎么用 AI 提效的新手桌面版带图形界面比纯命令行友好得多。当然不适合的人也有完全不懂代码、只想一键生成整个 App的人大概率会被 agent 的连环追问和 review 要求劝退。原因很简单agent 是执行者不是许愿机。它把一大段代码交给你你得有基本能力判断好不好、能不能跑。这部分能力决定你能不能用好它没有捷径。2. 五分钟上手装桌面版、配环境、跑通第一个任务2.1 桌面版下载与安装先说安装。去 Pi 官网的下载页按自己系统选安装包就行Windows 是 exemacOS 是 dmgApple Silicon 记得选 arm64 版本Linux 一般是 tar.gz 或 AppImage。我个人建议直接到官方 release 页拿最新版用系统包管理器装容易滞后一两个版本而这类工具迭代非常快版本差一个月体验可能差很多。很多人提到的Oh My Pi其实是社区做的一套配置管理脚本类似 oh-my-zsh 之于 zsh 的关系。它能把主题、快捷键、常用参数统一管理起来适合喜欢折腾的人。如果你只是想先用起来默认配置完全够不需要第一步就上这套。安装完成后首次启动会有一个初始化向导让你选工作目录、默认模型以及一个很关键的选项命令自动执行权限。我的建议是第一次先把自动执行关掉让 agent 处于只读观察模式等它在你眼皮底下跑过几轮、确认不会乱来之后再逐步放开权限。2.2 模型配置和凭证认证Pi 支持接入多种模型来源包括云端的 API也包括本地运行的模型。配置里最核心就三样东西接口地址、模型名、凭证。下面是我本地环境里的一份配置示例{ provider: openai-compatible, base_url: http://127.0.0.1:11434/v1, api_key: sk-local-demo, model: qwen2.5-coder:32b, temperature: 0.2 }base_url 指向本地模型的兼容接口api_key 填一个占位符就行整个链路在本地闭环不需要数据出本机。如果你用的是云服务商的模型就要填真实的接口地址和 key。这里有个很容易踩的坑key 填错时 agent 不会直接报错而是会反复重试表现出一堆莫名其妙的思考行为。所以配置完一定要先点测试连接确认通了再进项目这一步能省掉后面半小时的排查时间。模型选择上如果机器配置一般优先选带 coder 后缀的小参数模型响应快适配 agent 场景比通用对话模型稳得多。机器好的可以上 32B 以上级别复杂推理能力会有肉眼可见的提升。温度参数我习惯调低到 0.2 左右agent 任务追求确定性温度太高容易放飞自我。2.3 跑通第一个任务配置完找一个小项目试水。我建议第一个任务别太野就拿你熟悉的仓库让它做信息整理。例如pi 先读一下当前项目的 README 和 src 目录梳理模块结构输出一份总结你可以看到它先列目录再挑文件读最后生成总结。我第一次用的时候最直观的感受是它真的会拆解动作——不是一次性吐一大段文字而是先告诉你我打算先看配置文件再读入口模块然后一步一步执行。这个过程中你随时可以打断它纠正方向。第一个任务跑通后你对它的工作节奏就有感觉了它更像一个需要你盯着的执行者而不是放出去就不用管的自动机。2.4 第一次使用必须知道的三个注意事项这一节的内容都是我付过学费换来的建议看一眼。第一工作目录越小越好。别把整个 home 目录丢给它否则它会在无关文件里浪费时间token 消耗也快得惊人。第二任何自动执行命令的能力都必须在虚拟环境或容器里放开不要把生产环境直接暴露给它它的一次误操作可能比你手动十次还快。第三所有改动都要有版本控制兜底哪怕是临时实验也先 git init 再说。做到这三点后面再怎么折腾都不会出大乱子。3. 进阶玩法Subagent 编排与 Skill 导入3.1 主智能体和子智能体到底怎么配合Pi 的多智能体机制是它最值得玩的部分。简单说主 agent 负责理解你的总目标、拆解计划、汇总结果subagent 是被临时拉起来的专职角色各自有独立的上下文窗口和工具权限。这样一个 subagent 埋头查代码的时候另一个 subagent 已经在写测试了互不干扰。类比的话主 agent 是项目经理subagent 是不同工种的施工队而你才是那个拍板的人。项目经理不会把所有施工队叫到一个会议室里开大会而是分别传达任务、分别验收。这样做的最大好处是上下文隔离——每个 subagent 只需要关心自己负责的那一小块不会因为对话太长而把前面的指令忘掉。我见过很多人抱怨agent 用着用着就变傻仔细一看全是把几百个文件的阅读全都压在同一个上下文里不傻才怪。3.2 一个 subagent 配置文件长什么样subagent 在 Pi 里一般通过配置文件定义。下面是我项目里一个后端开发角色的配置格式做了简化字段名不同版本可能有差异但结构思路是通用的--- name: backend-dev description: 负责后端模块开发、接口实现与单元测试 tools: [read, search, edit, run, test] --- 你是项目里的资深后端工程师主要使用 Python 和 FastAPI。 工作规范 - 动手前必须先列出要改动的文件清单 - 每个接口实现后必须补测试 - 禁止修改与任务无关的模块 - 依赖不明确时先查 requirements.txt 再决定不要自行假定配置里最重要的不是 role 描述写得多华丽而是 tools 权限列表。列表越窄越不容易出事故。比如只给它 read、search、edit 三个权限它就没办法执行命令自然干不了删库这种坏事。这是我从翻车经历里总结出来的。role 描述部分则要用具体名词和规则去约束行为越具象越稳定模糊的形容词反而容易让模型自由发挥。每个 subagent 干完活你还得让它在汇报里写清楚改了什么、为什么这么改方便你 review。3.3 用 Web 控制台导入 Skill 的完整流程Skill 的概念很好理解就是给 agent 预装的操作手册。它把一套成熟的工作流打包成角色设定 规则 模板别人写好了你可以直接导入。比如代码评审skill会把评审步骤、输出格式、问题分级标准都定义好agent 一调就能用不用你每次重新交代一遍。pi web 导入 skill这个操作我实际走了一遍流程是这样的启动桌面版之后在浏览器里打开本地控制台页面找到技能市场搜索你需要的 skill点导入后它会自动同步到本地技能目录一般放在用户目录下的.pi/skills/或者项目里的.pi/skills/最后重启当前会话在对话里用斜杠命令调用。不同版本的界面可能有差异但整体流程大差不差。一个 skill 在本地通常是一个独立目录结构类似~/.pi/skills/ └── code-review/ ├── SKILL.md ├── templates/ │ └── issue-list.md └── scripts/ └── collect_changed_files.pySKILL.md 是核心里面定义了触发词、执行步骤和输出格式。我抄一段简化示例--- name: code-review description: 扫描指定范围代码输出问题清单与优先级 --- 执行步骤 1. 先用 git diff 获取变更文件列表 2. 逐个文件做增量评审 3. 按 严重/一般/建议 三级输出导入第三方 skill 之前务必看一眼 SKILL.md 里申请了哪些工具权限。尤其是带 run 权限的等于把执行命令的能力交给了别人的脚本风险很高。我自己只导入那些明确不含危险操作的 skill其他一律先打开源码确认再决定。skill 是可以自己写的把团队里反复用到的工作流沉淀成一个 skill比口头交代靠谱得多。3.4 什么时候拆 subagent什么时候不拆很多新手一上来就把所有任务都拆给 subagent结果发现反而更慢。我的判断标准很简单看任务粒度。改一个函数、修一个文案主 agent 直接做就行拆 subagent 的开销比干活本身还大。跨模块重构、批量补测试、查历史问题这类大任务才值得拆。任务类型是否需要拆原因修改单个函数不拆单线程最快拆了纯耗 token跨模块重构拆每个模块一个角色上下文隔离批量写测试拆测试与实现并行效率翻倍排查历史 bug拆让 subagent 专门翻 git log专注不跑神记住一句话拆 subagent 不是目的控制上下文才是目的。哪个方案能让每个智能体专注在最小范围里就用哪个方案。有时候你看着它不并行但实际上它省下的 token 和避免的冲突比并行省的时间更有价值。4. 实战复盘用 Pi 从零搭一个本地问答 API4.1 项目需求和任务拆解光聊概念没意思我拿一个真实小项目说下完整过程。需求很简单做一个极简的本地 RAG检索增强生成问答接口。把某个目录下的一堆 Markdown 文档当成知识库提供一个 POST 接口用户提问题系统先检索出最相关的片段再交给大模型生成答案最后返回答案和来源路径。这个项目不涉及任何外部依赖非常适合演示 agent 的完整工作流。这个需求被我拆成三个子任务。第一个是项目骨架初始化包括 FastAPI 应用和依赖清单。第二个是文档索引模块负责把 Markdown 按段落切块、向量化、存到本地向量库。第三个是问答接口负责把检索结果和问题拼成 prompt调用本地模型生成回答。每个子任务对应一个 subagent最后再由主 agent 统一整合。拆解的过程本身其实就是架构设计的过程对 pi coding agent 说清楚这三块它就能各自开工。4.2 让 Pi 动手前的关键 Prompt很多人的 agent 用不好问题出在 prompt 太含糊。需求只写一句帮我做个问答系统agent 就只能靠猜交出来的东西大概率不是你要的。我这次给 Pi 的任务描述是这么写的项目本地问答 API。 请按以下顺序执行 1. 创建 FastAPI 项目骨架依赖尽量少 2. 实现 docs 目录下 Markdown 的索引与检索使用本地向量库持久化 3. 实现 POST /ask接收 question返回 answer 和 sources 4. 最后给出运行方式和测试命令。注意这里我做了两件事一是给了明确的执行顺序让它先搭骨架再填血肉二是要求最后给出运行方式和测试命令等于逼它把交付物补完整而不是只丢一堆代码。这个技巧对提高 agent 交付质量非常有效——你要求的交付物越具体它就越不会糊弄。如果你希望某个环节重点做比如检索部分性能优先也得在 prompt 里明确写出来否则它只会按默认方式实现。4.3 核心代码从索引到问答接口整个项目的核心代码不多我把关键文件贴出来你照着就能跑。先是依赖清单fastapi uvicorn chromadb sentence-transformers httpx索引模块 indexer.py 负责把 Markdown 切块并写入本地向量库from pathlib import Path from hashlib import md5 import chromadb from sentence_transformers import SentenceTransformer encoder SentenceTransformer(all-MiniLM-L6-v2) client chromadb.PersistentClient(path./data/chroma) collection client.get_or_create_collection(namedocs) def build_index(docs_dir: Path): ids, chunks, metadatas [], [], [] for md in docs_dir.rglob(*.md): text md.read_text(encodingutf-8) for i, para in enumerate(text.strip().split(\n\n)): if not para.strip(): continue chunks.append(para) ids.append(md5(f{md}:{i}.encode()).hexdigest()) metadatas.append({path: str(md), chunk: i}) collection.upsert(idsids, documentschunks, metadatasmetadatas)问答接口 main.py 这样写from fastapi import FastAPI from pydantic import BaseModel from indexer import collection, encoder from llm import call_llm app FastAPI() class AskRequest(BaseModel): question: str app.post(/ask) def ask(req: AskRequest): results collection.query( query_embeddings[encoder.encode(req.question).tolist()], n_results3, ) sources [m[path] for m in results[metadatas][0]] context \n---\n.join(results[documents][0]) answer call_llm(req.question, context) return {answer: answer, sources: sources}最后是调用本地模型生成回答的 llm.pyimport httpx def call_llm(question: str, context: str) - str: resp httpx.post( http://127.0.0.1:11434/v1/chat/completions, json{ model: qwen2.5:7b, messages: [ {role: system, content: 你只能根据提供的上下文回答不要编造事实。}, {role: user, content: f上下文\n{context}\n\n问题{question}}, ], temperature: 0.2, }, timeout60, ) return resp.json()[choices][0][message][content]这个项目跑起来之后你往 docs 里丢几篇 Markdown再 curl 一下接口就能看到返回里带着答案和来源文件路径。整个链路从索引到检索到生成都在本地闭环。你也可以把向量库换成别的存储或者把 embedding 模型换大一点的效果更好的但整体结构不需要动。4.4 调试与 Review 的实操心得这个项目我让 Pi 干了大半天过程中有几次典型的翻车正好用来讲经验。第一次翻车在 ChromaDB 的参数上subagent 把query_embeddings和query_texts混用了。原因是它同时参考了旧版文档和新版文档两边 API 不一样。这种细节问题人眼 review 一眼就能看出来但 agent 自己很难发现所以review 代码这一步绝对不能省。第二次是测试用例的问题。它写了一个 test_main.py但测试里真的去调模型接口导致跑测试必须先起模型服务。我让它在测试里把 call_llm 用 monkeypatch 换掉只验证接口逻辑和返回结构。这个改动很小但对自动化测试的可用性是决定性的。以后每次改动都能快速回归不用背着模型服务跑测试。我的操作习惯是第一步让 Pi 自己跑测试把报错原样贴回对话它会自己修第二步每个 subagent 在独立分支上工作最后统一合并避免互相覆盖第三步合并前我亲自读一遍 diff不信任任何它说没问题的结论。这套流程走下来项目本身不难但它把用 agent 干活的正确姿势演示了一遍目标明确、角色拆分、代码审查、测试兜底这四步少一步都会还债。5. 常见问题与排查实录5.1 问题速查表我把这段时间里遇到的高频问题整理成了一张速查表遇到类似情况可以直接对号入座。现象可能原因处理办法导入 skill 后对话里不出现当前会话没刷新重启会话确认技能目录被识别模型答非所问上下文被无用文件占满限定读取范围用 search 代替读全文多个 subagent 改出冲突代码都动了公共文件公共模块改由主 agent 统一执行命令执行到一半卡住在等用户确认你没注意检查授权配置或换更快的模型token 消耗快得离谱每次都重读大文件提示 agent 只读关键片段限制读取数量这些问题的根源大部分是同一个上下文管理没做好。不是模型不行而是你把太多垃圾信息塞给了模型。想明白这一点排查思路就清晰了。5.2 我踩过最疼的几个坑第一个坑是让两个 subagent 并行改同一个文件。一个在重构接口一个在加注释结果后面的覆盖了前面的。从那以后我规定公共文件只能由主 agent 改subagent 只负责自己模块内的文件。团队协作里文件所有权的概念在 agent 协作里同样成立。第二个坑是自动审批开得太早。当时为了省事允许它直接执行命令结果它为了装依赖往系统 Python 里塞了一堆包把环境搞得一团糟。教训非常明确所有自动执行操作必须在虚拟环境或容器里进行并且 run 命令要加白名单。这个白名单不是用来限制 agent 的而是用来保护你的环境的。第三个坑是上下文里积累了太多历史包袱。同一个 session 里连续跑了好几个不相关的任务到后面它开始把上一个任务的输出当成参考答案越来越离谱。现在我的习惯是一个大任务结束就开新会话绝不拖着旧状态跑新任务。这个习惯看似浪费实际上省下了大量排查错误的时间属于典型的以小换大。5.3 几个让体验翻倍的小技巧关于 agent 的行为约束我发现负向指令比正向指令管用得多。你告诉它不要使用 requirements.txt 之外的库比请选择合适的库有效一百倍。因为负向指令是一个硬边界模型更容易遵守而正向指令给了它发挥空间发挥就意味着可能走偏。走偏一次浪费的时间比省下的时间还多。第二个技巧是让 agent 先写计划书。面对复杂任务第一轮先让它只输出实施计划你确认了再让它动手。这一步能在早期拦截掉大量方向性错误比事后返工省钱多了。我在第一次做这个 API 项目的时候跳过这步结果它先写了个数据库同步逻辑跟需求毫无关系白白浪费了二十分钟。第三个技巧是给 subagent 起一个具象的名字。叫backend-dev比叫assistant稳定很多。看起来是玄学但实测下来身份描述的颗粒度直接影响模型的行为模式——它会更倾向于表现出对应角色的专业性。名字和角色描述就是它的人设人设越清楚行为越收敛。6. 别搞混了此 pi 非彼 pi写到这里必须插一段因为pi这个词在技术圈里同时指好几样东西。你搜pi的时候可能一半结果是 AI 编码智能体另一半是树莓派或者控制理论。不把这些对应关系理清楚看文章很容易对不上号。6.1 树莓派玩家说的 PiRaspberry Pi 与 RP2040热词里有一个raspberry pi 2040 oled 0.96说的是用树莓派 Pico 开发板主控芯片是 RP2040驱动一块 0.96 英寸 OLED 屏屏的驱动芯片一般是 SSD1306走 I2C 接口。这类小项目的典型玩法是几分钟点亮屏幕显示文字from machine import Pin, I2C import ssd1306 i2c I2C(0, sclPin(1), sdaPin(0), freq400000) oled ssd1306.SSD1306_I2C(128, 64, i2c) oled.text(Hello, Pico!, 0, 0) oled.show()如果你要用 0.96 寸 OLED 显示中文就需要加载字库或者预先取模这是新手最容易卡住的地方。i2c 地址不对、SCL/SDA 接反也是高频问题。这个方向跟 AI 编码智能体完全是两个圈子但都叫 pi说明缩写这东西在实际交流中确实容易撞车。6.2 控制工程师说的 PI比例积分控制器热词里mmc环流抑制器的pi参数和pll pi控制带宽fb都是自动控制领域的内容。PI 控制的传递函数是 Kp 加上 Ki 除以 sKp 决定响应速度对应带宽Ki 负责消除稳态误差。在 MMC模块化多电平换流器里做环流抑制工程上常用 PI 或 PR 控制器把内部环流压到基波附近参数整定的基本思路是先按期望带宽定 Kp再让 Ki 提供足够的低频增益同时加抗积分饱和措施。锁相环PLL的 PI 参数同理带宽设得越高锁相越快但抗扰动能力会下降。实际调试时我一般从期望带宽的三分之一到二分之一起步观察动态响应再微调。这类问题里说的 pi和 AI 编码智能体没有一点关系完全是控制工程的经典内容。6.3 硬件工程师说的 SI/PI信号完整性与电源完整性在高速 PCB 设计领域SISignal Integrity和 PIPower Integrity合在一起简写就是 SI/PI。做高速电路时叠层设计、信号回流路径、去耦电容布局、眼图质量这些话题都归在这一类。如果你刷到的是SI/PI 仿真报告这类内容那大概率是硬件方向的内容别往编码智能体上靠。很多搞硬件的老哥看到 pi 相关热搜点进去发现讲的是 AI 写代码也是一脸懵。6.4 一句话判断对方说的是哪个 pi最后给一个快速判断的口诀出现场景大概率指编程、agent、代码库、subagentAI 编码智能体 Pi树莓派、GPIO、OLED、PicoRaspberry Pi / RP2040换流器、锁相环、带宽、参数整定PI 控制器PCB、仿真、叠层、电源完整性SI/PI另外你搜到的k pi八成是输入法把 KPI 打成了 k pi那是绩效考核的缩写跟这些技术方向完全无关。技术上说不上搭边职场里倒是人人都躲不开但那是另一个话题了。我把这段时间的实际使用感受放在最后。最大的体会是这类工具的真正价值不在于替你写代码而在于把查资料、翻代码、跑试验、改小 bug 这类重复劳动接过去让你能把注意力放在架构、边界和取舍上。但它跑得越快你越需要具备快速 review 的能力。它要是写错了你一眼看不出那它帮你节省的时间最后都会以别的方式赔回去。我现在的习惯是新项目、重构任务、补测试这类低风险高重复的活大胆交给它生产环境的敏感改动一律自己过一遍再上。工具在变但想清楚再让工具干活这个习惯什么时候都不过时。