🧙♂️
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