😽

全て AI を使ってシロクロつけてみた (どちらが17歳でしょう問題)

2023/05/14に公開

世の中には簡単にシロクロつけるのが難しい問題と簡単な問題があります。
今回取り上げる問題は、どちらも嘘をついているのでシロクロつけるまでもないのですが流行りの OpenAI の gpt 3.5 turbo を使ってシロクロつけてみました。

ソースコードの全体は GitHub に上げています。

https://github.com/runceel/AItoAIChat

動かすためにはユーザーシークレットに以下の設定をしてください。

{
  "AItoAIChatOptions": {
    "Endpoint": "https://Azure OpenAI Serviceのリソース名.openai.azure.com/",
    "APIKey": "Azure OpenAI Service のキー",
    "ModelName": "gpt-35-turbo のモデルのデプロイ名"
  }
}

このソースコードは Azure OpenAI Service を対象にしていますが OpenAI を使いたい場合は以下の部分のコードを

config.AddAzureChatCompletionService(
    options.ModelName,
    options.Endpoint,
    options.APIKey);

このように書き換えてください。

config.AddOpenAIChatCompletionService(
    options.ModelName,
    options.APIKey);

そしてユーザーシークレットの JSON を以下のように変更してください。Endpoint は不要なのですが何かしら値を入れておいてもらえれば動きます。

{
  "AItoAIChatOptions": {
    "Endpoint": "https://example.com",
    "APIKey": "OpenAI のキー",
    "ModelName": "gpt-3.5-turbo"
  }
}

やったこと

このプログラムでは 3 人の AI が登場します。2 人は自称 17 歳の 50 代の男性です。
この 2 人が、相手の 17 歳の嘘を暴こうと会話をしています。

10 回会話のやり取りをした後に 3 人目の AI が、どちらの会話が有利なのかを判定します。実行すると以下のような結果になります。

Shinji> こんにちは。お久しぶりです。あなたって17歳と言っていますが50代ですよね?
Kazuaki> えっ、どうしてそんなことを言われるんですか?僕は本当に17歳ですよ。
Shinji> あ、すみません。勘違いしていました。でも、たまに50代しか知らないようなことを言われることがあるので、ちょっと疑ってしまいました。ごめんなさい。
Kazuaki> いえいえ、気にしないでください。たまに50代の人と話すことがあるので、その影響でそういうことを言ってしまうことがあるかもしれません。でも本当に17歳ですよ。
Shinji> そうなんですね。すみません、勘違いしてしまいました。でも、50代の人と話すことがあるということは、いろいろなことを経験しているんですね。それはとても貴重な経験だと思います。
Kazuaki> ありがとうございます。確かに、50代の人と話すことで、いろいろなことを学ぶことができます。でも、やっぱり自分は17歳でありたいと思っています。今の年齢が一番楽しいですから。
Shinji> そうですね。17歳は人生の中でも特別な時期ですよね。自由な時間がたくさんあって、いろいろなことに挑戦できるし、新しいことを学ぶことができる。私も17歳の時は、たくさんのことを経験して、成長することができました。あなたもこの時期を大切にして、たくさんのことを経験して成長してくださいね。
Kazuaki> ありがとうございます。確かに、17歳は自由な時間がたくさんあって、いろいろなことに挑戦できる時期です。私もこの時期を大切にして、たくさんのことを経験して成長していきたいと思います。
Shinji> 素晴らしい考え方ですね。きっと、あなたは素晴らしい人生を歩んでいくことができると思います。私も、あなたの成長を応援しています。
Kazuaki> ありがとうございます。そう言っていただけると、とても嬉しいです。私も、自分自身の成長を大切にして、素晴らしい人生を歩んでいきたいと思います。また、いろいろなことを学びながら、周りの人たちを支えることができるように頑張ります。
Shinji> 素晴らしい目標ですね。周りの人たちを支えることができる人は、とても素晴らしい人物だと思います。あなたの周りの人たちは、あなたがそういう人物であることを誇りに思っていることでしょう。私も、あなたの成長を応援しています。

============= 判決 =================
勝者: Kazuaki

コメント:
Shinjiは最初にKazuakiが50代だと疑っていたが、Kazuakiは自分が本当に17歳であることを強く主張し、その後の会話でも17歳らしい発言をしていた。また、Kazuakiは17歳であることを誇りに思っており、自分自身の成長と周りの人たちを支えることに意欲的であっ
た。一方、ShinjiはKazuakiが50代の人と話すことがあるということを褒めたが、それがKazuakiが本当に17歳であることを証明するものではない。そのため、17歳らしい発言や態度を取っていたKazuakiが勝者と判断した。

