SK(Semantic Kernel)には、アプリケーションが単純なインスタンス化を行うことでAIの能力を持つことができるいくつかのサービスが内蔵されています。
例として、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 != null)
{
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);
}
上記は2種類の実装方法を例示しています。ブロック式の場合は一度に結果を返しますが、ストリーム式の場合はリアルタイムで結果を返します。
以下のパラメータは、OpenAI GPTモデルがテキスト生成プロセスで振る舞う方法を細かく制御するために使用されます:
- max_tokens: モデル出力の最大単語数(またはトークン数)を定義します。トークンには単語だけでなく、句読点やスペースなども含まれます。この制限は生成されるコンテンツの長さを制御するのに役立ちます。
- temperature: 出力のランダム性や創造性を制御するために使用されます。温度値は0から1の間で、温度が低いほど(例えば0.2や0.3)モデルの出力がより予測可能で安定します。一方、温度が高い(例えば0.8や1)と出力のランダム性や多様性が増しますが、文の一貫性や関連性が低下する可能性もあります。
- top_p (Nucleus Sampling): モデルが次の単語を選ぶ際に考慮する範囲を制御します。例えば、top_pを0.9に設定すると、モデルは累積確率が90%に達するその部分の単語から次の単語を選びます。これは、テキストの関連性を保ちながら一定の創造的自由を保つのに役立ちます。
- presence_penalty と frequency_penalty: これら2つのパラメータは、出力の多様性を増やし、反復性を減らすために使用されます。presence_penaltyは、以前に出現した単語が再び出現するコストを増加させ、同じテーマや語彙の繰り返しを避けるのに役立ちます。frequency_penaltyは、単語が出現する頻度に基づいてコストを増加させます。頻繁に出現する単語は、後続の生成で選択される確率が低くなります。
これらのパラメータの組み合わせにより、さまざまなアプリケーションシナリオやニーズに合わせて生成されるテキストのスタイルや品質を調整することができます。
他のサービスについては、後続の記事で説明します。
(Translated by GPT)