Post

向量库与 Embedding

向量化基于BERT编码器将文本映射到高维语义空间,生成稠密向量(如768维),语义相近则余弦相似度高。稠密向量代表语义检索,稀疏向量(如BM25)代表关键词检索。向量库选型中,Weaviate适合需要多租户和混合检索的轻量场景;Faiss+ES适合千万级以上高性能需求;Milvus虽强但运维重。ANN算法主流为HNSW(查询近O(logn)),其他包括IVF、PQ、Annoy。百万级题库压测显示单次搜题端到端10-20秒,瓶颈在AI解析而非检索。调优技巧:只向量化题干和选项排除答案,维度降级(2048→1024),预处理HTML但保留img标签,异步处理记忆管道降低响应延迟。多租户通过Weaviate的with_tenant实现硬隔离。

检索增强 RAG 阅读 3 点赞 0 评论 0

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 回复后请求即结束,事实提取/摘要更新异步处理降响应延迟;相对时间推断(用户说"下周开会",结合当前时间推算具体日期再存)。


继续阅读

全部归档
RAG 检索增强生成
RAG 检索增强生成

RAG 系统分为数据准备与查询两阶段,核心在分块(推荐 500/100 滑动窗口)、混合检索(BM25 与向量归一化加权,加长度惩罚)、Rerank(Cross-Encoder 精排)及评估(RAGAS 指标:命中率、忠实度等)。优化方向覆盖查询改写、多路召回、重排序及数据侧策略。进阶范式包括 Self-RAG(自决定是否检索)、GraphRAG(实体关系多跳推理)及多模态 RAG。读者可掌握从分块到生产压测的完整链路,关键在于排查“答非所问”的分块、召回、排序和生成环节,并通过离线评估与 bad case 回流持续迭代。

Kafka 核心原理详解:架构、存储、可靠性与消费机制
Kafka 核心原理详解:架构、存储、可靠性与消费机制

Kafka 是分布式流处理平台,本质是高吞吐、可持久化的消息队列,解决上下游数据时间差问题。消息系统有点对点(Queue)和发布订阅(Pub/Sub)两种模式,Kafka 通过消费者组实现组内点对点、组间发布订阅。架构核心包括 Producer、Broker、Topic、Partition(含 Leader 和 Follower 副本)、Consumer Group 及 Zookeeper。存储采用 Segment 文件(.log 存储数据,.index 稀疏索引),通过二分查找快速定位消息。生产者可靠性依赖 ACK 机制(0/1/-1),acks=-1 时需 ISR(同步副本)全部确认;副本通过 HW 和 LEO 水位线保证一致性。幂等性基于 PID 和序列号实现单分区去重,事务支持跨分区原子性。消费者使用 Pull 模式,分区分配策略有 RoundRobin、Range、Sticky;Offset 存储在 __consumer_offsets 主题,支持同步和异步提交。Kafka 常与 Flume 集成,Flume 负责采集,Kafka 负责缓冲分发。

评论