07-Embedding是什么-通俗理解向量检索 Embedding嵌入模型是什么用通俗语言理解向量检索系列从零构建企业 RAG 知识库第 7 篇1. Embedding 是一种可比较的表示Embedding 把文本映射成固定维度数值向量如何申请退款 → [0.12, -0.38, ...] 退货流程是什么 → [0.10, -0.35, ...]训练目标使语义相关文本在向量空间中更接近。向量不是人工可读的“主题字段”单个维度通常也没有稳定业务解释。2. 向量检索的三步用同一 Embedding 模型向量化文档 Chunk用同一模型向量化用户问题根据 Cosine Similarity余弦相似度、点积或距离取最近候选。不同模型、不同版本或不同维度产生的向量通常不能直接混用。升级模型时应建立新索引并灰度切换。3. 余弦相似度frommathimportsqrtdefcosine_similarity(left:list[float],right:list[float])-float:ifnotleftorlen(left)!len(right):raiseValueError(向量不能为空且维度必须一致)left_normsqrt(sum(value*valueforvalueinleft))right_normsqrt(sum(value*valueforvalueinright))ifleft_norm0orright_norm0:raiseValueError(零向量无法计算方向)dotsum(a*bfora,binzip(left,right))returndot/(left_norm*right_norm)余弦比较方向不比较长度。若向量已归一化余弦相似度等于点积数据库使用哪种度量必须与模型建议和索引配置一致。4. 一个可复验的教学 Embedderfromdataclassesimportdataclassdataclass(frozenTrue)classVectorItem:item_id:strtext:strvector:tuple[float,...]classFakeSemanticEmbedder:人为定义语义轴只用于验证检索代码不代表真实模型。KEYWORDS{退款:(1.0,0.0,0.0),退货:(0.9,0.1,0.0),物流:(0.0,1.0,0.0),密码:(0.0,0.0,1.0),}defembed(self,text:str)-list[float]:vector[0.0,0.0,0.0]forkeyword,valuesinself.KEYWORDS.items():ifkeywordintext:vector[abfora,binzip(vector,values)]returnvectordefvector_search(query:str,items:list[VectorItem],embedder:FakeSemanticEmbedder,top_k:int,)-list[tuple[float,VectorItem]]:query_vectorembedder.embed(query)scored[(cosine_similarity(query_vector,list(item.vector)),item.item_id,item,)foriteminitems]scored.sort(keylambdarow:(-row[0],row[1]))return[(score,item)forscore,_,iteminscored[:top_k]]5. 批量向量化与版本记录真实 API 通常支持批量输入。批量大小受厂商请求限制、文本长度和超时影响不能写死一个“万能值”。fromdataclassesimportdataclassdataclass(frozenTrue)classEmbeddingRecord:chunk_id:strmodel_id:strdimensions:intvector:tuple[float,...]defmake_record(chunk_id:str,model_id:str,vector:list[float],expected_dimensions:int,)-EmbeddingRecord:iflen(vector)!expected_dimensions:raiseValueError(Embedding 维度与索引配置不一致)returnEmbeddingRecord(chunk_id,model_id,expected_dimensions,tuple(float(value)forvalueinvector),)模型 ID 应是可追踪的精确版本或内部发布 ID不只保存可能漂移的别名。6. 可复验测试deftest_semantic_axis_retrieves_related_item()-None:embedderFakeSemanticEmbedder()items[VectorItem(a,退货流程,tuple(embedder.embed(退货流程))),VectorItem(b,密码修改,tuple(embedder.embed(密码修改))),]resultvector_search(退款申请,items,embedder,top_k1)assertresult[0][1].item_idadeftest_dimension_mismatch_is_rejected()-None:try:make_record(c1,demo-model,[0.1,0.2],3)exceptValueError:passelse:raiseAssertionError(维度错误必须失败)7. Embedding 的局限相似不等于事实支持对编号、产品代码和专有名词关键词检索可能更强长 Chunk 会把多个主题平均到一个向量否定、数字差异和细粒度条件可能被忽略多语言效果取决于模型训练查询与文档表达差异需要真实数据评测。8. 对抗性审查向量可能泄露语义信息也需要访问控制向量索引不能跨租户无条件检索不记录用户原文到普通 Embedding 日志模型升级不在旧索引中混写新向量批量失败要知道哪些条目成功用 RecallK 等检索指标验证而不是只看二维可视化。9. 总结Embedding 是让文本可以进行数学近邻搜索的表示方式。它擅长召回语义相关候选但不负责权限、事实判断和最终排序必须与关键词检索、重排和评测配合。