Skip to main content
我最早用 Embedding 只记住”文本转向量”,真做过检索才明白,切片和模型选型比公式更影响效果。维度、归一化、切片粒度这几项,决定了召回质量。

Q1: Embedding 的发展历史是什么?为什么需要它?

1

One-Hot 编码:离散表示的起点

早期 NLP 用 One-Hot 编码表示词汇——每个词是一个长度等于词表大小的向量,只有对应位置为 1,其余为 0。词表有 50000 个词,每个词就是一个 50000 维的向量。这种方式有两个致命缺陷:维度灾难(向量极其稀疏,浪费存储和计算),以及无法表达语义关系(“国王”和”女王”的余弦相似度为 0,因为它们正交)。
2

Word2Vec:稠密语义空间的突破

2013 年 Google 提出 Word2Vec,通过浅层神经网络将每个词映射到低维稠密向量(通常 300 维)。核心思想来自分布假说:“一个词的含义由其上下文决定”。Word2Vec 有两种训练模式:CBOW(用上下文预测中心词)和 Skip-gram(用中心词预测上下文)。训练完成后,语义相近的词在向量空间中距离更近——经典例子是 king - man + woman ≈ queen。[1]
3

ELMo 与 Transformer:上下文感知的 Embedding

Word2Vec 的问题是”一词一向量”——“苹果”在”吃苹果”和”苹果公司”中是同一个向量。2018 年 ELMo 用双向 LSTM 生成上下文相关的词向量。同年 BERT 用 Transformer 的自注意力机制取代 LSTM,真正实现了”一个词在不同上下文中有不同的向量”。BERT 通常取最后一层表示(或 [CLS] token),不做跨层加权平均。[2]
4

Sentence Embedding:从词向量到句向量

BERT 原生的 [CLS] token 作为句向量效果不佳(各向异性问题——向量聚集在空间的某个锥形区域,余弦相似度失真)。2019 年 Sentence-BERT 用对比学习(Contrastive Learning)微调 BERT,生成高质量的句向量。从此 Embedding 从”词级”扩展到”句级”和”文档级”,成为语义搜索的核心技术。
5

现代 Embedding:多模态与多任务

2023 年后,Embedding 进入多模态时代。OpenAI 的 text-embedding-3 系列支持 Matryoshka Representation Learning(MRL),允许在不重新训练的情况下截断向量维度。BGE-M3 支持 100+ 语言的多粒度检索(稠密、稀疏、多向量融合)。CLIP 将文本和图片映射到同一个向量空间,实现了跨模态检索。[3]
Embedding 解决的核心问题:
Embedding 的本质是将离散的、不可计算的非结构化数据(文本、图片)映射到连续的、可计算的向量空间,使得语义相似的数据在空间中距离更近——这是所有 AI 应用(RAG、搜索、推荐)的数据层基础。

🚫 没有 Embedding

搜索”如何优化 React 渲染性能”只能做关键词匹配,无法找到”避免不必要的 re-render”这种语义相关但关键词不同的文档。就像用拼音首字母查通讯录——你知道人名的发音但拼不出来,就找不到人。

✅ 引入 Embedding

语义搜索把查询和文档都转化为向量,通过余弦相似度匹配。“如何优化 React 渲染性能”和”避免不必要的 re-render”的向量距离很近,可以被正确检索到。就像通讯录支持模糊搜索——输入”小李”能找到”李明”。
回答时先说”为什么”(One-Hot 的痛点),再说”怎么解决”(Word2Vec 到 Transformer Embedding 的演进)。想听的是你对技术演进动机的理解,而不是背诵时间线。

Q2: Embedding 模型的原理是什么?

Embedding 模型的本质是一个编码器——输入文本,输出固定长度的向量。核心逻辑只有 3 步:
不同 Embedding 模型使用不同的池化策略,直接影响向量质量:
  • Mean Pooling:取所有 token 向量的平均值。BGE、E5、GTE 系列默认使用。适合通用语义表示。
  • CLS Token:取 [CLS] token 的输出向量。BERT 原生方式,但各向异性问题严重。
  • Last Token Pooling:取最后一个 token 的输出向量。OpenAI 未公开其 text-embedding-3 系列的池化方式。
  • Max Pooling:取每个维度的最大值。少数模型使用,对关键词匹配有优势。
