场景化输入识别 - 从自然语言到结构化单据
本文档探讨五金门店核心场景:销售单、采购单、退货单、产品资料修改的智能化处理。
一、核心挑战
1.1 典型问题
用户说 → 系统理解
销售场景:
"李文明需要螺丝刀3把,螺丝m8 100斤,电线2平方红色2卷"
→ 客户: 李文明, 产品: [螺丝刀×3, 螺丝m8×100斤, 电线2平方红色×2卷]
采购场景:
"向湖南日升商贸采购螺丝刀3把,螺丝m8 100斤"
→ 供应商: 湖南日升商贸, 产品: [螺丝刀×3, 螺丝m8×100斤]
退货场景:
"李文明退螺丝刀2把"
→ 客户: 李文明, 产品: 螺丝刀×2, 意图: 退货
产品修改:
"把鹏锐螺丝刀m4的库存改成20把"
→ 产品: 鹏锐螺丝刀m4, 属性: 库存, 新值: 20把
1.2 难点分析
┌─────────────────────────────────────────────────────────────────────┐
│ 四大难点 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 1. 口语化表达随意 │
│ ───────────────────────────────────────────────────────────────── │
│ "螺丝m8" = "M8螺丝" = "8mm螺丝" = "m8螺丝" │
│ "2平方红色" = "红色2平方" = "2平红色" │
│ "电线2卷" = "电线2圈" = "2卷电线" │
│ │
│ 2. 产品信息不完整 │
│ ───────────────────────────────────────────────────────────────── │
│ 用户说"螺丝刀" → 可能指: │
│ - 鹏锐十字螺丝刀 m4 │
│ - 史丹利螺丝刀 m6 │
│ - 大盛螺丝刀 m8 │
│ 需要结合上下文/历史记录/品牌偏好推断 │
│ │
│ 3. 数量单位歧义 │
│ ───────────────────────────────────────────────────────────────── │
│ "螺丝m8 100斤" → 斤?个?盒? │
│ "电线2平方" → 平方毫米?米? │
│ "螺丝刀3把" → 把=个?但钉子可能论斤 │
│ │
│ 4. 多产品批量处理 │
│ ───────────────────────────────────────────────────────────────── │
│ 一句话包含5-10个产品,每个产品有3-5个属性 │
│ 需要正确切分、归类、关联 │
│ │
└─────────────────────────────────────────────────────────────────────┘
二、核心场景分类
2.1 场景总览
┌─────────────────────────────────────────────────────────────────────┐
│ 四大核心场景 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 销售单 │ │ 采购单 │ │ 退货单 │ │ 产品修改 │ │
│ │ │ │ │ │ │ │ │ │
│ │ 客户→产品 │ │ 供应商→产品│ │ 客户→产品 │ │ 产品→属性 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ 共同要素: │
│ • 人员/供应商识别(没有则创建) │
│ • 产品识别 + 规范化命名 │
│ • 数量 + 单位解析 │
│ • 属性提取(品牌/型号/规格/颜色) │
│ │
└─────────────────────────────────────────────────────────────────────┘
2.2 销售场景详解
输入:
"李文明需要螺丝刀3把,螺丝m8 100斤,电线2平方红色2卷"
目标结构:
┌─────────────────────────────────────────────────────────────────────┐
│ 销售单 │
├─────────────────────────────────────────────────────────────────────┤
│ 客户: 李文明(无则创建) │
│ ───────────────────────────────────────────────────────────────── │
│ 日期: 2026-05-17 │
│ │
│ 产品清单: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ # │ 产品名称 │ 规格 │ 颜色 │ 数量 │ 单位 │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ 1 │ 螺丝刀 │ - │ - │ 3 │ 把 │ │
│ │ 2 │ 螺丝 │ M8 │ - │ 100 │ 斤 │ │
│ │ 3 │ 电线 │ 2平方 │ 红色 │ 2 │ 卷 │ │
│ └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
实体提取过程:
┌─────────────────────────────────────────────────────────────────────┐
│ Step 1: 意图识别 │
│ ───────────────────────────────────────────────────────────────── │
│ 关键词: "需要" → buy / create_order │
│ 置信度: 0.95 │
│ │
│ Step 2: 人员识别 │
│ ───────────────────────────────────────────────────────────────── │
│ "李文明" → 查客户表 → 存在则关联,不存在则创建 │
│ 规则: 句首/句中的未识别词 + 上下文是"需要/要/买" → 高概率客户名 │
│ │
│ Step 3: 产品列表切分 │
│ ───────────────────────────────────────────────────────────────── │
│ 输入: "螺丝刀3把,螺丝m8 100斤,电线2平方红色2卷" │
│ │
│ 切分标志: ","(逗号) │
│ ↓ │
│ ["螺丝刀3把", "螺丝m8 100斤", "电线2平方红色2卷"] │
│ │
│ Step 4: 单产品解析 │
│ ───────────────────────────────────────────────────────────────── │
│ "螺丝刀3把" │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 品牌: 待定(需确认) │ │
│ │ 产品名: 螺丝刀 │ │
│ │ 规格: 空 │ │
│ │ 型号: 空 │ │
│ │ 颜色: 空 │ │
│ │ 数量: 3 │ │
│ │ 单位: 把 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ "螺丝m8 100斤" │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 品牌: 待定 │ │
│ │ 产品名: 螺丝 │ │
│ │ 规格: M8(材质:铁/不锈钢?) │ │
│ │ 型号: 空 │ │
│ │ 颜色: 空 │ │
│ │ 数量: 100 │ │
│ │ 单位: 斤 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ "电线2平方红色2卷" │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 品牌: 待定 │ │
│ │ 产品名: 电线 │ │
│ │ 规格: 2平方(截面积) │ │
│ │ 型号: 空 │ │
│ │ 颜色: 红色 │ │
│ │ 数量: 2 │ │
│ │ 单位: 卷 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ Step 5: 产品规范化匹配 │
│ ───────────────────────────────────────────────────────────────── │
│ "螺丝刀" → 匹配商品库: │
│ • 鹏锐十字螺丝刀 m4 (库存充足) ✅ │
│ • 史丹利螺丝刀 m6 (库存充足) │
│ • 大盛螺丝刀 m8 (库存不足) │
│ → 弹出确认: 您要的是哪款螺丝刀? │
│ │
└─────────────────────────────────────────────────────────────────────┘
2.3 采购场景详解
输入:
"向湖南日升商贸(供应商)采购螺丝刀3把,螺丝m8 100斤,电线2平方红色2卷"
目标结构:
┌─────────────────────────────────────────────────────────────────────┐
│ 采购单 │
├─────────────────────────────────────────────────────────────────────┤
│ 供应商: 湖南日升商贸(无则创建) │
│ ───────────────────────────────────────────────────────────────── │
│ 日期: 2026-05-17 │
│ │
│ 产品清单: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ # │ 产品名称 │ 规格 │ 颜色 │ 数量 │ 单位 │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ 1 │ 螺丝刀 │ - │ - │ 3 │ 把 │ │
│ │ 2 │ 螺丝 │ M8 │ - │ 100 │ 斤 │ │
│ │ 3 │ 电线 │ 2平方 │ 红色 │ 2 │ 卷 │ │
│ └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
与销售单的关键区别:
┌─────────────────────────────────────────────────────────────────────┐
│ 销售单 │ 采购单 │
│────────────────────────────┼───────────────────────────────────────│
│ 客户 ← 李文明 │ 供应商 ← 湖南日升商贸 │
│ 去向: 客户付钱买走 │ 去向: 从供应商购入 │
│ 单据: 销售单/出库单 │ 单据: 采购单/入库单 │
│ 库存: 减少 │ 库存: 增加 │
│ 账户: 应收账款+ │ 账户: 应付账款+ │
└─────────────────────────────────────────────────────────────────────┘
实体提取特殊点:
"向XX采购" / "从XX进货" / "找XX供应商采购" → 供应商识别
括号内容"(供应商)" → 明确标注实体类型
2.4 退货场景详解
输入:
"李文明退螺丝刀2把"
目标结构:
┌─────────────────────────────────────────────────────────────────────┐
│ 退货单 │
├─────────────────────────────────────────────────────────────────────┤
│ 客户: 李文明 │
│ ───────────────────────────────────────────────────────────────── │
│ 原销售单: [需关联查询] │
│ 日期: 2026-05-17 │
│ │
│ 退货产品: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ # │ 产品名称 │ 规格 │ 颜色 │ 数量 │ 单位 │ 原销售价 │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ 1 │ 螺丝刀 │ - │ - │ 2 │ 把 │ ¥15 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 退货金额: ¥30 │
│ 库存处理: +2把 │
└─────────────────────────────────────────────────────────────────────┘
意图识别关键词:
┌─────────────────────────────────────────────────────────────────────┐
│ 销售意图 │ 退货意图 │
│────────────────────┼───────────────────────────────────────────────│
│ 需要/要/买 │ 退/退货/退了/不要了/取消 │
│ 来一把/拿一个 │ 退掉/退回去 │
│ 进货/采购 │ 换货/换一个 │
│ 补货 │ 换规格/换颜色 │
└─────────────────────────────────────────────────────────────────────┘
退货流程:
┌─────────────────────────────────────────────────────────────────────┐
│ 1. 识别客户 │
│ 2. 识别退货产品 │
│ 3. 查询原销售记录(客户+产品匹配) │
│ 4. 确认退货数量和金额 │
│ 5. 更新库存 │
│ 6. 生成退货单 │
│ 7. 财务处理(应收账款减少) │
└─────────────────────────────────────────────────────────────────────┘
2.5 产品资料修改场景
输入:
"把鹏锐螺丝刀m4的库存改成20把,把鹏锐螺丝刀m4的货号改为35286"
目标结构:
┌─────────────────────────────────────────────────────────────────────┐
│ 操作类型: 产品资料修改 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 修改项1: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 产品: 鹏锐螺丝刀 m4 │ │
│ │ 属性: 库存 │ │
│ │ 原值: [查询现有值] │ │
│ │ 新值: 20 │ │
│ │ 单位: 把 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 修改项2: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 产品: 鹏锐螺丝刀 m4 │ │
│ │ 属性: 货号 │ │
│ │ 原值: [查询现有值] │ │
│ │ 新值: 35286 │ │
│ │ 单位: - │ │
│ └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
属性识别关键词:
┌─────────────────────────────────────────────────────────────────────┐
│ 可修改属性 │ 识别关键词 │
│───────────────────────┼─────────────────────────────────────────────│
│ 库存 │ 库存改成/调整为/变为 │
│ 货号 │ 货号改为/改成/调整为 │
│ 价格/售价 │ 价格改成/调价为/卖价改成 │
│ 品牌 │ 品牌改为/牌子改成 │
│ 规格 │ 规格改成/改为 │
│ 颜色 │ 颜色改成/改为 │
│ 供应商 │ 供应商改为/供货商改成 │
│ 最小起订量 │ 起订量改成/最小量改为 │
└─────────────────────────────────────────────────────────────────────┘
多属性修改切分:
┌─────────────────────────────────────────────────────────────────────┐
│ 输入: "把鹏锐螺丝刀m4的库存改成20把,把鹏锐螺丝刀m4的货号改为35286" │
│ │
│ 切分标志: "," │
│ ↓ │
│ ["把鹏锐螺丝刀m4的库存改成20把", "把鹏锐螺丝刀m4的货号改为35286"] │
│ │
│ 每个子句独立解析 → 同一产品 + 不同属性 + 不同新值 │
└─────────────────────────────────────────────────────────────────────┘
三、核心技术方案
3.1 整体架构
┌─────────────────────────────────────────────────────────────────────┐
│ 场景化输入处理架构 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 用户输入 │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ 第一层: 场景分类 (Intent Classification) │ │
│ │ ────────────────────────────────────────────────────────── │ │
│ │ │ │
│ │ 关键词规则: │ │
│ │ • "需要/要/买" + 客户名 → 销售单 │ │
│ │ • "向XX采购/从XX进货" → 采购单 │ │
│ │ • "退" + 客户名 → 退货单 │ │
│ │ • "改成/改为/调整为" + 产品名 → 产品资料修改 │ │
│ │ │ │
│ │ LLM兜底: 复杂句/模糊句 │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ 第二层: 实体识别 (NER) │ │
│ │ ────────────────────────────────────────────────────────── │ │
│ │ │ │
│ │ 人员实体: 客户/供应商 │ │
│ │ • 正则: 客户名/供应商名 + 上下文 │ │
│ │ • 知识库: 历史客户/供应商列表 │ │
│ │ │ │
│ │ 产品实体: 产品名 │ │
│ │ • 正则: 数量词 + 单位词 + 产品类别词 │ │
│ │ • 知识库: 商品库产品名匹配 │ │
│ │ │ │
│ │ 属性实体: 品牌/规格/型号/颜色/单位 │ │
│ │ • 正则: 固定模式匹配 │ │
│ │ • Embedding: 语义相似度匹配 │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ 第三层: 产品规范化 (Normalization) │ │
│ │ ────────────────────────────────────────────────────────── │ │
│ │ │ │
│ │ 输入: "螺丝m8 100斤" │ │
│ │ │ │
│ │ Step 1: 词素分解 │ │
│ │ ["螺丝", "m8", "100", "斤"] │ │
│ │ │ │
│ │ Step 2: 属性归类 │ │
│ │ 产品名: 螺丝 │ │
│ │ 规格: M8 │ │
│ │ 数量: 100 │ │
│ │ 单位: 斤 │ │
│ │ │ │
│ │ Step 3: 规格标准化 │ │
│ │ "m8" → "M8" → 标准规格码 │ │
│ │ │ │
│ │ Step 4: 商品库匹配 │ │
│ │ → 螺丝 M8 铁镀锌 100斤 │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ 第四层: 数据结构化 (Structured Output) │ │
│ │ ────────────────────────────────────────────────────────── │ │
│ │ │ │
│ │ 销售单: {customer, items: [{product, spec, qty, unit}]} │ │
│ │ 采购单: {supplier, items: [{product, spec, qty, unit}]} │ │
│ │ 退货单: {customer, original_order, items: [...]} │ │
│ │ 产品修改: {product, updates: [{attr, new_value}]} │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ 第五层: 确认与执行 (Confirmation & Execution) │ │
│ │ ────────────────────────────────────────────────────────── │ │
│ │ │ │
│ │ 置信度 > 0.9 → 自动执行 │ │
│ │ 置信度 0.7-0.9 → 语音/界面确认 │ │
│ │ 置信度 < 0.7 → 人工处理 │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
3.2 实体识别详细方案
3.2.1 人员实体识别
┌─────────────────────────────────────────────────────────────────────┐
│ 人员实体识别流程 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 输入: "李文明需要螺丝刀3把" │
│ │
│ Step 1: 位置分析 │
│ ───────────────────────────────────────────────────────────────── │
│ 句首词: "李文明" → 可能是客户名 │
│ 后面紧跟: "需要" → 确认是客户名(buy意图的前置) │
│ │
│ Step 2: 知识库匹配 │
│ ───────────────────────────────────────────────────────────────── │
│ 查询客户表: │
│ SELECT * FROM customers WHERE name LIKE '%李文明%' │
│ │
│ 找到 → 返回客户ID: cust_001 │
│ 未找到 → 询问: "李文明是新客户,需要创建吗?" │
│ │
│ Step 3: 实体类型判断 │
│ ───────────────────────────────────────────────────────────────── │
│ 上下文关键词 → 决定实体类型: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 客户类关键词 │ │
│ │ "需要/要买/退/客户" → 人员类型 = customer │ │
│ │ │ │
│ │ 供应商类关键词 │ │
│ │ "向XX采购/从XX进货/供应商" → 人员类型 = supplier │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 输出: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ entity: 李文明 │ │
│ │ type: customer │ │
│ │ customer_id: cust_001 (或标记为待创建) │ │
│ │ confidence: 0.95 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
3.2.2 产品实体识别
┌─────────────────────────────────────────────────────────────────────┐
│ 产品实体识别流程 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 输入: "螺丝刀3把,螺丝m8 100斤,电线2平方红色2卷" │
│ │
│ Step 1: 产品列表切分 │
│ ───────────────────────────────────────────────────────────────── │
│ 分隔符: ","(逗号) │
│ ↓ │
│ ["螺丝刀3把", "螺丝m8 100斤", "电线2平方红色2卷"] │
│ │
│ Step 2: 单产品解析 │
│ ───────────────────────────────────────────────────────────────── │
│ 以"螺丝m8 100斤"为例: │
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 词素分解: │ │
│ │ ["螺丝", "m8", "100", "斤"] │ │
│ │ │ │
│ │ 正则匹配规则: │ │
│ │ ──────────────────────────────────────────────────────── │ │
│ │ 产品名候选: 螺丝 (名词,前面是数字"100"修饰) │ │
│ │ 规格候选: m8 (字母+数字组合,常见规格模式) │ │
│ │ 数量: 100 (数字) │ │
│ │ 单位: 斤 (重量单位) │ │
│ │ │ │
│ │ 组合推断: │ │
│ │ 螺丝 + m8规格 + 100 + 斤 │ │
│ │ → 产品: 螺丝 M8 │ │
│ │ → 数量: 100斤 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ Step 3: 产品规范化 │
│ ───────────────────────────────────────────────────────────────── │
│ 输入产品名: "螺丝" │
│ 查询商品库: │
│ SELECT * FROM products WHERE name LIKE '%螺丝%' │
│ │
│ 候选结果: │
│ • 螺丝 M4 铁镀锌 │
│ • 螺丝 M6 铁镀锌 │
│ • 螺丝 M8 铁镀锌 ← 最匹配 │
│ • 螺丝 M10 不锈钢 │
│ │
│ 匹配度计算: │
│ "螺丝m8" vs "螺丝 M8 铁镀锌" → 匹配度 0.85 ✅ │
│ │
│ 输出: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ entity: 螺丝 M8 铁镀锌 │ │
│ │ product_id: prod_089 (待确认) │ │
│ │ quantity: 100 │ │
│ │ unit: 斤 │ │
│ │ confidence: 0.85 │ │
│ │ need_confirm: true (多规格匹配,需用户确认) │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
3.3 产品规范化详细方案
3.3.1 五金产品属性体系
┌─────────────────────────────────────────────────────────────────────┐
│ 五金产品属性规范 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 标准属性结构: │
│ ───────────────────────────────────────────────────────────────── │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 产品名 │ 品牌 │ 规格 │ 型号 │ 颜色 │ 单位 │ 备注 │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ 螺丝刀 │ 鹏锐 │ 十字 │ m4 │ - │ 把 │ │ │
│ │ 螺丝 │ - │ M8 │ - │ - │ 斤/个 │ │ │
│ │ 电线 │ - │ 2平方 │ - │ 红色 │ 卷/米 │ BV线 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 规格标准化映射: │
│ ───────────────────────────────────────────────────────────────── │
│ 螺丝规格: │
│ "m8" / "M8" / "8mm" / "8个" → M8 │
│ "m6" / "M6" / "6mm" / "6个" → M6 │
│ "m10" / "M10" / "10mm" → M10 │
│ │
│ 电线规格: │
│ "2平方" / "2平方毫米" / "2平" / "2mm²" → 2.5平方(标准) │
│ "4平方" / "4平方毫米" / "4平" / "4mm²" → 4平方 │
│ │
│ 单位标准化: │
│ ───────────────────────────────────────────────────────────────── │
│ 螺丝: "斤" → "kg", "个" → "个" (不变) │
│ 电线: "卷" → "卷", "米" → "米" │
│ 螺丝刀: "把" → "把", "个" → "把" │
│ │
└─────────────────────────────────────────────────────────────────────┘
3.3.2 规范化匹配算法
┌─────────────────────────────────────────────────────────────────────┐
│ 产品规范化匹配算法 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 输入: "电线2平方红色2卷" │
│ │
│ Step 1: 正则解析 │
│ ───────────────────────────────────────────────────────────────── │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 正则模式: │ │
│ │ (?P<product>电线|电缆) │ │
│ │ (?P<spec>\d+平方|\d+mm²)? │ │
│ │ (?P<color>红色|蓝色|绿色|黑色|白色)? │ │
│ │ (?P<qty>\d+) │ │
│ │ (?P<unit>卷|米|个|把|斤|个)? │ │
│ │ │ │
│ │ 解析结果: │ │
│ │ product: "电线" │ │
│ │ spec: "2平方" │ │
│ │ color: "红色" │ │
│ │ qty: "2" │ │
│ │ unit: "卷" │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ Step 2: 规格标准化 │
│ ───────────────────────────────────────────────────────────────── │
│ "2平方" → 标准化: "2.5平方" (四舍五入到标准规格) │
│ 颜色: "红色" → 标准化: "红色" (不变) │
│ │
│ Step 3: 商品库匹配 │
│ ───────────────────────────────────────────────────────────────── │
│ SELECT * FROM products │
│ WHERE category = '电线' │
│ AND (spec = '2.5平方' OR spec LIKE '%2.5%') │
│ AND (color = '红色' OR color IS NULL) │
│ │
│ 候选: │
│ • 电线 2.5平方 红色 BV线 (stock: 100卷) ← 唯一匹配 │
│ • 电线 4平方 红色 BV线 (stock: 50卷) │
│ │
│ Step 4: 匹配度计算 │
│ ───────────────────────────────────────────────────────────────── │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 匹配维度 │ 权重 │ 得分 │ 说明 │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ 产品类别 │ 20% │ 1.0 │ 电线 vs 电线 │ │
│ │ 规格匹配 │ 30% │ 0.9 │ 2平 vs 2.5平 │ │
│ │ 颜色匹配 │ 20% │ 1.0 │ 红色 vs 红色 │ │
│ │ 库存可用 │ 10% │ 1.0 │ 有库存 │ │
│ │ 历史购买 │ 20% │ 0.8 │ 该客户曾买过 │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ 综合得分 │ 100% │ 0.93 │ ≥0.9 → 直接确认 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ Step 5: 输出结构化数据 │
│ ───────────────────────────────────────────────────────────────── │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ product_id: prod_156 │ │
│ │ product_name: 电线 2.5平方 红色 BV线 │ │
│ │ brand: 待确认 │ │
│ │ spec: "2.5平方" │ │
│ │ color: "红色" │ │
│ │ quantity: 2 │ │
│ │ unit: "卷" │ │
│ │ confidence: 0.93 │ │
│ │ need_confirm: false │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
3.4 多产品切分算法
┌─────────────────────────────────────────────────────────────────────┐
│ 多产品智能切分 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 挑战: │
│ ───────────────────────────────────────────────────────────────── │
│ "螺丝刀3把,螺丝m8 100斤,电线2平方红色2卷" │
│ │
│ 简单按逗号切分可能出错的情况: │
│ "螺丝刀,钳子等工具各5把" │
│ → 按逗号切分会导致"螺丝刀"和"钳子等工具各5把"无法正确关联 │
│ │
│ 解决方案: 递归最长匹配 │
│ ───────────────────────────────────────────────────────────────── │
│ │
│ 算法: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ function split_products(text): │ │
│ │ results = [] │ │
│ │ remaining = text │ │
│ │ │ │
│ │ while remaining is not empty: │ │
│ │ # 尝试最长匹配 │ │
│ │ match = find_longest_product(remaining) │ │
│ │ if match: │ │
│ │ results.append(match) │ │
│ │ remaining = remaining.replace(match, "", 1) │ │
│ │ else: │ │
│ │ # 无法识别,记录待处理 │ │
│ │ results.append(remaining) │ │
│ │ break │ │
│ │ │ │
│ │ return results │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 示例执行: │
│ ───────────────────────────────────────────────────────────────── │
│ 输入: "螺丝刀3把,螺丝m8 100斤,电线2平方红色2卷" │
│ │
│ 第1轮: │
│ remaining = "螺丝刀3把,螺丝m8 100斤,电线2平方红色2卷" │
│ 最长匹配 = "螺丝刀3把" → results = ["螺丝刀3把"] │
│ remaining = "螺丝m8 100斤,电线2平方红色2卷" │
│ │
│ 第2轮: │
│ remaining = "螺丝m8 100斤,电线2平方红色2卷" │
│ 最长匹配 = "螺丝m8 100斤" → results = ["螺丝刀3把", "螺丝m8 100斤"]│
│ remaining = "电线2平方红色2卷" │
│ │
│ 第3轮: │
│ remaining = "电线2平方红色2卷" │
│ 最长匹配 = "电线2平方红色2卷" → results = ["螺丝刀3把", "螺丝m8 100斤", "电线2平方红色2卷"]│
│ remaining = "" │
│ │
│ 完成! │
│ │
└─────────────────────────────────────────────────────────────────────┘
四、意图分类与槽位填充
4.1 意图分类体系
┌─────────────────────────────────────────────────────────────────────┐
│ 场景化意图分类 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 一级意图 │ 二级意图 │ 关键词/模式 │
│ ────────────────────────────────────────────────────────────────── │
│ │
│ 销售 (SALE) │ create_order │ 需要/要/买/来/拿 + 客户名 │
│ │ add_item │ 加/再加/追加 + 产品 │
│ │ query_price │ 多少钱/价格/多少 money │
│ │ query_stock │ 有没有/有没有货/库存 │
│ │
│ 采购 (PURCHASE) │ create_po │ 向XX采购/从XX进货 │
│ │ add_po_item │ 加/追加 + 产品 │
│ │ query_po │ 查采购单/采购记录 │
│ │
│ 退货 (RETURN) │ create_rma │ 退 + 客户 + 产品 │
│ │ query_rma │ 查退货/退货记录 │
│ │
│ 产品 (PRODUCT) │ update_info │ 改成/改为/调整为 + 产品 + 属性 │
│ │ add_product │ 新增产品/添加产品 │
│ │ delete_product│ 删除产品/下架产品 │
│ │ query_product│ 查产品/产品资料 │
│ │
│ 库存 (INVENTORY) │ adjust_stock│ 调整库存/盘点 │
│ │ query_stock │ 查库存/库存多少 │
│ │
└─────────────────────────────────────────────────────────────────────┘
4.2 槽位填充模板
┌─────────────────────────────────────────────────────────────────────┐
│ 槽位填充模板 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 销售单模板: │
│ ───────────────────────────────────────────────────────────────── │
│ { │
│ "intent": "create_order", │
│ "customer": { │
│ "name": "李文明", │
│ "id": "cust_001" 或 null (待创建) │
│ }, │
│ "items": [ │
│ { │
│ "product_id": "prod_001", │
│ "product_name": "螺丝刀", │
│ "spec": "m4", │
│ "brand": "鹏锐", │
│ "color": null, │
│ "quantity": 3, │
│ "unit": "把" │
│ }, │
│ ... │
│ ], │
│ "confidence": 0.92, │
│ "need_confirm": ["product_1", "product_3"] │
│ } │
│ │
│ 采购单模板: │
│ ───────────────────────────────────────────────────────────────── │
│ { │
│ "intent": "create_po", │
│ "supplier": { │
│ "name": "湖南日升商贸", │
│ "id": "sup_001" 或 null (待创建) │
│ }, │
│ "items": [ │
│ { "product_name": "...", "quantity": N, "unit": "..." } │
│ ], │
│ "confidence": 0.95 │
│ } │
│ │
│ 退货单模板: │
│ ───────────────────────────────────────────────────────────────── │
│ { │
│ "intent": "create_rma", │
│ "customer": { "name": "李文明", "id": "cust_001" }, │
│ "original_order_id": "order_20260515_001", │
│ "items": [ │
│ { │
│ "product_id": "prod_001", │
│ "quantity": 2, │
│ "reason": "质量问题/不需要了/其他" │
│ } │
│ ], │
│ "confidence": 0.88 │
│ } │
│ │
│ 产品修改模板: │
│ ───────────────────────────────────────────────────────────────── │
│ { │
│ "intent": "update_product", │
│ "product": { │
│ "name": "鹏锐螺丝刀 m4", │
│ "id": "prod_001" │
│ }, │
│ "updates": [ │
│ { "field": "stock", "old_value": "?", "new_value": 20 }, │
│ { "field": "sku", "old_value": "?", "new_value": "35286" } │
│ ], │
│ "confidence": 0.94 │
│ } │
│ │
└─────────────────────────────────────────────────────────────────────┘
五、置信度与确认机制
5.1 置信度评估
┌─────────────────────────────────────────────────────────────────────┐
│ 置信度评估体系 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 置信度 = 产品匹配度 × 数量清晰度 × 人员识别度 × 意图明确度 │
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 维度 │ 权重 │ 评估标准 │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ 产品匹配度 │ 40% │ 唯一匹配=1.0, 多匹配=0.7-0.9 │ │
│ │ 数量清晰度 │ 20% │ 明确=1.0, 模糊=0.5-0.8 │ │
│ │ 人员识别度 │ 20% │ 存在=1.0, 新建=0.8 │ │
│ │ 意图明确度 │ 20% │ 关键词=1.0, LLM=0.8-0.95 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 阈值处理: │
│ ───────────────────────────────────────────────────────────────── │
│ 置信度 >= 0.9 → 自动执行,无需确认 │
│ 置信度 0.7-0.9 → 语音确认:"您是要买这个吗?" │
│ 置信度 < 0.7 → 人工处理 │
│ │
└─────────────────────────────────────────────────────────────────────┘
5.2 确认话术模板
┌─────────────────────────────────────────────────────────────────────┐
│ 确认话术模板 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 销售确认: │
│ ───────────────────────────────────────────────────────────────── │
│ "好的,李文明,购买以下商品:" │
│ "1. 螺丝刀 3把" │
│ "2. 螺丝 M8 100斤" │
│ "3. 电线 2.5平方 红色 2卷" │
│ "确认开单吗?" │
│ │
│ 产品待确认: │
│ ───────────────────────────────────────────────────────────────── │
│ "您说的'螺丝刀',请问是:" │
│ "1. 鹏锐十字螺丝刀 m4(¥15/把)" │
│ "2. 史丹利螺丝刀 m6(¥22/把)" │
│ "3. 大盛螺丝刀 m8(¥18/把)" │
│ │
│ 客户新建确认: │
│ ───────────────────────────────────────────────────────────────── │
│ "李文明是新客户,是否创建并开单?" │
│ │
│ 供应商新建确认: │
│ ───────────────────────────────────────────────────────────────── │
│ "湖南日升商贸是新供应商,是否创建并下采购单?" │
│ │
│ 退货确认: │
│ ───────────────────────────────────────────────────────────────── │
│ "好的,李文明退以下商品:" │
│ "螺丝刀 2把(原购价¥15/把,共¥30)" │
│ "确认退货吗?" │
│ │
│ 产品修改确认: │
│ ───────────────────────────────────────────────────────────────── │
│ "确认修改鹏锐螺丝刀 m4:" │
│ "库存:10把 → 20把" │
│ "货号:35123 → 35286" │
│ │
└─────────────────────────────────────────────────────────────────────┘
六、总结
6.1 技术方案要点
| 模块 | 技术方案 | 延迟目标 |
|---|---|---|
| 场景分类 | 关键词规则 + LLM兜底 | <10ms |
| 人员识别 | 正则 + 知识库匹配 | <5ms |
| 产品切分 | 递归最长匹配算法 | <10ms |
| 产品规范化 | 正则 + Embedding + 商品库匹配 | <50ms |
| 槽位填充 | 模板 + 置信度评估 | <10ms |
| 确认机制 | 分级阈值处理 | - |
6.2 实施优先级
Phase 1: 核心销售场景
├── 意图分类(销售/采购/退货/修改)
├── 客户/供应商识别
├── 产品规范化
└── 单产品解析
Phase 2: 复杂场景
├── 多产品批量解析
├── 产品资料修改
└── 退货关联原单
Phase 3: 智能化提升
├── 自动纠错
├── 上下文补全
└── 历史偏好学习
6.3 关键挑战
| 挑战 | 解决方案 |
|---|---|
| 产品名称不标准 | 建立产品别名表,持续学习 |
| 数量单位歧义 | 结合产品类别推断默认单位 |
| 多产品关联 | 递归切分 + 确认机制 |
| 新客户/新供应商 | 先创建后确认模式 |
| 规格模糊 | 弹出选择确认 |