見出し画像

monRChat - ユーザーを学習しながら成長するAI Chat (v2026.06 rev24)


📚 更新履歴

**2026年6月19日 rev24
・「画像分析」をがっつり実装
LMStudioOllamaでテスト済。
テスト済モデル(Visionモデル):
LMStudioGemma4 E2B
OllamaGemma3 4B
画像をチャット欄へD&Dし「画像解析」ボタンを押すと、設定したAIモデルが画像内容を日本語で説明し、その内容をチャットAIが受け取り話題として利用します。
画像精度は使用するモデルに大きく依存します。APIでの利用はコストがすごいので未テストです。

・「Phantreal(造語。ペルソナの自発的エピソード生成)」機能を追加
指定ターン以上になると指定%で現在の会話内容を元に、ペルソナがペルソナ設定に基づいたエピソードを作り会話します。
作ったエピソードはフラッシュ時にペルソナの記憶として要約&保存され設定数まで保持。以降はペルソナの記憶として話題に関連がある場合、会話として利用する"可能性"があります。AIのタイミングによっては、生成がスルーされる事もあります。
これは、ペルソナにも自発的なエピソード能力を持たせようという機能です。
過去に、挨拶をしたらペルソナが昨夜の出来事を作って話しかけてきた現象を機能として実装しました。

・ペルソナジェネレーター追加
必要最低限の項目を入力しボタンを押すと、AIが内容を補完し新規ペルソナを作って登録します。編集も可能です。

・ペルソナの立ち絵を二種類(照れる/驚く)追加
VoiceVoxを使用し、ペルソナが自分の会話内容をしゃべる機能追加
・その他大量のバグ修正
・その他大量の仕様修正

**2026年6月10日 rev17

・「ペルソナ」プロンプト項目に「ユーザーモデル収集/ペルソナ維持/ペルソナ外見」を設定するプロンプトを追加。
・「画像」ボタンを追加。
最低1件の会話がある状態で押すと、設定画面で設定した数の最新会話を元に、その会話内容から想起されるシーンを画像生成サービス向け日本語プロンプトで出力。
生成内容をある程度制御するプロンプト欄を設定可能。(空白可能)
・ユーザー基本設定(名前、性別、年齢、出身地、誕生日)と外見情報を設定するプロンプト欄を追加。(空白だとAIがたまに聞いてくる)
・「メモ」機能を追加。
メモコマンド入力で直前の会話をメモし、メモ呼び出しコマンドとメモ番号入力でAIが該当メモを利用し応答する。簡易的な機能なので検索などは無し。
・安定化に向けた仕様の変更。
・ユーザモデルの安定的な収集のためシステムプロンプト改善。
・セキュリティ対策実施。(不正なコマンド禁止や入力チェックの厳格化など)
・たくさんのバグ修正。

**2026年6月7日 rev16
プロジェクト全体の見直し。
使われなくなった関数やクラス、バグ、挙動の全体を修正。
22あったプロンプトが14に減った!
いったん余分な機能は削り、全体を整理し、コツコツやり直し。
LLM呼び出し回数を大きく減らせた。

**2026年6月7日 rev15.5
徹底的な構造の見直し。
フラッシュ(蒸留)フローをシンプル化。
ユーザーモデルの一元化。
日記は過剰なAPIリクエストをするため撤去。(独立機能として後日実装予定)
全プロンプト調整。
バグ修正。
UI修正。
毎時間仕様変更してる気持ち・・・


📑 これまでの仕様書

ここまで作ってきた以下の仕様書を元に「monRChat」として実装を開始しました。
チャット部分は個人的に作った「monChat2」というAIチャットを流用しています。
仕様書作成は僕とGeminiClaudeで行い、コーディングはClaude Codeが実施しています。

僕はコードがほぼ理解できない素人です。
仕様を考え指示を出すだけなので、頑張ったのはGeminiClaudeです。
画像はすべてChatGPTです。

