45:57Chase AI
Log in to leave a comment
No posts yet
ローカル環境でRAGシステムを構築する際、最初に直面する壁はVRAM容量とライブラリ間の深刻なバージョン競合です。8ビット量子化モデルは、パラメータ10億個につき約1GBのVRAMを消費します。WindowsやmacOS自体の占有率を考慮すると、少なくとも20%の空き容量を残しておく必要があります。この余裕がないと、トークン生成速度が秒間2個レベルまで落ち込むという悲惨なパフォーマンスを目の当たりにすることになります。特にlightrag-hkuフレームワークは、最新のnumpy 2.xバージョンと組み合わせるとランタイムエラーを吐き出しがちです。
まずターミナルを開き、pip install numpy==1.26.4 --force-reinstallを入力してバージョンを固定してください。その次にnest_asyncioをインストールし、コードの最上部にnest_asyncio.apply()を記述する必要があります。これを忘れると、Jupyter Notebookで非同期ループが衝突し、プロセス全体が停止します。GPUメモリが8GB以下の場合は、LightRAGを初期化する際にembedding_batch_numを10以下に、llm_model_max_asyncを4程度に低く設定してください。この設定だけで、原因不明のシステムダウン(OOM: Out Of Memory)を防ぎ、無駄な試行錯誤の時間を2時間は短縮できます。
単にテキストを塊(チャンク)として保存すると、情報間の文脈がすべて断ち切られてしまいます。しかし、Obsidianのウィキリンク([[link]])構造を正しくパースすれば、かなり精巧な知識グラフを作成できます。肝心なのは、LLMが読み取る前に不要なマークダウン記号を取り除く作業です。乱雑な記号を掃除するだけで、トークン消費量を30%近く節約できます。
メモを作成する際、上部のYAML領域にtypeやdomainといったフィールドを入れる習慣をつけましょう。検索のフィルタリング速度が劇的に変わります。Pythonのreモジュールでr"\[\[(.+?)\]\]"パターンを使用して文書間の繋がりを抽出した後、これをJSONL形式の関係データセットに変換してください。ファイル名も重要です。「2024-04-14」のような日付よりも、知識の核心となるトピックをタイトルに据えることで、インデックスされたノードが本来の役割を果たします。このように連結されたデータは、単なる検索を超え、概念から概念へと渡り歩く推論を可能にします。
ローカルLLMを動かす際、最ももったいないのは計算済みの埋め込み(Embedding)を再計算するために時間を費やすことです。Pythonの標準的なキャッシュはプログラムを終了すると消えてしまいます。そのため、SQLiteベースのDiskCacheを使用して物理的なストレージを作成する必要があります。質問間のコサイン類似度が0.95を超えた場合、LLMを呼び出さずにキャッシュされた回答を即座に返すように設計してください。このようにセマンティックキャッシングを適用すれば、レスポンス時間を100ms前後に短縮できます。
方法は簡単です。pip install diskcacheでライブラリを導入し、埋め込みテキストとベクトルのペアを保存するクラスを作成してください。ここに時間重み付けアルゴリズムを組み合わせるとさらに効果的です。
修正したばかりのメモが検索結果の上位に来るようにロジックを組むのです。埋め込みキャッシュのTTLは1時間、生成された回答のキャッシュは2時間程度に設定すれば、繰り返される質問に対して即応体制を整えることができます。
メモに含まれるアーキテクチャ図やスクリーンショットは、テキストよりもはるかに多くの情報を含んでいます。これを検索から外すのは損失です。CLIPモデルを使えば、画像とテキストを同一空間に配置し、「データフロー図」と入力するだけで関連画像を見つけ出すことができます。ハイスペックなGPUがない場合は、CLIP-ViT-B-32モデルをOpenVINOフォーマットに変換してCPUで動かせば十分です。
マークダウンファイルから画像パスを見つけたら、その前後のテキスト200文字程度をセットにします。その後、Phi-3.5-visionのような軽量なローカルVLMで画像キャプションを自動抽出します。このキャプションベクトルと画像の特徴ベクトルを、QdrantのようなローカルベクトルDBに一緒に保存します。この工程を経ることで、テキストでは説明しにくい複雑な図表まで検索結果に含めることが可能になります。
ファイルを一つ修正するたびに保管庫全体を再インデックスするのは非効率です。Pythonのwatchdogライブラリを使えば、ファイルが保存された瞬間を検知して変更箇所だけを更新できます。ただし、執筆中に絶えずインデックスが回るとCPUに負荷がかかるため、デバウンス(Debouncing)処理が不可欠です。
スクリプトを組む際は、watchdog.observersでフォルダを監視し、修正イベントが発生してから5秒ほど待機した後に作業を開始するようにします。各ファイルのSHA-256ハッシュ値を別途保存しておき、本当に内容が変わったか対照するプロセスも組み込みましょう。ハッシュが異なるファイルだけを選別し、既存のノードを削除して新しいベクトルを投入します。これを構築しておけば、メモを保存した瞬間に検索システムへ反映される、リアルタイムな知識ベースが完成します。手動で更新ボタンを押す手間がなくなるのです。