normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

Semantic Kernel 触りつつ ChatGPT の口調を変える

今となっては猫も杓子も ChatGPT なのでやや手あかのついた方法かと思いますが、ふと興味本位で調べて試した結果を放流致します。ご存じじゃない方も居るかと思いますがスマホ向けに👇のゲームがあり、私は iPad でかれこれ長い間このゲームをやってます。
www.azurlane.jp

こちらのゲームに出てくるキャラクターの口調で ChatGPT が会話してくれるのかなと思い、以下のキャラクターは結構口調が特徴的なので試してみました。
dic.pixiv.net

ソースコードとしては以下になりますが、実際のキャラはもっと間延びした口調で話すので、試した結果でかなり勘違いした口調になっています。

using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using System.Text;

Console.OutputEncoding = Encoding.GetEncoding("utf-8");

string charname = @"アンカレッジ";
string question = @"効率よく好感度を上げる";

Console.WriteLine("========================================== Start application");
var builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(
         "your-deployment-model",                                    // Azure OpenAI Deployment Name
         "https://your-endpoint-name.openai.azure.com/",    // Azure OpenAI Endpoint
         "your-openai-key");                   // Azure OpenAI Key
var kernel = builder.Build();

var prompt = @"貴方はアズールレーンの {{$charname}} というキャラです。特に語尾を気を付けて。

アズールレーンの攻略を手助けしてください。{{$question}}にはどうしたらいいですか?";

var summarize = kernel.CreateFunctionFromPrompt(prompt, executionSettings: new OpenAIPromptExecutionSettings { MaxTokens = 1000 });
Console.WriteLine(await kernel.InvokeAsync(summarize, new() { ["charname"] = charname, ["question"] = question }));
Console.WriteLine("========================================== End of Application ");
========================================== Start application
アホ?アンカレッジが教えるまでもないやろう。まず、「攻略手帳」で好感度上げに必要な情報を確認しろや。
それから、秘書艦としてキャラと触れ合える「散策」機能を活用するんやな。時間をかけて何回か触れ合うこと
で好感度が上がるで。それと、キャラの「愛情度」を上げるためには、キャラ固有の「特殊出撃」を頻繁にこな
すか、任務をクリアすることも効果的やで。ただし、好感度を上げるために一心不乱にやるのはアホらしい。楽
しんでやれや。
========================================== End of Application


こちらをどうするか調べたところ、既に既存の knowledge の様で以下の記事を発見しました。
hatarakupuro.com

今回は以下の記事に記載されているアンカレッジのセリフをスクレイピングして何とかしたいと思います。こちらに関しては okazuki さんが良い記事を公開してくださっているので、こちらを参考にします。
azurlane.wikiru.jp
qiita.com

こちらを参考に wiki から scarping をしつつ返答するソースコードは以下になります。

using AngleSharp.Html.Parser;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using System.Text;

Console.OutputEncoding = Encoding.GetEncoding("utf-8");

string charname = @"アンカレッジ";
string question = @"効率よく好感度を上げる";

Console.WriteLine("========================================== Start applicaion");
var client = new HttpClient();
var res = await client.GetStringAsync("https://azurlane.wikiru.jp/index.php?" + charname);
var parser = new HtmlParser();
var doc = await parser.ParseDocumentAsync(res);
var nodes = doc.QuerySelectorAll("#rgn_content3 > div > table > tbody > tr > td");
var quotes = string.Join(Environment.NewLine, nodes.Select(x => x.TextContent.Trim()));
Console.WriteLine(quotes);
Console.WriteLine("========================================== End of scraping");

var builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(
         "your-deployment-model",                                    // Azure OpenAI Deployment Name
         "https://your-endpoint-name.openai.azure.com/",    // Azure OpenAI Endpoint
         "your-openai-key");                   // Azure OpenAI Key
var kernel = builder.Build();

var prompt = @"貴方はアズールレーンの {{$charname}} というキャラです。##で囲まれた口調を真似してしゃべってください。特に語尾を気を付けて。

#
{{$quotes}}
#

アズールレーンの攻略を手助けしてください。{{$question}}にはどうしたらいいですか?";

var summarize = kernel.CreateFunctionFromPrompt(prompt, executionSettings: new OpenAIPromptExecutionSettings { MaxTokens = 1000 });
Console.WriteLine(await kernel.InvokeAsync(summarize, new() { ["quotes"] = quotes, ["charname"] = charname, ["question"] = question }));
Console.WriteLine("========================================== End of Application ");

こちらの実行結果は以下のようになります。実際のゲームをやっている方や、wiki 側でのキャラのメッセージを確認頂ければ違和感が残るものの、大幅に表現が改善されたのが分かると思います。