腾讯一面,我霸气反问:“你说你们在做Agent项目,说说 SubAgent、Plan 模式、Skill 调用这些你们都是怎么做的?”面试官一直在擦汗。。

📅 发布时间:2026/7/18 4:44:00
腾讯一面,我霸气反问:“你说你们在做Agent项目,说说 SubAgent、Plan 模式、Skill 调用这些你们都是怎么做的?”面试官一直在擦汗。。 不知道大家有没有发现大模型公司都在卷终端 Agent包括 Qoder CLI、Kimi Code、ZCode 等等。更别提 Claude Code 和 Codex CLI 了。我自己也从 0 到 1 撸了一个名叫 PaiCLI各个版本都有下面是 Python 版的截图。为的就是能帮大家把 Agent 时代的核心技术栈过一遍ReAct、Function Calling、RAG、MCP、Multi-Agent、Memory、Context 压缩等等。同时我也结合 PaiCLI 的源码给大家整理了 16 道高频的 Agent 面试题照着背就一定能吊打面试官。介绍一下 PaiCLI 这个项目和流程有实现子 Agent 吗支持后台任务吗子 Agent 也支持 Plan 模式吗子 Agent 是怎么调用 Skill 的skill 分层体系是怎么做的为什么这么设计用户输入怎么和相关 skill 匹配有 skill 沉淀机制么还是只能用户自己构造长短期记忆怎么设计的为什么要静态长期记忆和动态长期记忆什么时候触发长期记忆存储有没有出现用户长期记忆快速积累存的过多大模型怎么决定长期记忆是否需要召回压缩机制是怎么做的上下文窗口总 token 多大触发上限为什么选这个值讲一下动态 prompt 和静态 prompt模型底座是哪个例如写一千行代码需要消耗多少 token?成本是多少你用的百万 token 计费是多少你平时用你的 PaiCLI 么全文比较肝保证大家能学到很多很多系好安全带我们粗粗发content01、介绍一下 PaiCLI 这个项目和流程老王开门见山“你简历上写了一个 PaiCLI 项目对标 Claude Code先介绍一下。”我说“PaiCLI 是一个 Python 写的 Agent 命令行工具核心架构是 ReAct 循环。”用户在终端输入一个任务PaiCLI 把任务发给大模型大模型决定要不要调用工具、调哪个、参数是什么。工具执行完后把结果返回给大模型大模型再决定下一步动作。直到大模型认为任务完成返回最终答案。“PaiCLI 有三种工作模式。”默认是 ReAct 模式适合日常的单步任务改个文件、跑个命令这种。执行 /plan 会进入 Plan-and-Execute 模式先把复杂任务拆成多个步骤再逐步执行。/team 会进入 Multi-Agent 模式多个 Agent 分工协作。“工具层面内置了 9 个核心工具文件读写、命令执行、代码搜索、目录浏览、web 搜索。通过 MCP 协议还可以接入外部工具比如浏览器操作、数据库查询这些。”02、有实现 Sub-agent 吗怎么编排的老王追问“多 Agent 场景下你是怎么编排的”“规划者Planner接收用户任务拆解成一组带依赖关系的执行步骤。”“比如用户说‘重构这个模块并写测试’规划者会拆成步骤 1 分析现有代码结构步骤 2 执行重构依赖步骤 1步骤 3 写单元测试依赖步骤 2步骤 4 运行测试验证依赖步骤 3。”“这些步骤按 DAG有向无环图组织。编排器做拓扑排序找出所有依赖已满足的步骤丢给执行者Worker并行跑。”执行者工作池默认 2 个用 asyncio.Queue 管理谁空闲谁接活避免任务堆在一个执行者身上。“每个步骤执行完检查者Reviewer会审查结果输出一个 JSON 结构包含是否通过、问题列表、摘要。”审查不通过的步骤会带着检查者的反馈重新执行最多重试 2 次。如果整体进度不到 50% 就连续失败编排器会触发重新规划让规划者换一种拆解方式。老王点点头“执行者之间的隔离怎么做的”“每个执行者有独立的消息历史和 Skill 上下文缓冲区。并行执行时输出各自写入独立的字节缓冲区全部完成后再按原始顺序合并到终端保证展示不会乱序。”03、支持后台任务吗老王问“前台跑 Agent 的时候能同时跑后台任务吗”“支持。后台任务用 SQLite 做持久化队列。”“状态机是 queued → running → completed 或 failed 或 canceled。”Worker 认领任务后会通过心跳续期。如果 Worker 崩溃了当前周期过期后其他 Worker 可以重新认领这个任务。“启动时还有崩溃恢复扫描所有 running 状态但租约已过期的任务重置为 queued 重新排队。这样即使进程异常退出未完成的任务也不会丢。”04、Sub-agent 也支持 Plan 模式吗Skill 怎么调用老王问“Multi-Agent 里的执行者能不能走 Plan 模式”我说“可以。每个执行步骤有一个 mode 字段值可以是 react 或 plan。”规划者在拆解任务的时候可以判断某个步骤是否足够复杂需要用 Plan 模式来执行。“Plan 模式的流程是先调规划者生成一份 JSON 格式的执行计划每个步骤有 id、描述、类型和依赖列表。”有一个简单的任务检测如果用户输入不超过 30 个字且不包含‘然后’‘并且’‘再’这些多步骤线索词就跳过 LLM 规划直接生成一个单步计划省掉一次 LLM 调用。“计划经过拓扑排序确定执行顺序。没有依赖关系的步骤通过 asyncio.gather 并行执行有依赖的串行等待。”Sub-agent 是怎么调用 Skill 的老王紧跟着追问“Skill 在 Sub-agent 里怎么工作”“系统提示词里注入了一份 Skill 索引包含所有启用 Skill 的名称和描述最多 20 个总大小不超过 4KB。”LLM 在处理任务时如果判断当前任务和某个 Skill 的描述匹配就会主动调用 load_skill 这个内置工具。“加载后Skill 的完整内容会写入一个上下文缓冲区。下一轮 LLM 请求时这段内容自动注入到用户消息的前面。LLM 就相当于拿到了一份专家手册按手册指引来执行任务。”“有个关键设计每个 Sub-agent 有独立的 Skill 缓冲区用 LRU 策略最多缓存 3 个 Skill。”因为 Skill 内容注入后会从缓冲区清空drain 操作如果多个 Sub-agent 共享同一个缓冲区一个 Worker 的 drain 会把另一个 Worker 还没读到的内容清掉。05、Skill 分层体系是怎么做的为什么这么设计老王说“Skill 系统展开说说。”我说“三层加载按优先级从低到高内置 Skill 打包在程序里、用户级 Skill 放在 ~/.paicli/skills/ 目录、项目级 Skill 放在项目根目录的 .paicli/skills/ 目录。同名 Skill优先级高的整体覆盖低的。”“每个 Skill 就是一个目录核心是 SKILL.md 文件用 frontmatter 声明名称、描述、版本、标签正文就是给 LLM 看的决策手册。可选的 references/ 目录放参考资料scripts/ 放可执行脚本。”“为什么这么分”内置 Skill 提供开箱即用的基础能力比如 web 访问的浏览器策略手册。用户级满足个人工作流定制比如我自己写了一个小红书热榜抓取的 Skill。项目级承载团队约定比如代码审查规范提交到仓库后团队所有人共享。这个思路和 Claude Code 的设计一脉相承Claude Code 也是内置 Skill、用户 Skill、项目 Skill 三层。06、用户输入怎么和 Skill 匹配有积累机制吗老王追问“用户输入一段话怎么知道该加载哪个 Skill”“打分制。每个 Skill 的得分由四个维度加权计算。精确名称匹配直接加 10000 分确保用户点名要的 Skill 一定排第一。名称中的词项命中权重 ×12标签词项 ×6描述词项 ×2。”“分词策略分中英文两套。”英文转小写后按空格分词过滤掉 and、for、the 这些停用词。“中文不做传统分词而是取单个汉字加上 2 字和 3 字的滑动窗口这样能覆盖大部分中文短语。比如‘代码审查’会生成‘代’‘码’‘审’‘查’‘代码’‘码审’‘审查’‘代码审’‘码审查’这些特征。”老王又问“Skill 只能开发者预定义吗还是用户也可以自己写”“用户可以在 ~/.paicli/skills/ 下创建自己的 Skill 目录写一个 SKILL.md 就能生效。”启用状态持久化在 skills.json 里记录的是 disabled 列表默认全部启用用 /skill off 命令禁用。“目前没做自动积累比如根据用户操作习惯自动生成 Skill。主要是自动生成的决策手册质量不可控一份写得不好的手册反而会误导 LLM 的判断。”简历亮点如果大家在简历上写 Agent 相关的项目可以参考下面这种方式来包装别忘了去 GitHub 上 star 一下 PaiCLI 哈项目名称PaiCLI项目简介对标 Claude Code 的 Python Agent 命令行工具支持多模型切换、多 Agent 协作、Skill 系统和记忆管理技术栈Python 3.11、asyncio、httpx、SQLite、prompt-toolkit、Rich、MCP核心职责基于 ReAct 实现了多模型适配的 Agent 引擎支持 DeepSeek、GLM、Kimi 等 6 种大模型 provider 的流式调用和运行时切换设计并实现了 Multi-Agent 编排系统规划者/执行者/检查者通过 DAG 拓扑排序和 asyncio 异步队列实现任务依赖的并行调度构建了三层 Skill 加载体系内置/用户/项目基于多维度加权评分算法实现用户意图到 Skill 的自动路由设计了双轨长期记忆系统静态项目记忆 动态 SQLite 记忆配合 SHA256 去重和 FIFO 淘汰策略控制记忆膨胀实现了基于滚动摘要的上下文压缩机制在 80% 窗口阈值自动触发压缩保留近 6 轮对话完整性支持百万 token 级长对话07、长短期记忆怎么设计的老王换了个方向“Agent 的记忆系统怎么做的”我说“三层。”“短期记忆就是当前对话的消息历史。用户说了什么、LLM 回了什么、工具返回了什么每轮 LLM 调用都带上。本质是一个不断增长的消息列表。”“长期记忆用 SQLite 存储。”每条记忆绑定了 scope项目路径实现项目隔离、content记忆内容、importance重要性0 到 1、confidence置信度0 到 1、access_count被召回的次数、content_hashSHA256 哈希用于去重。“长期静态记忆就是 PAI.md 文件。项目根目录或 .paicli 目录下放一个 PAI.md启动时自动加载到系统提示词里。功能类似 Claude Code 的 CLAUDE.md。”08、为什么要分静态长期记忆和动态长期记忆老王追问“为什么不统一成一种”“用途不同。”“静态记忆存的是团队规范和项目约定比如代码风格、分支策略、部署流程。”变化频率低可以提交到代码仓库团队所有成员共享同一份。PAI.md 还支持 filename 导入其他文件最大嵌套 3 层总预算 16KB避免撑爆上下文。”“动态记忆存的是用户特定的事实和偏好比如‘这个项目用的是 PostgreSQL 而不是 MySQL’。这些信息在交互过程中学习积累按项目隔离存储在 SQLite 里。”“分开存的好处是职责清晰静态记忆由开发者维护走版本控制动态记忆由 Agent 自动管理不会污染代码仓库。”两者在 Prompt 组装时合并注入系统提示词静态的先加载、动态的后加载。09、什么时候触发记忆存储会不会越存越多老王问“长期记忆是怎么触发存储的膨胀怎么控制”“触发有两种方式。用户执行 /save 命令主动存储或者对话中说‘记住这个’‘帮我记一下’LLM 会调用 save_memory 这个内置工具自动存。”“去重用 content_hash。把记忆内容做 Unicode 归一化后算 SHA256如果哈希已存在不创建新记录只把 importance 和 confidence 取两者中的较大值更新上去。”“防膨胀靠配额淘汰。设定一个 max_entries 上限超出时按 importance、confidence、access_count、updated_at 综合排序优先淘汰那些重要性低、置信度低、长时间没被召回过的旧记忆。”大模型怎么决定长期记忆是否需要召回老王紧跟着追问“每次对话都把所有记忆塞进上下文吗”“不是按相关性评分召回。每次 LLM 请求前用当前的用户消息作为查询对所有记忆逐条打分取分数最高的 6 条注入上下文。”“评分公式是多维度加权。”词汇覆盖率占 72%把查询和记忆内容各自提取词项特征算交集占比加上子串完全匹配的额外加成。重要性占 12%置信度占 8%时间衰减占 6%半衰期 30 天一条记忆 30 天没更新过时间分就衰减到一半访问频率占 2%用对数函数平滑避免高频访问的记忆垄断排名。“召回阈值设定为 0.05。这个值很低因为宁可多召回几条不太相关的也不要漏掉真正有用的。LLM 自己能判断哪些记忆和当前任务有关不需要评分系统做太严格的过滤。”10、上下文压缩机制是怎么做的老王问“对话太长上下文窗口装不下怎么办”我说“自动压缩。触发条件满足任一个就启动估算的 token 数超过可用输入 token 的 80%或者消息数超过 100 条。”“可用输入 token 的计算方式上下文窗口总大小减去最大输出 token 数再减去 1024 的预留空间。比如模型窗口 128K最大输出 8K可用输入约 119K80% 触发阈值约 95K。”“压缩算法分三步。”第一步保留最近 6 轮对话不动切割点必须落在用户消息的边界上。因为工具调用和工具结果必须成对出现在消息历史里从中间切断会破坏消息协议。第二步保留范围之外的旧消息做滚动摘要每条消息提取最多 500 字的摘要。第三步超长的工具返回结果截断到 4000 字。“压缩目标是可用 token 的 55%。为什么 80% 触发、55% 压缩留出来的空间给当前轮的输入、系统提示词里动态注入的部分比如刚召回的记忆以及 LLM 可能返回的多个工具调用。压缩得太晚太少当前轮的请求可能直接超窗口。”“token 估算用经验公式中文字符按 1 token/字英文按 3 个字符 1 个 token。偏保守代码多的场景会高估。但高估比低估安全低估可能导致请求超出模型窗口被截断。”11、讲一下动态 Prompt 和静态 Prompt老王说“你的系统提示词是怎么组装的”“分成静态部分和动态部分。”“静态部分在一个会话里不会变构建一次就缓存。包括人格设定语气风格、核心行为准则工具使用规范、安全策略、项目指令PAI.md 的内容。”“动态部分每次 LLM 请求都重新构建。包括当前时间和时区、工作目录路径、当前使用的模型名称和 provider、已启用的 Skill 索引、刚召回的相关长期记忆。”“还有一个模式维度。ReAct 模式、Plan 模式、规划者/执行者/检查者各有独立的模式提示词文件存在 resources/prompts/ 目录下。编排器根据当前角色选择对应的模式提示词拼到系统提示词的对应位置。”“项目指令的加载有优先级链用户全局的 PAI.md → 项目根目录的 PAI.md → .paicli 目录下的 PAI.md → PAI.local.md本地覆盖不提交仓库。”总预算 16KB超出截断。用户还可以自定义覆盖任意一层的提示词文件覆盖是整文件替换。12、模型底座是哪个成本怎么样你平时用 PaiCLI 吗老王抛出最后的问题“你用的什么模型成本算过吗”“默认模型是 DeepSeek V4。”PaiCLI 支持运行时切换模型/model 命令可以在 DeepSeek、GLM、Kimi、StepFun 等 6 种 provider 之间切换API Key 从配置文件、环境变量、.env 文件三个来源读取优先级依次升高。“1000 行代码大约 15000 到 20000 个 token。一次完整的编码任务算上多轮 ReAct 循环通常消耗 5 万到 10 万 token。”用 DeepSeek V4 的话成本大约 0.1 到 1 元之间。启用 Prompt Cache 后重复的系统提示词和历史消息命中缓存输入成本降到四分之一。老王最后问“你平时用你自己的 PaiCLI 吗”“用每天都在用。写代码、查资料、自动化日常操作都用它。”“有一说一Claude Code 功能肯定比 PaiCLI 强。但自己写的工具最大的好处不是功能而是你完全理解每一个设计决策背后的取舍。”“而且在写 PaiCLI 的过程中我把 Agent 技术栈的核心概念全过了一遍。ReAct、Function Calling、RAG、MCP、Multi-Agent、Memory、Context 压缩。看文章看十遍不如自己动手实现一遍。”endingAgent 面试考的不是能背多少概念是有没有自己做过一遍完整的技术栈想要搞清楚 Agent最有效的方式就是自己写一个 Agent 项目。不需要做得比 Claude Code 好但 ReAct 循环、记忆系统、上下文压缩、Skill 分层这些核心模块每个都要自己实现一遍。学AI大模型的正确顺序千万不要搞错了2026年AI风口已来各行各业的AI渗透肉眼可见超多公司要么转型做AI相关产品要么高薪挖AI技术人才机遇直接摆在眼前有往AI方向发展或者本身有后端编程基础的朋友直接冲AI大模型应用开发转岗超合适就算暂时不打算转岗了解大模型、RAG、Prompt、Agent这些热门概念能上手做简单项目也绝对是求职加分王给大家整理了超全最新的AI大模型应用开发学习清单和资料手把手帮你快速入门学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型GPT、文心一言等特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架LangChain等实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块看似清晰好上手实则每个部分都有扎实的核心内容需要吃透我把大模型的学习全流程已经整理好了抓住AI时代风口轻松解锁职业新可能希望大家都能把握机遇实现薪资/职业跃迁这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】