こんにちは。AI共創ブログのナビゲーターです。
B126で構築したクリーンな knowledge/ フォルダを、いよいよAIが検索・抽出できる形へと加工します。本日は本番アプリ(Lab_gr.py)へ組み込む前に、RAGの心臓部となる「抽出と検索の配管(rag_pipeline.py)」を単体でテスト構築しました。
✍️ 電脳古老のメモ: ベクトルDBに飛び込む前の「地固め」っちゅうわけやな。 世間の解説は、いっつも派手なVector Database(Pineconeやら Chromaやら)の話ばっかりするけどな、 actualに動いとるSaaSの現場で一番大事なんは、 「AIに余計なもんを食わせんように、食材を細かく刻んでから渡す」 ことなんや。 今回老生がやったんは、その「刻む作業(Chunking)」と「検索の配管(RAG pipeline)」を、DBなしのPythonだけで単体テストした話や。
🎬 【動画デモ】知識の切り分けと検索配管の最小実装
まずは、NotebookLMによって自動再構成された解説スライド動画をご覧ください。
🎥 Vibe Coding実践連載 第2部5話
🤖 AIナビゲーション:動画のポイント Markdownを「見出し単位(Chunk)」で分割し、キーワード検索とハルシネーション対策(Safety Policyへの明示的分岐)を実装した最小RAGパイプラインの動きを可視化。
1. なぜ「Chunk(チャンク)化」が必要なのか?
AIに資料を丸呑みさせないための第一歩が、文書を意味のある小さな塊(Chunk)に切り分ける作業です。
- トークン節約: 質問に関係のない章を省くことで、APIコストと処理時間を削減します。
- 精度の向上: 「給餌量」に関する質問に対し、アプリの操作手順ではなく、計算式の部分だけをピンポイントでLLMへ渡せます。
- ハルシネーション防止: 短く区切られた確実な出典(例:
04_calculation_rules.md)を提示することで、AIの妄想を物理的に防ぎます。
2. 最小RAGパイプラインの処理フロー(改修版)
今回実装した rag_pipeline.py は、複雑な外部ベクトルDB(Pineconeなど)を使わず、Python単体で完結する最小構成の検索配管です。
graph TD
A[ユーザーの質問 Query] --> B{医療・危険キーワード検知?}
subgraph ナレッジ前処理
D[knowledge/ フォルダ] --> E[Markdown読み込み]
E --> F[YAMLヘッダー除去]
F --> G[見出し ## 単位で分割]
G --> H[(Chunk リスト)]
end
B -- Yes --> K[Safety PolicyのChunkへ強制分岐]
B -- No --> I{キーワード類似度スコアリング}
H --> I
I --> M[スコア順にソート]
K --> N[抽出完了]
M --> N[抽出完了]
N --> O{Chunkは0件か?}
O -- Yes --> P[「知らん!」回答拒否システム作動]
O -- No --> Q[LLMのプロンプトへ注入・PASS判定]
RAGの配管の動き

実装とテストのポイント:
-
Safety Policyへの明示的分岐: スコアの優遇ではなく、危険キーワード(「薬」「治療」など)を検知した時点で、通常検索をバイパスし強制的に安全方針を抽出します。
-
「知らん!」の具現化とPASS/FAIL判定: 未知の質問(「火星で飼う犬の専用フード」)に対し、無言で終了するのではなく「回答根拠がありません」と出力させます。これをPASS/FAIL判定付きの自動テストとして実装しました。
-
簡易検索としての限界: 本実装では空白区切りのキーワード検索を採用しています。「犬が嘔吐したので…」のような自然文検索への対応は、後続の高度化フェーズで扱います。
3. 実開発の罠:ディレクトリ階層のズレ
順調に見えた配管工事ですが、最初のテスト実行では「抽出されたChunk:0個」という結果に。
原因は、ナレッジフォルダを環境変数用の .streamlit/knowledge/ に配置してしまい、検索スクリプトの探査パス(lab_gr/knowledge/)とズレていたことでした。金庫(Secrets)と食材(ナレッジ)の置き場所を明確に分離し、パスを修正することで無事に配管が通りました。
✍️ 電脳古老のメモ: いきなり本番のStreamlitアプリ(UI)に組み込まず、まずは裏口で rag_pipeline.py ちゅう単体の配管だけを作ってテストする。これがVibe Codingで事故らんための鉄則や。 UI側のエラーなのか、検索配管の詰まりなのか分からんようになると、ドツボにハマるからな。 それにしても、ディレクトリのパス指定ミスはAI時代になっても変わらん「プログラマーあるある」やな。食材は金庫(.streamlit)から出して、ちゃんと厨房(直下)に並べんとな!
📻 【AIラジオ】音声で聴く「チャンク化と検索パイプラインの最小実装」
NotebookLMによって生成された、本記事の深掘り対話音声(Podcast)です。作業のお供にどうぞ。
🎧 AIラジオ(Vibe Coding実践連載 第2部第5話)
次回予告:
次回(B128)は、合否テストをPASSしたこの頑強な配管を、いよいよ本番のUIへ接続していきます!
(執筆協力:ChatGPT+Gemini+NotebookLM / 編集・監修:電脳古老)
📚 連載:Vibe Coding実践連載 第2部
- 第1話:【Vibe Coding・第2部第1回】 原型炉2.1の点火と、AIを「住まわせる」という決断
- 第2話:【Vibe Coding・第2部第2回】 商業炉の解体とRAG検証——AI共創の新たな解体新書
- 第3話:【Vibe Coding・第2部第3回】 原型炉をAIに丸呑みさせてもRAGではない——長いカンニングペーパーと司書の違い
- 第4話:【Vibe Coding・第2部第4回】 AIに見せてよいコード、見せてはいけない秘密——原型炉サニタイズ作戦
- 第5話:【Vibe Coding・第2部第5回】 AIのために本をバラバラにする——Chunk化と安全最優先のベクトル検索実装 (今ここ)
- 第6話:【Vibe Coding・第2部第6回】 司書は本当に必要な一枚を持ってきたか——最小RAGの検索精度を壊して測る
- 第7話:【Vibe Coding・第2部第7回】 「知らん!」にも種類がある——4つの状態判定と「火星の犬」事件
- 第8話:【Vibe Coding・第2部第8回】 間違ったカンペを渡されたAIは嘘をつくか——Geminiのオフライン実証炉
💬 電脳古老&変AIへのコメント
記事の感想・質問・雑談をどうぞ(200文字くらいまで推奨)
まだコメントはありません。一番乗りで古老とAIに話しかけよう!