大数跨境
0
0

《深入解读 VSAG——OceanBase 向量索引库》系列之一 | 认识向量搜索

《深入解读 VSAG——OceanBase 向量索引库》系列之一 | 认识向量搜索 OceanBase数据库学堂
2025-11-27
0
导读:深入解读系列一

向量搜索技术,被认为是海量非结构化数据检索的关键技术之一,这会涉及到高维空间的搜索问题,通常会通过近似最近邻搜索(Approximate Nearest Neighbor Search, ANNS)的方式来在高维空间中进行检索,以此来找到满足要求的数据,下面针对向量搜索技术的基本概念进行简要介绍。



一、以图搜图的例子




import mathimport numpyfrom PIL import Image

def extract_feature(filenames):    images = [Image.open(filename) for filename in filenames]vectors = model.predict(images)return vectors

def euclidean_distance(vector1, vector2):    if len(vector1) != len(vector2):        raise ValueError("The dimensions of the two vectorw must be the same")
sum_sq = sum((p - q) ** 2for p, q in zip(vector1, vector2))return math.sqrt(sum_sq)

def image_search(vectors, query_image_path):    query_vector = extract_feature(Image.open(query_image_path))[0]min_idx = -1min_distance = 1.0ffor idx in len(vectors):    distance = euclidean_distance(vectors[i], query)if distance < min_distance:    min_idx = idxmin_distance = distancereturn min_distance, min_idx

def show_image(filename):    img = Image.open(filename)img.show()

if __name__ == "__main__":# build vector index of images    image_list = [        "images/cat1.jpg",        "images/cat2.jpg",        "images/cat3.jpg",        "images/cat4.jpg",        "images/cat5.jpg",        "images/cat6.jpg",        "images/cat7.jpg",        "..."    ]vectors = extract_feature(image_list)
# search image on indexmy_image = "./my_cat.jpg"_, idx = image_search(vectors, my_image)
print("The most similar cat is this one: ")show_image(image_list[idx])


二、向量是什么




向量(Vector / Embedding)是一个数据结构,其中包含一个浮点数的数组。这是一个向量的示例:

"West Highland White Terrier":[0.0296700,0.0231020,0.0166550,0.0642470,-0.0110980, ... ,0.0253750]


向量在检索相似的图片、音频和文本等方面发挥着关键作用,这源于其数据属性和特征表示能力。在机器学习和数据科学领域,向量被广泛用于描述数据特征。


以图片数据为例,我们可以将其表示为向量。在计算机中,图片本质上是由像素构成的二维矩阵。每个像素的亮度值可视为图片的一个特征,因此,我们可以将这些亮度值串联成一个高维向量,从而实现图片的向量化表示。这种向量化表示使我们能够利用向量空间中的距离和相似度度量方法来比较不同图片之间的相似程度。例如,欧氏距离可用于衡量两个图片向量间的像素差异,而余弦相似度则可测量它们的方向差异。通过计算向量间的距离或相似度,我们可以量化评估不同图片之间的相似程度。


在实际应用中,图片除了像素亮度以外还有轮廓等更复杂的特征可以用于比对相似度,所以一般会使用神经网络来进行特征向量的提取,然后通过距离函数来衡量不同图片之间的相似度。这就是为什么向量可以被用来衡量非结构化数据的相似度。


三、向量搜索有什么用




当可搜索内容表示为向量时,查询可以在相似内容中找到接近的匹配项。用于向量生成的嵌入模型知道哪些单词和概念相似,并将生成的向量放置在嵌入空间中。


例如,关于 “clouds” 和 “fog” 的向量化源文档更有可能显示在关于 “mist” 的查询中,因为它们在语义上相似,即使它们在词法上不匹配。


四、如何衡量向量相似度




如上面提到的,向量相似度有几种不同的度量方法,其中最常见的是欧式距离、点积距离和余弦距离。


这些度量方法各有特点和适用场景。欧式距离直观地反映了向量在空间中的绝对距离,适用于需要考虑向量大小的情况。点积距离反映了向量的方向和大小,常用于机器学习中的权重计算。余弦距离则专注于向量间的角度,忽略大小差异,特别适合文本相似度等归一化场景。


选择合适的度量方法对于提高相似度计算的准确性和效率至关重要,并且往往需要根据具体的应用场景和数据特征进行权衡。



五、近似最近邻搜索




在大规模数据集中,传统的精确最近邻搜索算法可能需要花费大量时间和计算资源。因此,近似最近邻检索(Approximate Nearest Neighbor Search,ANNS)技术的出现满足了对相似度搜索更快速和高效的需求。


近似最近邻检索通过牺牲一定的搜索准确度,来换取更快的搜索速度。这种特性使得 ANNS 技术在需要快速检索大规模数据集中的相似对象时极具优势,特别是在诸如推荐系统、图像识别、自然语言处理和数据挖掘等领域。近似最近邻检索技术的应用范围非常广泛,它在提高效率的同时保持了对搜索结果准确度的要求,因此在大数据量情况下更能展现出其价值。


一般来说,近似最近邻搜索依赖对数据集提前构建好一个索引,搜索在索引上进行。通过使用索引,近似最近邻搜索一般能将耗时降低几个量级。常见的向量索引类型:基于树的索引结构、基于哈希的索引结构、基于图的索引结构、基于倒排的索引结构等。这些索引对于构建时间、批量查询、异构计算等场景分别有不同的优势,一般在业务场景中会根据实际需要来选用索引。



