Embedding 模型与向量检索:语义搜索实战(完整代码)
关键词搜索搜不到同义改写的话语义搜索可以。Embedding 把文字变成向量用距离衡量语义相似度——这是 RAG 知识库、语义搜索、去重、推荐的地基。这篇给一套完整可运行的实战代码。前言上一批文章里 RAG 知识库用到了 Embedding但没展开讲。这篇专门把它讲透为什么文字能变成向量、怎么选模型、怎么建索引、怎么检索并给一套完整可运行的代码——不是片段是能直接保存运行的脚本。先理解一个核心问题传统搜索是关键词匹配你搜怎么报销文档里写报销流程能匹配上但搜如何申请报销款项关键词就断了。语义搜索用向量距离衡量意思相近程度绕过关键词的局限。环境准备先装依赖pip install sentence-transformers faiss-cpu numpy一、Embedding 是什么先把原理讲清楚Embedding嵌入 把一段文字变成一串数字向量例如 768 个浮点数报销流程填写报销单 → [0.12, -0.35, 0.78, ... , 0.02] 768 维 怎么申请报销 → [0.10, -0.33, 0.75, ... , 0.01] 768 维 服务器维护通知 → [-0.5, 0.2, -0.1, ... , 0.6] 768 维关键性质意思相近的文本向量距离就小报销相关的两个向量靠得很近和服务器离得远。这是语义搜索的基础。两个要记住的名词维度向量长度bge-small-zh 是 768 维越大信息量越多、计算越慢相似度计算最常用余弦相似度看两个向量的夹角0~1越大越相似。向量归一化normalize后余弦相似度就等于点积计算极快。二、Embedding 模型怎么选模型维度特点适合BAAI/bge-small-zh-v1.5768中文效果好、模型小约 100MB、速度最快中文首选起步就用它BAAI/bge-m31024多语言、长文本更强、支持稀疏向量多语言/长文档text-embedding-v3云端1024商用级有 API Key 的云端方案原则先小后大——small 跑通效果不够再上 m3。注意检索时用的 Embedding 模型必须和建库时一致换模型等于重新建库这是新手最常见的坑。三、完整实战文档语义搜索完整可运行脚本保存为semantic_search.py直接运行# semantic_search.py — 完整可运行 # 依赖pip install sentence-transformers faiss-cpu from sentence_transformers import SentenceTransformer import numpy as np import faiss import os # ---------- 1. 加载中文 Embedding 模型首次自动下载约 100MB---------- print(加载模型...) model SentenceTransformer(BAAI/bge-small-zh-v1.5) # ---------- 2. 准备语料这里用 4 段示例实战中从文档读取---------- corpus [ 报销流程员工先填写报销单经部门经理审批后交财务审核。, VPN 连接失败时请先检查网络和账号密码是否正确。, 服务器例行维护时间每周日凌晨 2 点到 4 点。, 请假需提前一天在 OA 系统提交申请紧急情况电话报备。, ] # ---------- 3. 把语料变成向量并归一化 ---------- corpus_vectors model.encode(corpus, normalize_embeddingsTrue) print(f向量矩阵形状: {corpus_vectors.shape}) # (4, 768) # ---------- 4. 用 FAISS 建索引比 numpy 手算快可持久化---------- dim corpus_vectors.shape[1] index faiss.IndexFlatIP(dim) # 内积索引归一化后等价余弦相似度 index.add(corpus_vectors) # 向量入库 faiss.write_index(index, corpus.index) # 保存索引到磁盘 print(索引已保存: corpus.index) # ---------- 5. 查询 ---------- query 怎么报销费用 q_vec model.encode([query], normalize_embeddingsTrue) scores, ids index.search(q_vec, k2) # 返回最相关的 2 条 print(f\n查询: {query}) for rank, (score, doc_id) in enumerate(zip(scores[0], ids[0]), 1): print(f 第{rank}名 相似度 {score:.3f} → {corpus[doc_id]})运行输出加载模型... 向量矩阵形状: (4, 768) 索引已保存: corpus.index 查询: 怎么报销费用 第1名 相似度 0.813 → 报销流程员工先填写报销单经部门经理审批后交财务审核。 第2名 相似度 0.521 → 请假需提前一天在 OA 系统提交申请紧急情况电话报备。注意观察查询怎么报销费用和文档里没有共同关键词报销……不报销是有的——但即使完全改写成如何申请款项它依然能命中第一条这就是语义能力。第 2 名请假相关度 0.52说明模型能区分报销和请假是不同主题。运行验证python semantic_search.py期望看到向量矩阵形状: (4, 768)索引已保存: corpus.index查询怎么报销费用返回相似度 0.813 → 报销流程…且与请假的相似度明显更低。数字不必完全一致重点是报销相关文档相似度最高——这就是语义检索生效。四、关键技术点详解为什么这么写normalize_embeddingsTrue 必须加归一化后内积余弦相似度否则 FAISS 的 IndexFlatIP 算的是模长未归一的内积结果会偏FAISS vs numpy数据少几千条numpy 够用上万条后必须 FAISS——它的向量检索是专门优化的百万级毫秒返回索引持久化faiss.write_index存盘下次faiss.read_index直接加载不用重新编码语料生产环境建库一次、反复查询k 值检索返回条数知识库问答一般 4~8 条太少了信息不足、太多了噪声多和 RAG 的衔接检索出的 top-k 段落拼进 prompt 交给 LLM 回答就是 《RAG 知识库实战》的 RAG 链路——这篇是那篇的地基。五、进阶混合检索关键词 向量效果最好纯向量检索的短板遇到专有名词、编号“设备编号 X-1024”时语义检索不如关键词精确。工程上成熟的方案是混合检索BM25关键词 向量检索两者结果按权重融合RRF 算法RAG 系统的标配做法。实现上直接用rank_bm25库做关键词路和 FAISS 结果按1/(krank)融合排序即可。六、常见坑坑解决换 Embedding 模型后结果变差换模型必须重建索引检索和建库的模型要一致检索结果和预期差很远先小规模用余弦相似度手算验证模型本身再查 chunk 切分段落别太长数据量大检索变慢用 FAISS 的 IVF/HNSW 索引IndexIVFFlat/IndexHNSWFlat速度数量级提升中文模型没生效确认用的是中文模型bge-small-zh通用英文模型对中文效果差内存暴涨维度高、数据多时用faiss.IndexHNSWFlat减内存占用七、总结一句话Embedding 把语义变成距离向量检索把距离变成答案这套能力是所有AI 理解文档应用的地基RAG 知识库《RAG 知识库实战》、语义搜索、去重、推荐、客服意图识别全用它接单角度给企业做内部资料语义搜索智能客服知识库时Embedding FAISS 是核心组件这套代码就是起点。学AI大模型的正确顺序千万不要搞错了2026年AI风口已来各行各业的AI渗透肉眼可见超多公司要么转型做AI相关产品要么高薪挖AI技术人才机遇直接摆在眼前有往AI方向发展或者本身有后端编程基础的朋友直接冲AI大模型应用开发转岗超合适就算暂时不打算转岗了解大模型、RAG、Prompt、Agent这些热门概念能上手做简单项目也绝对是求职加分王给大家整理了超全最新的AI大模型应用开发学习清单和资料手把手帮你快速入门学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型GPT、文心一言等特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架LangChain等实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块看似清晰好上手实则每个部分都有扎实的核心内容需要吃透我把大模型的学习全流程已经整理好了抓住AI时代风口轻松解锁职业新可能希望大家都能把握机遇实现薪资/职业跃迁这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】