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_query 和 embed_documents 必须用同一个模型——否则查询向量和文档向量在不同空间,相似度无意义。
2.2 HuggingFaceEmbeddings(本地模型,本系列主力)
为什么归一化:归一化后向量的余弦相似度 = 点积(一维
sum(x*y) 就能算),又快又直观。
实测相似度(2026-08):
3. 数据字典:Chroma 向量库
3.1 概念模型
3.2 构造与方法
4. 数据字典:Retriever(检索器)
为什么需要 Retriever(规定性 8 的收尾):VectorStore 本身不是 Runnable(没有 invoke)。Retriever 包一层,让它变成 Runnable——这样就能用
| 管道接进 LCEL 链(第 09 篇)。这是”向量库”通向”RAG 链”的桥。
5. 进程线程模型
- embedding 是本地 CPU 推理(sentence-transformers + torch)——不联网、不阻塞网络(首次下载模型除外)。
- Chroma 是本地嵌入式数据库(sqlite + HNSW)——单进程内运行,不联网。
6. 网络模型
7. 验证:跑起来
配套代码code/08_embed_search.py:
- embed_query 看 512 维向量;
- 亲手算余弦相似度(验证”意思相近分高”);
- 新人培训手册 163 块入库 Chroma;
- 语义检索 vs 关键词搜索对比;
- InMemoryVectorStore:纯内存向量库,零磁盘(测试/原型神器)。
7.5 补充:InMemoryVectorStore——纯内存向量库(测试/原型神器)
Chroma 要persist_directory(落盘到 sqlite)。但测试和原型场景,你经常只是”临时塞几个句子进去查一下”——用 InMemoryVectorStore 更省事:
- 接口和 Chroma 完全一致(
add_texts/similarity_search/as_retriever)——测试时用它,上生产换 Chroma 只改构造那行; - 零磁盘、零配置——不用建目录、不用删旧库、进程结束即消失,测试之间天然隔离;
- 第 13 篇全地图里它被列为”测试神器”,就是说的这个用途。
8. 边界
- embedding 模型 ≠ 对话模型——两者独立选择。换 embedding 模型 = 向量空间全变,必须重新建库。
- 相似度高分 ≠ 答案对——检索只是”召回”,质量由模型判断。召回不准时用第 10 篇重排序。
- 首次下载 100MB——没配
HF_ENDPOINT镜像可能很慢/失败。 - Chroma 是嵌入式——单机足够;超大知识库(千万级块)换专用向量数据库(Milvus 等),接口约定类似(都实现 VectorStore)。
推荐资料(延伸阅读)
- LangChain 官方文档 · 嵌入模型集成 —— Embeddings 接口与集成
- LangChain 官方文档 · 向量库集成 —— VectorStore 接口与官方支持清单
- Chroma 官方文档 —— 本教程使用的向量库,API 与配置
9. 未完待续
零件齐了:模板、模型、解析器、记忆、文档、切分、向量库、Retriever。老板要的东西来了:把检索 → 拼上下文 → 生成,串成一条完整链路——RAG。 但是:旧教程教的RetrievalQA / create_retrieval_chain 已经迁入 langchain-classic(弃用)。第 09 篇教你用 LCEL 管道直接组装——这才是 1.x 官方路线。
→ 09 · RAG 组装