.Net與AI的強強聯合:AntSK知識庫專案中Rerank模型的技術突破與實戰應用

许泽宇發表於2024-04-21

隨著人工智慧技術的飛速發展,.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專案地址:

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

  

在AntSK中,我們需要透過pythonnet來執行Rerank模型,這樣可確保.NET和Python之間的無縫整合。由於網路原因,一些國內使用者在下載模型時可能會遇到困難,因此我們對下載部分進行了修改,使其支援從modelscope進行下載。

接下來,我們來看看如何在AntSK中實現ReRank模型的整合。首先建立一個pythonnet類,以下是一個簡化版的程式碼實現:

public static class BegRerankConfig
{
    public static dynamic model { get; set; }

    static object lockobj = new object();



    /// <summary>
    /// 模型寫死
    /// </summary>
    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技術,非常融洽。

相關文章