在办公 Agent 里,意图识别不是简单地判断用户“想干什么”,而是要判断:

用户现在想做什么、缺什么信息、能不能直接调用工具、是否存在风险、要不要追问、当前任务和历史上下文是什么关系。

很多候选人回答这类问题时,只会说“用 LLM 做意图分类”,这个回答太浅。真正落地过办公 Agent 的人会知道,意图识别模块的难点不在分类本身,而在上下文、状态、槽位、工具和风险控制


一、面试官考察点

面试官问“办公 Agent 的意图识别模块核心痛点是什么?怎么解决?”,通常不是想听一个 NLP 分类模型的答案,而是想考察你有没有真实做过 Agent 系统。

主要考察这几个点:

  1. 是否理解办公场景的复杂性
    办公场景不是单轮问答,用户经常边想边补充,表达不完整,还会临时改需求。

  2. 是否理解意图识别和工具调用的关系
    意图不是直接等于工具。比如“帮我通知王经理”可能对应邮件、企业微信、日历邀请、待办创建,不能简单一一映射。

  3. 是否知道槽位和状态管理的重要性
    办公任务通常需要收件人、时间、正文、附件、权限、发送方式等信息,缺了就不能安全执行。

  4. 是否有风险控制意识
    像“发送邮件”“删除文件”“修改日程”“提交审批”这类操作,不能识别到意图就直接执行。

  5. 是否能提出工程化方案
    比如分层意图体系、Session 状态、任务状态机、规则 + 小模型 + LLM 混合识别,而不是只说“Prompt 写好一点”。


二、1 分钟标准回答

可以这样回答:

办公 Agent 的意图识别核心痛点不是单纯的意图分类,而是用户表达往往是模糊、分多轮、带省略和指代的,同时一个任务可能包含多个子任务,意图和工具也不是一一对应的。比如用户说“帮我发给王经理”,系统要知道“发什么、通过什么工具发、王经理是谁、是否需要确认”。

我的解决思路一般是做一套上下文感知的意图识别框架。先建立分层意图体系,比如一级是邮件、日程、文档、审批,二级是创建、修改、发送、查询;然后做槽位抽取,抽出时间、对象、内容、动作、工具等信息;再用 Session 状态和任务状态机维护多轮上下文,支持用户补充、修改、切换任务。对于工具选择,不是直接用意图映射工具,而是结合槽位、上下文和工具能力做路由。最后根据风险等级决定是否直接执行、主动澄清或二次确认。

工程上我会采用规则 + 小模型 + LLM 的混合方案。高频明确意图用规则和小模型保证稳定性,复杂表达、企业内部术语、多轮推理交给 LLM,同时在执行前加入风险校验和确认机制。


三、核心痛点

1. 用户表达模糊

办公场景里,用户很少说完整指令。

比如:

帮我处理一下这个会议
发给王经理
明天下午安排一下
把这个改正式一点

这些话单独看都不完整。

“处理会议”可能是改时间、取消会议、发纪要、创建日程、通知参会人。
“发给王经理”可能是发邮件,也可能是发企业微信,还可能是共享文档权限。

所以意图识别不能只看当前一句话,必须结合当前页面、历史对话、用户正在处理的对象和可用工具。


2. 多轮省略和指代

用户在办公 Agent 里经常连续说:

帮我写一封请假邮件
下周三下午
发给王经理
语气正式一点
顺便抄送 HR
现在发出去

这里后面几句话都不是完整意图,而是对前一个任务的补充或修改。

系统必须知道:

  • “下周三下午”是在补充请假时间;

  • “发给王经理”是在补充收件人;

  • “语气正式一点”是在修改邮件风格;

  • “顺便抄送 HR”是在补充抄送人;

  • “现在发出去”是高风险执行动作,需要最终确认。

如果没有 Session 状态,系统很容易把每句话都当成一个新任务,导致上下文断裂。


3. 复合任务

办公任务经常不是单动作。

比如:

帮我总结这份会议纪要,生成待办,并发给项目组成员。

这句话至少包含三个子任务:

  1. 总结会议纪要;

  2. 抽取待办事项;

  3. 发送给项目组成员。

如果系统只识别一个意图,很可能漏掉后面的任务。
因此需要把复杂指令拆成多个子意图,并建立执行顺序和依赖关系。


4. 意图和工具不是一一对应

这是很多候选人容易忽略的点。

用户说“通知王经理”,这只是业务意图,不是工具意图。

它可能对应:

  • 邮件发送工具;

  • IM 消息工具;

  • 日程邀请工具;

  • 待办提醒工具;

  • 审批流通知工具。

所以办公 Agent 不能简单写成:

