在技术语境里,“Embedding”常被称作“嵌入”,这是学术领域的规范表述,而从实际计算逻辑来看,它本质是一种向量化的处理方式。

那么,我们 为何执着于向量化?
核心目的,就是让复杂的信息对比变得高效可控——把冗长繁杂的信息,精准压缩至固定维度的向量空间中,这一过程,便是向量化的核心价值所在。
若想深入探究向量的本质,大家不妨回顾我此前的文章 # 揭秘Transformer架构设计1,其中对向量化有讲解。

向量数据库的核心使命,是存储向量数据,而Embedding的作用,正是将各类信息转化为标准化的向量化表达。随后,我们依托向量数据库,高效完成相似度计算,这套技术体系,在后续RAG向量知识库的搭建与应用中,发挥着不可替代的关键作用。

在AI大模型的落地场景中,RAG已然成为主流技术方案。企业沉淀的海量数据,从知识库到代码库,都亟待高效检索。传统的关键词检索,本质是“确认式匹配”,极易因表述差异遗漏关键内容——毕竟,我们的语言描述很难做到严丝合缝的精准匹配。
向量查询,则借助语义关联与近似匹配的思路,实现了模糊检索,让检索更贴合真实需求。

追根溯源,RAG知识库的底层基石正是Embedding通过向量化技术,将信息转化为数学向量并存入向量库,再依托向量库完成精准的相似度计算,构建起语义检索的核心链路

需要明确区分两类模型的定位:

  • LLM模型聚焦大型推理任务,承担回答问题、逻辑推演的核心职能,像Deepseek R1 671B这类大尺寸模型,文件体量庞大;
  • Embedding模型无需处理推理问答,专攻简化任务,核心使命就是判断知识库中的切片(chunk)与用户问题(query)的语义相似度。

举个直观的例子,
若知识库中存有1万个切片,若交由LLM模型逐一筛选,需遍历全部切片,历经理解、聚合、分析的全流程,计算量高达1万次;
Embedding模型可实现批量处理,它为所有信息赋予统一的向量标准,只需计算向量间的夹角(余弦相似度),借助矩阵运算就能批量完成计算,计算速度与性能优势显著。这背后的核心考量,正是成本与效率的平衡,让大规模语义检索具备了落地可行性。

特征价值:Embedding 嵌入

向量化提升检索效率的核心,在于把复杂信息转化为可量化、可高效比对的标准化表达,这背后的道理,用酒店推荐的场景就能轻松讲透。

在为酒店搭建内容推荐系统时,我们需要精准表达酒店的核心特征,这和我们记住一个人的逻辑如出一辙——判断两个人是否相像,会给对方贴上清晰的标签、提炼关键特征;而我们为酒店提炼的特征,就用向量来具象化。

举个直观的例子,
我们选取酒店最核心的两个特征维度:价格(对应向量坐标X1)、环境品质(对应向量坐标X2)

此时,酒店A可以用向量A[X1, X2]来精准标记,酒店B则对应向量B[X1, X2]。
当我们要检索与酒店A匹配的推荐项时,无需逐字比对繁杂的文字描述,只需计算这两个向量在二维坐标系中对应线段的夹角,通过余弦相似度就能快速判断二者的契合度
夹角越小,余弦值越接近1,说明两家酒店的核心特征越相似,检索效率瞬间拉满,既省去了传统文字匹配的繁琐,又精准捕捉了语义层面的关联,让推荐更高效、更贴合需求。

在这里插入图片描述

我们可以根据这样计算的数据公式,去表达这2个数学向量是像还是不像,
如果A与B的方向一致,θ = 0,Cosθ = 1 ;
如果A与B的方向完全相反, θ = 180, Cosθ = -1;
如果A与B的方向是正交, θ = 90,Cosθ = 0。

余弦相似度

  • 通过测量两个向量的夹角的余弦值来度量它们之间的相似性。
  • 判断两个向量⼤致方向是否相同,方向相同时,余弦相似度为1;两个向量夹角为90°时,余弦相似度的值为0,方向完全相反时,余弦相似度的值为-1。
  • 两个向量之间夹角的余弦值为[-1, 1]

