🤖 LLM 与编排器的协同架构
以提箱点工作流为例 · LLM 只负责 NLP,流程决策由编排器掌控
🧠 代码层
编排器(Orchestrator)
• 维护工作流状态(idle → params_ready → awaiting → done)
• 根据状态选择对应的 Prompt 模板
• 调用 LLM → 解析结构化输出 → 路由下一步
• 执行确定性逻辑:查库存、调算法、写 session
• 决定"下一步做什么"
💬 NLP 层
大语言模型(LLM)
• 意图分类 + 参数提取(自然语言 → 结构化数据)
• 用户回复解析(选推荐/跳过/自定义)
• 回复生成(结构化数据 → 自然语言)
不参与流程决策、状态跳转判断
• 每次调用是独立任务,不感知整张状态图
编排器调 LLM,LLM 返回结构化 JSON
举例:用户说"我有一批货在深圳坂田,要发到汉堡,40HQ两个"
编排器
状态: idle
收到用户消息,检测 workflow_state == null,进入意图分类流程。
选择 Prompt:extract_intent,携带对话历史发给 LLM。
LLM
被调用
输出:{ "intent": "route_plan", "params": { "factory": "深圳坂田", "destination": "汉堡", "container_type": "40HQ", "count": 2 } }
编排器
状态 → params_ready
解析 LLM 输出 → intent = route_plan
更新状态为 params_ready,保存参数到 session。
调用守卫条件评估:¬has_pickup ∧ ¬user_skipped → 走推荐路径。
查询附近提箱点(确定性代码,不调 LLM)。
编排器
状态 → awaiting
查到推荐结果,更新状态为 awaiting_pickup_select
选择 Prompt:pickup_recommend_reply,调 LLM 生成回复。
LLM
被调用
输出回复文本:"根据您的位置,为您推荐以下提箱点:A. 盐田港(12km)B. 龙岗物流园(8km)..."
用户
回复:"用B"
编排器
状态: awaiting
检测到 workflow_state.step == awaiting_pickup_select,不走意图分类。
选择 Prompt:interpret_pickup_selection,携带推荐列表 + 用户回复,调 LLM。
LLM
被调用
输出:{ "action": "select", "selected_index": 1 }
编排器
状态 → done → idle
解析结果为 action=select,选择项在推荐列表中已有库存确认。
调用路线算法(确定性代码),更新状态 done → idle
选择 Prompt:reply,调 LLM 生成最终回复给用户。
环节 谁负责 说明
状态管理 编排器 维护 workflow_state,决定当前处于 idle / params_ready / awaiting / done
Prompt 选择 编排器 根据状态选择对应模板(intent分类 / 选择解析 / 回复生成)
路由决策 编排器 解析 LLM 输出 JSON 后,决定下一步走哪条分支
确定性逻辑 编排器 查库存、调路线算法、地理编码、读写 session 等
意图理解 LLM 自然语言 → 结构化数据(intent + params)
选择解析 LLM 用户自然语言回复 → { action, index, name }(无前端 UI 时)
文本生成 LLM 结构化结果 → 自然的对话回复
核心原则: LLM 做它能做的——理解与生成;代码做它该做的——路由与决策。