メインコンテンツへスキップ
見出し画像

過去の自分が最強の先生に!?Dify×チャット履歴DBで挑戦したRAGシステム構築の記録

    こんにちは!YaroTechです。

    「あれ、前にも同じ問題解決したはずなのに...どうやったっけ?」
    「過去のアイデア、どこにメモしたかな...」
    「このエラー、確か以前も遭遇したような...」

    そんな経験ありませんか?

    私も42日間のnote連続投稿の中で、何度も「過去の自分」に助けを求めたくなる瞬間がありました。そして今日、Day36で作ったチャット履歴DBとDay42で構築したDifyを組み合わせて、過去の自分を先生にするRAGシステムに挑戦しました!

    結論から言うと...完璧には動作しませんでしたが、その過程で得られた知見と解決への道筋を共有します。


    🖥️ 実行環境

    • PC: Surface Laptop 7th Edition

    • CPU: Snapdragon X Elite (ARM64)

    • OS: Windows 11 Pro 24H2

    • Dify: v1.7.2(Docker版)

    • チャット履歴: Claudeエクスポート(226チャット、64MB)

    • Python: 3.11

    • Docker Desktop: WSL2バックエンド


    🎯 この記事で得られること

    • Claudeのチャット履歴をエクスポートする方法

    • DifyのWorkflow機能での知識検索実装手順

    • ARM版Windows特有の注意点

    • うまくいかなかった時のトラブルシューティング

    • 代替案としてのSQLiteデータベース活用法


    📊 実際の挑戦結果

    想定: 過去の解決策を瞬時に検索できるシステム
    現実: 知識検索は動作したが、LLMへの連携で苦戦
    学び: Difyの変数連携の重要性を痛感
    次の一手: SQLiteデータベースの活用で解決可能


    🚀 実践内容

    ステップ1: Claudeからチャット履歴をエクスポート

    まず、Claudeの設定画面から全チャット履歴をエクスポートしました。

    1. Claude設定 → データ管理
    2. 「エクスポート」をクリック
    3. ZIPファイルをダウンロード(約64MB)
    4. 解凍すると3つのJSONファイル
       - conversations.json(チャット履歴)
       - projects.json(プロジェクト情報)
       - users.json(ユーザー情報)

    発見した問題点:

    • エクスポートされたJSONの構造が特殊

    • `chat_messages`フィールドにメッセージが格納

    • すべてのメッセージの`sender`が`human`として記録される

    ステップ2: データ構造の調査とCSV変換

    エクスポートされたデータを調査したところ、予想外の構造でした:

    # 調査スクリプトの結果
    チャット総数: 226
    メッセージを含むチャット数: 222/226
    ファイルサイズ: 64.32 MB
    
    # 問題:すべてのsenderが'human'
    # Assistantの応答が区別できない!

    そこで、複数の変換スクリプトをクロ助(ClaudeDesktop)が作成:

    1. シンプル版(`export_dify_simple.py`)

    2. 詳細版(`export_for_dify.py`)

    3. 修正版(`export_dify_fixed.py`)

    しかし、Human/Assistantの区別ができないという根本的な問題が残りました。
    ※変換スクリプトを公開してほしい方はコメントで「公開希望」としてください。

    ステップ3: DifyでのWorkflow構築

    Difyで以下のようなWorkflowを構築しました:

    開始 → 知識検索 → LLM → 回答

    設定内容:

    1. Knowledge作成

      • 名前:Personal Chat History

      • CSVファイルをアップロード

      • Chunking: Paragraph(500 tokens)

    2. Workflow設計

      • 開始ノード:ユーザー入力を受け取る

      • 知識検索ノード:Knowledgeから関連情報を検索

      • LLMノード:検索結果を基に回答生成

      • 回答ノード:結果を出力

    画像
    Dify 上部メニュからナレッジ>ナレッジベースを作成
    画像
    テキストファイルをアップロードして「次へ」でナレッジ登録手続き
    画像
    ナレッジベースの埋め込み処理が時間かかるので完了を待ちましょう

    ステップ4: 遭遇した問題と試行錯誤

    問題1: 知識検索は動作するが、LLMが結果を受け取れない

    画面左側には検索結果(#22556、#21046など)が表示されるのに、LLMは「情報が取得できませんでした」と回答。

    試した解決策:

    • System Promptに`{{#1734.result#}}`を追加

    • Input Variablesで`context`変数を設定

    • デバッグ用プロンプトで変数の受け渡しを確認

    画像
    チャットフローで「知識検索」でナレッジは取得できていそうだけど。。。

    問題2: MCPを「Minecraft」と誤解

    知識ベースに正しくデータが入っているのに、MCPを「Minecraft Coder Pack」と解釈してしまう現象が発生。


    ⚠️ つまずきポイントと解決策

    問題1: Claudeエクスポートの構造問題

    症状: すべてのメッセージが`sender: human`として記録される

    解決策:

    • メッセージの長さで推定(500文字以上をAssistantと仮定)

    • または、SQLiteデータベースを使用(推奨)

    問題2: 変数の受け渡し問題

    症状: 知識検索の結果がLLMに渡らない

    解決策: LLMのコンテキストで知識検索の出力変数を指定したら、一応受け渡しはできていそうです。

    LLMノードの設定:
    Input Variables:
      context: {{#知識検索ノードID.result#}}
    System Prompt:
      検索結果: {{context}}

    問題3: ARM版での処理速度

    症状: Knowledgeのインデックス作成が遅い

    解決策:

    • Docker Desktopのメモリ割り当てを6GBに増加

    • 他のブラウザタブを閉じてメモリを節約


    💡 代替案:SQLiteデータベースの活用

    Claudeエクスポートの問題を回避するため、Day36で作成したSQLiteデータベースを使う方法が最も確実です:

    # SQLiteからのエクスポート
    def export_from_sqlite():
        conn = sqlite3.connect('chat_history.db')
        query = """
        SELECT 
            c.chat_name as title,
            m.content as content
        FROM messages m
        JOIN chats c ON m.chat_id = c.id
        WHERE m.role = 'assistant'
        AND length(m.content) > 100
        """
        # CSV出力処理...

    この方法なら:

    • Human/Assistantが正確に区別される

    • 既に構造化されたデータを活用できる

    • Day36の成果を有効活用


    🔗 関連記事

    今回の実装に関連する過去記事もぜひご覧ください:


    📝 まとめと今後の展望

    今回のRAGシステム構築は、完璧には動作しませんでしたが、多くの学びがありました:

    学んだこと:

    • Difyの変数連携の重要性

    • Claudeエクスポート形式の制限

    • Workflowデバッグの方法

    • SQLiteデータベースの有用性

    今後の改善点:

    1. SQLiteデータベースを直接使用する方法の確立

    2. Chatbot型での再実装

    3. より詳細なデバッグ手法の習得

    失敗も含めて、すべてが学びです。完璧でなくても、挑戦することに意味があります。

    木曜日のラストスパート、諦めずに次の方法を試していきます!


    🚀 次回予告

    明日Day44は金曜日!気を取り直して、新たな挑戦です。

    「Dify×Gmail連携で作る最強AI秘書!メール自動返信&スケジュール管理」をお届けします。

    今日の経験を活かして、より実践的なシステムを構築します。金曜日の定時退社を目指して!

    お楽しみに!

    #Dify #RAG #知識管理 #AI活用 #チャット履歴 #トラブルシューティング #ClaudeDesktop #ARM64 #YaroTech #note43日目

     
     
    生成AIの感動を共有したいYaroTechです✨ 常識より実験。正解より行動。 生成AI時代を、先に試す傾奇者。 📝 470日間継続投稿中| 🎉 フォロワー1900名突破!🤝 質問大歓迎!みんなで「AIと共に羽ばたく」コミュニティを作りましょう🚀

    あなたへのおすすめ