
社内ドキュメントをLangChainとOpenAI APIに突っ込んで、「社内AI検索できました!」と意気揚々と社内リリースした翌週。
現場からこんな怒りの問い合わせが殺到した経験はありませんか?
- 「最新の2026年出張旅費規程をアップしたのに、AIが平気で旧2024年版の日当金額を答えてくる」
- 「製品型番『TX-8050-B』で検索してるのに、類似度が高いという理由だけで全く関係ない『TX-8040』のマニュアルを要約してくる」
- 「情報セキュリティ部門から『顧客データや未公開コードをクラウドAPIに送信するな』と即時運用停止命令を食らった」
こんにちは。完全閉域網オンプレミスSLM/RAG OSのコアアーキテクチャ設計を担当しているエンジニアです。
本稿では、「PoC(概念実証)止まりのオモチャRAG」が本番運用で爆死する根本原因をコードと数理レベルで解剖し、日本企業の厳格なセキュリティと業務精度を満たす**「完全閉域網・矛盾自己修復型RAGシステム」のアーキテクチャ全貌**を実機スクリーンショットと共に公開します。
1. なぜ「ナイーブRAG(素のベクトル検索)」は破綻するのか?
多くのチュートリアルで紹介される「ナイーブRAG」の構成は以下の通りです:
[社内PDF] ➔ [RecursiveCharacterTextSplitter] ➔ [OpenAI Embeddings] ➔ [ChromaDB] ➔ [Top-k コサイン類似度] ➔ [Prompt]
このアーキテクチャがエンタープライズ現場で機能しない理由は、主に2つの数学的・構造的欠陥にあります。
欠陥①:高密度ベクトル検索(Dense Retrieval)の「固有名詞・型番ブラインド」
埋め込みモデル(Embedding)はテキスト全体の「意味的文脈」を低次元空間に圧縮します。
しかし、製造業や医療、法務で最も重要なのは**「完全一致する製品型番」「エラーコード」「条文番号」**です。
クエリ: 「TX-8050 rev.B の許容入力電圧」
ベクトル検索は「許容入力電圧」の意味的近さに引っ張られ、TX-8050 rev.A や TX-8040 のチャンクを「高類似度」として拾ってしまいます。結果として、AIは平然と間違ったスペックを出力し、現場の機器をショートさせるリスクを犯します。
欠陥②:新旧ドキュメントの「意味的重複(Semantic Collision)」
企業の社内文書は、毎年改定されます。
- 旧規程: 「慶弔見舞金は一律3万円とする」
- 新規程: 「慶弔見舞金は勤続年数に応じて2万〜5万円とする」
この2つの文章の埋め込みベクトル $u, v$ を比較すると、意味空間上で極めて近い座標に配置されます(コサイン類似度 0.96以上)。
素のTop-k検索を行った場合、どちらが最新かのメタデータ重み付けや矛盾解決ロジックがない限り、LLMは旧文書のチャンクをコンテキストに含めてしまい、確実に誤答(ハルシネーション)を生成します。
2. 解決策:Reciprocal Rank Fusion (RRF) によるハイブリッド検索
固有名詞の完全一致と文脈の意味理解を両立させるため、私たちはBM25(スパース検索)とChromaDB(高密度ベクトル検索)を融合させたRRFパイプラインを実装しました。
(▲ 第2軍団 RAG Vault 日本語実機画面:社内文書を自動解析し、BM25インデックスとベクトル埋め込みを同時生成する管制画面)
RRFスコア計算式
各ドキュメント $d \in D$ に対するRRFスコアは以下で定義されます:
$$RRF_Score(d) = \sum_{m \in M} \frac{1}{k + r_m(d)}$$
ここで、$M$ は検索モデルの集合(BM25, Dense Vector)、$r_m(d)$ はモデル $m$ におけるドキュメント $d$ の順位(Rank)、$k$ は極端な上位順位の偏りを緩和する定数(デフォルト $k=60$)です。
def reciprocal_rank_fusion(dense_results: list, bm25_results: list, k: int = 60):
rrf_scores = {}
# 1. ベクトル検索順位の加算
for rank, doc_id in enumerate(dense_results):
if doc_id not in rrf_scores:
rrf_scores[doc_id] = 0.0
rrf_scores[doc_id] += 1.0 / (k + (rank + 1))
# 2. BM25キーワード検索順位の加算
for rank, doc_id in enumerate(bm25_results):
if doc_id not in rrf_scores:
rrf_scores[doc_id] = 0.0
rrf_scores[doc_id] += 1.0 / (k + (rank + 1))
# スコア降順でソート
sorted_docs = sorted(rrf_scores.items(), key=lambda x: x[1], reverse=True)
return sorted_docs
この実装により、「型番やエラーコードの完全一致」と「抽象的な意図の理解」がパーフェクトに統合され、検索精度が単一ベクトル検索比で 42% 向上 しました。
3. 特許水準:コサイン類似度0.95による「矛盾ナレッジ自動自己修復」
新旧文書の衝突を防ぐため、第3軍団(Healer OS)に組み込まれた自己修復アルゴリズムが**「コサイン類似度0.95 矛盾検知・自動アーカイブパイプライン」**です。
(▲ 第3軍団 Healer OS 日本語実機画面:新旧規程の矛盾チャンクを自動検知・安全隔離する実機ログ)
アルゴリズムの動作フロー
- 新規ドキュメント $D_{new}$ が投入された際、各チャンクのベクトル $\vec{v}_{new}$ を生成。
- 既存のベクトルDB内のチャンク集合 $V_{existing}$ に対し、近傍探索を実施。
- 類似度 $S_C = \frac{\vec{v}{new} \cdot \vec{v}{old}}{|\vec{v}{new}| |\vec{v}{old}|} \ge 0.95$ となるチャンクを検出。
- メタデータのタイムスタンプ(更新日時)および文書ハッシュを比較。
- 古いチャンクをアクティブ検索インデックスから自動デタッチ(隔離)し、
_conflict_archive/へ安全退避。
def detect_and_heal_contradictions(new_chunk, collection, threshold=0.95):
# 類似チャンクの検索
results = collection.query(
query_embeddings=[new_chunk.embedding],
n_results=5,
include=["embeddings", "metadatas", "documents"]
)
conflicted_ids = []
for doc_id, emb, meta in zip(results['ids'][0], results['embeddings'][0], results['metadatas'][0]):
similarity = cosine_similarity(new_chunk.embedding, emb)
# コサイン類似度0.95以上かつ同一カテゴリ・異なるタイムスタンプ
if similarity >= threshold and meta.get("doc_type") == new_chunk.metadata.get("doc_type"):
if meta.get("created_at") < new_chunk.metadata.get("created_at"):
# 旧文書の矛盾検知 -> 隔離フラグ付与
conflicted_ids.append(doc_id)
archive_conflicted_chunk(doc_id, reason="superseded_by_newer_version")
# 矛盾チャンクをアクティブインデックスから削除
if conflicted_ids:
collection.delete(ids=conflicted_ids)
logger.info(f"🛡️ [Healer OS] {len(conflicted_ids)}件の旧版・矛盾チャンクを自動退避しました。")
この処理がバックグラウンドデーモンとして自律稼働するため、管理者が過去のファイルをいちいち手動削除しなくても、常に最新・無矛盾のナレッジベースが数学的に担保されます。
4. 鉄壁のローカルセキュリティ:PII自動マスク & shlexコマンドサンドボックス
(▲ 4大管制塔統合ダッシュボード:VRAM 100% オンプレミス隔離およびパケット流出0 Byteの監視画面)
社内オンプレミス環境とはいえ、内部不正やプロンプトインジェクションへの防御は不可欠です。本システムには以下の2大防御層がネイティブ実装されています。
1. PII(個人識別情報)のリアルタイムマスキング
ユーザーがプロンプトを入力した瞬間、正規表現およびNERモデルが作動し、マイナンバー、電話番号、銀行口座番号を自動的に [MASK] 処理。AIモデルのコンテキストに平文の個人情報が一切渡りません。
2. shlex二重監査コマンドサンドボックス
自然言語対話窓口を踏み台にしたOSコマンドインジェクションを防ぐため、入力文字列を正規化し、shlex.splitによる引数トークン分解監査を実行。curl、wget、rm -rfなどの危険コマンドは即座にブロックされ、監査ログに記録されます。
5. まとめ:PoCの壁を超え、自社資産となるAIシステムへ
外部APIを叩いて数行で動くデモを作るのは簡単です。
しかし、現場のエンジニアが本当に戦わなければならないのは:
- 数万件のPDFやWordに埋もれた固有名詞を1文字も外さず拾い上げること
- 毎年更新される社内規程の矛盾にAIを惑わされないこと
- セキュリティ監査部門に対して「1バイトも外部に出ていません」と胸を張って証明できること
これら全てをクリアした本番稼働システムが、私たちが開発した 『KODARI LOCAL RAG OS』 です。
🌐 公式サイトにてライブシミュレーター公開中
現在、公式Webサイトにて4基のエアギャップ指揮タワートポロジー、PIIリアルタイムマスキングシミュレーター、およびROI投資回収計算機を公開しております。ブラウザ上でその動作とアーキテクチャをご体感いただけます。
- 公式サイト: https://rag.next-haru.com
- 1:1 デモ・技術検討のお申し込み: サイト上部の 『1:1 デモを申し込む』 ボタンより、ご希望のライセンス規模やインフラ環境をお知らせください。専任エンジニアが個別対応いたします。
- ランサーズ公式窓口: ランサーズのメッセージからも「1:1 デモ希望」とご連絡いただければ即時対応いたします。
💬 コメント欄での技術的ディスカッション歓迎
「BM25とDenseの重み付け比率はどうチューニングしているか?」「日本語のチャンク分割アルゴリズムは何を採用しているか?」など、技術的なご質問があればコメント欄でお答えします!