选错池化策略会导致向量质量显著下降——例如对 BGE 模型使用 CLS Token 而非 Mean Pooling,检索准确率会明显降低。
Embedding 模型就像把一本书压缩成一段摘要。分词(Tokenizer)是”把书拆成章节和段落”。Transformer 编码器是”理解每段话在整本书中的含义”——同一个词在不同章节的含义不同(“苹果”在美食章节是水果,在科技章节是公司)。池化(Pooling)是”把所有章节的要点浓缩成一段 300 字的摘要”——摘要不能太长(维度太高浪费存储),也不能太短(信息丢失)。归一化是”统一摘要的字数”——这样比较两本书的摘要时,长度差异不会影响比较结果。

相似度计算方法

向量之间的相似度决定了检索的质量。两种主流方法:
| 方法 | 公式 | 值域 | 适用场景 | | -------------- | -------- | ------------ | -------------------- | --------- | -------------- | ------- | ---------------------- | | 余弦相似度 | a·b / ( | a | × | b | ) | [-1, 1] | 文本语义检索(最常用) | | 点积 | a·b | (-inf, +inf) | 归一化向量或推荐系统 | | 欧氏距离 | | a-b | | [0, +inf) | 聚类、异常检测 |

维度选择策略

维度是 Embedding 最核心的超参数之一——维度越高,表达能力越强,但存储和计算成本也越高:

Embedding 在 RAG 中的位置

Embedding 模型的核心流程是:分词 → Transformer 编码 → 池化 → 归一化。相似度计算首选余弦相似度(归一化向量下等价于点积)。维度选择遵循”够用就好”原则——MRL 技术允许在不重新训练的情况下截断维度。

Q3: Embedding 模型怎么选型?

基础梳理

表中的 MTEB 得分为公开评测的近似值。MTEB 榜单与评测子集版本更新频繁,不同版本之间不可直接横向比较,选型时应以自己的业务语料构造评测集。

专家视角深度剖析

很多人只知道”用 OpenAI 的 Embedding”,但实际更在意的是:怎么根据业务场景选择最合适的 Embedding 模型?选错了会怎样? 选型的核心决策树:

各模型核心特性对比

OpenAI text-embedding-3 系列:
  • Matryoshka Representation Learning:支持运行时截断维度,无需重新训练
  • 原生集成 OpenAI API,前端工程师接入成本最低
  • 不支持开源部署,数据必须经过 OpenAI 服务器
BGE-M3(BAAI):
  • “M3” = Multi-linguality(100+ 语言)+ Multi-functionality(稠密+稀疏+多向量)+ Multi-granularity(短句到长文档)
  • 基于 XLM-RoBERTa 架构,开源可自部署
  • 支持融合检索(Fusion Retrieval),将三种检索方式的结果加权融合,在部分检索任务上优于单一稠密检索
Jina-embeddings-v3:
  • 支持 Task LoRA:同一个模型通过 LoRA 适配不同任务(查询、文档、分类),无需部署多个模型
  • 支持 Matryoshka 维度截断(64/256/512/1024)
  • 长文档支持好(8192 tokens)
选 Embedding 模型就像给公司选翻译官。OpenAI 的翻译官是外包的(API 调用),专业水平高但数据要过别人的手。BGE-M3 是自己培养的多语言翻译官(开源自部署),会 100 多种语言,但需要自己养(GPU 资源)。Jina 是可以换专业领域的翻译官(Task LoRA),同一人切换法律/医学/技术领域。选型的核心不是”谁最贵最好”,而是”谁最适合你的业务场景”——中文为主选 BGE-M3,纯英文高精度选 OpenAI large,预算有限选 OpenAI small。

Embedding 模型的微调与适配

通用 Embedding 模型在特定领域(医疗、法律、金融)可能表现不佳。微调方案:

Q4: 向量数据库深度对比

向量数据库是存储和检索 Embedding 向量的专用数据库。核心能力是在百万甚至亿级向量中,毫秒级返回与查询向量最相似的 Top-K 结果。

基础梳理

专家视角深度剖析

向量数据库选型的核心不是”哪个最快”,而是”你的业务需要什么能力”。关键决策维度:

向量索引算法对比

HNSW 是最常用的向量索引算法,有两个关键参数:
  • M(每个节点的连接数):M 越大,图越稠密,查询越精确,但内存占用越高。推荐值:16-64。
  • efConstruction(构建时的搜索宽度):efConstruction 越大,索引质量越高,但构建越慢。推荐值:200-500。
  • efSearch(查询时的搜索宽度):efSearch 越大,查询越精确,但延迟越高。推荐值:64-200。
