什么是向量?
向量是数学、物理学和工程科学等多个自然科学中的基本概念,它是一个具有方向和长度的量,用于描述问题,如空间几何、力学、信号处理等。在计算机科学中,向量被用于表示数据,如文本、图像或音频。此外,向量还代表AI模型对文本、图像、音频、视频等非结构化数据的印象。
向量相似度搜索的基本原理
向量相似度搜索的基本原理是通过将数据集中的每个元素映射为向量,并使用特定相似度计算算法,如基于余弦相似度的、基于欧氏相似度或基于Jaccard相似度等算法,找到与查询向量最相似的向量。
Redis实现向量相似度搜索
了解原理后,我们开始来实现如何使用Redis实现向量相似度搜索。Redis允许我们在FT.SEARCH命令中使用向量相似度查询。使我们可以加载、索引和查询作为Redis哈希或JSON文档中字段存储的向量。
//相关文档地址
1、Redis Search安装
关于Redis Search的安装和使用,此处不再赘述,如果您对此不熟悉,可以参考上一篇文章:
C#+Redis Search:如何用Redis实现高性能全文搜索
2、创建向量索引库
这里我们使用NRedisStack和StackExchange.Redis两个库来与Redis进行交互操作。
//创建一个Redis连接 static ConnectionMultiplexer mux = ConnectionMultiplexer.Connect("localhost"); //获取一个Redis数据库 static IDatabase db = mux.GetDatabase(); //创建一个RediSearch客户端 static SearchCommands ft = new SearchCommands(db, null);
在进行向量搜索之前,首先需要定义并创建索引,并指定相似性算法。
public static async Task CreateIndexAsync() { await ft.CreateAsync(indexName, new FTCreateParams() .On(IndexDataType.HASH) .Prefix(prefix), new Schema() .AddTagField("tag") .AddTextField("content") .AddVectorField("vector", VectorField.VectorAlgo.HNSW, new Dictionary<string, object>() { ["TYPE"] = "FLOAT32", ["DIM"] = 2, ["DISTANCE_METRIC"] = "COSINE" })); }
这段代码的意思是:
- 使用了一个异步方法 ft.CreateAsync 来创建索引。它接受三个参数:索引名称 indexName,一个 FTCreateParams 对象和一个 Schema 对象;
- FTCreateParams 类提供了一些参数选项,用于指定索引的参数。这里使用 .On(IndexDat