ChatGPTが非常に流行っているので試してみることにしました。 ここではC#のコンソールアプリケーションでChatGPTと会話ができるように実装し、その過程と結果を紹介します。
実行環境
- Visual Studio 2022 17.5.3
- .NET 7
OpenAIのAPIはこちらのライブラリを使って呼び出しました。
Azure OpenAI Service用のライブラリですがChatGPTを直で使う場合でも使えるようだったのでこちらを利用しました。 ベータ版なのでVisual StudioのNugetパッケージマネージャーからインストールする際は、プレビュー版も含めて検索しないとヒットしないのでご注意ください。
実装してみる
コンソールアプリケーションでWeb版のChatGPTのようにAIとお喋りできるようなものを作ってみました。
using Azure.AI.OpenAI; var apiKey ="your api key"; var modelName ="gpt-3.5-turbo"; var client =new OpenAIClient(apiKey); while (true) { Console.WriteLine("YOU:"); var input = Console.ReadLine(); if (input =="quit") { return; } Console.WriteLine(); var response =await client.GetChatCompletionsAsync(modelName, new ChatCompletionsOptions { Messages = { new ChatMessage(ChatRole.User, input) } }); Console.WriteLine("ChatGPT:"); Console.WriteLine(response.Value.Choices.First().Message.Content); Console.WriteLine(); }
実行結果
YOU: こんばんはー! ChatGPT: こんにちは、私はAIアシスタントです。どうかしましたか? YOU: いや特に何かはありません! ChatGPT: では、なにか私ができることはありますか? YOU: 大丈夫です! ChatGPT: ありがとうございます! YOU: 私が1個前に質問したこと覚えてますか? ChatGPT: 申し訳ありません、私は覚えていません。私はAIであり、前回の会話の履歴を参照することはできません。お手数ですが、もう一度質問内容をお知らせください。
なんか会話が嚙み合ってない…と思ったら、この実装だと会話の内容が保持されていませんでした。
会話の内容を保持する
前段の実装だと、会話の履歴が残っておらず、質問のたびに新しい会話をしていることになっています。 なので、こちらが質問した内容とChatGPTが回答した内容を毎回APIに投げるようにします。
using Azure.AI.OpenAI; var apiKey ="your api key"; var modelName ="gpt-3.5-turbo"; var client =new OpenAIClient(apiKey); var options =new ChatCompletionsOptions(); while (true) { Console.WriteLine("YOU:"); var input = Console.ReadLine(); if (input =="quit") { return; } Console.WriteLine(); // ユーザーの入力はChatRole.UserとしてMessagesに追加 options.Messages.Add(new ChatMessage(ChatRole.User, input)); var response =await client.GetChatCompletionsAsync(modelName, options); var output = response.Value.Choices.First().Message.Content; Console.WriteLine("ChatGPT:"); Console.WriteLine(output); Console.WriteLine(); // ChatGPTの出力はChatRole.AssistantとしてMessagesに追加 options.Messages.Add(new ChatMessage(ChatRole.Assistant, output)); }
ユーザーの入力、ChatGPTの出力を都度都度MessagesというListに入れておき、APIをコールする際に今までのやり取りをすべて投げます。 ユーザーの入力はChatRole.Userとし、ChatGPTの出力はChatRole.Assistantとすることで、どのメッセージが誰の発言なのかを特定させます。
実行結果
YOU: こんばんはー! ChatGPT: こんばんは、お元気ですか? YOU: 元気ですー! ChatGPT: よかったですね!何か楽しいことがありましたか? YOU: いいプログラムが書けました! ChatGPT: 素晴らしいですね! どのようなプログラムを作られたのでしょうか? YOU: ChatGPTさんとお話するプログラムです! ChatGPT: それは面白そうですね!ChatGPTさんをモデルにして、どのようにお話しできるか、是非教えてください!
スムーズな会話になりました🎉