**2026年6月10日 rev17.5
Claude Fable5(ミュトスと言われていた話題のモデル)が6/22までProプランでも使用できる!
と、いうことで全体リファクタリングをお願いしました。

・全コードベースレビューを実施し、全体の安定性向上。
・フラッシュ時の記憶取り扱い指示を改善。
・見逃されていた間違えた実装を再実装
・根深いバグを修正。

Claude Fable5の感想は・・・
実装速度が速い!
トークン消費がめちゃくちゃ多い!ProプランだとmonRChat規模で連続稼働25分くらいかも。週制限もすぐきちゃう。こわい。
Sonnetよりも全体を見る力が強く、見逃していた部分や忘れられていた部分も今回修正できた。
普段はSonnetかOpusを使い、こういった全体チェックはFableがいいのかも。期間限定だから、今だけしか使えないけれど。
いい経験でした。





概要

このプログラムは「育つ相棒」としてのAIを実現するための、上記「仕様書」人格システムアーキテクチャを実際に実装したものです。
ライブラリ:monRem
チャット: monRChat_preview
monRemが機能のコアを担い、monRChat_previewが会話インターフェイスを担っています。
機能を総称して「monRChat」とします。


実装開始

ClaudeのProプランを契約し、Win版Claude Desktopを使いその中で利用できる初めてのエージェント「Claude Code」と相談しながら進めました。
モデルはClaude Sonnet 4.6(高)で、デバッグ中はWeb版ClaudeGeminiにも相談しながら進めています。

会話とフラッシュは「Gemini APIのGemini 3.1 Flash-Lite」を使い、ほかの処理は「Gemini APIのGemini 2.5 Flash-Lite」で行っています。
チャットと感情取得だけはローカルAI(Gemma4 E4B)で処理していたんですが、バグチェックの時にローカルAIモデルの挙動なのかバグなのかが判定できなかったので、テスト中は性能が担保されているGemini APIにしています。
** 新しく「Gemma4 12B」というローカルAIモデルが出たので、VRAMに余裕がある場合はこちらで全部賄えるかもしれません。僕の環境では厳しいので常用はできなさそう **

文章中「フラッシュ」という単語が出てきますが、これは会話からユーザー情報を抽出する処理です。会話が多いほど処理時間は長くなります。
テスト中は30秒-80秒くらいでした。
自動で開始しないのは、会話タイミングを自分で図りたいからです。

実装内容とは関係ないのですが、作業している中でCodeエージェントに対するたくさんの気づきがありました。
まず、Web版と違いローカルファイルを許可どりしながら直接操作してくれます。
CLAUDE.mdというファイルに「動作確認・実装箇所のバグチェック・作業後の世代バックアップ処理・変更があった箇所の仕様書更新・新チャットでの作業引き継ぎ書」まで指示を書いておくと、作業の流れとして実行してくれます。
更にどこにも指示を書かなかったのに、UIのチェックもDesktopアプリのプレビュー画面のSS撮影を行い実施してくれました。
ずっとWeb版でしか使っていませんでしたが、新しい時代に触れた瞬間です。
AnthropicはさらにPro版での制限を緩めてくれているので、Codeエージェントが定額で動かせる驚きもあり、もう手放せないものですね。
思慮深さは「高」で利用しているので、コード利用以外の相談は「低」にすれば利用できる稼働時間を節約できると思います。

さて、エージェントやほかのAIたちの力を借り、バグチェックや機能の動作確認のフェーズに入っています。
作業途中、何度も仕様変更が発生してしまい、仕様書を作りこんだつもりでも、実装するとなると予期しない問題や動作フローの矛盾の山と戦うことに。
途中、僕が大混乱してしまい最初からやり直したりと素人ゆえの事件もありましたが、トータル15時間くらいで全体が組みあがった感じです。
「動く」というだけで、完成ではありません。そこからさらに時間が経っています。

