天天看點

Semantic Kernel:Service内置服務

作者:opendotnet

在SK中内置了一些服務,這些服務可以讓我們的應用,簡單的執行個體化調用,便擁有AI能力。

以OpenAI為例,SK中内置的OpenAI服務有:

  • 内容生成服務:OpenAITextGenerationService
  • 聊天服務:OpenAIChatCompletionService
  • 文本轉圖檔服務:OpenAITextToImageService
  • 聲音轉文本服務:OpenAIAudioToTextService
  • 文本轉聲音服務:OpenAITextToAudioService
  • 文本嵌入向量服務:OpenAITextEmbeddingGenerationService

這些服務可以直接執行個體化使用,也可以配合Kernel使用。下面是一個TextGeneration服務使用方式,TextGeration隻支援modelid為gpt-3.5-turbo-instruct的模型,具體實作如下:

using Microsoft.Extensions.Logging;              using Microsoft.SemanticKernel;              using Microsoft.SemanticKernel.ChatCompletion;              using Microsoft.SemanticKernel.Connectors.OpenAI;              using System.Text.Json;                  var chatModelId = "gpt-3.5-turbo-instruct";              var key = File.ReadAllText(@"C:\GPT\key.txt");                  var settings = new PromptExecutionSettings              {              ExtensionData = new Dictionary<string, object>              {              ["max_tokens"] = 1000,              ["temperature"] = 0.2,              ["top_p"] = 0.8,              ["presence_penalty"] = 0.0,              ["frequency_penalty"] = 0.0              }              };              Console.WriteLine("---------------非流式---------------");              var textGenerationService = new OpenAITextGenerationService(chatModelId, key);              var textContents = await textGenerationService.GetTextContentsAsync("用50個字描述一下.NET", settings);              foreach (var textContent in textContents)              {              var usage = textContent?.Metadata?["Usage"] as Azure.AI.OpenAI.CompletionsUsage;              if (usage != )              {              var tokenStr = @$"====================Tokens==================              提示詞Tokens數:{usage.PromptTokens}              傳回内容Tokens數:{usage.CompletionTokens}              總Tokens數:{usage.TotalTokens}              ===========================================";              Console.WriteLine(tokenStr);              }              Console.WriteLine(textContent.Text);              }                  Console.WriteLine("---------------流式---------------");              var streamTextContents = textGenerationService.GetStreamingTextContentsAsync("用50個字描述一下C#");              await foreach (var textContent in streamTextContents)              {              Console.Write(textContent.Text);              }           

上面舉了兩種實作方式,阻塞式,一次性傳回結果,流式,時時傳回結果。

下面這些參數是用來精細控制OpenAI GPT模型在文本生成過程中的行為的:max_tokens:這個參數定義了模型輸出的最大詞數(或者說是token數)。Token不僅僅是單詞,還包括标點符号和空格等。這個限制幫助控制生成内容的長度。temperature:這個參數用于控制輸出的随機性或者創造性。溫度值在0到1之間,較低的溫度(如0.2或0.3)會讓模型的輸出更加可預測和穩定,而較高的溫度(如0.8或1)會增加輸出的随機性和多樣性,但也可能導緻文本的連貫性和相關性下降。top_p (Nucleus Sampling):這個參數控制模型在選擇下一個詞時考慮的範圍。例如,如果top_p設定為0.9,模型将隻從機率累積到90%的那部分詞中選擇下一個詞。這通常有助于保持文本的相關性同時還能保持一定的創意自由。presence_penalty 和 frequency_penalty:這兩個參數用于增加輸出的多樣性和降低重複性。presence_penalty增加了已出現過的詞再次出現的代價,有助于避免重複同一主題或詞彙。frequency_penalty類似,但它是基于詞出現的頻率來增加代價,頻繁出現的詞在後續生成中被選中的機率将降低。這些參數的組合可以幫助調整生成文本的風格和品質,以适應不同的應用場景和需求。關于其他服務,我們在後續的文章中使用說明。

繼續閱讀