给定属性向量A和B,A和B之间的夹角θ余弦值可以通过点积和向量长度计算得出

在这里插入图片描述

我们来个计算的例子:

计算A和B的余弦相似度:
句子A:这个程序代码太乱,那个代码规范。
句子B:这个程序代码不规范,那个更规范。

Step1,手动分词,也可以通过jieba库进行分词
句子A:这个/程序/代码/太乱,那个/代码/规范
句子B:这个/程序/代码/不/规范,那个/更/规范

Step2,列出所有的词
这个,程序,代码,太乱,那个,规范,不,更

Step3,计算词频
句子A:这个(1个),程序(1个),代码(2个),太乱(1个),那个(1个),规范(1个),不(0个),更(0个)—> [1, 1, 2, 1, 1, 1, 0, 0]
句子B:这个(1个),程序(1个),代码(1个),太乱(0个),那个(1个),规范(2个),不(1个),更(1个)—> [1, 1, 1, 0, 1, 2, 1, 1]

• Step4,计算词频向量/A和B的余弦相似度

句子A向量:[1, 1, 2, 1, 1, 1, 0, 0]

句子B向量:[1, 1, 1, 0, 1, 2, 1, 1]

在这里插入图片描述

结果接近1,说明句子A与句子B是相似的。

再通过人工检查,句子A与句子B的语义是大致相同的。

但是通过这样的计算,会出现一个问题,因为我们是通过词频计算的,如果把句子B内的“”更改下地方,如:
原始的句子B:这个程序代码不规范,那个更规范。
更改后句子B:这个程序代码规范,那个更不规范。

从语义上,这个句子不一样了,之前句子A/B的语义是“这个不好,那个好”,但是句子B更改后,变成“这个好,那个不好”。

但是Cosθ值是没变化的,因为词频一样,向量也一样,余弦相似度也是一样的。会出现这个原因,也是因为我们没考虑语序的关系,只考虑词频,不考虑顺序,在某些维度去看它可能是完全相反的。

我们可以用更多的特征,去弥补这个顺序,比如使用N-Gram。

N-Gram(N元语法)

  • 基于一个假设:第n个词出现与前n-1个词相关,而与其他任何词不相关;
  • N=1时为unigram(词频),N=2为bigram(相邻2个组合),N=3为trigram(相邻3个组合);
  • N-Gram指的是给定一段文本,其中的N个item的序列。比如文本:A B C D E,对应的Uni-Gram(词频)为A、B、C、D、E;Bi-Gram(相邻2个组合)为A B、B C、C D、D E;Tri-Gram(相邻3个组合)为A B C、B C D、C D E;
  • 当一阶特征不够用时,可以用N-Gram做为新的特征。比如在处理文本特征时,一个关键词是一个特征,但有些情况不够用,需要提取更多的特征,采用N-Gram —> 可以理解是相邻两个关键词的特征组合;

如何了解事物的特征表达?N-Gram就是最基本的一种方式!

现在我们为酒店建立内容推荐系统,我们以原始的搜索引擎为例,
其实我们今天看到的知识库的检索,在AI中有很多的应用场景,在很早的时候,我们的搜索引擎也在做类似的事情,当时的谷歌和百度用的就是向量检索,检索的时候跟它语义相关的,就会通过cosθ值去判断是像还是不像。

我们使用Uni-Gram(词频)为例,看下酒店内词频排序列表:

在这里插入图片描述

我们使用Bi-Gram(相邻2个组合)为例,看下酒店内词频排序列表:

在这里插入图片描述

我们使用Tri-Gram(相邻3个组合)为例,看下酒店内词频排序列表:

在这里插入图片描述

整个计算下来,我们是有3329个特征数量,也能叫3329维数学向量。

在这里插入图片描述

我们可以把152家酒店进行两两之间计算余弦值的相似度矩阵:

在这里插入图片描述

业务代码:

# 基于相似度矩阵和指定的酒店name,推荐TOP10酒店
def recommendations(name, cosine_similarities = cosine_similarities):
    recommended_hotels = []

    # 找到想要查询酒店名称的idx
    idx = indices[indices == name].index[0]
    print('idx=', idx)

    # 对于idx酒店的余弦相似度向量按照从大到小进行排序
    score_series = pd.Series(cosine_similarities[idx]).sort_values(ascending = False)

    # 取相似度最大的前10个(除了自己以外)
    top_10_indexes = list(score_series.iloc[1:11].index)

    # 放到推荐列表中
    for i in top_10_indexes:
        recommended_hotels.append(list(df.index)[i])
    return recommended_hotels

print(recommendations('Hilton Seattle Airport & Conference Center'))
print(recommendations('The Bacon Mansion Bed and Breakfast'))

输出:
在这里插入图片描述

152个酒店, 每个酒店的特征单词差不多100多个单词,用3329维数学向量来表达,空间已经很宽裕了。
用现在的这种方法,是推荐的策略,但是问题在于:
特征维度太大了,而且很多特征值为0 —> 存储空间太浪费,而且计算量会比较大。

TF-IDF:

  • TF: Term Frequency,词频
    T F = 单词次数 / 文档中总单词数 TF = 单词次数 / 文档中总单词数 TF=单词次数/文档中总单词数
    一个单词的重要性和它在文档中出现的次数呈正比。

  • IDF: Inverse Document Frequency,逆向文档频率,简单来说,评估特征的价值。
    一个单词在文档中的区分度,这个单词出现的文档数越少,区分度越大,IDF越大。
    I D F = l o g ( 文档总数 / 单词出现的文档数 + 1 ) IDF = log(文档总数 / 单词出现的文档数+1) IDF=log(文档总数/单词出现的文档数+1)

基于内容的推荐:

  • Step1,对酒店描述(Desc)进行特征提取;
    N-Gram,提取N个连续字的集合,作为特征;
    TF-IDF,按照(min_df, max_df)提取关键词,并生成TFIDF矩阵;

  • Step2,计算酒店之间的相似度矩阵:余弦相似度;

  • Step3,对于指定的酒店,选择相似度最大的Top-K个酒店进行输出;

N-Gram +TF-IDF的特征表达会让特征矩阵非常系数,计算量大,就像案例内152个酒店,每个酒店的特征100多个,但是产生了3329维数学向量,很多维度点的值是0。

现在我们的知识表达用到了Embedding嵌入,上面的方法很好,但是实际使用事情下,它的数学向量太稀疏了,数学维度太大,很多值为0 ,我就要把它压缩下。就要把它降维压缩到固定空间中,让它每一个空间都有值,不为0,这就是嵌入的思路

Embedding

  • 一种降维方式,将不同特征转换为维度相同的向量;
  • 离线变量转换成one-hot —>维度非常高,可以将它转换为固定 size的embedding向量;
  • 任何物体,都可以将它转换成为向量的形式,从Trait # 1到 # N;

在这里插入图片描述

  • 向量之间,可以使用相似度进行计算;

在这里插入图片描述

  • 当我们进行推荐的时候,可以选择相似度最大的

在这里插入图片描述

万事万物都可以Embedding嵌入(向量化)

谷歌在2014年做了一项研究,它把所有单词都转化为数学向量,如果我们将King这个单词,通过维基百科的学习,进行GloVe向量化,可以表示成50维的数学向量:

在这里插入图片描述

这50维度的权重大小在[-2,2],按照颜色的方式(热力图)来表示更能让大家进行理解:

在这里插入图片描述

将Word进行Embedding:

  • 我们将King与其他单词进行比较,可以看到 Man和Woman更相近,都用50维度的数学向量表达,并且用热力图进行展示;
  • 同样有了向量,我们还可以进行运算,热力图进行展示。

在这里插入图片描述

king-man+woman与queen的相似度最高,热力图如下图所示:

在这里插入图片描述

特征表达是很有价值的,Word2Vec就是来表达这点。可以通过Word2Vec训练出来,训练出来每个单词的词向量,原始有10000个单词,你要对king做一个表达,假设,我们是一个一元的Bi-Gram,我们的数学维度就是一万个,有的话是1,没有的话是0,我们就有一个0、1的表达方法做为原始的输入,输入完成后,我们要让计算机自己来去寻找规律,采用无监督的学习方法,给它一个邻居的比例,通过神经网络来预测一个邻居概率的结果,我们有10000个单词,所以它的邻居的概率也有10000种,有些概率很小,近乎为0 ,有些概率大,近乎为1。因为我们10000个单词是不会去变动的,所以邻居也固定的,你input = king的话,output也能很快输出邻居的概率,这也是一种取巧的方法

