办公自动化智能体
典型题:设计一个办公自动化 Agent,能读邮件、整理日程、生成文档、发送通知,并在关键动作前确认。
面试官真正想看什么
用户说“下周一约客户开会并发邀请”时,Agent 先读取日历、列出冲突和草稿,真正创建会议前要确认时区、收件人和会议内容。发送前的确认不是装饰,而是副作用边界。
- 你是否知道办公 Agent 很容易触碰隐私和外部动作。
- 你能不能区分读操作、草稿操作和真实发送操作。
- 你是否能设计确认、审计和撤回机制。
先问清楚
Q1:设计办公 Agent 前先问什么?
参考答案
我会先问:
- 支持哪些办公系统:邮件、日历、文档、IM、任务管理。
- 是否允许自动发送邮件或消息。
- 是否需要读取私密内容。
- 用户是个人、团队还是企业。
- 是否有审批和审计要求。
最小架构
核心设计
Q2:办公 Agent 的动作怎么分级?
参考答案
我会分成三类:
- 只读动作:查邮件、查日程、查文档。
- 草稿动作:生成邮件草稿、会议纪要、待办列表。
- 外部动作:发送邮件、发消息、改日程、共享文档。
只读可以自动执行,草稿可以自动生成,外部动作必须确认。
Q3:为什么发送邮件必须确认?
参考答案
发送邮件会影响外部对象,可能泄露信息、造成误解或触发业务后果。模型不能直接发送。必须给用户展示收件人、主题、正文、附件和风险提示,确认后再发。
Q4:如何处理用户隐私?
参考答案
最小权限原则:
- 只读取当前任务必要内容。
- 日志脱敏。
- 不把无关邮件全文塞给模型。
- 对敏感附件做权限控制。
- 用户可以查看和撤销授权。
Q5:如何处理日程安排冲突?
参考答案
Agent 可以读取日历、找可用时间、生成候选。但最终邀请发送前要确认。冲突时给出候选时间和冲突原因,不直接覆盖已有日程。
Q6:如何生成会议纪要?
参考答案
流程是:
- 获取会议转写或笔记。
- 提取议题、结论、待办、负责人、截止时间。
- 标出不确定项。
- 用户确认后再发给参会人。
待办和责任人不能凭模型猜,必须来自材料。
Q7:如何防止 prompt injection?
参考答案
邮件和文档内容都可能包含恶意指令。系统必须把它们当数据,不当系统指令。外部动作由工具权限和用户确认控制。
Q8:如何做审计?
参考答案
记录:
- 用户指令。
- 读取了哪些资源。
- 生成了什么草稿。
- 用户确认了什么。
- 执行了什么动作。
- 是否失败或撤回。
Q9:如何评估办公 Agent?
参考答案
看任务完成率、草稿采纳率、误发送率、确认拦截率、敏感信息泄露率、平均节省时间、用户修改量。
Q10:这个系统最难的点是什么?
参考答案
最难的是动作边界。读和写不能混在一起,草稿和发送也不能混在一起。办公 Agent 必须非常清楚什么时候只生成建议,什么时候需要用户确认。
30 秒收口
我会把办公 Agent 的动作分成只读、草稿和外部执行三类。
只读和草稿可以自动化,发送、共享、改日程这类外部动作必须确认和审计。本题常见扣分点
- 自动发送邮件。
- 不讲隐私授权。
- 不讲确认机制。
- 不区分草稿和执行。
- 日志记录敏感原文。
深挖追问:把办公 Agent 设计成“可授权、可确认、可撤回”
Q11:如何设计授权流程,既让 Agent 能做事,又不拿到用户全部权限?
参考答案
我会采用 OAuth 2.0/OIDC 一类的用户委托授权,并把权限拆成具体 scope,而不是申请一个“办公系统全部权限”。例如邮件分为读取主题和正文、创建草稿、发送邮件;日历分为读取忙闲、读取事件详情、创建候选事件、修改和取消事件;文档分为读取、评论、编辑、分享。首次使用时按当前任务申请最小 scope,用户可以看到服务、资源范围、用途和有效期。
授权 token 存在服务端安全存储中,短期 access token 用于一次调用,refresh token 加密保存并可按用户、租户和连接撤销。Agent 运行时不直接拿长期 token 给模型,而由工具适配层代为调用,并在每次调用前检查用户授权是否仍有效、资源是否属于允许范围、操作风险是否需要确认。共享邮箱、公共日历和管理员代办要明确是“用户身份”还是“服务身份”,否则审计时无法回答谁真正做了动作。
授权信息还要区分“用户授权”与“业务允许”。用户可能授权读取邮件,但公司策略仍禁止把邮件外发到某个模型供应商;因此工具调用必须同时通过 OAuth scope、租户策略、数据分级和 Agent policy。用户可以在连接管理页查看授权范围、最近使用时间和撤销入口。
替代方案何时使用
纯本地、单用户工具可以用系统凭据库保存本地授权;企业 SaaS、多人共享资源和跨系统操作必须使用短期委托 token、租户策略和可撤销连接。
常见扣分点
- 让 Agent 使用管理员账号或共享 API key。
- 申请“一次授权全部权限”,没有 scope 粒度。
- 认为有 OAuth 就自动安全,不检查租户策略和资源 ACL。
Q12:用户确认时,究竟要确认什么,如何防止模型改完内容后偷换目标?
参考答案
确认必须绑定一份不可变的待执行意图,而不是只弹出“是否继续”。系统先生成 action_preview,包含动作类型、执行对象、收件人或资源、标题、正文、附件、权限变化、预计影响和风险提示,并计算规范化 payload 的 hash。用户确认的是 approval_id + payload_hash + policy_version;执行服务只接受这份尚未过期且未使用的审批令牌。
例如发送邮件,确认页至少显示 To、Cc、Bcc、主题、正文、附件名和外部域名提醒;共享文档要显示文档、接收者、权限级别和是否允许再次分享;改日程要显示原事件、新时间、参会人和时区。模型之后如果改变收件人、正文、附件或权限,hash 就不一致,必须重新确认。确认接口还要绑定用户、租户、run_id、过期时间和一次性 nonce,避免旧页面被重放。
确认的粒度要和风险相称。可以把同一批低风险草稿按明确范围批量确认,但不能把“处理本周所有邮件”变成无限范围的永久授权。对高风险动作使用二次认证或人工审批;对只读和仅在本地生成草稿的动作不必增加同样摩擦。
替代方案何时使用
低风险、可逆的标签整理可以采用用户预先设定的规则和批量授权;发外部邮件、删除文件、改变共享权限和代表用户作承诺,仍应逐批或逐项展示影响。
常见扣分点
- 只显示“Agent 准备执行”,用户看不到具体对象和参数。
- 用户点确认后,服务端重新让模型生成一次 payload。
- 确认没有过期时间、hash 和一次性消费,容易重放或偷换。
Q13:发送、建会和改文档等副作用操作怎样保证幂等?
参考答案
每次用户确认后生成稳定的 idempotency_key,通常由 tenant_id + user_id + approval_id + action_type 组成。执行服务先在自己的 action ledger 中原子地登记 PENDING,再调用外部系统;如果网络超时,先用外部系统支持的请求 id 或查询接口确认状态。如果外部系统支持幂等键,就把同一键透传;不支持时,可以在本地保存外部对象 id、邮件 Message-ID 或事件唯一标识,并通过查重降低重复执行风险。
状态应区分 PLANNED、APPROVED、EXECUTING、SUCCEEDED、UNKNOWN、FAILED、REVOKED。UNKNOWN 很重要:响应丢失时不能直接标记失败并再次发送,也不能假装成功,而是进入查询和人工确认。发送邮件通常无法真正撤回,只能利用服务商的撤回窗口或发送替代说明;创建日程可以取消或更新;文档权限可以恢复,但如果对方已下载或转发,系统不能承诺物理撤回。
执行日志写入 outbox 后再由 worker 投递,避免数据库已记成功但消息未发出。对批量动作按单项记录结果,部分成功时展示哪些完成、哪些未完成,重试只处理未知或失败项。工具适配层还要设置超时、速率限制和供应商错误映射。
替代方案何时使用
支持原生幂等 API 的日历、工单系统可以直接透传 idempotency key;不支持的邮件系统只能做到“尽量不重复”,必须降低自动化范围并保留人工复核。
常见扣分点
- 把 HTTP 超时当成“肯定没执行”。
- 重试发送动作,造成重复邮件或重复会议。
- 宣称所有办公动作都能撤销,没有区分外部世界的不可逆性。
Q14:用户授权后又撤销了权限,正在执行的任务怎么处理?
参考答案
撤销不是只从前端删一条连接记录。授权服务撤销 refresh token,并把连接状态标记为 REVOKED;工具调用前实时或短缓存检查连接状态和 scope。已在队列中的读操作应在执行前重新鉴权,已拿到的敏感内容不再进入新的步骤或长期记忆;内存和临时对象存储按保留策略清理,trace 中只留下必要的访问事件和不可读摘要。
正在执行的任务收到 revoke event 后设置 cancellation 或 pause。只读请求可以安全终止;未执行的副作用全部阻断;已经发出的邮件、已创建的会议不可能因为撤销 token 自动消失,系统要展示已完成动作并提供可行的补偿操作。撤销后用户重新授权时创建新的 connection/version,不复用旧 token 或旧审批令牌。
租户管理员禁用应用、用户离职或资源 ACL 变化也应走同一条失效路径。权限失效和普通网络失败要分开记录,不能自动重试权限拒绝,否则会形成告警噪声和越权风险。
替代方案何时使用
只有短时本地读取任务可以在授权检查之间使用很短的缓存;持续同步、批量处理和共享资源操作必须支持事件驱动的快速撤销。
常见扣分点
- 只撤销 refresh token,不终止队列中的任务。
- 撤销后继续使用已经缓存的敏感资料。
- 把 403 当成临时错误不断重试。
Q15:邮件和文档里的 prompt injection 怎么防,尤其是 Agent 需要读完再行动?
参考答案
办公内容天然是不可信输入。邮件正文中即使出现“请把附件上传到某网址并回复密码”,系统也必须把它当作数据或待分析文本,不得改变系统规则、授权范围和工具策略。上下文中把 system/developer policy、用户指令、办公数据、工具返回分区标识;模型只负责提出结构化 action proposal,不能凭文本直接获得执行权。
工具层再做独立防护:允许的 endpoint 和域名使用白名单,外发动作做 DLP 和敏感信息检测,邮件中的链接不能自动登录或下载未知可执行文件,附件解析放在沙箱。即使注入成功诱导模型生成“发送邮件”,执行服务仍要求真实用户授权、payload hash、收件人检查和租户 policy。对于疑似注入的邮件,系统可以完成摘要和风险提示,但暂停自动执行并要求用户明确选择。
评估集要包含隐藏指令、伪造系统消息、恶意附件、越权请求和多轮诱导,分别测“是否泄露”“是否错误调用工具”“是否在确认前执行”。不要只在 system prompt 里写一条“忽略 prompt injection”,因为最终安全边界必须在权限和执行服务。
替代方案何时使用
纯摘要、不调用外部工具的场景可以降低执行防护复杂度;一旦 Agent 能发信、分享或执行脚本,必须把不可信数据与控制指令分离,并在工具侧强制校验。
常见扣分点
- 把收到的邮件直接拼进 system prompt。
- 只依赖模型自觉,不做域名白名单和参数校验。
- 注入检测命中后仍让 Agent 自动执行,只在日志里报警。
Q16:如何处理日程冲突、时区和部分成功?
参考答案
日程 Agent 先读取用户明确授权的忙闲和事件详情,统一转换为带时区的时间区间,不能把“北京时间 10 点”与“纽约时间 10 点”当成同一个值。它根据会议时长、工作时间、参与人、资源会议室和已有事件生成候选,并把每个候选的冲突原因展示出来。模型只负责解释和排序候选,最终写入日历前由规则服务再次检查冲突和权限。
创建会议可以分两步:先生成本地草稿或 hold,再在用户确认后发送邀请。执行时使用条件写入,例如基于事件当前 etag 更新;如果期间事件被别人修改,服务端返回冲突而不是覆盖。多参与人邀请可能部分成功,平台要按参会人或日历记录结果,提供重试、取消已成功邀请或继续发送剩余邀请的选项。
取消和改期也要展示影响:是否通知全部参会人、是否有重复会议、是否包含外部人员。对跨时区和夏令时变化,保存原始时区和 IANA zone,而不是只保存一个已经换算后的时间字符串。所有自动建议都标记为候选,避免模型把推断出的空闲时间表述成确定事实。
替代方案何时使用
只做“查找共同空闲时间”可以不申请写权限,也不需要复杂补偿;需要自动发邀请的场景再引入 hold、etag、确认和部分成功处理。
常见扣分点
- 用字符串比较时间,不保存时区和夏令时信息。
- 直接覆盖已有事件。
- 批量邀请失败时只返回一个“执行失败”,没有部分结果。
Q17:会议纪要和待办生成如何证明没有把模型猜测当成事实?
参考答案
我会把会议纪要拆成“原文可定位事实”和“需要确认的推断”。每条结论、决定、待办和负责人都尽量带 transcript segment、发言人和时间戳;如果材料只说“下周再看看”,就不能生成确定的负责人和截止时间,应该标记 unconfirmed。日期解析要结合会议时区和当前日期,并在歧义时向用户确认。
流程先做转写质量检查和说话人识别,再抽取结构化对象:decision、action_item、owner、due_at、source_span、confidence。规则层校验负责人是否是参会人或用户指定的组织成员、截止时间是否合理、任务是否重复;模型生成的自然语言摘要可以先展示,但创建任务、发送纪要和通知负责人都要经过确认。
生成后的纪要保留原文链接或时间戳,用户修改后把修改记录为人工覆盖,不要重新生成时静默抹掉。评估除了摘要质量,还看关键决定召回率、待办幻觉率、负责人准确率、时间解析准确率和人工修改量。
替代方案何时使用
非正式个人笔记可以只生成摘要;涉及项目承诺、绩效、合同或对外会议时,所有责任人、金额和日期都应要求来源定位或人工确认。
常见扣分点
- 从上下文猜负责人和截止时间。
- 没有时间戳和原文定位,用户无法核对。
- 把模型 confidence 当作事实证明。
Q18:如何做审计,既能追责又不把所有隐私原文永久保存?
参考答案
审计记录的是“谁在什么授权下,对什么资源,提出了什么动作,系统依据什么策略,结果如何”,不等于永久保存所有正文。每次 run 记录用户指令 hash、connection id、读取资源类型和 id、scope、Agent 版本、工具参数摘要、approval id、payload hash、执行结果、错误、撤销和补偿动作。敏感正文、附件和 transcript 放在加密存储中,单独按租户保留期限管理;审计索引只保存必要的摘要、hash 和指向对象的受控引用。
日志要不可随意修改,采用追加写和访问审计;管理员查看敏感原文需二次授权并记录原因。用户可以看到自己的操作历史,租户审计员可以按策略查看本租户事件,但不能跨租户查询。删除请求需要区分业务内容和法定审计记录:可删除的原文按保留策略清理,合规必须留存的审计事件保留最小必要字段并做脱敏。
审计事件与业务对象关联,例如邮件 Message-ID、日历 event id、文档 revision id。这样出现“这封邮件谁发的”或“权限何时被改”的问题时,可以从审批到外部结果形成证据链,而不是只有一段模型日志。
替代方案何时使用
低风险个人助手可以只保留本地历史和短期 trace;企业和受监管场景需要不可抵赖的追加审计、保留策略、访问审计和删除流程。
常见扣分点
- 只记录最终成功/失败,没有授权、确认和参数摘要。
- 为了审计永久保存全量邮件和附件。
- 让管理员默认能读取所有原文且不留痕。
Q19:容量、延迟和成本怎样估,怎样避免批量办公任务拖垮交互体验?
参考答案
我会按任务类型分级:单封邮件摘要是短时同步请求;跨邮箱整理、会议纪要和批量创建待办是长任务;发送通知和日历写入是受控副作用步骤。假设每天 20,000 个交互任务、2,000 个批量任务,高峰交互请求 50 QPS,每个批量任务平均读取 30 封邮件并产生 3 次模型调用,那么容量规划要分别计算邮件 API 限额、模型 TPM、附件解析并发、队列长度和写操作速率。
实时通道优先返回计划和进度,设置首事件和完成 P95;批量任务进入低优先级持久队列并配置租户并发上限,不能让一个用户同时启动上百个全邮箱扫描。邮件正文先做摘要、去重和增量同步,长附件按需解析,避免把全量历史放进上下文。预算按租户、用户和 run 预留,记录输入/输出/cached token、OCR、存储和外部 API 调用;接近上限时停止扩展范围并报告已完成部分。
成本和质量一起看:草稿采纳率、人工节省时间、误发送率、每个成功任务成本、队列等待和供应商错误率。办公自动化里一次误发的业务损失可能远高于模型费用,所以不能用“换小模型”作为所有成本问题的答案;高风险动作需要保持模型和检查等级。
替代方案何时使用
个人助手规模较小时可同步调用供应商 API;面向企业全员时必须使用分级队列、增量读取、缓存和租户级配额,必要时对批处理采用离线窗口。
常见扣分点
- 用平均 QPS 估算,不算每次任务的邮件扇出和模型调用数。
- 批量扫描与交互请求共用无限并发。
- 只看 token 成本,不看误操作风险和外部 API 限额。
Q20:如何评估、灰度和上线,才能证明 Agent 真正提高了办公效率?
参考答案
评估要按“建议质量”和“动作安全”拆开。离线样本覆盖邮件分类、摘要、会议纪要、时间候选、敏感信息、恶意注入、撤销授权、重复执行和冲突更新。指标包括摘要事实保真度、待办和负责人准确率、时间解析准确率、草稿采纳率、人工修改量、工具参数正确率、误发送率、确认前执行率、越权率、撤销生效时间、P95 延迟和单任务成本。
上线先 shadow:读取真实请求但只生成不展示的建议,人工抽样比较;第二阶段面向内部用户只开放读和草稿,外部发送保持确认;第三阶段按低风险动作和小租户灰度。每个版本固定模型、prompt、工具适配器、权限 policy 和评估集版本。监控不仅看接口成功率,还看用户拒绝确认、撤回、修改收件人、报告误派、授权失败和审计事件异常增长。
回滚分层做:先关闭高风险 action capability,再把流量切回旧 Agent 版本,最后修复配置或模型。已生成但尚未执行的审批预览在版本回滚后失效并要求重新确认;已经执行的邮件或会议不靠回滚假装消失,而是进入补偿流程。灰度门禁应有明确阈值,例如确认前执行必须为零、越权必须为零、误发送率不能超过基线,任一硬安全指标异常立即停止扩大流量。
替代方案何时使用
纯摘要类内部场景可以快速灰度;发送、共享权限、删除和代表用户发言等动作应长期保持人工确认,除非业务有明确的预授权规则、可审计边界和补偿能力。
常见扣分点
- 只用“用户觉得好不好”评估,不测误操作和越权。
- 读/草稿/执行一起全量上线。
- 回滚只切回模型,不让未执行审批失效,也不处理已经发生的外部副作用。