BotOf TechAI / IoT / Full-Stack / 植物养护知识分享
返回首页现场服务 Agent:让模型理解工单,让优化器安排人、车、备件和时间窗

现场服务 Agent:让模型理解工单,让优化器安排人、车、备件和时间窗

电力、设备维保、物业和售后服务常年面对同一个难题:客户描述不完整,调度员要判断技能、位置、备件、优先级和时间窗。Microsoft 2026 年 9 月发布的 Dynamics 365 Scheduling Operations Agent,就是将多资源优化与人工审核结合;Google 10 月案例中,Hitachi 一线人员已经构建 200 多个 Agent 场景,生产率最高提升 30%。

现场服务不是“问谁有空”这么简单。错误派单会造成二次上门、SLA 违约和车辆空驶,必须将语义理解与组合优化分开。

流程图:Agent 从工单中提取技能与备件需求,优化器结合位置、班次和 SLA 排程,调度员确认后下发到现场并回收执行证据。

模型把非结构化诉求变成约束,优化器求可行解,人类处理取舍与突发事件。

先把工单编译成约束

class DispatchRequest(BaseModel):
    job_id: str
    location: tuple[float, float]
    required_skills: set[str]
    required_parts: dict[str, int]
    duration_minutes: int
    earliest: datetime
    latest: datetime
    sla_penalty_per_minute: float
    safety_level: Literal["normal", "licensed", "two_person"]

Agent 从电话记录、设备型号和历史工单中抽取这些字段;缺少设备序列号或安全等级时进入补充信息,而不是给出低置信排班。

调度由求解器完成

from ortools.sat.python import cp_model

model = cp_model.CpModel()
assign = {(j, t): model.NewBoolVar(f"a_{j}_{t}") for j in jobs for t in techs}

for j in jobs:
    model.Add(sum(assign[j, t] for t in techs if qualified(t, j)) == 1)
for t in techs:
    add_no_overlap(model, t, jobs, assign, travel_minutes)
    enforce_shift_and_parts(model, t, jobs, assign)

model.Minimize(travel_cost(assign) + sla_penalty(assign) + overtime_cost(assign))

LLM 可以解释为什么把 A 工单分给张师傅,但不能自行忽略资质或备件约束。求解器若无解,要返回冲突集合,让 Agent 建议外包、改约或跨仓调拨。

变更必须带版本与影响面

调度表是持续变化的共享状态。Agent 每次提交变更时携带 schedule_version,写入前做乐观锁;若调度员刚刚手动改派,就重新求解。高优先级插单不应只移动一个工单,还要展示受影响客户和加班成本。

{
  "base_version": 418,
  "changes": [{"job": "J-82", "from": "T-07", "to": "T-12"}],
  "impact": {"late_jobs": 0, "extra_km": 18, "overtime_minutes": 25},
  "requires_approval": true
}

现场端必须允许离线和人工接管

移动端缓存当天工单、操作规程和必要模型;网络恢复后按事件序列同步照片、签字、用料和设备状态。Agent 生成的步骤不能覆盖安全作业票,技术员必须能暂停、标记不适用并直接呼叫专家。

核心指标包括首次修复率、每单里程、技术员利用率、准时到达率、二次上门率、备件缺失率和调度员人工调整次数。最先落地的往往不是全自动排班,而是工单结构化、缺失信息补齐和候选排程,这已经能显著减少调度时间。

参考资料