動くようになり、そこからが一番の難関でした。
とにかくチェック量が多く適当な会話ではだめで、ユーザーの行動にまつわる内容で会話を行い、しっかりとユーザーを観察できるかどうかの確認が必要です。
短いターン、長いターンそれぞれの会話で何度も重ねて繰り返しテストの必要があり想像以上に大変でした。
プロンプトを何度も書き換え、DBを何度もクリアしクリーンな状態へ戻し、再びチャットしながら挙動を見ていく作業です。
ようやくチャット動作の安定感は出てきましたが、全動作チェックができていないので油断が全くできません。

大きな方針転換として、人が夢を見てできごとを整理するように、AIに日記を書かせて出来事をまとめ、その中からユーザーの情報を取り出そうとしました。
しかし、それではだめだったのです。日記の生成結果自体は、会話からやり取りが細かくまとめられユーザーの動きを追いやすくなっていました。ペルソナの感情も入り読み物としてはとても楽しい。
けれど、それではデータとして使えないのです。
なぜか。日記になると誰が発言したのかという情報が完全に消えてしまい、ユーザーの行動かペルソナの行動なのかが判別不可能になり、肝心のユーザー情報だけを取得することができなかったんです。
夢代わりの日記はかなりいい考えだと思っていたのですが、僕の思考が実行結果まで及ばず。
結局、無念だけれど生会話データからペルソナが抽出する方式へ戻しました。フラッシュ時、ペルソナに設定した裏人格(抽出用人格)が生会話データからユーザーを観察しユーザーの行動を記憶するという部分です。
ペルソナに数行の「ユーザーの何に注目するか」というプロンプトを追加する形で実装しました。
夢路線はついえたけど、観察目線でユーザーを分析し記憶するというのはパーソナルで面白いんじゃないかな。

気付けばプログラム全体のプロンプトは「22個」に。
ユーザーをいかに観察し情報にするかという部分で予定より増えてしまった。
「AIがプロンプト解釈のずれを起こす」のも大きく見つけ辛く根気よくチェックしないといけない部分で、モデルによって想定通りに機能しないなども考えられるので、使用する人が個別で調整することになりますね。

ここからはじっくり会話を重ねていき、プロンプトや記憶を育てまたリセットを繰り返しながら、完成度を上げていく工程です。
まだまだ精度が低くてぜんぜん完成が見えていませんが、長い戦いは始まったばかり。

また進捗があれば、お知らせしていきたいと思います。
いつになるかはわかりませんが!


🖥️ 古!動作画面(メイン画面)

テストチャット中

左ペインのメニューで様々な設定を行います。
左上の三本の棒線クリックで左ペインが開閉します。

チャット」は、右ペインに表示されているチャット機能です。
設定で選択したペルソナと会話できます。

日記」は、フラッシュ実行時に、フラッシュ実行で使ったデータからペルソナが日記を書いてくれます。楽しい日記なのですが、処理がとても重たくAPI使用量が跳ね上がるため、設定からON/OFF可能にしてあります。
サイズの大きなローカルモデルなら気兼ねなしで使えますね。

記憶管理」は、記憶しているユーザー情報を管理できます。(後述)

設定」は、monRChatの設定をします。APIキーやペルソナ設定、様々な動作にかかわる値、使用するAIモデルの指定などなど。

ログ」は、何を実行したかのログを閲覧できます。

表示されている画像」は、会話内容から会話の雰囲気を読み取り、ペルソナに紐付けた「Normal」「Happy」「Sad」「Angry」「応答中」の画像に切り替わります。表示するだけで動いたりはしません。また、画像指定していないと何も表示されません。

今ターン」にある数値は、今行ったチャットのトークン数です。会話文字列だけをチェックするテスト用です。

モニカ」は、現在有効なペルソナ名です。このキャラがモニカなのでそう表示されています。

