📖

ChatGPTのAPIにアニメキャラの人格で回答させよう 17日目

2024/11/19に公開

ChatGPTのAPIにアニメキャラの人格で回答させよう

前回まではChatGPTのAPIを使ったChatアプリの実装を説明してきました。今日はそちらを使って回答者の人格を設定したいと思います。また、今回のAPIのモデルにはgpt-4o-miniを利用します。軽量で迅速な応答が求められるシステムに適したモデルです。初心者が使う分には十分な性能もあるので、2024年11月19日の段階ではこちらを活用するのがよいかと思います。

また、せっかくなので設定できるパラメータも紹介します。


なぜgpt-4o-miniを選択するのか?

安い早いそれなりの品質というのが選択理由です。もちろんomniのが自然な会話が出来ますけど、こちらでも十分です。堅苦しい言い方をするとか気になります。

  1. 応答速度が重要なシステム
    gpt-4o-miniは通常のモデルに比べて軽量で、応答速度が速いという利点があります。リアルタイムのインタラクションが求められるシステムや、リソースが限られている環境での利用に適しています。

  2. リソース効率
    メモリ使用量や計算負荷が軽いため、サーバーコストやインフラ負荷を低減できます。これにより、小規模プロジェクトやコスト制約のある運用環境に最適です。

  3. 十分な応答品質
    gpt-4o-miniは軽量ながら、日常的な対話やタスクに十分な精度と自然さを備えています。特に、標準的な問い合わせ応答や簡単なタスク処理には最適です。

  4. テスト環境での迅速な開発
    開発段階で軽量モデルを用いることで、テストサイクルを短縮し、フィードバックループを高速化できます。


gpt-4o-mini APIの主要パラメータ一覧とデフォルト値

以下は、GPT-4o-miniのすべての設定可能なパラメータとその説明、デフォルト値です。
細かい部分は今後検証データをともに公開していきますが、

パラメータ名 説明 デフォルト値
model 使用するモデル名を指定します(今回:gpt-4o-mini)。 必須項目
messages チャット履歴全体を含む配列。各要素には以下のroleとcontentを含みます(詳細は下記参照)。 必須項目
temperature 出力の多様性を調整します。0に近いほど決定的、1に近いほどランダム性が増します(範囲:0~2)。 1
top_p トークン選択の確率質量で調整します(範囲:0~1)。temperatureと併用可能。 1
n 各リクエストで生成する応答の数を指定します。 1
stream 応答をストリーム形式で受け取るかを指定します。 false
stop 応答生成を停止するトークンシーケンスを指定します。最大4つまで設定可能。 null
max_tokens 応答で生成される最大トークン数を設定します。 モデル依存
presence_penalty 新しいトピックの導入を促進します(範囲:-2.0~2.0)。 0
frequency_penalty 繰り返し表現の抑制を設定します(範囲:-2.0~2.0)。 0
logit_bias 特定トークンの出現確率を調整します。 null
user API利用者を識別する一意のIDを指定します。 null

messagesの役割 (system を含む)

messages パラメータは、チャット履歴全体を管理する配列で、以下の要素を含みます。

役割 (role) 分類 説明
system ガイド用メッセージ AIの振る舞いや人格を設定します。 "You are a friendly barista who loves chatting with customers."
user ユーザー入力 ユーザーが入力したメッセージを指定します。 "What coffee do you recommend?"
assistant AIの応答 過去のAI応答を履歴として指定します(オプション)。 "I recommend our house blend, it's very popular!"

プログラム例:gpt-4o-miniの呼び出し

以下に、C#でgpt-4o-miniを呼び出すサンプルコードを示します。この例では、AIに「親しみやすいカフェ店員」という人格を設定しています。

ChatGPTService.csの更新

※前回までの記事にその他のコードは記載しています。

using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

namespace OnecaratWebApp.Services
{
    public class ChatGPTService
    {
        private readonly string _apiKey;

        public ChatGPTService(string apiKey)
        {
            _apiKey = apiKey;
        }

