.net AI 向量搜索
  • 使用 InMemoryVectorStore 做向量数据存储
  • 使用 ollama + embeddinggemma 进行向量计算

处理过程

        // 这里使用 ollama + embeddinggemma
        await using
            var serviceProvider = this.CreateServiceProviderCore(it => it.UseOllamaEmbeddingGenerator("embeddinggemma", false));

        // 创建向量生成器
        using var generator = serviceProvider.GetRequiredService<IEmbeddingGenerator<string, Embedding<float>>>();

        // 在内存中保存向量 nuget Microsoft.SemanticKernel.Connectors.InMemory, 
        var vectorStore = new InMemoryVectorStore();
        VectorStoreCollection<int, VectorData> vectorStoreCollection = vectorStore.GetCollection<int, VectorData>("VectorData");

        await vectorStoreCollection.EnsureCollectionExistsAsync();

        // 生成一些词插入到向量数据中
        var idx = 0;
        const string text = "星河\n\n青竹\n\n红枫\n\n白云\n\n夜航\n\n晨曦\n\n山川\n\n流水\n\n秋叶\n\n烟雨\n\n逐梦\n\n飞鸟\n\n岚风\n\n碧海\n\n雪原";
        var vectorDatas = text.Split('\r', '\n').Select(it => it.Trim()).Where(it => it.Length > 0)
            .Select(it => new VectorData { Key = idx++, Description = it, })
            .ToArray();

        // 生成向量并插入向量数据
        foreach (var vectorData in vectorDatas)
        {
            vectorData.Vector = await generator.GenerateVectorAsync(vectorData.Description);
        }

        var tasks = Array.ConvertAll(vectorDatas, it => vectorStoreCollection.UpsertAsync(it));
        await Task.WhenAll(tasks);

        // 查询问题
        var queries =
            "想找和 早晨、阳光 有关的名字\n\n有没有和 天空或大海 有关的\n\n给我一个和 红色植物 相关的\n\n有没有和 旅行、飞翔 相关的\n\n找一个和 安静、雨天 接近的名字\n\n有没有带点 浪漫、梦想 意境的\n\n给我一个和 冬天、雪 相关的\n\n想要和 山水自然 有关的"
                .Split('\r', '\n')
                .Select(it => it.Trim()).Where(it => it.Length > 0);

        // 进行查询并输出结果
        foreach (var query in queries)
        {
            // 计算问题的向量值,并进行查询
            var queryEmbedding = await generator.GenerateVectorAsync(query);
            var results = vectorStoreCollection.SearchAsync(queryEmbedding, 1);

            var result = await results.FirstOrDefaultAsync();
            if (result != null)
            {
                this.testOutputHelper.WriteLine($"查询:{query}, {result?.Record.Description} [{result?.Score}]");
            }
        }

向量值存储项

private class VectorData
    {
        // key 
        [VectorStoreKey] public int Key { get; set; }

        [VectorStoreData] public string Description { get; set; }

        // 定义向量值及维度
        // Dimensions 指定向量的维度,向量函数指定
        // 向量比较使用方法 DistanceFunction 
        [VectorStoreVector(
            256,
            DistanceFunction = DistanceFunction.CosineSimilarity)]
        public ReadOnlyMemory<float> Vector { get; set; }
    }
上一篇
下一篇