0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

複数のAIで共有するObsidianのWikiに、会話中の発言が記録されなかった原因

0
Posted at

私は、ObsidianのVaultを複数のAI(Claude Code、Codex、ChatGPT、Gemini、Hermes、Ollama)が共有する共通の記憶として運用しています。

先日、Claude Codeとの会話の途中で入力した私からの命令が、Wikiに記録されていないことに気づきました。

毎朝のスクリプトは、会話IDがWiki内に存在するかどうかを基準に「未登録の会話一覧」を作成します。今回の会話は、前に別の内容を記録した時点で既に会話IDがWikiに存在していたため、一覧に載りませんでした。その結果、夜間にCodexが一覧からWikiへ書き足す処理の対象外となり、命令が記録されなかったのです。

この記事は、会話IDがWikiにあることは全発言が反映された証拠にならないという気づきと、その記録です。

環境

  • 共通の記憶:ObsidianのVault。中身はMarkdownです。AIごとの記憶や会話履歴は、正本にしません。
  • 会話の原本:Claude CodeとCodexの会話ログ(JSONL)。消さずに残します。
  • 毎朝の自動処理:cronで、まだWikiに入っていない会話の一覧を作ります。LLMは使いません。
  • 夜の統合:Codexが、その一覧の上から数件を原本で読み、Wikiの既存ページへ足します。

知識の流れは、次のとおりです。

AIとの会話(原本を残す)
        ↓ 毎朝、スクリプトが一覧を作る
まだWikiに入っていない会話の一覧
        ↓ 夜に、Codexが上から数件を原本で読む
Wiki(Obsidian)=次の会話・別のAIが読む共通の記憶

起きたこと

ある日、ある意見を、Claude Codeの会話に1回だけ伝えました。

あとで「その意見はWikiに入っているか」と探すと、入っていませんでした。探した結果は次のとおりです。

  • Wiki全体を、意見の本文の言葉で検索:0件
  • Codexの会話原本を、同じ言葉で検索:0件
  • アプリの開発記録のフォルダ:2か所

意見は、貼ったClaude Codeの会話と、開発記録にだけありました。Wikiにも、Codexにも、渡っていませんでした。

原因

「まだWikiに入っていない会話」を決める処理は、次の形でした。内容は省いて書いています。

def wiki_ids():
    ids = set()
    for root, dirs, files in os.walk(WIKI):
        for f in files:
            if f.endswith(".md"):
                ids.update(ID.findall(open(os.path.join(root, f)).read()))
    return ids

known = wiki_ids()
for p in glob.glob("~/.claude/projects/*/*.jsonl"):
    sid = os.path.basename(p)[:-6]      # 会話のファイル名=会話ID
    rows.append((sid in known, ...))    # Wikiのどこかに書いてあれば「入っている」

会話IDがWikiのどこかの.mdに1回でも書いてあれば、その会話は「入っている」と数えます。IDを書くのは、その会話から何かをWikiへ写したときです。長く続く会話ほど、IDが何度も書かれます。

原因は2つありました。

1. 判定の単位が「会話」だった

いまの仕組みでは、会話IDがWikiに書かれているかどうかで、取り込み済みかを判定しています。

そのため、会話IDがすでにWikiに書かれている会話では、そのあとに新しい発言が追加されても、取り込み待ちの一覧には出ません。

今回の意見は、会話IDがすでにWikiに書かれていた会話の途中で貼ったものでした。そのため、会話IDだけを見る今の判定では、新しい発言として検出できませんでした。

2. 処理が1日1回だった

毎朝1回、スクリプトが未登録の会話を調べ、夜にCodexが一覧の上から数件を原本で読んでWikiへ追加しています。

この仕組みでは、新しい情報がWikiに入るのは早くても翌日です。

その間、Wikiを読むほかのAIは、その新しい情報を知りません。既存のページと内容が食い違っていても、Wikiへ取り込まれるまでは確認できません。

直したこと

意見を、出典つきでWikiへ入れました。元の文をそのままコピーしてsourcesに置き、出どころとSHA-256を書いた一覧を付けました。要点はanalysisのページに書きました。

見直す方針(案・今後)

1. 新しい情報が出た時点で、取り込み待ちの一覧に追加する

会話全体をあとから探すのではなく、新しい情報が出た時点で取り込み待ちにします。

Claude Codeには、発言を送ったときに動くUserPromptSubmitと、返答が終わったときに動くStopのフックがあります。

2. 会話の区切りで、関連するWikiのページへ統合する

取り込み待ちになった内容は、会話の区切りで関連するページへ統合します。

そのとき、既存の記述と矛盾していないかも確認します。

KarpathyのLLM Wikiでは、新しい資料を取り込む時点で、既存のページと内容を比べる方式が使われています。

3. 全発言をWikiへ写さない

会話の原本はそのまま残します。

Wikiへ統合するのは、判断や行動を変える内容だけにします。

4. 毎朝の照合は残す

毎朝の照合は、取りこぼしがないかを確認するための点検として残します。

まだ確認できていないのは、次の2点です。

  • どの発言を「取り込み待ち」にするかの基準
  • 新しい情報が出るたびに処理を動かした場合の費用

分かったこと

  1. 会話IDがWikiにあるだけでは、その会話のすべての発言がWikiに入っている証拠にはなりません。
  2. 情報が入っているかどうかを確かめるときは、会話IDではなく、発言本文に含まれる言葉でWikiと各AIの原本を検索します。
  3. 1つのAIとの会話にだけ貼った情報は、ほかのAIには届きません。共通の記憶に入れるまでは、ほかのAIにとってその情報は存在しません。
  4. 1日1回のまとめ処理では、Wikiは新しい情報より遅れます。共通の記憶として使うなら、新しい情報が出た時点で取り込む設計にする必要があります。

出典

チェックワンツー(App Store・無料)

無料でできないことのうち、おもなものは3つです。ステレオ録音は1回5分・2件まで。モニターチェックの結果は3件まで。耳を鍛えるクイズは1日2セットまで。買い切り1,200円のフル版にすると、5分を超える本番も1本で録れます。結果は何件でも残せます。クイズも1日何セットでもできます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?