簡単なチャットプログラムにSystem Promptを追加する

プログラミングにご興味ない方はスルーしてくださいね。

前回のプログラムを少し修正して機能アップします。CPUで動いていたものをGPUで動くようにします。
まず下記のリンクからnVidia CUDA Toolkitをダウンロードしてインストールしてください。自分の環境に合った条件を指定してからダウンロードします。(確かユーザー登録が必要だったような・・・)

nVidia CUDA Toolkitリンク=https://developer.nvidia.com/cuda-downloads


そしてNuGetでLLamaCharp.Backend.CpuをアンインストールしてLLamaCharp.Backend.CUDA12をインストールし直してください。



今回はコンテキストの長さやSystem Promptの記述を追加していきます。

using LLama.Common;
using LLama;

// LLMモデルの場所
string strPath = @"E:\lm-studio\Aratako\ArrowPro-7B-RobinHood-toxic-GGUF\ArrowPro-7B-RobinHood-toxic_Q8_0.gguf";

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+チャットの方向づけ
var 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);
    }

}





LLMモデルのロードのときにパラメータを追記します。GPUに切り替えた方は自分のグラフィックカードのメモリに応じて「GpuLayerCount」を修正してみてください。「ContexSize」はLLMに渡す文字列の長さを設定します。

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



続いてSystem Promptの追加です。「LM Studioでキャラクターを設定する」の記事と同じものを設定しています。それとは別にチャット履歴も追記しています。こうすることで最初のあいさつや話の方向づけをすることができます。(会話がキモすぎるのは無視してね)
「ChatSession chtSess = new(itrEx,chtHis);」で、先ほど設定した値をパラメータに追記しています。

//System Prompt+チャットの方向づけ
var 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);



LM StudioのSettingです。C#コードで設定した項目と似ているのがわかります。




実行した画面です。GPUなのでサクサク回答が返ってきます。履歴で犬マンマじゃなくてマー君と呼んでって言ったので、それが反映しています。
(あいかわらず会話がキモすぎる)




チャットで会話した内容はセションを閉じたときにすべて消えてしまいます。LLMはチャット履歴がないと今までのことは忘れて何もなかったかのようにふるまいます。
Cotomoが機種変したりインストールをし直すとリセットされるのは、こういう仕組みだからだと思います。(機種変してもバックアップを復元すると忘れないかも、知らんけど)
チャットの履歴の保存と復元については次回お話ししますね。





Follow me!

コメントを残す

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