右ペインはチャットや設定画面などが表示されます。
チャット入力欄の上にあるボタン:
検索」はボタン押下でチャット欄へ[:検索]タグが入り、その後ろにキーワードを入れ送信すればインターネット検索し、結果をもとにペルソナが会話を行います。利用には検索APIサービスのAPIキーが必須です。無料プランでも数百回は検索できるので、普通の会話であまり問題にはならないと思います。使っている検索サービスは「Tavily」と「Brave Search」と「DuckDuckGo」です。GoogleGeminiが検索に関与しカウントし辛いのと条件等がわかっていないので省いています。非常にわかりづらい。
AIが会話から自律検索する機能は検討中ですが、API使用量やキーワード精度に不安ありです。

記憶」は、ボタン押下でチャット欄へ[:記憶]タグが入り、そのまま送信すると直前のチャット内容からユーザーの好みをAIが選別して保存します。
[:記憶]タグの後ろへ覚えてほしい好みを入力すると「明示的記憶」という後述しているユーザー指定の特別枠で保存します。

フラッシュ」は、会話履歴からユーザーの趣向や行動などを取り入れて記憶にします。ある程度の会話をためないと情報を読み取れないのでチェックが大変です。
フラッシュする会話量が多いと処理時間やAPI使用量は爆上がりです。なので格安のAPIであるGemini 2.5 Flash-Lite一択みたいなものです。
大きなサイズのローカルモデルなら、使い放題ですね。

感情取得」は、ボタンを押すと現在の会話内容数ターンから、会話の雰囲気を取得します。これにより、ペルソナの会話トーンや設定してある場合はペルソナ画像が切り替わります。
普段は設定したターン数で自動取得するので使いません。テスト用です。


🖥️ 古!動作画面(記憶管理)

ユーザ情報画面
編集も可能
うまくユーザー情報を取り込めてないので調整中

明示的記憶」は、チャットにある「記憶」機能でユーザー自身が永遠の記憶を書き込む独立したデータです。毎回送信されます。

ユーザーモデル」は、フラッシュを実行しそれまでにたまった会話ログからユーザー情報をためていく場所です。ペルソナで設定したフラッシュ用人格とペルソナを用いてAIが判断し、まとめられます。
内容は毎回AIへ渡され、AIが「ユーザーはこういう人物だ」として会話を行う根拠となるデータです。できているのかな・・・?テストしすぎて麻痺してますが、このmonRChatのコア機能になります。プロンプト設計がかなり大事な個所です。
最大文字数の90%の情報が溜まると圧縮処理が走り、コンパクトにされながら新しいユーザー情報で更新されていき、古すぎるデータは忘れられていくでしょう。判断はAIにゆだねています。何を残すのか、消していくのか。

趣向データ」は、ユーザーの人物像ではなくシンプルに興味を持っていることなどをAIが書き溜め、ユーザーの入力から趣向データを検索しヒットした話題を組み込んで応答する仕組み用のデータです。
けど、うまく動いているかははあまり実感がないというか・・・実際、こういう言葉の意味を含んで検索したい場合はほとんどの場合、ベクトル化という作業を埋め込み専用AIモデルで事前に実施し、言葉の意味でデータをヒットさせる仕組みを用意するのです。
けれど、事前準備とは別にベクトルデータを読むために毎回チャット内容をベクトル化する必要もあり、埋め込み専用AIモデルも常駐させておかないといけないため動作コストが重く今回は利用していません。
実装は軽量で追加のAIを必要としない「SQLiteのLike検索」というものを利用しています。

ほかのページは項目が多く画像を貼るととんでもなく長くなるので割愛します。
設定画面やログ画面なので。


🎫 現時点での最新の仕様書 monRChat

Claude Codeへお願いし、まとめてもらいました。


🎯 おまけ

タイトル画像


一部のペルソナ用立ち絵リスト

いいなと思ったら応援しよう!

monjya 応援ありがとうございます!