这三者的关系类似”修路”——M 是每条路的车道数(车道越多越宽),efConstruction 是修路时勘探的范围(勘探越广路网越合理),efSearch 是开车时搜索的范围(搜索越广找到的路越好,但耗时越长)。
向量数据库就像图书馆的索引系统。暴力搜索(FLAT)是”一本一本翻”——精确但慢得不可接受。HNSW 是”先看楼层指示牌,再看区域指示牌,再看书架标签”——分层导航,快速定位。IVF 是”先按主题分区,只在相关分区里找”——把图书馆分成科技区、文学区,找编程书只去科技区。DiskANN 是”大部分书在仓库(磁盘),常用的在书架(内存)“——用最少的内存覆盖最大的藏书量。

Q5: 为什么需要微调 Embedding?怎么微调?

通用 Embedding 模型在特定领域可能表现不佳——医疗领域的”PCI”(经皮冠状动脉介入治疗)和金融领域的”PCI”(支付卡行业数据安全标准)在通用模型中的向量可能非常接近,但在各自领域中含义完全不同。

微调的核心方法

方法 1:对比学习(Contrastive Learning)—— 最常用
方法 2:三元组训练(Triplet Training)
方法 3:知识蒸馏(Knowledge Distillation)—— 近年趋势

微调数据准备

Matryoshka Representation Learning(MRL)

MRL 是近年热门技术——训练时同时优化多个维度的向量质量,使得截断维度后精度损失最小:
Embedding 微调的核心是对比学习——用正样本对拉近语义相似的向量,用难负例推开语义相近但不相关的向量。数据准备的关键是挖掘高质量的难负例。MRL 技术允许在不重新训练的情况下截断维度,兼顾精度和成本。

Q6: Embedding 相关的高频面试题有哪些?

Embedding 向量为什么要做 L2 归一化?

L2 归一化使向量长度为 1,这样余弦相似度等价于点积,计算更快。更重要的是,未归一化的向量,其模长可能携带”置信度”信息——长文档的向量模长通常比短文档大,这会导致检索时长文档天然得分更高。归一化消除了这种偏差。

向量数据库的 HNSW 和 IVF 该选哪个?

HNSW 适合对延迟要求极高的实时检索场景(毫秒级),但内存占用高。IVF 适合大规模数据集,可以通过调整 nlist(聚类数)和 nprobe(搜索的聚类数)平衡速度和精度。实际项目中,HNSW 是默认选择;数据量超过内存上限时,考虑 DiskANN 或 IVF-PQ。

Embedding 模型的 Token 限制如何处理长文档?

三种方案:1) 切片(Chunking)——按固定长度或语义边界切片,每片独立生成向量;2) 滑动窗口——切片之间有重叠,避免信息丢失;3) 层次化 Embedding——先对每段生成向量,再对段向量做加权平均得到文档向量。RAG 系统中最常用的是切片 + 滑动窗口。

如何评估 Embedding 模型的质量?

使用 MTEB(Massive Text Embedding Benchmark)排行榜。它覆盖 8 类任务(分类、聚类、配对分类、重排序、检索、STS、摘要、双文本挖掘),在 56 个数据集上评测。但 MTEB 主要是英文基准——中文场景需要参考 C-MTEB。实际项目中,建议在自己的业务数据上构建评测集,跑端到端的检索准确率。

为什么 Sentence-BERT 比原生 BERT 的句向量效果好?

原生 BERT 的 [CLS] token 向量存在各向异性问题——所有句向量聚集在向量空间的某个锥形区域,任意两个句子的余弦相似度都在 0.6-1.0 之间,无法有效区分。Sentence-BERT 用对比学习微调,使句向量均匀分布在整个向量空间,相似句距离近,不相似句距离远。

稠密检索 vs 稀疏检索 vs 混合检索,怎么选?

稀疏检索(BM25)擅长精确关键词匹配——搜索”error code 404”效果好。稠密检索擅长语义匹配——搜索”页面找不到”也能找到 404 相关文档。混合检索将两者结合,通常用 RRF(Reciprocal Rank Fusion)或加权融合。生产环境推荐混合检索——BGE-M3 原生支持稠密+稀疏+多向量三种模式的融合。

Embedding 的维度越高越好吗?

不是。维度越高,表达能力越强,但存储和计算成本线性增长。公开评测中,从 512 维提升到 3072 维,性能提升通常只有几个百分点,但存储成本增加 6 倍。MRL 技术允许在运行时选择维度——先用高维度评测,确认效果后截断到低维度部署。实际项目中,768-1024 维通常是最佳平衡点。