意图 = 发邮件 → 调用邮件工具
意图 = 查日程 → 调用日历工具

更合理的做法是:

业务意图 → 任务类型 → 所需槽位 → 可选工具 → 工具选择策略 → 风险校验 → 执行

也就是说,意图识别模块只负责判断用户目标,工具选择模块再结合上下文和工具能力做决策。


5. 槽位缺失

办公任务往往依赖关键参数。

比如发邮件至少需要:

  • 收件人;

  • 主题;

  • 正文;

  • 是否有附件;

  • 是否立即发送;

  • 是否需要抄送;

  • 语气风格。

用户只说“帮我写封请假邮件”,系统不能直接发送,因为收件人、请假时间、正文细节都不完整。

所以意图识别不能只输出:

{
  "intent": "send_email"
}

更应该输出:

{
  "intent": "email.create_or_send",
  "slots": {
    "recipient": null,
    "leave_time": null,
    "tone": "formal",
    "cc": null,
    "send_now": false
  },
  "missing_slots": ["recipient", "leave_time"],
  "next_action": "ask_clarification"
}

6. 高风险操作需要确认

办公 Agent 不是聊天机器人,很多动作会产生真实后果。

比如:

  • 发邮件;

  • 删除文件;

  • 修改日程;

  • 取消会议;

  • 提交审批;

  • 对外发送附件;

  • 修改客户资料。

这类操作不能因为模型判断“用户想发出去”就直接执行。

一般要做风险等级划分:

风险等级 示例 处理方式
低风险 查询日程、草拟邮件、总结文档 可直接执行
中风险 创建日程、生成待办、保存草稿 可执行,但要展示结果
高风险 发送邮件、删除文件、取消会议、提交审批 必须二次确认

比如用户说“现在发出去”,系统应该回复:

我将把这封请假邮件发送给王经理,并抄送 HR,请假时间是下周三下午,语气正式。是否确认发送?

确认后才调用邮件发送工具。


7. 任务中途切换

用户经常在一个任务还没完成时突然切换话题。

比如:

帮我写一封请假邮件。
等一下,先帮我看看明天下午有没有会。
好,继续刚才那封邮件。

这里系统要能识别“查日程”是一个新任务,但原来的邮件任务不能丢。
这就需要任务栈或 Session 状态管理。

可以维护类似结构:

{
  "active_task": "calendar.query",
  "paused_tasks": [
    {
      "task_id": "email_leave_request",
      "status": "drafting",
      "slots": {
        "recipient": "王经理",
        "leave_time": "下周三下午"
      }
    }
  ]
}

当用户说“继续刚才那封邮件”,系统可以恢复之前的邮件任务。


8. 企业内部术语歧义

办公场景里有大量企业内部术语。

比如:

发给 PM
同步给中台
走一下合同流程
拉一下 Alpha 项目的人
给风控那边看一下

这些词在不同公司含义不一样。

“PM”可能是产品经理,也可能是项目经理。
“中台”可能是组织、系统、部门,也可能是某个群组。
“Alpha 项目”可能对应多个文档、群聊、项目空间。

所以意图识别要结合企业知识库、组织架构、通讯录、权限系统、历史项目上下文,不能只靠通用大模型的常识。


四、解决方案

1. 上下文感知识别

意图识别不能只看当前 query,而要把这些信息都纳入上下文:

  • 当前用户输入;

  • 历史对话;

  • 当前页面或文档;

  • 用户选中的内容;

  • 当前任务状态;

  • 可用工具列表;

  • 用户角色和权限;

  • 企业内部知识库。

例如用户在一封邮件草稿页面说:

改得正式一点

系统应该识别为:

修改当前邮件草稿的语气

而不是泛泛地回答“可以,正式语气应该如何写”。


2. 分层意图体系

不要把所有意图平铺成几十个分类。
办公 Agent 更适合做分层意图。

例如:

一级意图:
- 邮件
- 日程
- 文档
- 审批
- 通讯录
- 待办
- 知识库

二级意图:
- 创建
- 查询
- 修改
- 删除
- 发送
- 总结
- 分享

三级意图:
- email.create_draft
- email.send
- email.modify_tone
- calendar.query_availability
- calendar.create_event
- document.summarize
- approval.submit

这样做的好处是:

第一,扩展性更好。
第二,可以按模块维护。
第三,便于和工具能力对齐。
第四,模型识别失败时,也可以先落到较粗粒度意图,再通过追问补齐。


3. 槽位抽取和缺失检测

识别意图之后,还要抽取槽位。

以发邮件为例,常见槽位包括:

{
  "recipient": "王经理",
  "cc": ["HR"],
  "subject": "请假申请",
  "body": "邮件正文",
  "tone": "正式",
  "leave_time": "下周三下午",
  "send_time": "now",
  "attachments": []
}