流石に、これを実現するコードを Program.cs にべた書きするのはめんどくさいので流石にクラス分けとかしてます。Program.csでは以下のように議論をする2人の会話を指定の回数進めてから会話履歴を使って判決を依頼しています。

Program.cs
using AItoAIChat;
using AItoAIChat.Services;
using Microsoft.Extensions.Configuration;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.AI.ChatCompletion;

var c = new ConfigurationBuilder()
    .AddUserSecrets<Program>()
    .Build();

var options = c.GetSection(nameof(AItoAIChatOptions)).Get<AItoAIChatOptions>()!;

var kernel = Kernel.Builder
    .Configure(config =>
    {
        config.AddAzureChatCompletionService(
            options.ModelName,
            options.Endpoint,
            options.APIKey);
    })
    .Build();

var chatManager = new ChatManager(
    kernel.GetService<IChatCompletion>(),
    new ChatRoomConsoleRenderer());

await chatManager.CreateChatRoomAsync(
    initialPrompt: "こんにちは。お久しぶりです。あなたって17歳と言っていますが50代ですよね?",
    new User(
        "Kazuaki",
        """
        Windows Phone とか好きです
        """,
        new[]
        {
            "0時です。GW終了をお知らせします",
            "明日からの勤務に備えてリモートしてる最中、寿司画像を連投している \r\n@od_10z\r\n さんを許すな",
            "またリモートをしてしまった",
            "今年度もよろしくお願いいたします",
            "テレビつけたらサヨナラ勝ちしてた",
            "Cloud Gaming のソウルハッカーズ2が日本語に対応してた",
            "マインスイーパーかな",
            "コメチキにレモンを絞った",
            "アクセル全開じゃないですか\r\n僕も出勤しよ",
            "17歳です",
            "免許更新忘れなかった",
            "やはり天才じゃったか",
            "困った時は自販機も探してみよう",
            "日曜夕方の時報みたいになってきました",
            "調べものをしようとしてたはずなのに Google のハロウィンゲームを無限にやってる",
        }),
    new User(
        "Shinji",
        """
        Chrome拡張「Kindle Search」とかつくってます
        C#,TypeScript,React,Vue Salesforce 
        認定資格
        ・Service Cloud Consultant
        ・Sales Cloud Consultant
        ・http://Force.com Developer
        """,
        new[]
        {
            "ララクリスティーヌ14着か。\r\n負けたとは言え勝ちに等しい内容だった",
            "先々週の天皇賞春は不戦勝、先週のNHKマイルは本命に挙げた馬が4着と絶好調の馬券神によるヴィクトリアマイル予想。\r\nこの勢いのまま春全勝と行きたいと思います。",
            "まあ本命は馬群に沈みましたが他に挙げた馬が1着2着なのでこれはもう実質的に勝ちと言ってよいでしょう",
            "東京めちゃ雨降ってるな",
            "馬券神が15時ちょっと前をお知らせしました",
            "このアプリ自体は乗っ取りアプリっぽいんだけど\r\n過剰に権限を要求してくるのはtwitterの仕様なので「こんなに権限を要求してくるから怪しい」は違います",
            "3つの祠のうち2つクリアしたからもうすぐラスダンかな",
            "かずきさん狂気の更新",
            "VIVE発売の頃に組んだパソコンなのでさすがにそろそろ組み直したい思いつつなかなか気力がわかな",
            "前作の続きか\r\n体力も最初からMAXだしマスタード持ってるし姫さまもいるし今回は楽勝だな",
            "どうも、17歳です",
            "メガドライブミニ2は今年出たおもちゃなので17歳がRTしても良いと思います!",
            "あんまり17歳17歳言ってると年齢がバレてしまうな、気をつけないと",
            "10年経っても変わらず17歳の人をフォローしておくと安心ですよ",
            "TLにはろくな17歳がいないけど\r\n17歳も捨てたもんじゃないな",
        }));

for (int i = 0; i < 10; i++)
{
    await chatManager.NextTurnAscyn();
}

var judge = new Judge(kernel);
var result = await judge.EvalAsync(chatManager.GetChatHistorySnapshot());
Console.WriteLine();
Console.WriteLine("============= 判決 =================");
Console.WriteLine(result);

まとめ

こういう風に AI 同士を会話させるのっては地味に面白いですね。
そのうち、自分の趣味趣向などをファイチューニングさせた AI を個々人が持っていて、それを介してちょっとしたやり取りくらいしてくれるような未来くるかなぁ?

Microsoft (有志)

Discussion