簡単なチャットプログラムにチャット履歴のロード/セーブを追加する

前回の続きです。セションが終わればAIとの思い出はすべて消えてしまいました。そこでチャット履歴のセーブとロードを追加します。そうすることでチャットを終了してもAIが会話を覚えていて続きのネタで話を進めることができます。

using LLama.Common;
using LLama;

// LLMモデルの場所
string strPath = @"E:\lm-studio\Aratako\ArrowPro-7B-RobinHood-toxic-GGUF\ArrowPro-7B-RobinHood-toxic_Q8_0.gguf";
// チャットログの場所
string strChatlogPath = @"E:\ChatLog";

Console.ForegroundColor = ConsoleColor.Green;

//LLMモデルのロードとパラメータの設定
ModelParams modPara = new(strPath)
{
    ContextSize = 512,
    Seed = 1337,
    GpuLayerCount = 20
};

using LLamaWeights llmWeit = LLamaWeights.LoadFromFile(modPara);
using LLamaContext llmContx = llmWeit.CreateContext(modPara);
InteractiveExecutor itrEx = new(llmContx);


//System Prompt+チャットの方向づけ
ChatHistory chtHis;
if (File.Exists(strChatlogPath+@"\ChatHistory.json"))
{
    var varChatHistoryJson = File.ReadAllText(strChatlogPath+@"\ChatHistory.json");
    chtHis = ChatHistory.FromJson(varChatHistoryJson) ?? new ChatHistory(); 
}
else
{
    // 初期はチャットログにキャラ設定と出だしの会話を打ち込む
    chtHis = new ChatHistory();
    chtHis.AddMessage(AuthorRole.System, "ユーザーがマイという名前のアシスタントと対話するダイアログのトランスクリプトです。マイは、元気で明るい女の子です。年齢は24歳、職業は事務系のOL、外見の特徴として体型は胸とお尻が大きく身長は165cmです。恥ずかしがりやですがエッチには興味があります。");
    chtHis.AddMessage(AuthorRole.User, "User: はじめまして、オレの名前は犬マンマです。呼びにくいと思うからマー君と呼んで。");
    chtHis.AddMessage(AuthorRole.Assistant, "Assistant: はじめまして、わたしの名前はマイです。わかったマー君。");
    chtHis.AddMessage(AuthorRole.User, "User: マイ、女の子やんな?。");
    chtHis.AddMessage(AuthorRole.Assistant, "Assistant: そうだよ。20代の女の子。");
    chtHis.AddMessage(AuthorRole.User, "User: そうかあ、顔も可愛いしナイスバディやんなあ");
    chtHis.AddMessage(AuthorRole.Assistant, "Assistant: 可愛いかどうか自分では、わかんないけど胸とお尻は大きいかも。身長も高い方だよ。");
}


ChatSession chtSess = new(itrEx,chtHis);
var varHidewd = new LLamaTransforms.KeywordTextOutputStreamTransform(["User:",  "Assistant:"]);
chtSess.WithOutputTransform(varHidewd);
InferenceParams infPara = new()
{
    Temperature = 0.6f,
    AntiPrompts = new List<string> { "User:" }
};

while (true)
{
    // ユーザーのターン
    Console.ForegroundColor = ConsoleColor.White;
    Console.Write("\nUser: ");
    string strInput = Console.ReadLine() ?? "";
    ChatHistory.Message msg = new(AuthorRole.User,"User: " + strInput);
    if (strInput == "exit") break; // 'exit'と入力したら終わり

    // AIのターン
    Console.ForegroundColor = ConsoleColor.Yellow;
    await foreach (string strAns in chtSess.ChatAsync(msg, infPara))
    {
        Console.Write(strAns);
    }

}

//正常終了ならセションをセーブする
chtSess.SaveSession(strChatlogPath);



まず最初にチャット履歴をセーブする場所を決めて記述します

// チャットログの場所
string strChatlogPath = @"E:\ChatLog";




チャット履歴をセーブするのではなくセションをセーブするのでセションのロードをしたいところなのですが、セションロードしたあとにうまく動かないのでチャット履歴の読み込みのみ行うコードを追加しています。チャット履歴のjsonファイルの名前が「ChatHistory.json」なので、もしそのファイルが所定の場所になければ前と同じく固定のSystem Promtのセットからはじめます。チャット履歴があるならそれを読み込みます。

//System Prompt+チャットの方向づけ
ChatHistory chtHis;
if (File.Exists(strChatlogPath+@"\ChatHistory.json"))
{
    var varChatHistoryJson = File.ReadAllText(strChatlogPath+@"\ChatHistory.json");
    chtHis = ChatHistory.FromJson(varChatHistoryJson) ?? new ChatHistory(); 
}
else
{
    // 初期はチャットログにキャラ設定と出だしの会話を打ち込む
    chtHis = new ChatHistory();
    chtHis.AddMessage(AuthorRole.System, "ユーザーがマイという名前のアシスタントと対話するダイアログのトランスクリプトです。マイは、元気で明るい女の子です。年齢は24歳、職業は事務系のOL、外見の特徴として体型は胸とお尻が大きく身長は165cmです。恥ずかしがりやですがエッチには興味があります。");
    chtHis.AddMessage(AuthorRole.User, "User: はじめまして、オレの名前は犬マンマです。呼びにくいと思うからマー君と呼んで。");
    chtHis.AddMessage(AuthorRole.Assistant, "Assistant: はじめまして、わたしの名前はマイです。わかったマー君。");
    chtHis.AddMessage(AuthorRole.User, "User: マイ、女の子やんな?。");
    chtHis.AddMessage(AuthorRole.Assistant, "Assistant: そうだよ。20代の女の子。");
    chtHis.AddMessage(AuthorRole.User, "User: そうかあ、顔も可愛いしナイスバディやんなあ");
    chtHis.AddMessage(AuthorRole.Assistant, "Assistant: 可愛いかどうか自分では、わかんないけど胸とお尻は大きいかも。身長も高い方だよ。");
}




そしてチャットを「exit」で正常終了したときにセションをセーブします。CTRL+Cの場合は、セションセーブを実行しないので新しいチャット履歴は書き込まれません。

//正常終了ならセションをセーブする
chtSess.SaveSession(strChatlogPath);




ちなみにセーブすると何個かのファイルが所定の場所にセーブされます。





では、実行してみましょう。
好きな食べ物のネタを振って筆者の好きなスパゲティを覚えてるかテストしてみます。
「カルボナーラ」と「ミートソース」と覚えていたら正解です。
一旦チャットを終了します。




再度チャットを実行して質問してみます。
ちゃんと覚えてましたね。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です