基于冰石机器人系统的招聘面试邀约机器人实现
摘要:大模型只会「说话」,不会发定位、发图片、打标签、建定时任务。冰石微信智能客服系统(以下简称「冰石机器人系统」)把 LLM 当作「决策大脑」,把微信/企业微信的真实操作封装成 18+ 内置工具,通过提示词 + 工具调用,即可在几乎不写业务代码的前提下,落地一套完整的招聘面试邀约与跟进机器人。本文以蓝领/服务业招聘场景为例,拆解设计与实现思路。
一、业务背景:招聘面试邀约到底要做什么?
典型招聘私域流程可以拆成两条线:
1.1 主流程(邀约漏斗)
| 步骤 | 机器人动作 | 业务目的 |
|---|---|---|
| 1 | 询问面试岗位 | 确认意向岗位 |
| 2 | 确认求职者年龄 | 过滤不符合要求的候选人 |
| 3 | 介绍工资待遇 | 建立预期、提高转化率 |
| 4 | 询问是否接受住宿 | 筛选异地/本地候选人 |
| 5 | 询问是否能两班倒 | 筛选排班适配度 |
| 6 | 收集电话和姓名 | 建档、后续联系 |
| 7 | 根据位置匹配面试中心 | 就近安排,降低爽约率 |
| 8 | 发送邀请函 | 定位 + 指路图 + 文字说明 |
1.2 跟进流程(生命周期触达)
| 时机 | 动作 |
|---|---|
| 面试前 2 小时 | 出发提醒 |
| 面试结束当天 | 询问面试结果,提醒次日入职 |
| 入职日早上 | 入职出发提醒 |
| 入职后 | 询问入职情况 |
1.3 标签体系
根据求职者每一轮回复自动打标签,例如:
意向-普工/意向-质检年龄-不符/年龄-符合可住宿/不可住宿可两班倒/不可两班倒已邀约-茶园中心/已邀约-江北中心待面试/已入职/已流失
标签不是给人看的备注,而是 后续筛选、滴灌群发、人工接管的结构化数据。
二、为什么选冰石机器人系统做基座?
很多团队的第一反应是:「接一个大模型 API,写个 Python 脚本监听微信消息不就行了?」
问题在于,招聘场景的真实复杂度不在「聊天」,而在 渠道能力 和 运营闭环:
| 能力 | 自研脚本 | 冰石机器人系统 |
|---|---|---|
| 个人微信 / 企业微信 / 闲鱼 | 各写一套 | 统一后台,多端复用 |
| 大模型多厂商接入 | 自己封装 | 后台配置 DeepSeek / 通义 / OpenAI 等 |
| 发文字 | 简单 | ✅ |
| 发图片/文件/定位 | 各端 API 差异大 | ✅ 内置 send_media / send_location |
| 打标签 | 要自己对接 | ✅ set_friend_remark_tag / wecom_contact_personal_label |
| 定时提醒 | 自己写 cron | ✅ 定时群发 + 滴灌群发 |
| 无回复自动跟进 | 自己写 timer | ✅ 内置无回复续聊 |
| 人工接管切换 | 难做 | ✅ switch_session_mode |
| 管理后台 | 没有 | Vue 管理端 + RBAC 权限 |
冰石机器人系统的定位:不是「又一个 ChatGPT 套壳」,而是 可配置的私域客服操作系统——LLM 负责理解与决策,系统负责执行。
系统回复优先级为:关键词 → FAQ → 大模型(含工具调用),适合把刚性规则(如年龄下限)交给关键词/FAQ,把灵活对话交给 LLM。
三、系统架构:LLM 是大脑,工具是手脚
四、核心问题:大模型只会输出文字,怎么发定位和图片?
这是本文的技术重点。
4.1 本质:Function Calling 的工程化落地
大模型 API 返回的是 文本 token。要让机器人发定位,不能指望模型「凭空生成一个微信定位气泡」——必须走 工具调用(Tool Calling):
- 在系统配置中 启用工具调用,并勾选所需工具;
- 在提示词中写清 何时调用哪个工具、参数格式;
- LLM 输出结构化 JSON;
- 系统解析 JSON,调用真实工具;
- 工具执行结果可选地反馈给 LLM,生成最终话术。
冰石系统的解析逻辑在 parse_llm_response_with_tools() 中:从 LLM 回复里提取 tool_calls 数组,校验工具名是否在 当前聊天配置允许列表 内,再交给 ToolExecutionService 执行。
安全设计:即使模型「幻想」出一个工具名,未在后台勾选的工具也会被跳过,不会越权执行。
4.2 发送定位:send_location
企业微信场景可直接发地图定位气泡:
{
"tool_calls": [
{
"tool_name": "send_location",
"tool_type": "notification",
"parameters": {
"title": "南岸区茶园面试中心",
"address": "重庆市南岸区某某路88号",
"latitude": 29.510868,
"longitude": 106.656882
}
}
]
}
对应工具实现见 backend/tools/send_location_tool.py,底层调用企业微信第三方 API 的 send_location_message。
个人微信侧可用 send_favorite 发送收藏里的定位条目,或 send_media 发送指路图。
4.3 发送图片:send_media
邀请函里的「指路图」「门店外观图」:
{
"tool_calls": [
{
"tool_name": "send_media",
"tool_type": "file_operation",
"parameters": {
"media_type": "image",
"file_path": "uploads/茶园中心指路图.jpg"
}
}
]
}
文件需预先上传到机器人 uploads 目录,或通过管理后台「文件上传管理」入库。
4.4 发送文字通知:send_notification
纯文字提醒(出发提醒、入职确认等):
{
"tool_calls": [
{
"tool_name": "send_notification",
"tool_type": "notification",
"parameters": {
"message": "您好,您的面试将在两小时后开始,请提前出发~",
"recipient_type": "wechat"
}
}
]
}
未指定 recipient_id 时,默认发往 当前会话,适合 1v1 私聊跟进。
4.5 典型一轮「发邀请函」的工具编排
提示词中可要求模型 一次回复里顺序调用多个工具:
1. send_location → 发面试中心定位
2. send_media → 发指路图
3. send_notification → 发文字邀请函(含时间、联系人、注意事项)
4. set_friend_remark_tag → 打标签「已邀约-茶园中心」「待面试」
5. update_customer_note → 写入面试时间、岗位等到客户备注
这正是「LLM 只说话,但机器人能干活」的关键:说话和执行解耦,执行走工具链。
五、面试中心匹配:LLM + Python 工具
「根据求职者位置匹配最近面试中心」是 确定性逻辑,不建议完全交给 LLM 心算。
冰石系统提供 python_code_executor 工具,可在服务端执行 Python 计算:
# 提示词中嵌入的匹配逻辑示例(简化)
centers = [
{"name": "茶园中心", "lat": 29.51, "lon": 106.65, "addr": "南岸区..."},
{"name": "江北中心", "lat": 29.58, "lon": 106.53, "addr": "江北区..."},
]
# 根据用户说的区县/地标做字符串匹配或距离计算
user_location = "我在南岸"
matched = next(c for c in centers if c["name"][:2] in user_location or "南岸" in user_location)
result = matched # 工具返回给 LLM,LLM 再组织话术并调用 send_location
更稳妥的做法是:把中心列表维护在后台 FAQ/商品库/配置文件,LLM 只负责 抽取用户位置意图,匹配逻辑走 Python 或关键词规则。
六、标签系统:让对话产生可运营的数据
6.1 个人微信:set_friend_remark_tag
{
"tool_calls": [
{
"tool_name": "set_friend_remark_tag",
"parameters": {
"tags": "可住宿",
"remark": "张三-普工-待面试"
}
}
]
}
- 个人微信通过客户端 UI 自动化打标签;
- 支持
remove_tags先删后加,便于标签状态迁移(如待面试→已入职)。
6.2 企业微信:wecom_contact_personal_label
{
"tool_calls": [
{
"tool_name": "wecom_contact_personal_label",
"parameters": {
"action": "add",
"tag_name": "意向-普工"
}
}
]
}
无同名标签时会 自动创建 个人标签再打上。
6.3 本地会话目录标签
系统还在 chat_session_catalog 中维护好友会话的 tags 与 tag_registry,与「从微信导入」「按标签筛选滴灌群发」联动——这是做 批量跟进 的基础。
6.4 提示词中的标签规范(重要)
参考系统内置的汽服私域模板(prompt_presets.py),标签闭环的最佳实践是:
- 标签名白名单:在提示词里枚举允许的标签,禁止模型自造;
- 状态机式迁移:每个对话阶段明确「打什么标签、删什么标签」;
- 先工具后话术:确定关键信息后,先调用打标签工具,再回复用户。
招聘场景标签示例:
| 用户回复 | 标签动作 |
|---|---|
| 「可以接受住宿」 | +可住宿 |
| 「不能接受两班倒」 | +不可两班倒 -可两班倒 |
| 确认参加茶园中心面试 | +已邀约-茶园中心 +待面试 |
| 明确拒绝 | +已流失 |
七、跟进流程:三种定时能力怎么选?
面试邀约的跟进涉及 绝对时间点(面试前 2 小时)和 相对时间点(用户沉默 30 分钟再追问),冰石系统提供三层能力:
7.1 无回复续聊(对话内跟进)
内置 llm_no_reply_followup:用户长时间未回复时,系统再次调用 LLM 生成 简短跟进话术,推动对话继续。
- 适合:问完「能否接受住宿」后对方半晌没回;
- 结束跟进:调用
cancel_no_reply_followup_wait工具,避免已流失用户被反复打扰。
7.2 定时群发 / 大模型创建群发任务
create_broadcast_config 工具支持创建 daily / weekly / monthly / once 定时任务:
{
"tool_calls": [
{
"tool_name": "create_broadcast_config",
"parameters": {
"name": "张三-面试前提醒",
"schedule_type": "once",
"schedule_time": "13:00",
"start_date": "2026-06-21",
"group_names": ["张三"],
"message_type": "text",
"message_content": "您好,两小时后面试开始,请带好身份证..."
}
}
]
}
底层走 UnifiedBroadcastService + SchedulerService,支持队列、重试、执行日志。
实践建议:确认面试时间的当下,让 LLM 调用
create_broadcast_config创建 一次性 提醒任务;入职日早上同理。
7.3 滴灌群发(批量生命周期触达)
管理后台「顺序定时群发(滴灌式)」适合:
- 对
待面试标签好友批量发提醒; - 发送成功后自动打标签并写回本地目录;
- 支持随机间隔、断点续传,避免封号风险。
滴灌是 运营侧独立功能,不是 LLM 工具——大批量触达建议人工在后台配置,LLM 负责 1v1 建档和打标。
八、完整提示词结构示例(招聘面试邀约)
下面是一段可放入「聊天配置 → AI 大模型提示词」的骨架(需按实际业务填充):
# 角色
你是XX人力资源公司的招聘顾问小冰,负责微信私聊中的面试邀约与跟进。
# 对话流程(严格按顺序,不可跳步)
1. 询问意向岗位(普工/质检/仓管...)
2. 确认年龄(要求18-45岁;不符则礼貌结束并打标签「年龄-不符」)
3. 介绍对应岗位工资待遇(见下方知识库)
4. 询问是否接受公司住宿
5. 询问能否接受两班倒
6. 收集姓名和手机号
7. 询问所在区域,匹配最近面试中心
8. 确认面试时间后,发送邀请函
# 知识库
## 岗位待遇
- 普工:综合 5000-7000,包吃住...
## 面试中心
| 中心 | 地址 | 经纬度 | 指路图文件 |
|------|------|--------|-----------|
| 茶园中心 | 南岸区... | 29.51, 106.65 | 茶园指路图.jpg |
| 江北中心 | 江北区... | 29.58, 106.53 | 江北指路图.jpg |
# 工具调用规范(必须遵守)
- 需要发定位、图片、打标签、建定时提醒时,**只输出 JSON**,不要编造已发送。
- 标签只能使用白名单:意向-*、年龄-*、可住宿、不可住宿、可两班倒、不可两班倒、
已邀约-*、待面试、已入职、已流失
- 发邀请函时必须依次调用:send_location → send_media → set_friend_remark_tag
- 确认面试时间后,调用 create_broadcast_config 创建面试前2小时 once 提醒
- 用户明确拒绝时:打标签「已流失」,并调用 cancel_no_reply_followup_wait
# 输出格式
调用工具时,回复必须是合法 JSON:
{
"tool_calls": [
{
"tool_name": "send_location",
"tool_type": "notification",
"parameters": { ... }
}
]
}
系统已有行业预设模板(汽服私域等)采用了相同的 「阶段 + 工具 + 标签闭环」 写法,招聘场景可直接复用该模式。
九、部署与配置 Checklist
- 安装启动:运行
冰石微信智能客服系统.exe,浏览器打开http://localhost:8000 - 大模型配置:「大模型设置 → 大模型配置管理」填写 API Key
- 聊天配置:为招聘号私聊会话绑定大模型 + 粘贴提示词
- 启用工具:「系统配置管理 → 启用工具调用 → 选择工具」勾选:
send_notification/send_media/send_locationset_friend_remark_tag/wecom_contact_personal_labelcreate_broadcast_config/update_customer_notecancel_no_reply_followup_wait/switch_session_mode- (可选)
python_code_executor
- 素材准备:指路图上传到
uploads/,企业微信定位经纬度预先录入知识库 - 验证工具清单:
GET /api/tool-calling/tools核对当前实例可用工具
十、效果与扩展
10.1 这套方案的实际价值
- 开发成本低:核心逻辑在提示词 + 工具编排,无需从零对接微信协议;
- 可运营:标签 + 滴灌 + 定时群发,形成「邀约 → 到面 → 入职」漏斗;
- 可降级:复杂客诉
switch_session_mode一切人工;刚性规则走关键词/FAQ; - 可扩展:
python_code_executor、自定义插件工具可注册进ToolRegistry。
10.2 常见坑
| 问题 | 原因 | 解决 |
|---|---|---|
| 模型说「已发送定位」但实际没发 | 未输出工具 JSON | 提示词强调「必须调用工具」 |
| 工具不执行 | 后台未勾选工具 | 系统配置里启用并保存 |
| 定位发不出 | 用了个人微信 | 企微用 send_location,个微用 send_favorite |
| 标签乱了 | 模型自造标签名 | 提示词白名单 + 示例 |
| 提醒没触发 | once 任务日期/时间错误 |
检查 start_date + schedule_time |
十一、总结
招聘面试邀约机器人,表面是「聊天」,实质是 私域 CRM + 多渠道消息执行 + 定时触达 的组合问题。
冰石机器人系统的思路很清晰:
LLM 负责理解人话、走流程、做决策;内置工具负责发定位、发图、打标签、建定时任务——把「会说」变成「会做」。
对于技术团队而言,它提供了一套 可配置的客服基座:换一套提示词和工具组合,同一套系统可以服务招聘、汽服私域、闲鱼电商、企业微信 B2B 等不同场景——这正是「基座型客服系统」的核心价值。
本文基于冰石微信智能客服系统实际代码与文档整理,工具名称与接口以部署版本为准。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)