• .Net与AI的强强联合:AntSK知识库项目中Rerank模型的技术突破与实战应用


            随着人工智能技术的飞速发展,.Net技术与AI的结合已经成为了一个新的技术热点。今天,我要和大家分享一个令人兴奋的开源项目——AntSK,这是一个基于.net平台构建的开源离线AI知识库项目。在这个项目中,我们最近加入了一项强大的Rerank(重排)模型,进一步增强了我们的AI知识库的查询能力。如果你关心.NET和AI的融合应用,那么请继续阅读,我保证这会是一次充满技术洞见的探索旅程。

     

    引言

            在现代搜索引擎技术中,如何从庞大的数据中快速、准确地找到用户需要的信息,这一点至关重要。虽然向量匹配技术已经可以实现语义相关度的匹配,它是根据向量之间的距离来判断文档与查询之间的相关性,但这往往不能满足我们日益增长的精准匹配需求。文档质量的参差不齐,以及用户查询意图的多样性,让向量匹配技术看起来有些力不从心。

            AntSK知识库项目正是针对这些挑战而诞生,目标是构建一个强大、灵活且易于扩展的AI知识库框架。引入Rerank技术后,AntSK可以对向量匹配后的初步结果进行进一步的重排序,从而显著提升搜索结果的相关性和质量。

     

    AntSK项目简介

            AntSK是一个开源且强大的AI知识库框架,它集成了先进的语义理解技术。通过结合

    semantic kernel和kernel memory,它提供了一个扩展的AI功能平台,还支持Python混合编程,让.NET开发者也可以轻松利用Python丰富的AI生态库进行开发。

    项目地址参见:

    https://github.com/AIDotNet/AntSK

    Rerank模型的介绍及应用

            要在AntSK中加入Rerank模型,我们可以使用一个名为FlagEmbedding的开源项目作为参考。FlagEmbedding提供了一个用于文档重排序的优秀实践,它可以通过更复杂的模型和更多因素,例如文档的语义深度、用户查询意图等,来筛选出更加配准的结果。

    FlagEmbedding项目地址:

    1
    https://github.com/FlagOpen/FlagEmbedding/tree/master/FlagEmbedding/llm_reranker#model-list

      

            在AntSK中,我们需要通过pythonnet来运行Rerank模型,这样可确保.NET和Python之间的无缝集成。由于网络原因,一些国内用户在下载模型时可能会遇到困难,因此我们对下载部分进行了修改,使其支持从modelscope进行下载。

            接下来,我们来看看如何在AntSK中实现ReRank模型的集成。首先建立一个pythonnet类,以下是一个简化版的代码实现:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    public static class BegRerankConfig
    {
        public static dynamic model { get; set; }
     
        static object lockobj = new object();
     
     
     
        ///
        /// 模型写死
        ///
        public static dynamic LoadModel(string pythondllPath, string modelName)
        {
            lock (lockobj)
            {
                if (model == null)
                {
                    if (string.IsNullOrEmpty(Runtime.PythonDLL))
                    {
                        Runtime.PythonDLL = pythondllPath;
                    }
                    PythonEngine.Initialize();
                    try
                    {
                        using (GIL())// 初始化Python环境的Global Interpreter Lock)
                        {
                            dynamic modelscope = Py.Import("modelscope");
                            dynamic flagEmbedding = Py.Import("FlagEmbedding");
     
                            dynamic model_dir = modelscope.snapshot_download(modelName, revision: "master");
                            dynamic flagReranker = flagEmbedding.FlagReranker(model_dir, use_fp16: true);
                            model = flagReranker;
                            return model;
                        }
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                }
                else
                {
                    return model;
                }
            }
        }
     
     
        public static double Rerank(List<string> list)
        {
            using (GIL())
            {
                try
                {
                    PyList pyList = new PyList();
                    foreach (string item in list)
                    {
                        pyList.Append(item.ToPython()); // 将C# string转换为Python对象并添加到PyList中
                    }
                    PyObject result = model.compute_score(pyList, normalize: true);
                    return result.As<double>();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }
    }

      

     代码详见AntSK项目。通过简单的集成,我们就能为AntSK赋予ReRank的能力。另外,我们将初步查找的top 5结果扩展为top 20,甚至更多,然后通过ReRank模型对这些结果进一步筛选和排序,最后只抽取重排后的top 5。这样的操作流程大大提升了结果的准确性。

    为什么需要向量匹配后再Rerank?

            这是因为Rerank依赖的是一对一的精确匹配模型,在处理海量文档时效率较低。因此,将向量匹配作为第一轮粗筛选择,然后让Rerank技术进行第二轮精细的筛选排序,就显得格外高效且合理。

    效能测试

            经过初步的测试,引入Rerank技术后,AntSK在搜索结果的相关性和准确性上都得到了显著的提升。这不仅加深了我们对混合AI系统的认识,也为.NET平台上的AI应用开发提供了新的可能性和方向。

     

    结语

            通过AntSK这一案例,我们可以明显看到.NET和AI领域融合的趋势。随着技术的不断进步,我们预计会有越来越多精彩的.NET结合AI的应用场景出现。现在,你可以通过访问Github上的AntSK项目,深入了解这一先进技术,并将其应用于你自己的工作当中。

            本文仅是一个起点,探讨AntSK知识库框架以及Rerank在内的相关深度技术。我将继续关注这一个领域的进展,并与大家分享更多精彩内容。感谢阅读,让我们一起期待.NET/AI的融合未来!

    另外也欢迎大家加入我们的社区交流群,关注公众号《许泽宇的技术分享》发送进群!
    这是一个非常和谐的社区,大家在里面讨论AI技术,非常融洽。

     

     

  • 相关阅读:
    VS Code:CMake配置
    AVR单片机与C语言的一些入门简要概述
    unix多进程多线程
    Qt --- Day02
    猿创征文|软件测试入门(一)
    6 张图告诉你 RocketMQ 是怎么保存偏移量的
    Python(黄金时代)—— 搞定python的日志
    【本地运行chatgpt-web】启动前端项目和service服务端项目,也是使用nodejs进行开发的。两个都运行成功才可以使用!
    电脑访问不到在同网络的手机设备
    《垃圾回收算法手册 自动内存管理的艺术》——其他分区策略(笔记)
  • 原文地址:https://www.cnblogs.com/xuzeyu/p/18148685