如果关键槽位缺失,不要硬执行,而是进入澄清流程。

比如:

请问请假时间是哪一天?
请问王经理是王磊还是王明?
这封邮件需要现在发送,还是先保存为草稿?

槽位抽取不是一次性完成的,而是在多轮对话中逐步补齐。


4. Session 状态管理

Session 状态是办公 Agent 的核心。

它要记录:

  • 当前任务是什么;

  • 已经收集了哪些槽位;

  • 还缺哪些槽位;

  • 用户刚刚修改了什么;

  • 当前任务是否可以执行;

  • 是否已经过确认;

  • 是否存在暂停任务。

一个简化的 Session 可以长这样:

{
  "task_id": "email_leave_request_001",
  "intent": "email.send_leave_request",
  "status": "collecting_slots",
  "slots": {
    "recipient": "王经理",
    "cc": ["HR"],
    "leave_time": "下周三下午",
    "tone": "正式",
    "body": null
  },
  "missing_slots": ["body"],
  "risk_level": "high",
  "confirmed": false
}

这比单轮意图分类可靠得多。


5. 任务状态机

办公任务最好不要只用一个状态字段,而是设计任务状态机。

例如邮件任务可以分为:

初始化
  ↓
识别意图
  ↓
收集槽位
  ↓
生成草稿
  ↓
用户修改
  ↓
待确认
  ↓
执行发送
  ↓
完成

其中任何一步都可能被用户打断、修改或取消。

比如用户在“待确认”阶段说:

先别发,把语气再委婉一点

状态就应该从“待确认”回到“用户修改”,重新生成草稿,而不是继续发送。


6. 工具选择策略

工具选择不能只靠意图标签。

更好的方式是综合判断:

用户目标 + 槽位 + 上下文 + 工具能力 + 权限 + 风险等级

比如“通知王经理”:

  • 如果上下文是邮件草稿,优先邮件;

  • 如果上下文是会议安排,可能创建日程邀请;

  • 如果用户说“马上告诉他”,可能走 IM;

  • 如果涉及正式审批,可能走审批系统或邮件;

  • 如果对方不在通讯录,需要澄清身份。

工具选择应该是一个独立模块,输入标准化任务表示,输出候选工具和调用参数。


7. 风险等级和二次确认

每个意图或工具都应该有风险等级。

例如:

{
  "tool": "email.send",
  "risk_level": "high",
  "need_confirm": true
}

二次确认要包含关键信息,而不是简单问“是否确认”。

不好的确认方式:

是否执行?

好的确认方式:

我将向王经理发送一封正式语气的请假邮件,内容是申请下周三下午请假,并抄送 HR。是否确认发送?

这样用户才能真正判断有没有问题。


8. 主动澄清

当信息缺失或存在歧义时,系统要主动澄清。

澄清问题要具体,不要泛泛地问“请补充信息”。

比如:

用户说:

发给王经理

如果通讯录里有多个王经理,应该问:

你指的是王磊经理还是王明经理?

用户说:

下周三下午

如果任务需要明确请假时间,可以问:

请问是下周三整个下午请假,还是从某个具体时间开始?

主动澄清的目标是减少用户输入成本,而不是把问题丢回给用户。


9. 规则 + 小模型 + LLM 混合方案

工程上不建议所有意图都交给大模型。

比较稳的架构是:

规则层:
处理高频、明确、强约束场景
例如“发送”“取消”“删除”“确认”等高风险关键词

小模型层:
处理常见意图分类和槽位抽取
优点是速度快、成本低、稳定性好

LLM 层:
处理复杂语义、多轮上下文、复合任务拆解、企业术语歧义

一个典型流程是:

用户输入
  ↓
规则预处理
  ↓
上下文拼装
  ↓
小模型做初步意图识别和槽位抽取
  ↓
LLM 处理复杂推理和歧义消解
  ↓
任务状态机更新
  ↓
工具选择和风险判断
  ↓
澄清 / 确认 / 执行

这样既能保证效果,也能控制成本和延迟。


五、办公场景案例解析

用户连续输入:

帮我写一封请假邮件
下周三下午
发给王经理
语气正式一点
顺便抄送 HR
现在发出去

系统应该如何处理?

第一步:识别初始意图

用户说:

帮我写一封请假邮件

系统识别为:

{
  "intent": "email.create_draft",
  "task_type": "leave_request_email",
  "slots": {
    "recipient": null,
    "leave_time": null,
    "tone": "default",
    "cc": [],
    "send_now": false
  },
  "status": "collecting_slots"
}

此时不能发送,只能进入草稿创建或信息收集状态。


