You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 12:38:07