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

求基于all-MiniLM-L6-v2 embedding的C#相似字符串搜索代码实现

C# 实现相似字符串搜索(基于all-MiniLM-L6-v2)

依赖准备

  • 安装NuGet包:SentenceTransformers(用于生成与Python兼容的embedding)
  • 安装NuGet包:System.Text.Json(用于解析JSON格式的embedding文件)

假设的JSON文件结构

假设你的embeddings JSON文件格式如下(每个条目包含目标文本和对应的384维embedding向量):

[
  {
    "text": "Ayrton Senna",
    "embedding": [0.123, -0.456, 0.789, ...]
  },
  {
    "text": "Michael Schumacher",
    "embedding": [0.987, -0.654, 0.321, ...]
  }
]

完整实现代码

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.Json;
using SentenceTransformers;

namespace SimilarStringSearch
{
    // 与JSON结构匹配的实体类
    public class EmbeddingEntry
    {
        public string Text { get; set; }
        public float[] Embedding { get; set; }
    }

    class Program
    {
        static async System.Threading.Tasks.Task Main(string[] args)
        {
            // 配置参数
            string inputText = "sena"; // 待搜索的输入字符串
            string jsonFilePath = "embeddings.json"; // 本地embedding文件路径
            string modelName = "all-MiniLM-L6-v2"; // 与Python端一致的模型

            // 加载JSON中的embedding数据
            var embeddingEntries = LoadEmbeddingEntries(jsonFilePath);

            // 加载预训练模型并生成输入文本的embedding
            var model = await SentenceTransformerModel.LoadAsync(modelName);
            var inputEmbedding = await model.EncodeAsync(inputText);

            // 找到最相似的条目
            var mostSimilarEntry = FindMostSimilarEntry(inputEmbedding, embeddingEntries);

            // 输出结果
            Console.WriteLine($"最相似条目:{mostSimilarEntry.Text}");
        }

        // 读取并解析JSON文件
        private static List<EmbeddingEntry> LoadEmbeddingEntries(string filePath)
        {
            string jsonContent = File.ReadAllText(filePath);
            return JsonSerializer.Deserialize<List<EmbeddingEntry>>(jsonContent);
        }

        // 计算余弦相似度并筛选最相似条目
        private static EmbeddingEntry FindMostSimilarEntry(float[] inputEmbedding, List<EmbeddingEntry> entries)
        {
            return entries.OrderByDescending(entry => CalculateCosineSimilarity(inputEmbedding, entry.Embedding)).First();
        }

        // 余弦相似度计算逻辑
        private static float CalculateCosineSimilarity(float[] vecA, float[] vecB)
        {
            float dotProduct = 0;
            float magA = 0;
            float magB = 0;

            for (int i = 0; i < vecA.Length; i++)
            {
                dotProduct += vecA[i] * vecB[i];
                magA += vecA[i] * vecA[i];
                magB += vecB[i] * vecB[i];
            }

            magA = (float)Math.Sqrt(magA);
            magB = (float)Math.Sqrt(magB);

            return magA == 0 || magB == 0 ? 0 : dotProduct / (magA * magB);
        }
    }
}

注意事项

  • 首次运行时会自动下载all-MiniLM-L6-v2模型,需保证网络正常
  • 确保JSON文件中的embedding向量维度为384(该模型固定输出维度)
  • 若处理大规模数据,可考虑引入向量数据库优化相似度计算效率

内容的提问来源于stack exchange,提问作者Jean J. Michel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 23:15:20