😺

C#でAIと無料で会話できるようにしてみた

2024/10/20に公開

使う生成AI

Gemini
無料で使えるから。

前提

このサイトでGeminiのAPI Keyを発行してください。

プログラム

デザイン

SplitContainerを配置して上下に分けるようにします。

RichTextBoxとTextBoxを配置します。(それぞれ名前はrichTextBox1とtextBox1)

コード

"GeminiApiKey"という環境変数を作り、GeminiのAPIKeyを設定します。(安全性のため)
NuGetで"Google_GenerativeAI"というパッケージを追加します。
下のようなクラスChatBotを作ります。ほとんどChatGPTに作ってもらった

ChatBot.cs
using GenerativeAI.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GeminiChat
{
    public class ChatBot
    {
        private readonly GenerativeModel model;
        private List<string> conversationHistory;

        // コンストラクタでAPIキーを渡し、APIクライアントを初期化
        public ChatBot()
        {
            string apiKey = Environment.GetEnvironmentVariable("GeminiApiKey", EnvironmentVariableTarget.User);
            model = new GenerativeModel(apiKey);
            conversationHistory = new List<string>();
        }

        // チャットのメイン機能: ユーザーの入力に対してAPIの応答を取得
        public async Task<string> SendMessageAsync(string userMessage)
        {
            // 会話履歴にユーザーのメッセージを追加
            conversationHistory.Add($"User: {userMessage}");

            // コンテキスト付きのプロンプトを作成
            string promptWithContext = string.Join("\n", conversationHistory);

            try
            {
                // メッセージをGemini APIに送信し、応答を受け取る
                var response = await model.GenerateContentAsync(promptWithContext);

                // ボットの応答を履歴に追加
                conversationHistory.Add($"You: {response}");

                // ボットの応答を返す
                return response;
            }
            catch (Exception ex)
            {
                // エラーが発生した場合の処理
                return $"リクエストエラー: {ex.Message}";
            }
        }
    }
}

Form1.csは

Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using GeminiChat;

namespace Qiita
{
    public partial class Form1 : Form
    {
        private ChatBot chatBot;

        public Form1()
        {
            InitializeComponent();

            chatBot = new ChatBot();
        }

        private async void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                string text = textBox1.Text;
                string res = await chatBot.SendMessageAsync(text);

                int startPos = richTextBox1.Text.Length;
                string additionalText = $"You: {text}\n";
                int length = additionalText.Length;

                richTextBox1.Text += additionalText;
                richTextBox1.Select(startPos, length);
                richTextBox1.SelectionColor = Color.Gray;
                richTextBox1.Text += $"{res}\n";

                textBox1.Text = "";
            }
        }
    }
}

結果

スクリーンショット 2024-10-20 161906.png
このように会話ができます。

Discussion