特征表达的价值,在Word2Vec的技术逻辑中得到了精准印证。
Word2Vec的核心使命,便是实现高效且精准的特征向量化表达——它通过无监督学习的方式,对海量语料进行训练,为每一个单词生成专属的词向量。

以10000个单词的语料库为例,若聚焦“king”这一单词,在一元Bi-Gram的设定下,原始的数学表达维度恰好对应10000个,采用“有则为1、无则为0”的极简编码规则,就能把单词转化为清晰的0-1特征输入。
完成输入后,计算机无需人工干预,仅依靠无监督学习机制,依托预设的邻居比例规则,借助神经网络自主挖掘数据规律,精准预测出邻居出现的概率分布。
由于10000个单词的语料库是固定不变的,对应的邻居概率集合也始终保持稳定,一旦输入“king”,系统便能快速输出对应的邻居概率结果,这种以固定映射关系高效求解的思路,无疑是兼顾效果与效率的巧妙设计。

在这里插入图片描述

Word2Vec:

  • 通过Embedding,把原先词所在空间映射到一个新的空间中去,使得语义上相似的单词在该空间内距离相近;
  • Word Embedding(单词的特征表达,谷歌用神经网络) =>学习隐藏层的权重矩阵
    • 输入层是one-hot编码;
    • 隐藏层的神经元数量为300(Embedding Size),也是单词的嵌入表达;
    • 对于输入层和隐藏层之间的权值矩阵W,分别为10000、300;
    • 输出层为10000维度的向量,尽可能与input的数学向量维度一致,每一个值代表着输出一个词的概率;

早年间,Word Embedding 依赖监督学习模式,需要人工投入大量精力完成标注工作,而面对如今庞大的词汇规模,这种人工标注的方式早已因工作量过于繁重而难以为继。
如今,我们巧妙借助“邻居”思路来定义任务输出,例如像Man与Woman这样语义相近的词汇,经过压缩转化后,其对应的数学向量也会呈现出高度的一致性。

神经网络训练的核心逻辑,便是不断降低loss误差值,本质是构建精准的替代关系。若想让神经网络的输出更加精准,最直接的方法便是扩大中间隐藏层的数学向量维度

但维度提升必然带来连锁反应:存储空间会被大量占用,算力消耗也会同步激增,不仅容易造成算力冗余,还会拖慢整体运算速度。

因此,我们必须在精准度与资源成本之间找到最佳平衡点,追求数学维度、存储空间、算力以及运算时间的综合性价比。通常,中间隐藏层的特征向量维度会远小于原始数学维度,比如原始维度为10000时,中间隐藏层的特征向量维度往往设定为300,以此实现效率与成本的最优适配。

对于输入的one-hot编码:

  • 在矩阵相乘的时候,选取出矩阵中的某一行,而这一行就是输入词语的word2vec表示;

不妨以具体场景为例:
假设存在一个5维的数学向量,仅下标为3的位置取值为1,其余维度均为0,整体呈现出显著的稀疏特征。
此时,我们借助Word2Vec技术,将其精准压缩至固定维度空间,转化为3维的紧凑向量。
比如某个词在Embedding字典的第4层对应向量为[10, 12, 19],我们提取出这一向量后,神经网络会在中间隐藏层发挥作用,把原本高达10000维的原始信息,压缩至300维。
尽管压缩过程难免会产生细微信息损耗,但这点损失对核心信息的保留影响微乎其微。后续开展任务时,我们便会依托这300维向量,以高度浓缩的特征精准捕捉其语义关联,就像搭建酒店推荐系统时,将原本稀疏分散的酒店特征,压缩成稠密的核心向量,用这种高效替代方案,既保留了关键信息,又能为后续任务提供精准支撑,让任务的精准度与运行效率实现双重提升。

在这里插入图片描述

  • 隐藏层的节点个数 = 词向量的维数;
  • 隐藏层的输出是每个输入单词的Word Embedding
  • word2vec,实际上就是一个查找表;