第二步:补全时间槽位

用户说:

下周三下午

系统不能把它当成新意图,而要结合 Session 判断这是在补充请假时间。

更新状态:

{
  "leave_time": "下周三下午"
}

第三步:补全收件人

用户说:

发给王经理

系统识别为补充 recipient 槽位。

如果通讯录中只有一个王经理,可以直接填充。
如果有多个,则需要澄清:

你指的是产品部王经理,还是行政部王经理?

假设识别到唯一对象,状态更新为:

{
  "recipient": "王经理"
}

第四步:修改语气

用户说:

语气正式一点

系统识别为对当前邮件草稿的修改,而不是新任务。

更新:

{
  "tone": "formal"
}

并重新生成或调整邮件正文。


第五步:补充抄送人

用户说:

顺便抄送 HR

系统识别为增加 cc 槽位。

{
  "cc": ["HR"]
}

这里也可能需要结合组织架构解析 HR 是个人、部门邮箱还是 HR 群组。


第六步:识别高风险执行动作

用户说:

现在发出去

系统识别为:

{
  "intent": "email.send",
  "risk_level": "high",
  "need_confirm": true
}

虽然用户已经说“发出去”,但发送邮件是高风险操作,仍然建议二次确认。

系统可以回复:

我将向王经理发送一封正式语气的请假邮件,申请下周三下午请假,并抄送 HR。是否确认发送?

用户确认后,再调用邮件发送工具。


六、常见追问

追问 1:为什么不能只用 LLM 做意图识别?

因为办公 Agent 要稳定、可控、可审计。

LLM 擅长理解复杂语义,但它也可能出现输出不稳定、槽位遗漏、风险判断不一致的问题。
尤其是发送邮件、删除文件、提交审批这类操作,不能完全依赖模型自由生成。

更合理的是让 LLM 负责理解和推理,让规则、状态机、权限系统和风险控制负责约束执行。


追问 2:意图识别和工具调用有什么区别?

意图识别回答的是:

用户想完成什么目标?

工具调用回答的是:

用哪个系统、哪个 API、带哪些参数去完成?

两者不能混在一起。

比如用户说“通知王经理”,意图是通知,工具可能是邮件、IM、日程、审批系统。
具体用哪个工具,要结合上下文、用户习惯、任务类型和风险等级判断。


追问 3:如何处理槽位缺失?

核心原则是:低风险可先生成草稿,高风险必须补齐关键槽位。

比如“写一封请假邮件”,可以先生成草稿。
但“发一封请假邮件”,必须补齐收件人、请假时间、正文内容,并经过确认。

常见策略是:

关键槽位缺失 → 主动澄清
非关键槽位缺失 → 使用默认值或生成草稿
高风险操作缺槽 → 禁止执行

追问 4:如何处理用户中途改需求?

靠 Session 状态和任务状态机。

用户说“语气正式一点”,系统要知道这是修改当前邮件草稿。
用户说“先别发”,状态要从待确认回退到草稿。
用户说“继续刚才那个”,系统要能恢复被暂停的任务。

这类能力不是靠单次 Prompt 解决的,而是 Agent 框架层要维护状态。


追问 5:企业内部术语怎么解决?

需要接入企业知识库、通讯录、组织架构、项目空间和权限系统。

比如“王经理”“HR”“中台”“Alpha 项目”这些词,通用模型只能猜,企业 Agent 必须查内部数据。
如果匹配结果不唯一,就主动澄清;如果用户没有权限,就不能展示或执行相关操作。


七、可背诵模板

面试时可以这样背:

办公 Agent 的意图识别核心痛点不在于做一个简单分类器,而在于办公任务天然是多轮、模糊、省略、带上下文的。用户经常只说半句话,比如“发给王经理”“语气正式一点”“现在发出去”,系统要能判断这是新任务、补槽、修改当前任务,还是高风险执行动作。

我的方案是做上下文感知的分层意图识别。先把意图体系分成邮件、日程、文档、审批等一级意图,再细分创建、查询、修改、发送等二级意图。同时做槽位抽取,维护 Session 状态和任务状态机,把用户多轮补充的信息持续写入当前任务。对于缺失槽位要主动澄清,对于发送、删除、提交审批这类高风险操作必须做二次确认。

工具调用上,我不会把意图和工具做简单一一映射,而是根据用户目标、上下文、槽位、权限和风险等级选择工具。工程实现上可以采用规则 + 小模型 + LLM 的混合方案:规则处理高风险和强约束场景,小模型处理高频意图和槽位,LLM 处理复杂语义、多轮上下文和企业内部术语歧义。这样整体会比单纯 Prompt 调大模型更稳定,也更适合真实办公场景落地。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