文章目录
- 一、传统方案为什么不够用?
- 二、向量数据库解决的核心问题是什么?
- 三、向量数据库核心思想
- 四、整体架构拆解(核心)
- 五、vector_count_key:为什么要向量化"统计意图"?
- 六、vector_group_key:为什么要向量化"分组维度"?
- 七、vector_select_key:为什么还要"实体词识别"?
- 八、v_order_info:为什么不用原始业务表?
- 九、完整流程串起来
- 十、为什么一定要用向量数据库?
- 十一、总结
在数据分析、BI 报表、智能问答场景中,我们经常会遇到这样的需求:
用户希望直接用自然语言提问,而不是写 SQL。
例如:
- "哪个品牌销量最高?"
- "各个地区的销售情况怎么样?"
- "最受欢迎的商品有哪些?"
但数据库并不理解"最受欢迎""销量最高""销售情况"这些词。
这正是向量数据库要解决的问题。
一、传统方案为什么不够用?
1️⃣ 规则 + if/else 的局限
最直观的做法是:
text
if 包含 "销量" → 用 order_id
if 包含 "金额" → 用 order_amount
if 包含 "品牌" → GROUP BY tm_name
但很快就会失控:
- "销量最高 / 最畅销 / 最热门"
- "销售额 / 金额 / 总金额"
- "各个地区 / 哪些省 / 哪些城市"
👉 同一个意思,可以有无数种说法。
规则会越来越多,维护成本指数级上升。
2️⃣ 关键词搜索无法理解"语义"
即使用 Elasticsearch,也只能解决:
- 关键词是否匹配
- 文本是否包含
但解决不了:
"最畅销"和"销量最高"是同一个意思
二、向量数据库解决的核心问题是什么?
一句话概括:
向量数据库解决的是"语义相似度"问题,而不是关键词匹配问题。
1️⃣ 向量化:把"人话"变成"数学表示"
通过 AI 向量模型(Embedding):
text
"最畅销的商品"
↓
[0.12, -0.45, 0.88, ...]
不同说法但语义相近的句子,在向量空间中距离也会很近。
2️⃣ 向量数据库:高效计算"像不像"
向量数据库只做一件事:
text
给我一个向量 → 找最相似的向量
👉 它不理解文本
👉 只负责 快速相似度检索
三、向量数据库核心思想
核心思想可以总结为一句话:
用向量数据库解决"理解用户意图",
用关系数据库解决"执行统计计算"。
四、整体架构拆解(核心)
你的设计可以抽象成 4 个关键组件:
| 层级 | 对象 | 作用 |
|---|---|---|
| 语义层 | vector_count_key | 统计意图识别 |
| 语义层 | vector_group_key | 分组维度识别 |
| 实体层 | vector_select_key | 具体对象识别 |
| 数据层 | v_order_info | 统一事实数据 |
五、vector_count_key:为什么要向量化"统计意图"?
text
order_amount → 销售额, 金额, 总金额, 销售额最高
order_id → 销量, 最畅销, 最热门
user_id → 人数, 最受欢迎
用户不会说:
"请按 order_amount 统计"
而是说:
"销售额最高的是什么?"
👉 这一步就是典型的"语义匹配"问题
👉 非常适合用向量数据库解决
六、vector_group_key:为什么要向量化"分组维度"?
text
tm_name → 品牌, 哪些品牌
province_name → 地区, 哪些省, 哪些城市
category1 → 分类, 各类
用户说:
- "各个品牌的销量"
- "不同地区的销售情况"
本质是在问:
sql
GROUP BY tm_name
GROUP BY province_name
👉 同样是语义到字段的映射问题
七、vector_select_key:为什么还要"实体词识别"?
text
耐克、苹果、广东、北京
这些词:
- 不是统计方式
- 不是分组维度
- 而是具体对象
你用 vector_select_key 作为候选池:
- 可以向量化
- 可以做相似度匹配
- 可以避免误识别
👉 这是把 NLP 的"实体识别"工程化落地的一种方式
八、v_order_info:为什么不用原始业务表?
因为向量数据库不适合直接算业务指标。
所以你的设计是:
- 向量数据库:负责"理解用户在说什么"
- 关系数据库:负责"算结果"
v_order_info 的价值在于:
- 打平多表 join
- 提前准备好所有可统计字段
- 为 SQL 生成提供稳定结构
九、完整流程串起来
用户问题
"各个品牌销量最高的是哪个?"
系统执行逻辑
1️⃣ 向量匹配统计意图
→ "销量最高" ≈ order_id
2️⃣ 向量匹配分组维度
→ "品牌" ≈ tm_name
3️⃣ 是否有具体实体
→ 无,跳过
4️⃣ 生成 SQL
sql
SELECT
tm_name,
COUNT(order_id) AS total_count
FROM v_order_info
GROUP BY tm_name
ORDER BY total_count DESC
LIMIT 1;
十、为什么一定要用向量数据库?
如果不用向量数据库,你只能:
- 写大量规则
- 不断补关键词
- 接近 NLP 黑洞
而向量数据库的优势在于:
- ✅ 能理解"相近意思"
- ✅ 扩展只需要加数据
- ✅ 规则复杂度不会爆炸
- ✅ 天然适合自然语言场景
十一、总结
向量数据库不是用来"算数据"的,
而是用来"理解人说的话"的。
这套设计,本质上是:
用向量语义完成"意图解析",
用 SQL 完成"结果计算"。
这是一个非常工程化、非常克制、非常可扩展的方案。