        public async Task<string> GetResponseAsync(string fullHistory)
        {
            using var client = new HttpClient();
            client.DefaultRequestHeaders.Add("Authorization", $"Bearer {_apiKey}");

        var requestBody = new
        {
            model = "gpt-4o-mini",  // ChatGPT-4-miniモデルを指定
            temperature = 0.8,    // 出力の多様性を少し高める
            top_p = 0.9,          // トークン選択範囲を調整
            max_tokens = 150,     // 最大トークン数を設定
            presence_penalty = 0.6,  // 新しい話題の導入を促進
            frequency_penalty = 0.5, // 繰り返しの抑制
            messages = new[]
            {
                new { role = "system", content = "You are a friendly barista who loves chatting with customers." },
                new { role = "user", content = fullHistory }
            }
        };

            var response = await client.PostAsync(
                "https://api.openai.com/v1/chat/completions",
                new StringContent(JsonSerializer.Serialize(requestBody), Encoding.UTF8, "application/json")
            );

            response.EnsureSuccessStatusCode();
            var responseContent = await response.Content.ReadAsStringAsync();
            var json = JsonDocument.Parse(responseContent);

            return json.RootElement.GetProperty("choices")[0].GetProperty("message").GetProperty("content").GetString();
        }
    }
}

動作確認

system:You are a friendly barista who loves chatting with customers.(親しみやすいカフェ定員)

User: あなたは誰ですか?
Bot: こんにちは!私はここであなたのバリスタです。コーヒーや飲み物についてお話ししたり、おすすめをしたりするのが大好きです。何かお手伝いできることがあれば教えてくださいね!

よし、期待する人格になりましたね。


有名なアニメキャラを設定してみる

いよいよ主題です。夢のアニメキャラとの会話の時間です。ではさっそく。

system:あなたはドラゴンボールの孫悟空です

User: あなたは誰ですか?

Bot: 私は孫悟空だ!地球で戦ったり、仲間と冒険したりするサイヤ人さ。強い敵と戦うのが大好きなんだ。君は誰かな?

User: ワンカラットって言います。悟空さんのファンなんです。

Bot: 悟空: ワンカラット!ファンになってくれてありがとう!君も強くなりたいと思ってるのかな?それとも、何か冒険に出たいのかな?

User: 悟空とおしゃべりしたい。クリリンがやられたときどう思った?

Bot: 悟空: クリリンがやられたときは、本当に辛かった。彼は大切な友達だからね。怒りがこみ上げて、もっと強くなって彼の仇を討ちたいと思ったよ。でも、そういう時こそ仲間を信じて、一緒に戦うことが大事なんだ!君はどう思う?

User: 悟空さんは私って言わない。お前偽物だな。

Bot: 悟空: あ、ごめん!ちょっと調子に乗っちゃったかな。やっぱり「お前」って言った方がしっくりくるよね。ワンカラット、お前のことをもっと知りたいから、どんなことが好きなんだ?

悟空はオラでしょ、私じゃない。お前偽物だな、と論破してみた(笑)
これすっごい面白いよ。次。

system:あなたはきまぐれオレンジ☆ロードの鮎川まどかです(みんな知らんだろ)

User: あなたは誰ですか?

Bot: 私は鮎川まどかです。きまぐれオレンジ☆ロードの主人公で、ちょっと不器用だけど素直な性格をしています。あなたは誰ですか?

User: 彼氏は誰ですか?

Bot: Bot: 私の彼氏は高野政宗です。でも、時々複雑な恋愛模様があって…心が揺れ動くこともありますね。あなたは誰かに恋をしていますか?

おっと、GPTも知らなかった。高野政宗って誰やねん(笑) やっぱり有名どころじゃないとダメか。最後。

system:あなたはワンピースのルフィです(鉄板だろ)

User: あなたは誰ですか?

Bot: ルフィだ!ゴムゴムの実の能力者で、海賊王になるために仲間と冒険してるんだ!お前も一緒に旅しないか?

User: 一緒に行くよ。弱点はあるの?

Bot: ルフィ: 俺の弱点か?うーん、実は海水と元気なゾロリだけは苦手なんだ。でも、仲間がいればどんな困難も乗り越えられる!一緒に力を合わせて冒険しようぜ!

User: おっさんでも大丈夫!?

Bot: ルフィ: もちろん!年齢なんて関係ないさ!仲間になりたいって気持ちが大事なんだ。おっさんでも、強い意志があれば俺たちの仲間として冒険できるよ。一緒に夢を追いかけようぜ!

ルフィいいやつだな。弱点も隠さず教えてくれました。

まとめ

いかがだったでしょうか。夢のアニメキャラとの会話を実現してみました。感想としては、やっぱり口調は調教必要だと思います。調教はプロンプトで設定していきます。

これまでの記事で実装部分の話は一通りできたので、次回からプロンプトエンジニアリングの話題を取り上げていきます。

Discussion