如何处理 Embedding 模型的版本升级?

Embedding 模型升级后,新旧向量不兼容——不能在同一索引中混合使用不同版本的向量。方案:1) 全量重新生成(成本高但最可靠);2) 双索引切换(新旧索引并行运行,逐步迁移);3) 向量映射(训练一个线性变换层,将旧向量映射到新空间,精度损失可控但需要额外训练)。

Embedding 向量的常见踩坑

256 维向量的 max token 截断问题

Embedding API 有最大 token 限制(如 OpenAI text-embedding-3 系列为 8191 tokens)。超出限制的文本会被静默截断——不会报错,但后半部分的语义信息完全丢失。这在处理长文档时尤为隐蔽:你以为整篇文档都被向量化了,实际上只有前半部分被编码。
解决方案有三种:

批量写入导致向量变零

向量数据库对单次批量写入有数量限制。以 Elasticsearch / Easysearch 为例,默认 bulk 请求的文档数上限为 10000 条。超过限制时,部分文档的向量会被静默写入为零向量——不会报错,但这些零向量与任何查询的余弦相似度都为 0,永远不会被检索到。

kNN 索引的关键参数

Elasticsearch / Easysearch 的 kNN 向量检索依赖 HNSW 索引,有两个直接影响检索质量的参数:

推理模型的 reasoning_content vs content

使用推理模型(如 DeepSeek-R1、QwQ)做 Embedding 相关的 RAG 生成时,需要注意响应中包含两个字段:reasoning_content 是模型的思维链(中间推理步骤),content 是最终答案。前端渲染时应隐藏 reasoning_content,只展示 content——否则用户会看到大段的推理过程,影响体验。
Embedding 向量的常见踩坑包括:1) 长文本超过 API 的 max token 限制会被静默截断,导致后半部分语义丢失,解决方案是先切片再向量化;2) 批量写入向量数据库时超过限制会导致部分向量变零,解决方案是分批写入(每批 200 条);3) kNN 索引的 num_candidates、m、ef_construction 参数直接影响检索精度,需要根据数据规模调优;4) 推理模型的 reasoning_content 是思维链,前端应隐藏只展示 content。

🔍 底层源码:Transformer Embedding 是怎么计算的?

Transformer 编码器的核心是多头自注意力(Multi-Head Self-Attention)。每个 Token 通过 Q、K、V 矩阵与其他所有 Token 交互,生成上下文相关的向量表示(详见 HuggingFace Transformers 源码 modeling_bert.py):
这段代码做了 3 件事:1) 每个 Token 通过注意力机制”看到”序列中所有其他 Token;2) 多头注意力在不同子空间捕捉不同类型的语义关系;3) 前馈网络(FFN)进一步变换向量,增加非线性表达能力。经过 12-24 层这样的编码,每个 Token 的向量已经编码了丰富的上下文信息。 以 Sentence Transformers 的 Mean Pooling 为例(详见 Sentence Transformers 源码 pooling.py):
这段代码的关键是 attention_mask——它标记了哪些位置是真实的 Token(值为 1),哪些是 Padding(值为 0)。Mean Pooling 只对真实 Token 求平均,避免 Padding 向量污染最终的句向量。

Q7: 满分回答 vs 及格回答

问题:“说说 Embedding 的原理和在 RAG 中的应用”

及格回答(60-70分):
“Embedding 是把文本转化为向量,通过余弦相似度计算相似性,RAG 中用向量数据库检索相关文档。”
问题出在:知道概念但不理解机制。 满分回答(90-100分):
“Embedding 解决的核心问题是让计算机能’理解’语义。One-Hot 编码无法表达语义关系(‘国王’和’女王’正交),Word2Vec 通过浅层神经网络将词映射到低维稠密向量,语义相近的词在向量空间中距离更近。但 Word2Vec 是’一词一向量’,无法处理多义词。Transformer Embedding(如 BERT)通过自注意力机制生成上下文相关的向量——同一个词在不同句子中有不同的向量。[1]”
“在 RAG 系统中,Embedding 是数据层的核心。离线阶段:文档按语义边界切片(通常 256-512 tokens,重叠 50 tokens),每片通过 Embedding 模型生成向量,存入向量数据库(如 Milvus,使用 HNSW 索引)。在线阶段:用户查询经过同一个 Embedding 模型生成查询向量,在向量数据库中做 Top-K 检索(余弦相似度),返回最相关的文档片段,与用户查询一起送给 LLM 生成回答。[2]”
“实际项目中有三个关键决策:1) 模型选型——中文为主选 BGE-M3(开源免费、100+ 语言支持),纯英文高精度选 text-embedding-3-large;2) 维度选择——MRL 技术允许运行时截断维度,768-1024 维是最佳平衡点;3) 切片策略——滑动窗口(重叠 50 tokens)比固定切片效果好,避免语义在切片边界被截断。[3]”
“踩坑经验:Embedding 模型升级后新旧向量不兼容,不能在同一索引中混合使用,必须全量重新生成或双索引切换。长文档的向量模长比短文档大,必须做 L2 归一化才能公平比较。向量数据库的 HNSW 参数(M、efConstruction)需要根据数据规模调优——M=16、efConstruction=200 是默认起点,数据量超过 1000 万时 M 需要调到 32-64。“

