Skip to content

Agent 实战(六)AIPPT 项目面试深挖:8 个维度怎么答

🕒 Published at:

上一篇《AIPPT 编辑 Agent 项目复盘》讲了整体设计。这一篇是它的"面试加强版"——把这个项目按面试官最爱深挖的 8 个维度逐一拆开,每个维度我都写清楚:面试官可能怎么问、我怎么答、以及我真正定位过的一个问题。带着具体设计和数字去讲,比背概念有说服力得多。

项目一句话回顾:AIPPT 底层是一份 JSON,用户用自然语言(聊天)来增删页、改文本/图片/表格。核心设计是让模型产出"被严格约束的编辑操作",而不是重写整份 JSON。下面 8 个维度,都是围绕"怎么把这句话做扎实"展开的。

维度一:用户输入规范化

面试官会问:用户说话又乱又口语,你怎么把它变成机器能处理的东西?

用户不会说标准指令,他们说的是"把那个弄大点""标题不对,改一下"。我在把指令交给模型之前先做一层归一化,主要处理三类问题:代词消解("它/那个"指谁)、缺省补全("改红色"缺了对象)、形容词标准化("大一点"到底加几号)。

这里我挑形容词标准化讲透,因为它最容易被忽略、也最能体现深度。用户说"大一点""醒目一点""正式一点"——这些模糊的形容词,最终必须落成 JSON 里具体的数值或操作。我的做法是维护一张"模糊词 → 具体操作"的映射,并结合当前元素的现状来算增量:

json
{
  "大一点":  { "op": "updateStyle", "delta": { "fontSize": "+4" } },
  "大幅放大": { "op": "updateStyle", "delta": { "fontSize": "+12" } },
  "醒目一点": { "op": "updateStyle", "patch": { "bold": true }, "delta": { "fontSize": "+2" } },
  "正式一点": { "op": "applyStyle", "preset": "formal" }
}

我真正定位过的问题:上线后发现"再大一点"这类指令的撤销率偏高。用 trace 一看,是我把"大一点"直接映射成固定 +8 号,但用户往往是在已经放大过的基础上说的,叠加后字大得离谱。修复:改成"看当前字号按比例调 + 设上限封顶",并且对"再/继续"这类递进词做衰减(第二次 +4、第三次 +2)。撤销率明显下降。这个 case 特别能讲——它体现了"形容词标准化不是查表,要结合上下文和状态"。

维度二:意图识别的多层机制

面试官会问:用户输入进来,你怎么知道他想干嘛?直接全交给大模型?

不。全交给大模型又贵又慢又不稳。我设计了一个从便宜到贵的多层级联(cascade),能在前面解决就绝不往后走:

① 规则/正则撤销/删第X页② 向量匹配语义命中意图库③ 轻量模型分类+抽参④ 重量级模型复杂/多意图才上命中就返回,命中不了才降级到下一层 → 越往后越贵大部分请求在前两层就解决,只有少数走到大模型

① 规则/正则:像"撤销""删除第 3 页""保存"这种明确命令,正则一撞一个准,0 延迟、0 成本、100% 准② 向量匹配:把输入和"意图库"做语义相似度,高置信直接命中。③ 轻量模型(qwen-turbo):中等置信度的,用小模型做意图分类 + 参数抽取。④ 重量级模型:只有复杂、模糊、一句话套多个意图的,才动用大模型。

这么设计的价值:大部分日常操作在前两层就解决了,平均延迟和成本都大幅下降,把贵模型的调用留给真正需要它的少数场景。面试时这套"级联"思路很出彩,体现了成本意识和工程权衡。

我定位过的问题:早期把"删掉这页"误判成了"更新"意图(向量匹配把"删"和"改"搞混了)。修复:把破坏性意图(删除类)单独用规则层前置兜底,明确关键词直接命中删除意图,不让它进语义匹配去"猜"。

维度三:Agent 运行——一个完整的 ReAct 故事

面试官会问:讲一个你的 Agent 完整跑起来的过程。

我会讲这么一个包含多轮对话、参数补全、用户反馈的真实场景:

用户:帮第二页加个对比表格。 Agent 思考:意图是"加表格",但缺了关键参数——几行几列、对比什么。→ 参数补全:反问。 Agent:好的,对比几个产品、比哪些维度?(要几行几列) 用户:比 A、B、C 三个产品的价格和保修。 Agent 思考:现在参数齐了(4 行 × 3 列),调用 addTable 工具 → 观察工具返回成功 → 生成操作 → 过校验。 Agent:已在第二页加了一个 4×3 的对比表格(预览)。要我把表头加粗吗? 用户:把表头背景改成品牌蓝。 Agent 思考:"表头"指刚加的表格第一行(代词/指代靠上一步的操作上下文解析)→ 调 updateTableRowStyle

这个故事把 ReAct 的"思考→行动→观察→再思考"多轮记忆(记住刚操作的是哪个表格)、参数补全(缺参数就反问而不是瞎猜)、用户反馈闭环(预览确认)全串起来了。面试官想听的就是这种"有血有肉的一次完整运行",而不是干巴巴的定义。

维度四:工具管理——几十上百个操作怎么不选错

面试官会问:你有很多编辑操作(工具),全塞给模型它不会选错吗?

会,而且这是真实痛点。AIPPT 的操作有几十上百个(改文本、加页、改表格、换主题、调图表……),全丢给模型 → 选错 + token 爆炸。我用三招筛:

按意图筛:先用维度二的意图识别粗判类别(文本类/布局类/样式类/图表类),只把该类别下的工具给模型,候选一下子从上百个降到几个。标签筛:每个工具打标签,按场景加载。Tool Search(工具检索):当相关工具仍然多时,把用户指令拿去和"工具描述"做语义检索,选出 top-k 最相关的工具再交给模型——本质是把 RAG 用在了工具选择上

价值:模型每次只面对少数几个高相关工具,选错率和 token 都大降。这套"工具也要检索"的思路,面试官会觉得你真处理过"工具规模化"的问题。

维度五:上下文管理——大 PPT 怎么塞进有限窗口

面试官会问:一份几十页的 PPT JSON 好几万 token,你怎么喂给模型?

绝不能全塞。我做了三层:

窗口装载算法:按优先级决定放什么——当前页 > 用户指令涉及的相关页 > 相邻页,其余不放。多级压缩:不放完整 JSON,而是放带 ID 的精简大纲(每个元素只留 id/type/role/预览文字),比完整 JSON 小一两个数量级。细节召回:当模型确实需要某个元素的完整属性时,按 ID 回查取详情——用多少取多少,而不是一开始全给。

这三层合起来,就是"默认给地图,用到才给详情",和 RAG"只喂相关上下文"是同一个哲学。我定位过的问题:有用户"把所有页的页脚统一改掉",这种跨全篇的指令,我的"只放当前页"策略就漏了。修复:识别出"全局类"指令后,走一条确定性代码遍历的路径(不靠模型逐页改),既准又省——这也呼应了上一篇说的"模型决策、代码执行"。

维度六:检索 / RAG 在这个项目里的角色

面试官会问:这个项目哪里用到了 RAG?

有两处:

一是素材/规范检索:用户说"按公司品牌规范配色""从素材库找张合适的配图",我用 RAG 去检索企业的品牌规范、模板库、素材库。这里就用到进阶那套:文档入库、特殊内容处理(模板里的表格/样式结构化)、混合检索(关键词 + 向量,型号/名称这类精确词靠关键词兜底)、以及检索参数优化(top-k、重排)。

二是工具检索(维度四的 Tool Search)——把工具描述当文档检索,也是 RAG。

我会诚实地说:这个项目 RAG 不是主角(它主要是"改结构化文档",不是"查知识"),但在"素材/规范/模板"这类需要"带着资料做"的子场景里,RAG 是很自然的选择。面试时不硬凑、把边界说清楚,反而显得靠谱。

维度七:评估与反馈——怎么证明它真的好用

面试官会问:你怎么衡量这个 Agent 好不好?改了东西怎么知道是变好还是变差?

测试集:我攒了几百条「用户指令 → 期望产生的操作(或期望的结果 JSON)」。LLM as Judge:因为同一个改动可能有多种正确的操作写法,不能用字符串死比,我用大模型判断"产出的操作和期望是否等价"。实验机制:每次改提示词、调意图阈值、换模型,都跑一遍测试集,看指令解析准确率涨跌,改坏了就不发布。

最关键的是业务指标,这是面试官最想听的——我盯这几个:一次成功率(不用反问、不用重试就改对的比例)、平均往返轮次(越少越顺)、澄清率(触发反问的比例,太高说明理解差、太低可能在瞎猜)、撤销率(用户改完又撤销,是"改错"的最好代理指标)。把技术指标翻译成业务指标,是这一维度的加分点。

维度八:可观测性——以及我真正定位过的问题

面试官会问:线上出问题你怎么排查?

Logging:我把一次请求的全链路都记下来——用户输入 → 归一化后 → 命中哪层意图 → 选了哪些工具 → 模型产出的操作 → 校验结果 → 应用的 patch。任何一步都能回看。Metrics:意图各层命中率、工具选错率、校验失败率、平均延迟、token 成本、撤销率、澄清率。Trace:单次请求的完整链路追踪,一眼看出慢在哪、错在哪。

两个我真正定位过的问题(面试时讲具体 case 最有杀伤力):

其一,某段时间校验失败率突然升高。看日志发现模型频繁产出不存在的 elementId。trace 到根因:那批 PPT 元素多,我给模型的精简大纲被上下文截断了,模型没看到后面的元素只能"编 ID"。修复:改进窗口装载,保证指令涉及页的元素完整进上下文,失败率回落。

其二,撤销率在"样式类"指令上偏高(就是维度一那个"大一点"叠加过头的问题)。是从 Metrics 里先看到撤销率异常,再用 trace 逐条还原用户操作链,才定位到形容词标准化的缺陷。

这两个 case 的共同点先靠 Metrics 发现异常 → 再靠 Trace/Logging 定位根因 → 最后针对性修。这套"可观测驱动排障"的方法论,比修好某个具体 bug 更能打动面试官。

收尾:怎么把这 8 点串成一次好的面试

如果只给你一分钟讲这个项目,我会这么收:

"AIPPT 编辑 Agent 的核心,是把'自然语言改 PPT'重构成'模型只发出被严格约束的编辑操作、由可信代码执行'。围绕这条主线,我在输入归一化(形容词标准化结合状态算增量)、意图识别(便宜到贵的多层级联省成本)、工具管理(意图筛 + Tool Search 应对上百个工具)、上下文管理(带 ID 精简大纲 + 按需召回)上都做了针对性设计;用评测集 + LLM Judge + 业务指标(一次成功率、撤销率)来驱动迭代;靠Metrics 发现异常、Trace 定位根因来排障——比如我就是这样定位并修复了'编造 elementId'和'样式叠加过头'两个线上问题的。"

这一段,把设计、取舍、指标、和真实排障故事全带上了——这就是面试官眼里"真做过、且做得深"的样子。