六、使用流行的算法库 faiss 进行向量搜索




from PIL import Imageimport numpyimport faiss

def extract_feature(filenames):    images = [Image.open(filename) for filename in filenames]    vectors = model.predict(images)    return vectors

def show_image(filename):    img = Image.open(filename)    img.show()

if __name__ == "__main__":    # build vector index of images    image_list = [        "images/cat1.jpg",        "images/cat2.jpg",        "images/cat3.jpg",        "images/cat4.jpg",        "images/cat5.jpg",        "images/cat6.jpg",        "images/cat7.jpg",    ]    index = faiss.IVFFlat(image_list)
    # search image on index    my_image = "./my_cat.jpg"    idx, dist = index.search(extract_feature(my_image))
    print("The most similar cat is this one: ")    show_image(image_list[idx])


可以看出使用向量索引可以更方便地管理数据,同时也能更快地找到相似的图片,而向量索引获得的性能收益在随着数据量的增加会更加明显,所以在搜索推荐的业务场景中,一般会为向量构建一个索引来提供更好的 QPS 和延迟表现。


七、市面上的 ANNS 算法库




前面示例代码中用到的 faiss 就是一个 ANNS 算法库。在开源社区有不少 ANNS 算法库,每个算法库有不同的特点,面向不同的使用场景。在这里对其中的几个简单介绍:


facebookresearch/faiss(可查看链接:https://github.com/facebookresearch/faiss):faiss 是 Meta 基础 AI 研究小组开源算法库,主要用于高效相似性搜索以及稠密向量聚类。faiss 使用 C++ 编写,并且提供了完整的 Python/numpy 包装器。作为相似性搜索领域最有名、维护时间最长的库,faiss 深受开发者喜爱,并在大量场景中被使用。


nmslib/hnswlib(可查看链接:https://github.com/nmslib/hnswlib):hnswlib 是 HNSW 论文作者维护的算法库,以 header-only 的方式提供了一个 HNSW 算法实现。HNSW 算法是一个基于多层近邻图的搜索方法,能够高效地在高维向量空间中快速找到与目标向量最相似的向量。由于 hnswlib 库高效、易于集成、单线程读写等特性,广泛地应用于各种搜索推荐系统中。


antgroup/vsag(可查看链接:https://github.com/antgroup/vsag):vsag 是OceanBase与蚂蚁集团联合研发的向量索引库,提供了超大规模下混合内存与磁盘的快速检索方案。vsag 库通过引入了许多 SIMD、内存分配和布局、量化等方法,获得了卓越的近似 K 近邻图的搜索性能表现。受益于 vsag 的资源管理模块,在系统中能够提供租户级细粒度的计算和存储资源管理。


八、向量搜索的挑战在哪里




虽然现在我们已经有了很多成熟的开源算法,但随着非结构化数据量的持续增长,以及更多 AI 应用的诞生,向量搜索技术被提出了更多的挑战。


更快的搜索速度是第一个挑战。对于更好性能的追求在业务中是一直存在的,更快的搜索速度意味着单位实例能够服务更多的用户请求,同时更快的搜索速度能够降低访问延迟提升体验。


更高的搜索精度是第二个挑战。向量召回作为搜索推荐链路的上游环节,搜索精度很大程度上影响到整条搜索链路的召回精度上界。通过提高向量召回的精度,能够给后续的排序环节提供更加高质量的输入。在 RAG 应用中同理,向量的召回率越高,能够输入给语言大模型的内容就越好,语言大模型的回答就越准确。


更低成本的搜索是第三个挑战。更低成本更多是企业从降本增效出发,希望在技术上获得收益。向量检索因为数据结构本身的特点,查询服务的成本本来就高于标量数据。而当前音视图文数据量的增长给系统带来的服务成本来增长迅速。近几年对于低成本的向量索引的探索更多被关注到,比较有名的是微软提出的 DiskANN 算法,而后续在学术界和工业界也涌现出更多相关的后续工作。


九、延展阅读




SIGMOD 2024 向量相关科研工作


  • Starling: An I/O-Efficient Disk-Resident Graph Index Framework for High-Dimensional Vector Similarity Search on Data Segment

    基于磁盘的向量检索方案……它的核心优化思路主要是两块:优化 DiskANN 的 disk layout 来提高 IO 命中;通过预选入口点来减少 IO 次数……


  • Vexless: A Serverless Vector Data Management System Using Cloud Functions

    基于 Cloud Functions 的低成本向量服务……利用云函数构建高性能、低成本的向量数据库,特别适用于突发性和稀疏性(Sparse)工作负载……


  • RaBitQ:Quantizing High-Dimensional Vectors with a Theoretical Error Bound for Approximate Nearest Neighbor Search

    高效的向量量化方法……使用 bit 级别的压缩,将 D 维向量压缩到 D 位的串;使用 estimator 来估计压缩后的向量到 base 数据的真实距离……


  • ACORN:Performant and Predicate-Agnostic Search Over Vector Embeddings and Structured Data

    基于 HNSW 实现向量检索过程中的谓词过滤……提出了一个基于 HNSW 搜索框架的更适用于谓词过滤的图结构……


点击【阅读原文】,查看更多技术分享


【声明】内容源于网络
0
0
OceanBase数据库学堂
关注获取数据库前沿技术、应用实战与精彩活动。
内容 261
粉丝 0
OceanBase数据库学堂 关注获取数据库前沿技术、应用实战与精彩活动。
总阅读22
粉丝0
内容261