當前位置: 妍妍網 > 碼農

入門Semantic Kernel:OneApi整合與HelloWorld

2024-05-09碼農

引言

從這一章節開始正式進入我們的 Semantic Kernel 的學習之旅了。

什麽是 Semantic Kernel

Semantic Kernel 是一個輕量級的開源框架,透過 Semantic Kernel 可以快速使用不同程式語言( C#/Python/Java )結合 LLMs(OpenAI、Azure OpenAI、Hugging Face 等模型) 構建智慧套用,簡化將人工智慧( AI )整合到現有解決方案中的過程。

Semantic Kernel 的特點

  1. 模組化外掛程式架構 Semantic Kernel 提供了一個模組化的外掛程式架構,允許開發者透過結合自訂和預定義的智慧外掛程式來解決復雜的業務問題。這種架構使得傳統程式碼能夠與智慧外掛程式無縫協作,從而簡化了傳統應用程式向智慧化轉型的過程。

  2. 多模型整合能力 Semantic Kernel 支持多種 AI 模型,包括但不限於 Azure OpenAI Service OpenAI ,以及 Hugging Face 提供的離線模型。透過 Semantic Kernel 的連結器功能,開發者可以快速地將這些 AI「大腦」 整合到自己的智慧套用中,大幅提升套用的智慧化水平。

  3. 多樣化的連結器生態系 :除了連線 AI 模型, Semantic Kernel 的連結器還支持連線向量資料庫、商業軟體、業務中介軟體等多種服務。這種多樣化的連結能力,使得 Semantic Kernel 能夠適應更多的業務場景,推動業務流程的智慧化轉型。

  4. 全面的語言相容性 Semantic Kernel 支持主流的程式語言,包括 C# Python Java 。這種全面的語言支持,使得不同背景的開發者都能夠輕松地利用 Semantic Kernel 來挖掘 AI 的潛力,並將其套用到自己的計畫中。

  5. 低門檻的開發體驗 Semantic Kernel 設計註重使用者體驗,提供了簡單易用的介面和文件。即使是 AI 領域的新手,也能夠快速上手,實作零成本入門,從而降低了開發智慧套用的門檻。

核心概念

Semantic Kernel 基本組成

Semantic Kernel 中,核心概念包括:

內核(Kernel)

如果說 Semantic Kernel Copilot Agent 的核心 AI 編排層,那 Kernel 物件就是 AI 編排層的核心物件。

從上圖我們可以看出 Kernel 的核心包括:

  • 配置 : 包括 AI 模型、外掛程式、連結器等的配置資訊。

  • 上下文管理 :它維護應用程式的上下文資訊,確保在執行任務時,可以存取到正確的數據和狀態。

  • 服務協調 Kernel 物件協調不同的 AI 服務和外掛程式,確保它們能夠協同工作,完成復雜的任務。

  • 執行引擎 :它作為執行引擎,根據規劃器生成的計劃,排程和執行相應的操作。

  • 外掛程式(Plugins)

    外掛程式是 AI 解決方案的構建塊,它們是一組可以暴露給 AI 應用程式和 AI 服務的函式,允許它們存取完成特定任務所需的數據。

    Semantic Kernel 中的函式

    Semantic Function 是用自然語言編寫的提示( Prompt )樣版,發送給 AI 服務;而 Native Function 是用 C# Python 編寫的傳統函式,可以透過規劃器和函式呼叫被 AI 服務呼叫。

    記憶( Memories

    Memories 是用於儲存數據的專用外掛程式,它們在執行過程中為你的內核提供必要的上下文,以便你的 AI 服務能夠正常執行。

    規劃器( Planners

    規劃器 可以接收使用者的目標,並幫助我們動態生成一個包含實作該特定目標的執行步驟的計劃。規劃器使用 AI 模型根據核心中指定的函式和服務生成計劃。

    透過整合這些概念和元件, Semantic Kernel 可以實作智慧的語意理解、任務規劃和智慧決策,從而為使用者提供更加智慧、靈活和個人化的互動體驗。它可以套用於各種領域,如虛擬助手、智慧客服、自然語言互動系統等,為使用者和企業提供更加智慧和高效的解決方案。

    從下面這張圖可以更好的理解各核心元件之間的關系

    Sematic Kernel 對接 OneApi

    透過我們上一篇文章的,我們了解到了 OneApi ,是以 OpenAI 的格式,所以在 SK 中可以使用 OpenAI Connector 來操作、在 Semantic Kernel 類別庫中已經預設整合。

    使用 UseSecrets 儲存機密資訊

  • 在我們的啟動項右鍵機密資訊管理

  • 配置項 Json 檔

    "OneApiSpark": {
    "Endpoint""http://localhost:3000",
    "ModelId""SparkDesk-v3.5",
    "ApiKey""sk-LAYzQaWssCYYEVHP1d6a3fFa111745249e94F0364a0cF37c"
    }

    從 OpenAI 到本地服務的請求轉換

    自訂 HttpClientHandler

    OpenAI 或者 Azure OpenAI 的擴充套件,請求會發送到 "api.openai.com" 或者 "openai.azure.com" ,這時候就需要我們透過自定的 HttpClientHandler 重新導向的模型基礎 URL 轉發到我們的 http://localhost:3000 OneApi 的服務地址。

  • 核心程式碼

  • public classOpenAICustomHandler : HttpClientHandler
    {
    ///<summary>
    /// 用於OpenAI或Azure OpenAI請求時重新導向的模型基礎URL。
    ///</summary>
    privatereadonlystring modelUrl;
    privatestaticreadonlystring[] sourceArray = ["api.openai.com""openai.azure.com"];
    ///<summary>
    /// 使用指定的模型URL初始化<see cref="OpenAICustomHandler"/>類的新例項。
    ///</summary>
    ///<param name="modelUrl">用於OpenAI或Azure OpenAI請求的基礎URL。</param>
    publicOpenAICustomHandler(string modelUrl)
    {
    // 確保modelUrl不是null或空
    if (string.IsNullOrWhiteSpace(modelUrl))
    thrownew ArgumentException("模型URL不能為空或空白。"nameof(modelUrl));
    this.modelUrl = modelUrl;
    }
    ///<summary>
    /// 異步發送HTTP請求,對於OpenAI或Azure OpenAI服務的請求,將URL重新導向到指定的模型URL。
    ///</summary>
    ///<param name="request">要發送的HTTP請求訊息。</param>
    ///<param name="cancellationToken">可以用來取消操作的取消令牌。</param>
    ///<returns>表示異步操作的任務物件。</returns>
    protectedoverrideasync Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
    // 檢查請求是否針對OpenAI或Azure OpenAI服務
    if (request.RequestUri != null &&
    (sourceArray.Contains(request.RequestUri.Host)))
    {
    // 修改請求URI,以包含模型URL
    request.RequestUri = new Uri(modelUrl + request.RequestUri.PathAndQuery);
    }
    // 呼叫基礎類別方法實際發送HTTP請求
    returnawaitbase.SendAsync(request, cancellationToken).ConfigureAwait(false);
    }
    }

    Semantic Kernel HelloWorld

    我們先透過一個簡單的範例學習一下 Kernel 物件的建立使用

  • VS 建立控制台計畫 SK_CreateKernel

  • Nuget 安裝 Semantic Kernel 的依賴

  • PM> NuGet\Install-Package Microsoft.SemanticKernel -Version 1.10.0

  • 下面我們範例將借助 Prompt 提示詞用的 Semantic function 來推理一下使用者的意圖

  • Steps

    簡單的流程可以總結為:

    Build Kernel Prompt Template Create Semantic function Kernel Invoke Semantic function

    var config = ConfigExtensions.FromConfig<OpenAIConfig>("OneApiSpark");
    //自訂HttpClientHandler
    var openAICustomHandler = new OpenAICustomHandler(config.Endpoint);
    using HttpClient client = new(openAICustomHandler);
    //Create Kernel
    Kernel kernel = Kernel.CreateBuilder()
    .AddOpenAIChatCompletion(
    modelId: config.ModelId,
    apiKey: config.ApiKey,
    httpClient: client)
    .Build();
    // 接收使用者入參
    string request = Console.ReadLine()!;
    // create prompt to the chat service
    string prompt = "這個請求的意圖是什麽? {{$request}}";
    // Create a kernel arguments object and add the request
    var kernelArguments = new KernelArguments
    {
    "request", request }
    };
    var streamingKernelContentsAsync = kernel.InvokePromptStreamingAsync(prompt, kernelArguments);
    awaitforeach (var content in streamingKernelContentsAsync)
    {
    Console.WriteLine(content);
    }
    Console.ReadKey();

    上面的程式碼我們透過 Kernel 物件用 prompt 建立了一個 Semantic function ,內容是揣測使用者輸入的文本意圖,借助大模型的推理能力很簡單的就可以做到這個功能。

    Run 一下

  • 輸入

  • I want to send an email to the marketing team celebrating their recent milestone

  • 輸出

  • 這個
    請求的意圖
    是發送一封
    電子信件給市場團隊
    ,慶祝他們最近達成
    的一個重要成就。

    在編程或自動化的上下文中,實作這個意圖可能涉及以下幾個步驟:

    1. 確定市場團隊的聯系資訊,包括電子信件地址。
    2. 編寫信件內容,確保包含對最近裏程碑的慶祝和肯定。
    3.
    使用適當的信件發送協定(如SMTP)或信件服務API(如SendGrid, Mailgun等)來發送信件。
    4. 確保信件格式正確,包括主題行、正文、簽名等。
    5. 測試信件發送功能以確保信件能夠成功送達。
    如果你需要具體的程式碼範例或進一步的幫助來實作這個功能,請提供更多的上下文或技術要求。




    最後

    本章介紹了 Semantic Kernel 的特點、核心概念以及與 OneApi 的對接方式,算是我們 SK 學習的 HelloWorld ,展示了如何利用 Semantic Kernel 構建智慧套用並與線上大模型進行整合。

    參考文獻

  • Semantic Kernel Cookbook [1]

  • Prompting AI models with Semantic Kernel [2]

  • What is Semantic Kernel [3]

  • 本文範例原始碼

    本文原始碼 [4]

    參考資料

    [1]

    Semantic Kernel Cookbook: https://github.com/microsoft/SemanticKernelCookBook/blob/main/README.zh-cn.md

    [2]

    Prompting AI models with Semantic Kernel: https://learn.microsoft.com/en-us/semantic-kernel/prompts/your-first-prompt?tabs=Csharp

    [3]

    What is Semantic Kernel: https://systenics.ai/blog/2023-12-11-what-is-semantic-kernel/

    [4]

    本文原始碼: https://github.com/Dong-Ruipeng/SK-WorkBook