Skip to main content

08 · 向量化与向量库:让机器理解”意思相近”

本片目标:解决”怎么找到最相关的块”。用 Embedding 把文本变成向量,用向量相似度检索——这是 RAG 的召回引擎。 新增规定性:8(Embedding 接口 + Chroma 库协议 + Retriever 转换) 数据字典:Embeddings / HuggingFaceEmbeddings / Chroma / VectorStoreRetriever。 进程线程模型:embedding 本地推理(CPU 计算);Chroma 本地 sqlite+HNSW。 网络模型:embedding 模型首次需从 HF 下载(~100MB);之后纯本地。

1. 上集回顾

第 07 篇把新人培训手册切成了 163 块。现在问题:用户问”转正需要什么条件”,怎么找到最相关的块? 关键词搜索if "转正" in chunk —— 但用户问”我多久能转正”,里面没有”条件”二字;问”答辩要几个评委”,块里写的是”评委人数:4 位以上评委打分”。字面对不上,但意思相近 向量搜索:把每句话变成一个”语义坐标”(向量),语义相近的文本向量也相近。用户问句的向量,和”转正”块的向量挨得很近——就能命中。

2. 数据字典:Embedding 接口

2.1 Embeddings(抽象接口,langchain_core)

铁律embed_queryembed_documents 必须用同一个模型——否则查询向量和文档向量在不同空间,相似度无意义。

2.2 HuggingFaceEmbeddings(本地模型,本系列主力)

为什么归一化:归一化后向量的余弦相似度 = 点积(一维 sum(x*y) 就能算),又快又直观。 实测相似度(2026-08):
下载注意:首次运行模型自动从 HuggingFace 下载(~100MB)。国内需镜像:

3. 数据字典:Chroma 向量库

3.1 概念模型

每个 collection 里存的是:块文本 + 向量 + metadata + id

3.2 构造与方法


4. 数据字典:Retriever(检索器)

为什么需要 Retriever(规定性 8 的收尾):VectorStore 本身不是 Runnable(没有 invoke)。Retriever 包一层,让它变成 Runnable——这样就能用 | 管道接进 LCEL 链(第 09 篇)。这是”向量库”通向”RAG 链”的桥。

5. 进程线程模型

  • embedding 是本地 CPU 推理(sentence-transformers + torch)——不联网、不阻塞网络(首次下载模型除外)。
  • Chroma 是本地嵌入式数据库(sqlite + HNSW)——单进程内运行,不联网。

6. 网络模型

对比第 01~06 篇:对话模型的调用每次都要联网(云端推理);embedding 用本地小模型——快、免费、隐私安全。生产常见组合:本地 embedding + 云端对话模型。

7. 验证:跑起来

配套代码 code/08_embed_search.py
  1. embed_query 看 512 维向量;
  2. 亲手算余弦相似度(验证”意思相近分高”);
  3. 新人培训手册 163 块入库 Chroma;
  4. 语义检索 vs 关键词搜索对比;
  5. InMemoryVectorStore:纯内存向量库,零磁盘(测试/原型神器)。
预期输出(节选)

7.5 补充:InMemoryVectorStore——纯内存向量库(测试/原型神器)

Chroma 要 persist_directory(落盘到 sqlite)。但测试和原型场景,你经常只是”临时塞几个句子进去查一下”——用 InMemoryVectorStore 更省事:
为什么有用
  • 接口和 Chroma 完全一致add_texts / similarity_search / as_retriever)——测试时用它,上生产换 Chroma 只改构造那行;
  • 零磁盘、零配置——不用建目录、不用删旧库、进程结束即消失,测试之间天然隔离;
  • 第 13 篇全地图里它被列为”测试神器”,就是说的这个用途。
适用边界:纯内存、进程重启就丢、不适合多进程共享——只用于测试/原型/单元测试,生产用 Chroma(单机)或 Milvus(大规模)。

8. 边界

  • embedding 模型 ≠ 对话模型——两者独立选择。换 embedding 模型 = 向量空间全变,必须重新建库
  • 相似度高分 ≠ 答案对——检索只是”召回”,质量由模型判断。召回不准时用第 10 篇重排序。
  • 首次下载 100MB——没配 HF_ENDPOINT 镜像可能很慢/失败。
  • Chroma 是嵌入式——单机足够;超大知识库(千万级块)换专用向量数据库(Milvus 等),接口约定类似(都实现 VectorStore)。

推荐资料(延伸阅读)


9. 未完待续

零件齐了:模板、模型、解析器、记忆、文档、切分、向量库、Retriever。老板要的东西来了:把检索 → 拼上下文 → 生成,串成一条完整链路——RAG。 但是:旧教程教的 RetrievalQA / create_retrieval_chain 已经迁入 langchain-classic(弃用)。第 09 篇教你用 LCEL 管道直接组装——这才是 1.x 官方路线。 09 · RAG 组装