- 使用
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; }
}