常见追问

题目来源于真实面经(字节/腾讯/阿里前端面试、牛客网、haizlin/fe-interview),按难度递进。
答题要点: 从维度、稀疏性、语义表达三个维度对比。高分回答: “One-Hot 编码是稀疏的离散向量——词表有 50000 个词,每个词是一个 50000 维的向量,只有对应位置为 1。Embedding 是稠密的连续向量——通常 300-3072 维,每个维度都有值。三个核心区别:
  1. 维度:One-Hot 维度 = 词表大小(50000),Embedding 维度是超参数(通常 300-3072)。Embedding 本质上是一个降维过程。
  2. 稀疏性:One-Hot 只有一个位置为 1,其余为 0(稀疏);Embedding 每个维度都有值(稠密),信息密度高。
  3. 语义表达:One-Hot 无法表达语义关系(任意两个词的余弦相似度都是 0);Embedding 通过训练学习语义关系,语义相近的词向量距离近。
从实现角度看,Embedding 层本质上是一个查找表(Lookup Table)——输入词的索引,输出对应的向量。这等价于 One-Hot 向量乘以权重矩阵:one_hot @ W = W[index]。”
答题要点: 从训练目标、适用场景、计算效率三个维度对比。高分回答: “CBOW 和 Skip-gram 是 Word2Vec 的两种训练模式,核心区别在于预测方向:CBOW(Continuous Bag of Words):用上下文词预测中心词。输入是上下文窗口内的词向量平均,输出是中心词。训练速度快,适合高频词。Skip-gram:用中心词预测上下文词。输入是中心词,输出是上下文窗口内的每个词。训练速度慢,但对低频词和小数据集效果更好。
实际选择:数据量大、高频词为主 → CBOW。数据量小、需要处理低频词 → Skip-gram。GloVe(另一种词向量模型)用共现矩阵+分解,介于两者之间。”
答题要点: 从公式、值域、是否受向量模长影响三个维度对比。高分回答: “余弦相似度衡量两个向量的方向相似性,点积同时受方向和模长影响。
使用场景:
  • 余弦相似度:文本语义检索(最常用)。因为长文档和短文档的向量模长不同,但语义可能相同。
  • 点积:1) 向量已归一化时(此时余弦相似度 = 点积,计算更快);2) 推荐系统中需要考虑热度(模长代表热度)。
  • 欧氏距离:聚类算法(K-Means)和异常检测。
向量数据库通常同时支持这三种距离度量。选择建议:默认用余弦相似度,如果向量已归一化用点积(更快)。”
答题要点: 从图结构、分层导航、参数调优三个角度回答。高分回答: “HNSW(Hierarchical Navigable Small World)是一种基于图的近似最近邻算法。核心思想是构建一个多层的可导航小世界图:
  1. 底层(Layer 0):包含所有向量,每个节点连接 M 个最近邻节点
  2. 上层:随机选择部分节点,形成稀疏的’高速公路’
  3. 查询时:从最高层的入口节点开始,逐层向下导航,每层找到最近邻节点作为下一层的起点
参数调优:
  • M(连接数):M=16 是默认值。数据量 100 万+ 时建议 M=32-64。M 越大,图越稠密,查询越精确,但内存占用线性增长。
  • efConstruction(构建参数):efConstruction=200 是默认值。建议至少 2*M。efConstruction 越大,索引质量越高,但构建时间越长。
  • efSearch(查询参数):efSearch=64 是默认值。efSearch 越大,查询越精确,但延迟越高。建议在 64-200 之间调优。
