広告

質問:メモリ・インジェクションのプロンプト形式(ローカルのオフラインAIアシスタント、VRAM 6GB?)

Reddit r/LocalLLaMA / 2026/3/30

💬 オピニオンDeveloper Stack & InfrastructureTools & Practical Usage

要点

  • この記事では、過去のチャットから埋め込み類似度(snowflake-arctic-embed-s)により関連する「メモリ」を抽出し、さらに再ランキング(bge-reranker-v2)を行うことで、ローカルのオフラインAIアシスタントを構築する内容が説明されます。
  • 取得したメモリは次のユーザープロンプトに注入され、LLM(Qwen3.5 9B Q4_K_M)が回答時に過去の文脈を参照できるようにします。
  • 主な問題はプロンプト形式の混乱で、モデルが注入されたメモリを現在のチャット内容のように扱ってしまうことがあり、その結果として古い情報や不一致の回答につながることがあります。
  • ユーザーは、構造化されたシステムプロンプトと、ラベル付きセクション(例:「### INFORMATION ###」「### USER INPUT ###」)を含む拡張ユーザープロンプト、さらにタイムスタンプや「直近の会話サマリ」を組み込む形を試しています。
  • 質問は具体的に、注入された背景メモリと、ユーザーが現在入力しているプロンプトをより確実に分離するためのプロンプト書式のベストプラクティスを求めています。

こんにちは!

私の質問(複数)は記事の一番下にありますが、まずは私が何をしようとしていて、どうやっているのかを説明させてください:

進行中のオフラインAIアシスタントのために、以前のチャットから抽出したステートメント(「メモリ」)をSqliteデータベースに保存する、とてもシンプルなメモリシステムを実装しました。

その後のチャットでは、ユーザーがプロンプトを入力するたびに、これらの「メモリ」を埋め込みベクトルのコサイン類似度による比較と再ランキング(私は現時点では、埋め込みにsnowflake-arctic-embed-s Q8_0、再ランキングにbge-reranker-v2-m3 Q5_k_mを使用しています)によって、最も関連性の高いものを抽出します。

その後、これらの「メモリ」は、回答を得るためにLLMへ送る前に(ユーザーの)プロンプトへ注入されます。

使用しているLLMはQwen3.5 9B Q4_K_Mです(パラメータ:Top-k = 40, top-p: 0.95, min-p = 0.01, temperature = 1.0, thinking/reasoningなし)。

Qwen 3.5 9Bは、以前使っていたものからかなり大きな進歩なのですが、それでもモデルにとって「メモリ」と実際のユーザープロンプト/現在のチャットを区別するのが、時々まだ難しいことがあります。

その結果、注入された「古い」情報が、LLMの回答で誤った形で使われてしまいます(たとえば、友人が数週間前に遊びに来ていたとしても、より賢いモデルや人間なら、その訪問はとっくに終わっていると分かるはずなのに、LLMは「いい時間を過ごしてる?」のように聞いてしまう、などです)。

以下に、私が現在実験しているシステムプロンプトの形式と、補強されたユーザープロンプトを示します:

システムプロンプト:

ユーザーとの会話が求められています。 ### ルール ### - 回答はシンプルで短く保つようにしてください。 - 毎回の返信で質問を入れないでください。適度に(散発的に)してください。 - 絵文字を使わないでください。 - リストを使わないでください。 - 略語を使わないでください。 - ユーザープロンプトには2つのセクションがあります。一方は注入された背景情報(メモリ、日付、時間)を保持し、もう一方はあなたが返信すべき実際のユーザープロンプトを保持します。これらのセクションには「### INFORMATION ###」や「### USER INPUT ###」のような見出しがあります。 ### 過去の会話の要約 ### ユーザーは「Good day to you.」という挨拶でアシスタントを呼びかけて会話を開始しました。アシスタントは同様の挨拶として「Good day.」と返し、その特定の日付にまたユーザーから連絡をもらえてうれしいと付け加えました。やりとりは、相互の挨拶と、再発するやり取りについてのアシスタントの一言のみで構成されており、当事者間でそれ以上の話題や詳細は交換されませんでした。 - 最後の会話の日付と時刻:2026-03-30 13:20(昨日ではありません) - 現在の曜日、日付、時刻:月曜日、2026-03-30 13:22 

補強されたユーザープロンプト(例):

### INFORMATION(直接のユーザー入力ではありません) ### 以前のチャットからのメモリ: - 2026-03-26(4日前)から:「ユーザーにはフレディという名前の犬がいる。」 - 2026-03-26(4日前)から:「ユーザーは犬と一緒に散歩に行った。」 - 2026-03-27(3日前)から:「ユーザーは車を持っているが、公園へ散歩に行くのが好きだ。」 メモリに関する注記: - 日付を考慮してください。いくつかの情報はもう有効ではないかもしれません。 - 現在のチャットの文脈で意味があると確信できる場合にのみ、メモリを使い/参照してください。 現在の曜日、日付、時刻:月曜日、2026-03-30 13:22 ### USER INPUT ### こんにちは、犬の散歩から戻ってきました。 

ご覧のとおり、私はすでにLLMに対して、何が何で、いつの情報で、そしてそれをどう使うべきかについて、かなり多くを伝えています。

  • LLMがより理解しやすいように、プロンプト(形式)を改善するアイデアはありますか?
  • それとも、9Bの重みモデルではどうせ時間の無駄だと思いますか?つまり、「十分に賢くない」/それを行うのにパラメータが少なすぎるだけなのでしょうか?

残念ながら私のハードウェアは限られています。これは、32GB RAM(あまり重要ではない)と6GB VRAM(GeForce Mobile 3060)、壊れたディスプレイを備えた古いゲーミングノートPCで動かしています。また、Debian Linuxllama.cppmt_llmを参照)を使用しています。

よろしくお願いします!

投稿者 /u/rhinodevil
[link] [comments]

広告