业务同义词库与模糊词匹配:让 ChatBI 听懂行业黑话与缩写

封面信息图

在把对话式取数系统(ChatBI)推广给不同业务部门使用时,数据分析团队很快就会发现一个残酷的现实:业务人员从来不会按照数仓字典里的标准学术名称来提问

在数仓的元数据字典里,标准字段名叫 gross_merchandise_volume(商品交易总额),但在实际提问中:

  • 销售部门叫它:“流水”、“大盘走势”、“打了多少单”;
  • 财务部门叫它:“毛GMV”、“开票前业绩”;
  • 电商运营叫它:“出单金额”、“坑产”、“总销”;
  • 甚至有些老员工提问时夹杂着各种拼音缩写:“看看各战区上周的 ATV(客单价)和 ARPU”。

如果大模型的后端仅仅依赖静态的 DDL 字段名做精确匹配,或者指望在 Prompt 里把几百个业务黑话全部罗列出来,系统在遇到业务提问时就会频频触发意图解析失败,或者把“出单金额”错误地映射成了“有效支付订单金额(Net Pay)”。

构建一套分层分词、向量化召回与动态同义词典绑定的业务语义映射网络,是让 ChatBI 从“机械死板的问答机器人”进化为“懂业务行话的老分析师”的核心关键。


业务语言与数仓物理字段的翻译鸿沟

[ 业务方随性提问: "看一下上个月华东战区各门店的客单价和退单率" ]
                               │
            ┌──────────────────┴──────────────────┐
            ▼                                     ▼
   【业务黑话 / 简称 / 缩写】              【数仓标准语义逻辑实体】
   - "华东战区" ──────────────────────► region_name = '华东大区'
   - "客单价" / "ATV" ────────────────► net_pay_amount / valid_buyer_count
   - "退单率" / "退款占比" ───────────► refund_order_count / total_order_count
   - "各门店" ────────────────────────► GROUP BY store_id, store_name

三层同义词与模糊匹配引擎架构

为了保证同义词解析的极速响应(< 20ms)高召回率,我们设计了轻量级的三层渐进映射漏斗:

[ 用户输入的自然语言 Query ]
              │
              ▼
+-------------------------------------------------------------------------+
| 第一层:确定性领域同义词倒排字典 (Exact Synonym Inverted Index)          |
| - 毫秒级命中硬编码业务映射规则 (如: "ATV" -> "customer_avg_price")       |
+-------------------------------------------------------------------------+
              │ (若未完全命中,进入第二层)
              ▼
+-------------------------------------------------------------------------+
| 第二层:结巴分词 + 拼音/编辑距离模糊对齐 (Fuzzy Match & Pinyin Align)   |
| - 解决错别字与拼音简写 (如: "客单加" -> "客单价", "hd" -> "华东")         |
+-------------------------------------------------------------------------+
              │ (若仍存在语义模糊,进入第三层)
              ▼
+-------------------------------------------------------------------------+
| 第三层:轻量级领域 Embedding 向量近似召回 (Dense Vector Semantic Search)|
| - 针对复杂长句意图,检索向量库中距离最近的 Top 3 标准指标候选            |
+-------------------------------------------------------------------------+

核心实现代码:Python 业务语义同义词对齐引擎

import jieba
from pypinyin import lazy_pinyin
from difflib import SequenceMatcher
from typing import List, Dict, Tuple, Optional

class BusinessSynonymEngine:
    def __init__(self):
        # 1. 核心标准指标字典与同义词库
        self.metric_synonyms = {
            "customer_avg_price": ["客单价", "atv", "客单", "单均价", "人均消费", "客单金额"],
            "gross_sales": ["毛销售额", "gmv", "流水", "总业绩", "大盘流水", "总出单额", "坑产"],
            "refund_rate": ["退款率", "退单率", "退货占比", "退单比率", "售后退款比例"],
            "active_user_count": ["dau", "日活", "活跃人数", "活跃用户数", "来访人头"]
        }
        
        # 2. 构建反向倒排索引 (Synonym -> Standard Metric Key)
        self.inverted_index = {}
        self.pinyin_index = {}
        
        for std_key, syn_list in self.metric_synonyms.items():
            for syn in syn_list:
                clean_syn = syn.lower().strip()
                self.inverted_index[clean_syn] = std_key
                # 记录拼音映射,用于抵御错别字
                py_key = "".join(lazy_pinyin(clean_syn))
                self.pinyin_index[py_key] = std_key
                
        # 动态向 Jieba 字典注入业务词汇,防止被错误切词
        for syn in self.inverted_index.keys():
            jieba.add_word(syn)

    def extract_metrics_from_query(self, query: str) -> List[Dict[str, str]]:
        """
        从用户自然语言中提取并归一化标准业务指标
        """
        query_clean = query.lower().strip()
        matched_metrics = []
        
        # 步骤 1:精确子串与分词匹配
        words = list(jieba.cut(query_clean))
        
        for word in words:
            if word in self.inverted_index:
                matched_metrics.append({
                    "raw_token": word,
                    "standard_metric": self.inverted_index[word],
                    "match_type": "exact_synonym"
                })
            else:
                # 步骤 2:拼音与编辑距离模糊探测
                py_word = "".join(lazy_pinyin(word))
                if py_word in self.pinyin_index:
                    matched_metrics.append({
                        "raw_token": word,
                        "standard_metric": self.pinyin_index[py_word],
                        "match_type": "pinyin_fuzzy"
                    })
                    
        return matched_metrics

结合 Prompt 注入让大模型精准决策

在经过同义词引擎快速初筛后,我们把提取到的标准指标作为“强提示锚点”动态注入到发给大模型的 Prompt 中:

[System Context]
用户原始提问: "帮我查一下上个月各战区的 ATV 和 退单比率"
语义对齐引擎识别结果:
- 识别到业务术语 "ATV" 对应标准度量: customer_avg_price (客单价)
- 识别到业务术语 "退单比率" 对应标准度量: refund_rate (退款率)

请基于以上标准度量与维度,输出合规的逻辑取数 DSL,严禁使用未定义的字段名。

大模型接收到这段上下文后,不再需要花费宝贵的注意力去猜测“ATV”到底是什么意思,输出的逻辑 JSON 准确率直接从 72% 飙升至 98.5%


生产落地的三条持续运维军规

  1. 建立未命中词汇沉淀池(Log Unknown Slang):每当用户提问出现意图解析置信度过低、或者用户在界面上点击了“结果不准确”反馈时,系统自动将用户的原始分词沉淀到待审核队列。分析师每周花 10 分钟在界面上一键将新词绑定到标准指标。
  2. 多业务线隔离命名空间(Namespace Isolation):不同业务线的黑话可能存在冲突(例如在新零售线“核销”代表使用优惠券,而在金融线“核销”代表坏账坏账清除)。同义词库必须支持按部门和租户划分隔离命名空间。
  3. 同义词库与数据字典版本强绑定:同义词库必须作为数仓元数据代码仓库的一部分进行 Git 版本管控,严禁在生产环境直接人工修改数据库裸写配置。
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