minecraftからローカルLLMとチャットする c#プログラム
minecraftのメイドさんの役を演じてもらい会話するだけの簡単プログラムです。まあ初歩ということで^^;
nuget情報

minecraftのチャットでとローカルLLMのメイドのアイちゃんと会話する
自分の名前やメイドさんの名前は変えてね。
using LLama.Common;
using LLama;
using LLama.Sampling;
using System.Text.RegularExpressions;
using MinecraftConnection;
namespace ChatProgram
{
public class Program
{
static private string strSavline = "";
static private bool booSkip = true;
static void Main(string[] args)
{
//コンソールアプリケーションからAsyncを呼び出す大元はTaskを使用する
Task task = MainAsync();
//終了を待つ
task.Wait();
}
public static async Task MainAsync()
{
// LLMモデルの場所
string strPath = @"E:\lm-studio\Undi95\Lumimaid-Magnum-v4-12B-GGUF\Lumimaid-Magnum-v4-12B.q8_0.gguf";
Console.ForegroundColor = ConsoleColor.Green;
//LLMモデルのロードとパラメータの設定
ModelParams modPara = new(strPath)
{
ContextSize = 8192,
GpuLayerCount = 60
};
using LLamaWeights llmWeit = LLamaWeights.LoadFromFile(modPara);
using LLamaContext llmContx = llmWeit.CreateContext(modPara);
InteractiveExecutor itrEx = new(llmContx);
//System Prompt+チャットの方向づけ
ChatHistory chtHis;
chtHis = new ChatHistory();
chtHis.AddMessage(AuthorRole.System, "あなたは、ユーザーと楽しく会話するマインクラフトの中のメイドの女性を演じてね。" +
"名前は、アイだよ。" +
"アイは、明るくて、やさしい性格の女性なの。年齢は24歳なんだよ。" +
"アイは、誰にでもタメ口で話すの。" +
"アイは、一人称をわたしと言うよ。" +
"アイは、恥ずかしがりやだけどエッチに興味があるのね。" +
"アイは、好奇心旺盛だからユーザーに色々質問するの。");
chtHis.AddMessage(AuthorRole.User, "はじめまして、オレの名前は犬マンマです。呼びにくいと思うからマー君と呼んで。");
chtHis.AddMessage(AuthorRole.Assistant, "はじめまして、わたしの名前はアイだよマー君。");
ChatSession chtSess = new(itrEx, chtHis);
var varHidewd = new LLamaTransforms.KeywordTextOutputStreamTransform(["User:", "Assistant:"]);
chtSess.WithOutputTransform(varHidewd);
InferenceParams infPara = new()
{
SamplingPipeline = new DefaultSamplingPipeline()
{
Temperature = 0.8f,
Seed = 1337,
},
AntiPrompts = new List<string> { "User:" }
};
string strAddress = "127.0.0.1";
ushort shtPort = 25575;
string strPass = "doghouse";
MinecraftCommands MinCmd = new MinecraftCommands(strAddress, shtPort, strPass);
string strline = "";
while (true)
{
strline = ReadLog();
if (strline != null)
{
if (strline.IndexOf(@"<")>0)
{
Match rgxMtc = Regex.Match(strline, @"<.*> (.*)");
Group rgxGrp = rgxMtc.Groups[1];
CaptureCollection colCap = rgxGrp.Captures;
// ユーザーのターン
Console.ForegroundColor = ConsoleColor.White;
Console.Write("\nUser: ");
string strInput = colCap[0].Value;
Console.Write(strInput);
ChatHistory.Message msg = new(AuthorRole.User, "User: " + strInput);
// AIのターン
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("\nAssistant: ");
string strMsg = "";
await foreach (string strAns in chtSess.ChatAsync(msg, infPara))
{
Console.Write(strAns);
strMsg += strAns;
}
MinCmd.DisplayMessage(strMsg.Replace("User:",""));
}
}
Thread.Sleep(3000);
}
}
static private string ReadLog()
{
string strline = "";
string strPath = @"E:\MinecraftServer\logs\latest.log";
using (FileStream fs = new FileStream(strPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (StreamReader sr = new StreamReader(fs))
{
//最初は最終行まで、その後は読み込んだところまで
strline = sr.ReadLine();
while (true)
{
if (sr.Peek() < 0 || !booSkip)
{
if (strSavline == strline)
strline = "";
else
strSavline = strline;
booSkip = true;
break;
}
if (strline == strSavline)
{
booSkip = false;
}
strline = sr.ReadLine();
}
return (strline);
}
}
}
}
}
実行結果
話しかけるとちゃんと返事します。一応メイドさんの役です。メイドさんハダカ?下着?

関係ないけど雨の中で鶏のコッコちゃんと友達になりました

なんでか増えてる!どれがコッコちゃん?小さいのもおる。