内存估算:每个向量占用 dim * 4 bytes(float32)+ M * 2 * 4 bytes(图的边)。100 万 1536 维向量约需 6.5 GB(向量数据)+ 0.13 GB(图结构)。”
答题要点: 从切片大小、重叠、语义边界三个维度回答。高分回答: “文档切片是 RAG 系统中最容易被忽视但影响最大的环节。切片策略直接决定检索质量:
  1. 切片大小:256-512 tokens 是最佳范围。太小(< 128 tokens)丢失上下文,太大(> 1024 tokens)引入噪音。经验值:每个切片应该包含一个完整的语义单元(一个段落、一个代码函数、一个问答对)。
  2. 重叠(Overlap):相邻切片之间重叠 50-100 tokens。避免语义在切片边界被截断——如果一个概念跨越两个切片,重叠确保两个切片都能检索到完整信息。
  3. 语义切片:比固定长度切片效果好。按 Markdown 标题、段落、代码块等语义边界切片。LangChain 的 RecursiveCharacterTextSplitter 先按 \n\n(段落)切,段落太长再按 \n(行)切,行太长再按字符切。
答题要点: 对比稀疏检索和稠密检索的优劣,说明融合方法。高分回答: “混合检索将稀疏检索(BM25)和稠密检索(向量)的结果融合,取长补短:
  1. 稀疏检索(BM25):基于词频和逆文档频率的关键词匹配。擅长精确匹配——搜索 ‘error code 404’ 效果好。弱点是无法处理同义词——搜索 ‘页面找不到’ 找不到 404 相关文档。
  2. 稠密检索(向量):基于 Embedding 的语义匹配。擅长语义匹配——‘页面找不到’ 和 ‘error 404’ 的向量距离很近。弱点是对精确关键词不敏感——搜索特定的错误代码可能匹配到语义相似但不相关的文档。
  3. 融合方法:RRF(Reciprocal Rank Fusion)是最常用的融合算法。公式:RRF_score(d) = sum(1 / (k + rank_i(d))),k 通常取 60。简单说,一个文档在两个检索结果中排名都靠前,融合后的排名就更靠前。
BGE-M3 原生支持融合检索(稠密+稀疏+多向量),是多语言混合检索的常见方案之一。”
答题要点: 从兼容性、迁移方案、成本三个维度分析。高分回答: “Embedding 模型升级后,新旧向量在不同的向空间中,余弦相似度没有意义,不能在同一索引中混合使用。三种迁移方案:
  1. 全量重新生成:用新模型对所有文档重新生成向量。最可靠,但成本最高——100 万文档,每条 512 tokens,text-embedding-3-small 的成本约 $0.02。如果数据量大(1 亿+),需要分批处理,耗时可能数天。
  2. 双索引切换:同时维护新旧两个索引,新请求用新索引,旧请求逐步迁移。优点是零停机时间,缺点是双倍存储成本。切换完成后下线旧索引。
  3. 向量映射:训练一个线性变换层,将旧向量映射到新空间。需要少量标注数据(1000 对新旧向量),训练成本低,但会带来小幅精度损失,适合对成本敏感但可接受精度下降的场景。
实际建议:数据量 < 1000 万,全量重新生成(成本可控)。数据量 > 1 亿,双索引切换 + 逐步迁移。”
答题要点: 从数据摄入、切片、索引、更新、监控五个环节回答。高分回答: “生产级 Embedding Pipeline 需要覆盖五个环节:
  1. 数据摄入:支持多种文档格式(PDF、Markdown、HTML),用 LangChain 的 Document Loader 统一处理。关键:保留文档元数据(来源、更新时间、权限),用于后续的过滤和追溯。
  2. 切片策略:语义切片(按标题/段落)+ 滑动窗口(overlap 50 tokens)。切片后做去重(相同内容的切片只保留一份)和过滤(太短的切片丢弃,通常是页眉页脚)。
  3. 索引构建:批量生成 Embedding(用 batch API,每批 100-500 条),写入向量数据库(HNSW 索引)。关键:先构建索引再上线,不要在查询时实时插入。
  4. 增量更新:文档变更时,只重新生成变更切片的向量,不全量重建。用文档的 hash 值检测变更。删除文档时,从索引中删除对应向量(很多团队忘记这一步,导致检索到已删除的文档)。
  5. 监控告警:监控 Embedding API 的延迟、错误率、Token 消耗。监控检索质量——定期跑评测集,如果检索准确率下降 5%+,触发告警(可能是数据质量问题或模型服务异常)。”

📚 延伸阅读与引用参考