1. Embedding 原理
向量化把自然语言映射到高维连续语义空间,底层基于 Transformer 的 Encoder 架构(BERT 体系),多头注意力捕捉全局上下文,提取固定长度稠密向量,语义近则余弦相似度高。与 Decoder 预测下一 token 不同,Embedding 纯做语义特征压缩表达。
💡 深入理解
- M3E-base:中文优化多语言嵌入,768 维,专为相似度/检索优化,HuggingFace 有评测。
- 火山豆包嵌入:2048 维。
- 检索用余弦相似度返回 Top-K。
2. 稠密向量 vs 稀疏向量(易答反,重点)
- 稀疏向量 Sparse = 关键词检索。维度=词典大小(如 10 万维),只有出现的词位置有值其余为 0。代表 BM25/TF-IDF。
- 稠密向量 Dense = 向量/语义检索。模型映射到低维语义空间(768/1024/2048),全非零浮点,意思近距离近。
注意:口诀「稀疏=关键词,稠密=语义」,别记反。
3. 向量库选型对比
| 维度 | Faiss | Milvus | Weaviate | Chroma | Pinecone |
|---|---|---|---|---|---|
| BM25 关键词 | ❌ | ✅ 内置 | ✅ 内置 | ❌ | ✅ 稀疏向量 |
| 混合检索 | ❌ | ✅ | ✅ RRF/BM25+向量 | ❌ | ✅ |
| 多租户 | ❌ | ✅ Collection级 | ✅ 命名空间隔离 | ❌ | ✅ |
| 分布式 | ❌ | ✅ 原生 | ✅ 集群/高可用 | ❌ | ✅ 全托管 |
| 数据规模 | 十亿级(自管分片) | 亿~十亿级 | 百万~千万级 | 百万级以下 | 十亿级(自动扩展) |
| 延迟 | 极快(GPU微秒) | 毫秒 | 毫秒 | 10-100ms | <2ms |
| 场景 | 嵌入库/去重 | 大规模生产 | 语义搜索/RAG | 原型/测试 | 免运维SaaS |
4. 选型话术(项目里怎么答)
为什么选 Weaviate? 三点:① 原生多租户支持;② 开箱即用混合检索(Hybrid Search);③ 架构轻量易维护(对比 Milvus 太重)。多租户实现:FastAPI 网关校验 Token 提 tenant_id/user_id,调用时注入 with_tenant(tenant_id) 底层硬隔离。
为什么 FAISS+ES 而非纯 ES? 纯 ES 适合百万级以下/复杂全文/运维成本;FAISS+ES 适合千万级以上/性能极高/复杂混合搜索。
为什么不用 Milvus? 太重,运维成本高;Weaviate 轻量且原生多租户+混合检索满足需求。
5. ANN 近似最近邻算法
精确 KNN 要和全库比对太慢,工业用 ANN 近似最近邻(牺牲极小精度换大幅提速):
- HNSW(最主流):分层可导航小世界图,上层稀疏快速定位、下层稠密精确查找,查询近 O(logn)。Milvus/Weaviate/Faiss 都支持。
- IVF(倒排文件):先聚类分桶(nlist),查询只搜最近几个桶(nprobe),nprobe 越大越准越慢。
- PQ 乘积量化:把高维向量切段分别量化压缩,省内存、加速距离计算,常和 IVF 组合(IVF-PQ)。
- Annoy:随机超平面二叉树森林,参数 n_trees(建树数,越多越准索引越大)和 search_k(查询检查节点数)。
ES 倒排索引:分词后以词为索引查找,把全文匹配转成树查找;写入更新性能差,只适合全文搜索不适合频繁更新的交易数据。ES 概念映射:索引→类型→文档→字段 ≈ 库→表→行→列。
6. 高频追问速答
❓ 常见追问 · 最大维度支持? → Weaviate 65535 维(实际推荐 <4096),Milvus 32768 维,Faiss 无理论限制受内存。
❓ 常见追问 · 向量检索用什么距离度量? → 常用余弦相似度(cosine)、欧氏距离、点积。
❓ 常见追问 · 多租户怎么做数据隔离? → Weaviate with_tenant(tenant_id) 命名空间隔离,长期记忆各维度绑定用户专属标识,杜绝跨租户泄露。
7. 实战压测与调优经验(项目真实数据,最能体现工程能力)
百万级题库向量化压测(拍照搜题备用方案,Weaviate):
- 批量导入 1 万题约 454s(7.5 分钟);全量 180 万题约 22.7 小时。
- 存储 601.9MB / 10 万条,内存 60MB,CPU 2%。
- 单次搜题端到端 10-20s:OCR 4-6s + AI 解析 10-13s + 混合检索 ~4s + 格式转换 6-7s。
- 关键洞察:瓶颈不在检索(才 4s),而在 AI 解析和格式转换;导入慢的根因是向量化过程慢,不是写库慢。
向量化调优 trick:
- 只向量化"题干+选项",故意排除答案/解析——避免答案文本参与匹配污染召回结果。
- 维度降级 2048→1024(doubao 可变维度模型上权衡存储与检索开销)。
- HTML/Unicode 预处理:去转义(大量文本拖慢向量化和响应),但保留 img 标签避免返回缺图。
- 格式转换省时:让大模型只补"考点/解答流程/点评/难度"四个字段,其余(题目/选项/答案/解析)用代码解析而非 AI 解析,规避图片长文本导致的响应慢。
异步记忆管道(长期记忆系统):AI 回复后请求即结束,事实提取/摘要更新异步处理降响应延迟;相对时间推断(用户说"下周开会",结合当前时间推算具体日期再存)。
评论