办事入口
CRITICAL — 开始前 MUST 读取 ../beisen-shared/SKILL.md
任务目标
- 本 Skill 用于:根据用户自然语言输入,检索系统菜单并按意图匹配推荐功能入口
- 触发条件:用户询问功能入口位置、导航路径,表达业务操作意图,或输入疑似功能/菜单名称的文本(含 Agent 弱信号仲裁后的探测式路由)
说明:权限校验、阈值过滤、终端适配均由后端
menuSearch自动处理,返回结果均已过滤。menuSearch检索的是租户实时菜单库(含自定义视图/鲁班页/ocean 菜单),因此不预设句式、不枚举关键词,能否命中由检索证据决定。
路由优先级
本 Skill 处理:搜索并唤起 HR 业务操作菜单、引导用户进入业务办理页面
不归本 Skill 处理:
- 企业知识制度搜索 → ../beisen-knowledge/SKILL.md
- 具体业务数据的查询 → 各对应业务域 Skill / ../beisen-data-query/SKILL.md
- 审批查询 → ../beisen-approval/SKILL.md
命令速查
| 场景 | CLI 命令 | 说明 |
|---|---|---|
| 搜索菜单 | beisen-cli staffservice employeeWork menuSearch --data '{"query":"<用户问题>","minScore":0.3}' |
按语义匹配检索租户菜单库 |
minScore固定传0.3,仅返回匹配分数严格大于该值的菜单。query传用户原始问题(可参考同义词表改写,提升命中率)。
操作步骤
步骤零:意图预分类
在调用检索工具前,先判断用户意图类型:
| 意图类型 | 识别特征 | 处理方式 |
|---|---|---|
| 导航意图 | "在哪看XX"、"XX在哪"、"打开XX"、"XX菜单" | 进入步骤一,入场方式记为明确找入口 |
| 功能名意图 | 裸名词、短语、疑似功能/页面/报表/菜单的名称或描述性文本(如"我的目标""日报""周报",及任意自定义菜单名/描述) | 进入步骤一,入场方式记为探测式 |
| 操作意图 | "帮我请假"、"我要请假"、"请假申请"、"我要出差"、"我要休假"、"申请加班"、"提交报销"、"修改银行卡"等,即用户表达要执行某项业务操作的意图 | 进入步骤一,入场方式记为明确找入口 |
| 咨询意图 | "XX流程是什么"、"年假怎么算"、"离职政策" | 进入步骤一,有相关菜单则一并推荐;无则按入场方式退出(见步骤三) |
入场方式决定无命中时的退出行为:明确找入口 → 输出兜底文案;探测式 → 零输出静默退回(见步骤三)。若 Agent 已在弱信号仲裁中完成
menuSearch探测并确认菜单强命中后才路由进来,同样按探测式处理。
步骤一:调用菜单检索工具
执行 CLI 命令搜索菜单:
beisen-cli staffservice employeeWork menuSearch --data '{"query":"<用户原始问题>","minScore":0.3}'
参数说明:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| query | string | 是 | 用户原始问题(可参考同义词表改写,提升命中率) |
| minScore | number | 是 | 固定传 0.3 |
同义词参考(仅作检索改写的辅助手段,不承担路由职责;未列入的表达直接用原文检索):
- "打卡" / "签到" → "考勤"
- "工资" / "薪水" → "薪资"
- "请假" / "休假" → "假期"
- "打开日程菜单" → "日程"
返回结构:
CLI 返回的外层包装:
{
"ok": true,
"identity": "user",
"data": {
"code": "200",
"data": {
"itemsCount": 6,
"items": [
{
"menuId": "d594f7c9-153f-4ea0-9527-7a8f4b4740f3",
"menuName": "日程",
"menuDescription": "用于预定日程,员工也可查看自己和他人的日程",
"menuLink": "https://xxxx/xxx/oR352Sn1"
}
]
},
"message": null
}
}
关键路径:data.data.items(注意双层 data 嵌套)。
字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
| menuId | string | 菜单唯一标识 |
| menuName | string | 菜单名称(用于展示) |
| menuDescription | string | 菜单描述(可能为空) |
| menuLink | string | 菜单跳转链接(完整 URL,用于生成可点击链接) |
data.code == "200"→ 业务成功,结果在data.data:itemsCount > 0→ 进入步骤二判断意图是否命中itemsCount == 0或items为空 → 按步骤三的无命中分支处理
data.code != "200"→ 业务失败,原因在data.message,按步骤四异常处理
步骤二:判断用户意图是否命中
返回菜单是语义相近的候选,需逐一判断是否真正符合用户意图:
- 结合用户问题和
menuName、menuDescription判断 - 根据意图精度动态控制输出数量,上限 4 个:
- 精确意图(单一功能):1-2 个
- 中等意图(一类功能):2-3 个
- 宽泛意图(一个领域):最多 4 个
- 若无菜单命中意图,按步骤三的无命中分支处理
步骤三:输出结果
有命中 → 回复引导文案:
你可能需要操作:,然后以 Markdown 链接列表输出命中的菜单。Agent 自主从返回数据中提取menuName和menuLink,生成可点击链接:- [菜单名称1](菜单链接1) - [菜单名称2](菜单链接2)输出规则:
- 链接文本使用
menuName(菜单名称),URL 使用menuLink(完整跳转地址) - 若
menuDescription非空,可在链接后用括号补充简要描述,帮助用户判断 - 示例:
- [日程](https://xxxx/xxx/oR352Sn1)(用于预定日程,员工也可查看自己和他人的日程)
- 链接文本使用
无命中(检索为空或返回菜单均不符合意图),按入场方式分支:
- 明确找入口(用户明确询问入口/导航/操作)→ 输出兜底文案:
没找到这个入口,换个说法我再帮你看看? - 探测式(功能名意图/咨询意图/Agent 弱信号仲裁转入)→ 零输出静默退回:不输出任何文案、解释或兜底语,由 Agent 按失败兜底链继续处理(知识查询/兜底)
- 明确找入口(用户明确询问入口/导航/操作)→ 输出兜底文案:
步骤四:异常处理
若 menuSearch 调用失败(code != "200" 业务失败、超时、异常、返回格式错误等):
- 检测当前会话中是否有其他可用 Skill(如 ../beisen-knowledge/SKILL.md 知识库检索、../beisen-data-query/SKILL.md 数据查询等)
- 若有可用 Skill → 将用户原始问题转交对应 Skill 处理
- 若无可替代 Skill → 输出兜底文案:
没找到这个入口,换个说法我再帮你看看?
多轮对话
当用户首次检索无命中后继续追问时,结合上下文补全 query:
- 用户追问中省略主语或宾语时,从上一轮对话中提取并拼接
- 示例:用户先问"在哪看我的工资" → 无命中 → 追问"那出勤呢?" → query 补全为"在哪看我的出勤"
使用示例
示例 1:导航意图命中
- 输入:用户问"在哪里看工资条"
- 处理:执行
beisen-cli staffservice employeeWork menuSearch --data '{"query":"在哪里看工资条","minScore":0.3}'→ 判断返回菜单命中意图 - 输出:
你可能需要操作: - [工资条](https://xxxx/xxx/xxxxxx)
示例 2:操作意图命中(多菜单)
- 输入:用户说"我想打开文化激励"
- 处理:执行
beisen-cli staffservice employeeWork menuSearch --data '{"query":"文化激励","minScore":0.3}'→ 返回多个候选 → 判断多个菜单命中意图 - 输出:
你可能需要操作: - [文化激励](https://xxxx/xxx/xxxxxx) - [文化激励管理](https://xxxx/xxx/yyyyyy)
示例 3:操作意图命中(请假/出差/休假)
- 输入:用户说"帮我请个假" / "我要出差" / "我要休假"
- 处理:意图分类为操作意图 → 执行
beisen-cli staffservice employeeWork menuSearch --data '{"query":"帮我请个假","minScore":0.3}'→ 判断返回菜单命中意图 - 输出:
你可能需要操作: - [请假申请](https://xxxx/xxx/xxxxxx)
示例 4:功能名意图(裸名词)命中
- 输入:用户说"我的目标"(或"日报""周报",或某自定义菜单的名称/描述文本)
- 处理:功能名意图 → 执行
beisen-cli staffservice employeeWork menuSearch --data '{"query":"我的目标","minScore":0.3}'→ 返回菜单与输入语义一致,命中 - 输出:
你可能需要操作: - [我的目标](https://xxxx/xxx/xxxxxx)
示例 5:咨询意图有相关菜单
- 输入:用户问"年假怎么算"
- 处理:执行
beisen-cli staffservice employeeWork menuSearch --data '{"query":"年假怎么算","minScore":0.3}'→ 返回"假期余额"和"请假记录"菜单 → 与咨询内容相关,一并推荐 - 输出:
你可能需要操作: - [假期余额](https://xxxx/xxx/xxxxxx) - [请假记录](https://xxxx/xxx/yyyyyy)
示例 6:明确找入口但无返回
- 输入:用户问"怎么修改银行卡信息",
menuSearch返回itemsCount=0 - 输出:
没找到这个入口,换个说法我再帮你看看?
示例 7:探测式入场无命中 → 静默退回
- 输入:用户说"月度总结"(功能名意图),
menuSearch返回itemsCount=0 - 处理:探测式入场 → 零输出静默退回,由 Agent 继续走知识查询/兜底;不输出"没找到入口"等任何文案
示例 8:多轮对话接续
- 第一轮:用户问"在哪看我的工资"(明确找入口)→ 无命中 → 输出
没找到这个入口,换个说法我再帮你看看? - 第二轮:用户追问"那出勤呢?" → query 补全为"在哪看我的出勤" → 执行 CLI 命令检索
示例 9:路由判断 — 数据查询非本 Skill 范围
- 输入:用户问"我的年假还有多少?"
- 处理:此为业务数据查询(非办事入口),应路由到 ../beisen-attendance-leave/SKILL.md / ../beisen-data-query/SKILL.md,而非本 Skill
禁止事项
- 不得跳过
menuSearch直接编造 menuId 或 menuLink - 不得修改后端返回的
menuId或menuLink - 不得在无命中时输出菜单链接列表
- 不得强制输出菜单:意图不匹配时按入场方式输出兜底文案或静默退回
- 不得在探测式入场无命中时输出任何文案(必须零输出静默退回)
- 不得输出冗余的思考过程
menuLink必须从 CLI 返回中提取,严禁编造 URL
详细参考
- references/service-menu.md:菜单命令详细参数与返回格式
- ../beisen-shared/SKILL.md:CLI 安装检查、SSO 认证、错误处理通用策略
不在本 Skill 范围
- 企业知识制度搜索 → ../beisen-knowledge/SKILL.md
- 具体业务数据的查询 → 各对应业务域 Skill / ../beisen-data-query/SKILL.md
- 审批查询 → ../beisen-approval/SKILL.md