🧙‍♂️

Semantic Kernelを使ってC#でAI (3)

に公開

話者判定をさせてみる

最近のOpenAIのgpt-4o-miniなどはチャットの 話者判定 までできるようになっているようです。
さっそくSemantic Kernelでやってみましょう。

話者判定させるプログラム

サンプルは こちら

Program.cs
using DotEnv.Core;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;

new EnvLoader().Load();

var kernel = Kernel
    .CreateBuilder()
    .AddAzureOpenAIChatCompletion(
        Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT"),
        Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT"),
        Environment.GetEnvironmentVariable("AZURE_OPENAI_API_KEY"),
        apiVersion: Environment.GetEnvironmentVariable("AZURE_OPENAI_API_VERSION"))
    .Build();

List<(string name, string content)> items = [
    ("Keny", "バトルジャパン!バトルフランス!バトルコサック!バトルケニア!ミスアメリカ!"),
    ("Jhon", "デンジレッド!デンジブルー!デンジイエロー!デンジグリーン!デンジピンク!"),
    ("Joan", "バルイーグル!バルシャーク!バルパンサー!"),
    ];

#pragma warning disable SKEXP0001 // 種類は、評価の目的でのみ提供されています。将来の更新で変更または削除されることがあります。続行するには、この診断を非表示にします。
var history = new ChatHistory(items
    .Select(i => new ChatMessageContent(AuthorRole.User, i.content) { AuthorName = i.name })
    .ToArray());
#pragma warning restore SKEXP0001 // 種類は、評価の目的でのみ提供されています。将来の更新で変更または削除されることがあります。続行するには、この診断を非表示にします。

history.AddUserMessage("彼らは過去にテレビで放映された作品について話しています。話をしているのは何人ですか。また、1981年に放映された作品に関して話しているのは誰ですか");

var chatRes = await kernel
    .GetRequiredService<IChatCompletionService>()
    .GetChatMessageContentAsync(history);
Console.WriteLine(chatRes.Content);

もう短いプログラムなので全文載せてみます。
ここでのキモは ChatMessageContent に設定した AuthorName です。
これにより話者との関連付けがされています。

ちなみに、実行すると

彼らは3人です。具体的には、Keny、Jhon、Joanの3人がそれぞれ異なる作品について話しています。

1981年に放映された作品に関して話しているのは、Kenyです。Kenyが挙げた「バトルジャパン」、「バトルフランス」、「バトルコサック」、「バトルケニア」は、1981年に放映された作品に関連しています。

ちゃんと判別できているようです。
答えは間違えていますが…。
そこはまあ、AIの答えは要反証、ということで。

また、名前に関して日本人名でも通るのかな?と試してみましたが、

彼らは3人(つよし、こういち、ひとし)です。その中で、1981年に放映された作品に関して話しているのは、「デンジマン」に関連する内容を述べているこういちです。この作品は1980年から1981年まで放映されました。

認識はしてくれているようですね。

あと、答えに関しては、戦隊ものが2月で切り替わるので、年指定では答えがぶれますね。
もう少し設問を考えるべきでした…。

まとめ

上記のプログラムの接続先をollamaにしてgemma3とphi4で試してみましたが、やはり判定はできないようでした。
まあ、こちらはプレリリースですから、ということで。

Discussion