10 KiB
我们之前讲的搭建本地知识库,基本都是使用检索增强生成(RAG)技术来搭建,Embedding模型则是RAG的核心,同时也是大模型落地必不可少的技术。那么今天我们就来聊聊Embedding向量模型:
一、Embedding模型是什么?
Embedding模型是一种将离散数据(如文本、图像、用户行为等)映射到连续向量空间的技术。其核心思想是通过低维稠密向量(Embedding)捕捉数据的内在特征和语义关系。
用通俗易懂一些的说法就是Embedding给数据穿上了一件“数字外衣”,把离散数据(如文本、图像、用户行为等)转化成一组数字,即向量来表示,目的是让机器更好的理解和处理。
或者说,Embedding模型就是一个“翻译官”,能把文字、图片、用户行为这些东西,变成一串计算机能看懂的数字。
比如:它能知道“猫”和“狗”都是宠物,所以它们的数字串很像;但“猫”和“西瓜”差别大,数字串就离得远。
干啥用?比如让手机听懂你说的话,或者让淘宝猜你喜欢什么商品。
在本地知识库搭建中,我们关注的重点是文本Embedding,它能把文本信息变成计算机更容易理解和处理的向量模型。
二、Embedding模型原理
Embedding模型的原理就像“猜词游戏”:
比如你和朋友聊天,朋友说:“我今天买了一只__,它会喵喵叫”,你肯定猜是“猫”。Embedding模型就是通过大量这样的句子,学会哪些词经常一起出现,然后把它们变成相似的数字串。
方法举例:
Word2Vec:像小学生背单词,记“苹果”和“水果”是相关的。
BERT(比如ChatGPT的基础):像学霸,联系上下文猜词,比如“银行”在“存钱”和“河边”两种句子中意思不同。
三、Embedding模型向量化方法
常见的向量化方法包括:
| 基于词频/共现 | 1、TF-IDF:基于词频统计。2、LSA:对词-文档矩阵进行奇异值分解(SVD)。 |
| 基于神经网络 | 1、Word2Vec:Skip-Gram/CBOW(适合通用语义)。2、FastText:引入子词(subword)信息,解决未登录词问题。3、GloVe:结合全局词共现统计与局部上下文窗口。 |
| 上下文相关模型 | BERT:动态生成基于上下文的向量(如“bank”在“河岸”和“银行”中不同)。 |
| 图嵌入 | Node2Vec:将图节点映射为向量,保留网络结构特征。2、 |
非文本领域:如推荐系统中使用矩阵分解(MF)生成用户/物品向量。
四、Embedding模型作用
Embedding 模型在本地知识库中的作用,可以理解为用“数字密码”将本地文件(如文档、笔记、数据库)转化为计算机能理解的形式,从而快速实现搜索、问答、分类等功能。
1、本地数据向量化
把本地知识库中的文档(如PDF、Word、Excel、笔记)转化为向量,方便后续搜索。
数据预处理
| 分块 | 将长文档拆分成小段落(如每段200-500字),避免信息过载。示例:一篇10页的“咖啡研究报告” → 拆成30个小段落。 |
| 清洗 | 去除乱码、特殊符号、广告等无关内容。 |
选择Embedding模型
| 通用场景 | 用轻量级模型(如 text2vec、m3e-base),适合本地运行。 |
| 专业场景 | 用领域微调模型(如法律用Law-Embedding,医学用 BioBERT) |
批量生成向量
对每个文本段落调用Embedding模型,生成对应的向量(一串数字)。
工具示例:
# 伪代码:用 text2vec 生成向量
from text2vec import SentenceModelmodel = SentenceModel("shibing624/text2vec-base-chinese")text = "咖啡因可以提神,但过量会导致心悸。"vector = model.encode(text) # 输出示例:[0.3, -0.2, 0.8, ...]
存储向量+原文
| 向量数据库 | 将向量和对应的原文关联存储。 |
| 工具推荐 | 轻量级:FAISS(适合小数据,快速检索)。大规模:Milvus、Qdrant(支持百万级数据)。 |
| 存储示例 |
2、用户输入向量化
接受用户输入
用户输入可以是文字、语音转文字,甚至图片(需先用多模态模型转为文本)。
示例输入:
文字:“提神饮料有哪些?”
语音:“帮我找关于咖啡的文章。”
输入与处理
纠错:修正错别字(如“提神钦料” → “提神饮料”)
精简:提取关键信息(如“请告诉我如何快速提神?” → “快速提神方法”)。
生成用户输入向量
使用相同的Embedding模型,将用户输入转为向量。
代码示例:
user_query = "提神饮料有哪些?"query_vector = model.encode(user_query) # 生成向量,如 [0.25, -0.3, 0.75, ...]
相似度计算与匹配
在向量数据库中,快速找到与用户向量最接近的本地数据向量。
算法:
余弦相似度(最常用,计算方向相似性)。
欧氏距离(计算向量绝对距离)。
工具示例(使用FAISS):
# 伪代码:FAISS 搜索相似向量distances, indices = index.search(query_vector, k=5) # 找最接近的5个结果for idx in indices: print("匹配内容:", 原文库[idx])
返回结果
根据匹配的向量,返回对应的原始文本或摘要。
优化技巧:
多路召回:同时匹配多个相似段落,提升覆盖率。
重排序:用更精细的模型(如交叉编码器)对结果二次排序。
3、完整流程示意图
用户输入 → 向量化 → 搜索向量库 → 匹配最相似的本地数据 → 返回结果 ↑ ↑ 同一模型 同一向量空间
一句话总结
Embedding模型在本地知识库的用法,就是“两步走”:
a.把本地文件变成数字向量(建库)。
b.把用户问题也变成数字向量(搜索)。
两者在“数字世界”中比对,就能像人一样理解语义,实现精准问答和搜索!
五、Embedding模型如何选择
在RAG(Retrieval-Augmented Generation)应用中,选择合适的Embedding模型至关重要。选择时需要考虑一下因素:
1、应用场景
首先,需要明确RAG系统将处理哪种类型的数据,是文本、图像还是多模态数据。不同的数据类型可能需要不同的Embedding模型。
例如,对于文本数据,你可以参考HuggingFace的MTEB(Massive Text Embedding Benchmark)排行榜来选择适合的模型;对于多模态需求的,如图文检索等,可以选择CLIP、ViLBERT。
2、通用与特定领域需求
其次,可以根据任务是通用还是特定领域,选择合适的模型。如果任务涉及通用知识,可以选择通用的Embedding模型;如果任务涉及特定领域(如法律、医疗、教育、金融等),则需要选择更适合该领域的模型。
3、多语言需求
如果系统需要支持多种语言,可以选择支持多语言的Embedding模型,如BAAI/bge-M3、bce_embedding(中英)等。如果知识库中主要包含的是中文数据,可以选择如iic/nlp_gte_sentence-embedding_chinese-base等模型。
4、性能评估
查看MTEB排行榜等基准测试框架来评估不同模型的性能。这些排行榜覆盖了多种语言和任务类型,可以帮助你找到在特定任务上表现最佳的模型。同时,考虑模型的规模和资源限制,较大的模型可能提供更高的性能,但也会增加计算成本和内存需求。
5、Embedding模型推荐
推荐一些表现优秀的Embedding模型:
文本数据:参考HuggingFace的MTEB排行榜或国内的魔搭社区排行榜。
多语言支持:选择如BAAI/bge-M3、bce_embedding(中英)等模型。
中文数据:选择如iic/nlp_gte_sentence-embedding_chinese-base等模型。
Embedding模型是连接符号数据与数值计算的桥梁,其选择需结合实际任务需求和数据特点。随着预训练模型的发展,动态、多模态的Embedding正成为趋势。