ひでぼ~blog

C#ときどきゲーム

C#でChatGPTとのお喋りを試してみる

ChatGPTが非常に流行っているので試してみることにしました。 ここではC#のコンソールアプリケーションでChatGPTと会話ができるように実装し、その過程と結果を紹介します。

実行環境

OpenAIのAPIはこちらのライブラリを使って呼び出しました。

www.nuget.org

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さんをモデルにして、どのようにお話しできるか、是非教えてください!

スムーズな会話になりました🎉

参考

platform.openai.com

zenn.dev