针对这10000个单词的特征刻画,我们依托神经网络完成核心处理,最终将每个单词压缩并存储为300维的数学向量,这一核心环节正是业内常说的Embedding LookUp(Embedding查询)——本质上,就是神经网络为每个单词量身定制并固化存储的300维压缩特征,以紧凑的形式实现精准的语义表达。

在这里插入图片描述

用一个贴近日常的小案例,把向量化的逻辑讲透:

比如:
句子A是“I Love eating apple”;
句子B是“I Love eating banana”。

这两个句子中,“apple”和“banana”的上下文邻居完全一致,都围绕“love”“eating”展开。
正因如此,在Word Embedding的神经网络中间层,二者的特征表达会高度趋同,最终压缩形成的数学向量,也会呈现出极强的相似性,精准捕捉到语义层面的紧密关联。

Word2Vec的两种模式:

  • Skip-Gram,给定input word预测上下文

在这里插入图片描述

  • CBOW,给定上下文,预测input word(与 Skip-Gram相反)

在这里插入图片描述

在这里插入图片描述

我们知道这么多Word Embedding的底层逻辑、理念,我们能不能自己去训练出来一个Word Embedding?
这就衍生出来一个工具:Gensim

Gensim,谷歌开源的工具,单词训练工具:

  • pip install gensim
  • 开源的 Python工具包
  • 可以从非结构化文本中,无监督地学习到隐层的主题向量表达
  • 每一个向量变换的操作都对应着一个主题模型
  • 支持TF-IDF,LDA,LSA,word2vec等多种主题模型算法

使用方法:

  • 建立词向量模型,word2vec.Word2Vec(sentences) :
    window,句子中当前单词和被预测单词的最大距离,简单来说,你想关联几个邻居;
    min_count,需要训练词语的最小出现次数,默认为5,最小出现的词频 >= 1;
    size,向量维度,默认为100,这个感觉经验来,不懂得,首先这个向量维度要小于原始数据维度,然后在做实验的过程中,去改变;
    worker,训练使用的线程数,默认为1即不使用多线程;
  • 模型保存 model.save(fname);
  • 模型加载 model.load(fname);

模型参数,通过使用AI Coding,在实验过程中,会自动帮你优化:

在这里插入图片描述

Word2Vec工具的使用:

  • Word Embedding就是将Word嵌入到一个数学空间里,Word2vec,就是词嵌入的一种工具;
  • 可以将sentence中的word转换为固定大小的向量表达(Vector Respresentations)
  • 其中意义相近的词将被映射到向量空间中相近的位置;
  • 将待解决的问题转换成为单词word和文章doc的对应关系;

例如:

  • 抖音大V推荐,把用户观看短视频的大V,每个大V都是一个单词,将每一个用户关注大V的顺序,组成一个句子,句子长了就编辑成文章。
  • 淘宝商品推荐,把用户点击的商品,每个商品都是一个单词 ,然后根据用户对商品的行为顺序,组成一个句子,句子长了就编辑成文章。

Word2Vec —> embedding is all you need 万事万物都可以Embedding!

chunks(分片)与分词的区别:
chunks是对全文的一种切片,一篇文字可能会有10万次,可能会切上完个切片。
分词是对每句话进行分词处理,就像我们说话一样,我们说 —> “我们、说“。
它们两个核心的区别就是颗粒度不一样

三国演义Word2Vec案例

step1,把三国演义文字内容复制到一个txt文档内:

在这里插入图片描述

step2,使用分词工具jieba库,进行分词

prompt:使用jieba库对@three_kingdoms.txt文件进行字词分割,编写到three_kingdoms-2.txt

在这里插入图片描述

step3,prompt:使用gensim库,调用word2vec进行训练,训练的数据使用@three_kingdoms-2.txt,模型参数设置 size = 128,window=3,min_count = 1

在这里插入图片描述

step4,prompt:分析和曹操最相近的词有哪些

在这里插入图片描述

step5,prompt:计算曹操、刘备、张飞的相似度,并且进行计算:曹操 + 刘备 - 张飞 = ?

在这里插入图片描述

Embedding模型的选择

