Tech Blog

使って気づいた、Geminiにあって自分になかったもの

RAG Gemini Grounding my-rag-brain Python

使って気づいた、Geminiにあって自分になかったもの

動かして初めてわかること

my-rag-brainを実際に使い始めて、不便に感じることが出てきた。

search_memoryで過去の記録を引き出したとき、その内容が「どの会話から来たのか」がわからない。検索結果を見ると、教訓や結論のテキストは確かに表示される。しかし、元の文脈——どんな問題があって、どんな経緯でその結論に至ったのか——に戻る手段がなかった。

ファイルパスもなければ、日付以外の手がかりもない。


これはGeminiとの設計差異だ

Geminiの仕様を確認した。

GeminiはRAG Engine、MemoryCorpus、そしてSources: Previous chatsという構成を持つ。過去の会話を検索するだけでなく、その会話そのものを出典として返せる。取得した情報が「どこから来たか」を、Groundingの仕組みで常に保持している。

自分のシステムに欠けているのはそこだった。

vault(lesson/conclusionなど蒸留済みエントリ)に記録された内容は、元の会話ファイルとの接続が切れていた。蒸留は情報を圧縮するが、出典を切り落としていた。


source_originを実装した

変更は4ファイルに及んだ。まず各ファイルの役割を整理する。

ファイル役割
store.pyChromaDBへの書き込み層。全チャンクのメタデータを管理する
note_writer.pyMCPサーバーとCLIから呼ばれる記録の入口。store.pyを呼び出す
distill_v2.pydiaryの生ノートをLesson/Conclusionに昇格させるパイプライン
server.pyMCPサーバー本体。search_memoryツールの検索・表示ロジックを持つ

書き込みの流れは distill_v2.py → note_writer.py → store.py → ChromaDB で、読み出しは server.py → ChromaDB だ。

① store.py — ChromaDBメタデータにフィールド追加

ChromaDBに投入するすべてのチャンクのメタデータにsource_originフィールドを追加した。

meta = {
    "source_type":   source_type,
    "source_file":   str(path),
    "source_ref":    source_ref,
    "source_origin": source_origin,  # 蒸留元ファイルパスを記録
    "title":         title,
    "date":          date_str,
    ...
}

② note_writer.py — 書き込み関数の引数追加

記録の入口となるwrite_note()source_origin引数を追加し、store.pyに受け渡す。

def write_note(text: str, source_type: str, ref: str = "",
               priority: str = "", source_origin: str = ""):
    ...
    ingest_file(str(target_file), source_type, ..., source_origin=source_origin)

③ distill_v2.py — 蒸留時に元ファイルパスを渡す

diaryを蒸留してvaultに書き込む際、元のdiaryファイルパスをsource_originとして渡す。これにより「この教訓はどの日の会話から来たか」が記録される。

write_note(
    text=body,
    source_type=note_type,
    ref=f"distill_v2:{source_date}:{time_str}",
    source_origin=str(md_path),  # 例: data/diary/2026-05-27.md
)

④ server.py — 検索結果に出典を表示

search_memoryの結果を組み立てる際、source_originがあれば末尾に表示する。

source_origin = meta.get("source_origin", "")
...
if source_origin:
    lines.append(f"📄 出典: {Path(source_origin).name}")

これで検索結果の末尾に 📄 出典: 2026-05-27.md と表示されるようになった。元の会話に戻れる。


なぜGroundingが重要なのか

記録は取れていた。しかし、記録の文脈に戻れなければ、知識は孤立したラベルになる。

SEがシステムを設計するとき、要件書だけでなく「なぜその要件が生まれたか」の背景を持っている状態と、持っていない状態では判断の質が違う。RAGも同じだった。

Geminiは出典を手放さない。自分のシステムもそうあるべきだった。


関連する記事

気軽にメッセージください

仕事の依頼、案件紹介、ご感想・ご質問なんでもお待ちしております。 高い志をもった同士の皆様と繋がることを切に願っております。 これからも人生を掛けたチャレンジを続けていきます。 何卒よろしくお願い致します。