如何使用OllamaSharp获取嵌入向量并计算余弦相似度
如何使用OllamaSharp获取嵌入向量并计算余弦相似度
我明白你现在的困扰——已经用OllamaSharp成功拿到EmbedResponse里的嵌入向量了,但卡在了余弦相似度的计算上,尤其是不知道怎么和System.Numerics.Tensors.TensorPrimitives.CosineSimilarity配合使用对吧?别担心,我来一步步帮你搞定这个问题,完全不用依赖废弃包或者额外的第三方组件。
第一步:确保你已经正确获取嵌入向量
首先,先确认你已经用EmbedAsync方法拿到了两个需要对比的文本的嵌入结果。这里先给个基础的代码示例,确保这一步没问题:
using OllamaSharp; using OllamaSharp.Models; var ollamaClient = new OllamaClient(new Uri("http://localhost:11434")); ollamaClient.SelectedModel = "all-minilm"; // 换成你正在使用的嵌入模型 // 获取第一个文本的嵌入 var embedResponse1 = await ollamaClient.EmbedAsync("你要对比的第一个文本内容"); var embeddings1 = embedResponse1.Embeddings; // 获取第二个文本的嵌入 var embedResponse2 = await ollamaClient.EmbedAsync("你要对比的第二个文本内容"); var embeddings2 = embedResponse2.Embeddings;
第二步:用TensorPrimitives.CosineSimilarity计算相似度
你之所以卡在这里,大概率是因为Embeddings的类型是IReadOnlyList<float>,而TensorPrimitives.CosineSimilarity需要的是ReadOnlySpan<float>类型的参数。不过转换起来非常简单,直接把Embeddings转成ReadOnlySpan<float>就行,不需要额外的复杂操作。
直接上完整的计算代码:
using System.Numerics.Tensors; // 确保两个嵌入向量的长度一致(模型输出的嵌入长度都是固定的,一般不会有问题) if (embeddings1.Count != embeddings2.Count) { throw new InvalidOperationException("两个嵌入向量的长度不匹配,无法计算余弦相似度"); } // 把IReadOnlyList<float>转成ReadOnlySpan<float> var span1 = embeddings1.AsSpan(); var span2 = embeddings2.AsSpan(); // 计算余弦相似度 var similarity = TensorPrimitives.CosineSimilarity(span1, span2); // 输出结果,相似度范围是[-1, 1],越接近1表示文本越相似 Console.WriteLine($"两个文本的余弦相似度:{similarity:F4}");
关于你提到的其他选项的说明
- 那个标注“废弃”的包确实没必要用了,OllamaSharp是官方推荐的替代方案,咱们现在用的方法就是最正统的实现。
- 至于
smartcomponents-local-embeddings,其实完全不需要引入它——咱们用System.Numerics.Tensors这个官方原生库就足够完成计算,既轻量又不需要额外的配置,反而比引入新组件更简单。
只要确保你的项目里已经引用了System.Numerics.Tensors NuGet包(一般.NET 6+的项目可以直接引用,或者手动安装最新版本),上面的代码就能正常跑起来。
内容来源于stack exchange
相关产品推荐
相关产品推荐