Embedding的作用

Embedding模型的核心特征:

  • Embedding模型将文本等离散数据转换为低维、稠密的向量,捕捉其语义信息。
  • 向量空间中的距离(如余弦相似度)可反映文本间的语义相似度。

MTEB榜单
MTEB (Massive Text Embedding Benchmark)是一个全面的评测基准,它涵盖了分类、聚类、检索、排序等8大类任务和58个数据集。

通过MTEB榜单,可以清晰地看到不同模型(如BGE系列,GTE,Jina 等)在不同任务类型上的性能表现。

比如例如,某些模型在检索任务上表现优异,而另一些则可能在聚类或分类任务上更具优势。这有助于我们根据具体应用场景,做出初步的模型筛选。

在这里插入图片描述

我们可以到魔塔社区直接搜索Embedding库,可以直接把开源模型下载下来,本地部署使用,也可以直接使用商业版的Embedding模型,通过API_KEY密钥进行调用。

MTEB优点:

  • 检索(Retrieval): 从一个庞大的文档库中,根据用户输入的查询(Query),找出最相关的文档列表。
  • 语义文本相似度(Semantic Textual Similarity,STS): 判断一对句子的语义相似程度,并给出一个连续的分数(例如1到5分)。
  • 重排序(Reranking): 对一个已经初步检索出的文档列表进行二次优化排序,使得最相关的文档排在最前面。
  • 分类(Classification): 将单个文本(如电影评论、新闻文章)划分到预定义的类别中(如“正面/负面”、 “体育/科技”)。
  • 聚类(Clustering): 在没有任何预设标签的情况下,将一组文本自动地分成若干个有意义的群组,使得同一组内的文本语义相似,不同组间的文本语义差异大。
  • 对分类(Pair Classification): 判断一对文本(句子或段落)是否具有某种特定关系,通常是二分类问题,如 “是否是重复问题”、“是否是转述关系”。
  • 双语挖掘(Bitext Mining): 从两种不同语言的大量句子中,找出互为翻译的句子对。对于机器翻译至关重要。
  • 摘要(Summarization): 这个任务比较特殊,它不是让模型生成摘要,而是评估一个机器生成的摘要与人工撰写的参考摘要之间的语义相似度。

通过MTEB榜单,可以看到不同模型(如BGE系列,GTE,Jina 等)在不同任务类型上的性能表现。

向量维度直接影响模型的表达能力、计算开销和内存占用:

  • 高维度(如1024,4096): 编码更丰富、语义更细致,适用于需要深度语义理解的复杂场景,如大规模、多样化的信息检索,或者细粒度的文本分类。但计算成本更高,所需存储空间更大。

  • 低维度(如256,512): 计算速度快,内存占用小,更适合计算资源有限,或实时性要求高的场景,比如移动端。

如果把向量从768维拉长到1024维,检索指标提高不到1%,但内存要多占约35%,是否还要升维?
不需要,性价比低。反过来,若压缩到768维后,指标下降超过5% —> 说明信息损失大,值得使用更高维度。

Jina Embedding

由Jina AI(官网jina.ai)开发,公司总部位于德国柏林,专注于开源多模态搜索与向量化技术。

Jina Embedding具有灵活的嵌入大小,默认情况下,密集嵌入为2048维,但可以截断到最低128维,性能损失较小。

jina-embeddings-v4 是一个多模态和多语言检索的通用嵌入模型,特别适合用于复杂的文档检索,包括包含图表、表格和插图的视觉丰富文档。

在这里插入图片描述

功能 Jina-Embedding-V4
基础模型 Qwen2.5-VL-3B-Instruct
支持的任务 retrieval, text-matching, code
模型数据类型 BFloat 16
最大序列长度 32768
单向量维度 2048
多向量维度 128
Matryoshka(套娃) 维度 128, 256, 512, 1024, 2048
池化策略 平均池化
注意力机制 FlashAttention2

神奇的“俄罗斯套娃”
Jina-embeddings 训练时使用了一种特殊技术(Matryoshka Representation Learning,MRL)—> 俄罗斯套娃

在这里插入图片描述

生成完整向量: 模型总是先在内部生成一个最完整、维度最高(比如2048维)的向量。

