DIおよびEFコアサポートとのOpenAI Chat Completions API(CHATGPT)統合。 .NETアプリケーションでAPIを使用できます。また、クライアントは、Asyncストリームを介してストリーミング応答(ChatGPTなど)をサポートしています。
AddChatGptEntityFrameworkIntegrationには、必須パラメーターとしてbuilder.Configurationが必要になりました。StructuredResponseモジュールを使用すると、C#オブジェクトとしてAPIから構造化された応答を取得できます。参照:structuredResponseセクション。 まず、OpenAIアカウントを作成してAPIキー(またはOpenRouterまたはAzure Openai)を取得する必要があります。これをhttps://platform.openai.com/account/api-keysで行うことができます。
DIおよびPersistence(EF Core)サポートを備えた.NETプロジェクトでCHATGPTサービスを使用する最も簡単な方法は、NUGETパッケージopenai.chatgpt.entityframeworkcoreをインストールすることです。
Install-Package OpenAI.ChatGPT.EntityFrameworkCore
EFコアを使用したくない場合は、パッケージopenai.chatgpt.aspnetcoreをインストールし、 IChatHistoryStorageインターフェイスを使用して、チャット履歴に独自のストレージを実装できます。
TL; DR:参照プロジェクトの例を参照してください。
appsettings.jsonファイル(安全ではない)を設定します。 {
"AIProvider" : " openai " , // or openrouter or azure_openai
"OpenAICredentials" : { //optional
"ApiKey" : " your-api-key-from-openai " ,
"ApiHost" : " https://api.openai.com/v1/ "
},
"AzureOpenAICredentials" : { //optional
"ApiKey" : " your-api-key-from-azure-openai " ,
"ApiHost" : " https://{your-host}.openai.azure.com/ " ,
"DeploymentName" : " gpt-4-turbo-preview "
},
"OpenRouterCredentials" : { //optional
"ApiKey" : " your-api-key-from-openrouter " ,
"ApiHost" : " https://openrouter.ai/api/v1 "
}
}また、OpenAI API Keyを環境ASPNETCORE_OpenAICredentials:ApiKeyとして指定することもできます。
builder . Services . AddChatGptEntityFrameworkIntegration (
builder . Configuration ,
options => options . UseSqlite ( " Data Source=chats.db " ) ) ; options.UseSqlite("Data Source=chats.db")の代わりに、独自のDBと接続文字列を使用します。
ChatGPTFactoryをサービスに挿入し、それを使用してChatGPTインスタンスを作成します。 public class YourService
{
private readonly ChatGPTFactory _chatGptFactory ;
public YourService ( ChatGPTFactory chatGptFactory )
{
_chatGptFactory = chatGptFactory ;
}
public async Task < string > GetAnswer ( string text )
{
ChatGPT chatGpt = await _chatGptFactory . Create ( userId ) ;
var chatService = await chatGpt . ContinueOrStartNewTopic ( ) ;
response = await _chatService . GetNextMessageResponse ( _prompt ) ;
return response ;
}
}Blazorの例を参照してください。
リクエストパラメーターを構成する場合は、 appsettings.json構成またはChatGPTFactory.CreateまたはChatGPT.CreateChatメソッドで実行できます。
{
"ChatGPTConfig" : {
"InitialSystemMessage" : " You are a helpful and kind assistant. " ,
"InitialUserMessage" : null ,
"MaxTokens" : null ,
"Model" : null ,
"Temperature" : null ,
"PassUserIdToOpenAiRequests" : true
}
}chatgptconfig内のパラメーターの説明を参照してください。
サーバーの応答が成功ステータスコードではない場合、クライアントはnotexpectedResponseExceptionをスローします。例外には、Openai APIからのエラーメッセージが含まれます。
デフォルトでは、CancellationまたはChatService.Stop()メソッド呼び出しを要求すると、 OperationCanceledExceptionがスローされます。スローしたくない場合(応答のストリーミングに関連する)、 throwOnCancellationパラメーターをfalseに設定できます。
await foreach ( string chunk in chatService . StreamNextMessageResponse ( text , throwOnCancellation : false ) )
{
//...
} ChatGPTFactory 、 ChatGPTクラススレッドセーフティは、 IChatHistoryStorage実装に依存します。 Entity Frameworkを使用してChatGPTFactoryを使用する場合、スレッドセーフではありません。 ChatServiceクラスはスレッドセーフではありません。
とにかく、これらのサービスはDIで安全に使用するように設計されているため、心配する必要はありません。
すべてのパッケージからのすべてのメソッドは、非同期コンテキストで使用され、 ConfigureAwait(false)を使用するように設計されています( ConfigureAwait.Fodyパッケージに感謝します)。
ChatGPTFactory IHttpClientFactoryに依存するため、 Pollyのような利用可能なポリシーを簡単に使用できます。
このモジュールを使用すると、C#オブジェクトとしてAPIから構造化された応答を取得できます。チャットだけでなく、APIを使用したい場合に便利です。
record City ( string Name , int YearOfFoundation , string Country ) ;
var message = Dialog
. StartAsSystem ( " Return requested data. " )
. ThenUser ( " I need info about Almaty city " ) ;
City almaty = await _client . GetStructuredResponse < City > ( message , model : ChatCompletionModels . Gpt4Turbo ) ;
Console . WriteLine ( almaty ) ; // Name: "Almaty", Country: "Kazakhstan", YearOfFoundation: 1854ボンネットの下では、GPT4Turboとgpt-3.5-turbo-1106のAPIの新しいJSONモードを使用します。通常のGPT4およびGPT3.5TURBOモデルもサポートされていますが、GPT3.5応答は不安定です(GPT3.5の場合、 examplesパラメーターを提供することを厳密にお勧めします)。
テストでは、配列、ネストされたオブジェクト、列挙を使用したより複雑な例を使用できます。
chatgpt_api_dotnet/tests/openai.chatgpt.integrationtests/openaiclienttests/openaiclient_getStructuredResponse.cs
F50D386の1行目
nuget:https://www.nuget.org/packages/openai.chatgpt.modules.structuredResponse
このモジュールを使用すると、メッセージをある言語から別の言語に翻訳できます。
string textToTranslate = " Hello, world! " ;
string translatedText = await _client . TranslateText ( textToTranslate , " English " , " Russian " ) ;
Console . WriteLine ( translatedText ) ; // "Привет, мир!"また、 StructuredResponseモジュールとペア内のオブジェクト全体を翻訳することも可能です。
var objectToTranslate = new Order (
new List < Order . Item >
{
new ( 1 , " Book " , 5 ) ,
new ( 2 , " Pen " , 10 ) ,
new ( 3 , " Notebook " , 3 )
}
) ;
Order translatedObject = await _client . TranslateObject ( objectToTranslate , " English " , " Russian " ) ;テストの完全な例を参照してください:
chatgpt_api_dotnet/tests/openai.chatgpt.integrationtests/chatgpttranslatorservicetests.cs
11658b7の36行
nuget:https://www.nuget.org/packages/openai.chatgpt.modules.translator
ChatCompletions(chatGPT)APIリクエスト(openai.chatgpt/models/chatcompleation/chatcompletion.cs)で使用できる主なパラメーターのリストを次に示します。それらのいくつかは、この記事から取られています:https://towardsdatascience.com/gpt-3-parameters-and-prompt-design-1a595dc5b405
以下に、ChatCompletions APIのリストされたパラメーター。
予測生成AIモデルは、エンジンパラメーターによって指定されます。利用可能なモデルは、https://platform.openai.com/docs/models以下で説明します
| C#モデル | APIモデル |
|---|---|
| chatcompletionmodels.gpt4turbo | GPT-4-1106-PREVIEW |
| chatcompletionmodels.gpt4 | GPT-4 |
| chatcompletionmodels.gpt4_0613 | GPT-4-0613 |
| chatcompletionmodels.gpt4_32k | GPT-4-32K |
| chatcompletionmodels.gpt4_32k_0613 | GPT-4-32K-0613 |
| chatcompletionmodels.gpt3_5_turbo | GPT-3.5-ターボ |
| chatcompletionmodels.gpt3_5_turbo_1106 | GPT-3.5-TURBO-106 |
| chatcompletionmodels.gpt3_5_turbo_16k | GPT-3.5-TURBO-16K |
| chatcompletionmodels.gpt3_5_turbo_0613 | GPT-3.5-TURBO-0613 |
| chatcompletionmodels.gpt3_5_turbo_16k_0613 | GPT-3.5-TURBO-16K-0613 |
| chatcompletionmodels.gpt4_0314 | GPT-4-0314 |
| chatcompletionmodels.gpt4_32k_0314 | GPT-4-32K-0314 |
| chatcompletionmodels.gpt3_5_turbo_0301 | GPT-3.5-Turbo-0301 |
生成された回答を許可するトークンの最大数。デフォルトはChatCompletionRequest.MaxTokensDefault (64)になります。
ChatCompletionModels.GetMaxTokensLimitForModelメソッドで制限されています。ChatCompletionMessage.CalculateApproxTotalTokenCountメソッドを使用して、ほぼトークンカウントを計算することができますChatCompletionResponse.Usage.TotalTokens 。英語の経験則として、1つのトークンは約4文字です(したがって、100トークン≈75ワード)。 OpenaiのTokenizer:https://platform.openai.com/tokenizerを参照してください使用するサンプリング温度、0〜2。
ChatCompletionTemperaturesで利用できます。ChatCompletionTemperatures.Balanced (0.5)。説明:確率にマッピングする前に、モデルは非正規化値(ロジット)を出力します。ロジットは通常、ソフトマックスなどの関数で使用され、確率に変換されます。
ただし、SoftMax関数を適用する前に、熱力学に触発されたトリックを使用して、温度パラメーター、つまりSoftMax(ロジット/温度)でロジットをスケーリングできます。
1に近い温度パラメーターは、ロジットが変更なしでソフトマックス関数を通過することを意味します。温度がゼロに近い場合、最も高い可能性のあるトークンは他のトークンと比較して非常に可能性が高くなります。つまり、モデルはより決定的になり、特定の単語のシーケンスの後に同じトークンのセットを常に出力します。
その他のパラメーターの説明はこちらにあります:それらのいくつかはこの記事から取得されています:https://towardsdatascience.com/gpt-3-parameters-and-prompt-design-1a595dc5b405
DIとチャットの履歴が必要ない場合は、Nugetパッケージopenai.chatgptのみを使用できます。
Install-Package OpenAI.ChatGPT
次に、 OpenAIClientのインスタンスを作成します。
_client = new OpenAiClient ( " {YOUR_OPENAI_API_KEY} " ) ; string text = " Who are you? " ;
string response = await _client . GetChatCompletions ( new UserMessage ( text ) , maxTokens : 80 ) ;
Console . WriteLine ( response ) ; var text = " Write the world top 3 songs of Soul genre " ;
await foreach ( string chunk in _client . StreamChatCompletions ( new UserMessage ( text ) , maxTokens : 80 ) )
{
Console . Write ( chunk ) ;
} ThenAssistantおよびThenUserメソッドを使用して、ダイアログを作成します。
var dialog = Dialog . StartAsUser ( " How many meters are in a kilometer? Write just the number. " ) //the message from user
. ThenAssistant ( " 1000 " ) // response from the assistant
. ThenUser ( " Convert it to hex. Write just the number. " ) ; // the next message from user
await foreach ( var chunk in _client . StreamChatCompletions ( dialog , maxTokens : 80 ) )
{
Console . Write ( chunk ) ;
}または、コレクションとしてメッセージ履歴を送信するだけです。