按需截断: 这个长向量有一个非常神奇的特性,它的前128维、前256维、前512维……本身就是一组高质量的、独立的、可以正常使用的短向量。

用户指定: 当调用模型时,可以通过embedding_size告诉模型“我这次只需要前512维就够了” —>模型就会截断向量,只返回前512维

动态调整维度是Jina-embedding模型赋予开发者的一个强大选项

样例:

  • 场景1: 社交媒体情感分析
    社交媒体的文本短,实时性要求高,计算资源有限=>可以使用128维;
    在索引所有社交媒体评论时,都调用模型请求128维的向量;
    当用户进行查询时,您也同样将查询文本转换为128维的向量,然后进行比较。

  • 场景2: 投资分析报告
    投资分析、公司财报包含大量专业术语和细节(如风险提示、前瞻性声明),精准理解至关重要=>2048维。
    在索引所有投资分析报告时,都请求2048维的向量。查询语句也同样生成2048维的向量进行匹配。

单语言与多语言Embedding模型的选择

单语言模型: 如BGE-large-zh,专门针对单一语言(如中文) 进行训练,
比如:为电商平台开发一个智能客服问答系统。

目标,系统需要能精准理解用户使用中文提出的问题:

  • 我的订单何时能送达?
  • 这个商品有保修吗?
  • 如何办理退换货?
    并从FAQ知识库中匹配最相关的答案。

单语言模型在特定语言任务上,理解更深入、性能更优越。比如理解“七天无理由退货”

多语言模型: 如m3e-base 或multilingual-e5-large,能够处理多种语言的文本,并将它们映射到统一的语义空间中。

场景:为一个国际连锁酒店集团,建立全球客户评论分析系统。
将来自世界各地的评论,按主题(如:客房清洁度、员工服务、地理位置)进行自动分类,无论评论是用英文、日文、西班牙文还是中文写的。

总部的经理可以用英文查询“Loud music at night”,系统需要能同时找出写着“夜に音楽がうるさい”的日文评论和“晚上音乐很吵”的中文评论。

多语言Embedding的优势是能将不同语言的文本映射到统一的语义空间。

“clean room”、“部屋が綺麗”和“干净的房间”的向量在空间中会非常接近 —> 跨语言的聚类分析和检索才能实现。

如何选择适合的Embedding模型,依靠MTEB就可以?
模型选型是一个系统的过程,不能仅依赖于公开榜单。
包括以下关键步骤:

  • 明确业务场景与评估指标: 首先定义核心任务是检索、分类还是聚类?并确定衡量业务成功的关键指标,如搜索召回率(Recall@K)、准确率(Accuracy)或NDCG。
  • 构建“黄金”测试集: 准备一套能真实反映您业务场景和数据分布的高质量小规模测试集。比如,构建一系列“问题-标准答案”对 —> 评估模型好坏的“金标准”。
  • 小范围对比测试(Benchmark): 从MTEB榜单中挑选几款排名靠前且符合需求(如语言、维度)的候选模型。使用“黄金”测试集,对这些模型进行评测。

Embedding模型的选择属于综合评估,即结合测试结果、模型的推理速度、部署成本 —>做出最终决策

向量数据库

向量数据库:AI时代的核心记忆体!

传统的关系型数据库不同,向量数据库用于存储和查询由非结构化数据(如文本、图片、音视频)转化而来的高维向量嵌入(Embeddings)。
这些向量在多维空间中的距离代表了原始数据的语义相似度。
因此,向量数据库的核心能力是高效的相似性检索

向量数据库内部就有分词工具,不需要我们再去做任务处理,直接把信息给向量数据库即可。

向量数据库的核心价值:

  • 为大模型提供长期记忆: 弥补LLM上下文窗口(Context Window)长度限制和知识更新延迟的问题。
  • 实现私有知识库的问答与搜索: 将企业内部文档、产品信息等转化为向量,实现基于语义的智能检索。
  • 赋能推荐系统、以图搜图等多种应用: 通过计算用户、物品的向量相似度,提供更精准的推荐。

如何将metadata元数据管理的更健壮?
在更复杂的生产环境中,可以将metadata_store 这个简单的列表替换为更健壮的存储方案:

  • **键值数据库(如Redis):**通过ID快速查询,性能极高。
  • 关系型数据库(如PostgreSQL): 可以存储更复杂的结构化元数据。
  • 文档数据库(如MongoDB): 非常适合存储JSON格式的元数据。

常见的向量数据库

FAISS:
特点: 由Facebook开发,专注于高性能的相似性搜索,适合大规模静态数据集。
优势: 检索速度快,支持多种索引类型。
局限性: 主要用于静态数据,更新和删除操作较复杂。

Milvus:
特点: 开源,支持分布式架构和动态数据更新。
优势: 具备强大的扩展性和灵活的数据管理功能。

Elasticsearch:
特点: 强大的分布式搜索和分析引擎,将向量搜索(k-NN)作为其众多功能之一。
优势: 具备业界领先的混合搜索能力,可以无缝结合传统的关键词搜索和向量语义搜索。

Pinecone:
特点: 托管的云原生向量数据库,支持高性能的向量搜索。
优势: 完全托管,易于部署,适合大规模生产环境。

ChromaDB:
特点: 开源向量数据库,提供完整的向量存储、检索和管理服务,支持动态数据操作和元数据过滤。
优势: 开箱即用,内置持久化存储;支持实时插入/删除/更新向量;无缝集成 LangChain、LlamaIndex 等框架,简化 RAG 开发流程。
局限性: 大规模数据集下性能弱于 Faiss;未深度优化 GPU 加速,超低延迟场景需结合其他工具。

Weaviate:
特点:开源AI原生向量数据库,支持混合搜索(向量+关键词)、多模态数据处理及动态元数据过滤,采用云原生架构适配大规模生产环境。
优势

  • 内置GraphQL接口,简化复杂查询逻辑;
  • 支持模块化嵌入(如HuggingFace模型)和实时数据更新;
  • 企业级安全合规(RBAC、SOC 2认证),适合金融、医疗等敏感领域。
    局限性
  • 集群部署复杂度较高,需额外配置Kubernetes等基础设施;
  • 纯向量搜索性能略逊于Faiss,超大规模场景需权衡成本。

Qdrant:
特点:开源高性能向量搜索引擎,基于Rust构建,专注低延迟近似最近邻搜索(ANN),支持自定义插件和精细化权限控制。
优势

  • 内存映射存储设计,兼顾速度与磁盘持久化;
  • 提供Payload机制,允许向量关联结构化元数据并实现高效过滤;
  • 轻量级部署,适合边缘计算或嵌入式场景。
    局限性
  • 生态工具链较少,与LLM框架(如LangChain)集成深度不足;
  • 缺乏原生多模态支持,需自行扩展Embedding模块。

向量数据库与传统数据库的对比

  • 数据类型:
    传统数据库:存储结构化数据(如表格、行、列)。
    向量数据库:存储高维向量数据,适合非结构化数据。

  • 查询方式:
    传统数据库:依赖精确匹配(如=、<、>)。
    向量数据库:基于相似度或距离度量(如欧几里得距离、余弦相似度)。

  • 应用场景:
    传统数据库:适合事务记录和结构化信息管理。
    向量数据库:适合语义搜索、内容推荐等需要相似性计算的场景。

数据导入案例

step1,数据准备

在这里插入图片描述

step2,把数据给faiss库,将原始数据转成数学向量
prompt:使用faiss-cpu将@three_kingdoms.txt的信息向量化,并且数学向量打印出来,编写到three向量化.py

在这里插入图片描述

step3,prompt:将生成的向量@three向量化.py 及关联的元数据一同存入向量数据库,向量数据库使用dashscope的text-embedding-v4向量库,参考@embedding计算.py,

在这里插入图片描述

step4,prompt:构建FAISS 索引

在这里插入图片描述

step5,prompt:添加数据到索引

在这里插入图片描述

step6,prompt:执行搜索,搜索:刘备什么时候与张飞、关羽见面的?他们3个人什么时候结拜的?
返回Top5的相似数学向量,并且查找到原始文本与元数据进行打印

在这里插入图片描述

ps:当前使用欧式距离

在这里插入图片描述

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