結論
- AzureだけでもRAG基盤は組めるが、実務ではLangChain等の補助ライブラリを併用した方が速く確実。
- 効いたのは、ハイブリッド検索(BM25+ベクター+セマンティック再ランク)、用途別のチャンク設計、根拠表示、用語辞書。
- 完璧主義より**“80%で本番→計測→改善”**。運用(監視・権限・コスト)設計が実用性を決める。
はじめに
社内の膨大なナレッジを活かすには、検索と要約だけでなく**“根拠に基づく回答”が必要です。そこでAzureを主軸にRAG(Retrieval Augmented Generation)**でAIアシスタントを構築。背景、設計、詰まった点と打ち手、学びを共有します。
アーキテクチャ概観(採用スタック)
レイヤ | 採用候補 | 役割・ポイント |
---|---|---|
取得(Ingest) | Azure AI Document Intelligence / Logic Apps / Functions | PDF/Officeからテキスト抽出、メタ付与、ジョブ化 |
ストレージ | Azure Blob Storage | 原本保管、前処理済みJSON/MD保管 |
検索基盤 | Azure AI Search | ベクター+キーワードのハイブリッド検索、セマンティック再ランク、フィルタ(部署/機密区分) |
埋め込み | Azure OpenAI(text-embedding-3系) | 高再現のベクター化。メタ情報(見出し/章)も連結して埋め込み |
生成 | Azure OpenAI(GPT-4系/4o系) | 回答生成、引用整形、要約・抽出 |
オーケストレーション | LangChain(採用) / Semantic Kernel | チェーン化、評価・実験、プロンプト管理 |
配信 | App Service / API Management | 社内Web/Teamsボット公開、レート制御 |
セキュリティ | Private Endpoint, Managed Identity, Key Vault, RBAC | データ出域制御、鍵管理、最小権限 |
監視/評価 | Application Insights /(後述の)評価指標 | プロンプト/ツール呼び出しの可観測性 |
メモ:Azure AI Searchのハイブリッド+セマンティック再ランクを中心に据えると、召喚文(プロンプト)への依存が減り、品質が安定しました。
対象読者と動機
- 社内ドキュメントを活用したAIアシスタントを作りたい人(検索性・業務効率化に関心)
- Azureでセキュアに運用したい人(権限設計・プライベート接続・監査まで含めたい)
動機はシンプル:「社内資料をAIで“引けて頼れる”状態にしたい」。まずはクローズドなトライアルから開始。
直面した課題と効いた解決策(要点)
1. 「精度が低い?」問題
- 現象:原文をそのまま投入すると、要点が外れた回答が出る
- 効いた対策
- Q&A再構造化:FAQ化した文書は直接RAGに強い
- チャンク設計:300–800トークン+50–100トークン重なり/見出し+本文を同チャンクに保持
- ハイブリッド検索:BM25+ベクター+セマンティック再ランクで高精度化
- ドメイン固有Boost:部署・文書種別・発行日でスコア補正
2. 「回答の正確性が不明確」問題
- 現象:ユーザーが“本当に正しいの?”と不安
- 効いた対策
- 根拠URL/文書名/見出し/該当行の表示(最低トップ3)
- 回答ポリシー:根拠が薄い場合は**「不明」+次の探索手**を明示
- 引用の強制:プロンプトで引用がない出力を非採用に
3. 「同じ言葉の意味が曖昧」問題
- 現象:「コード=プログラム?商品コード?」
- 効いた対策
- 用語辞書(部門横断で合意)を前処理・検索・生成の全段で参照
- 検索前に曖昧語を展開(シノニム、別名、略称)
- 生成段で意図確認プロンプト(曖昧なら確認質問)
4. 「Azure以外も使いたい」問題
- 現象:前処理や評価で柔軟さが欲しい
- 効いた対策
- LangChain併用:パイプラインの迅速な試行・分岐実験
- ただし保管・検索・鍵管理はAzureに一元化して統制を担保
5. 「完璧主義」との戦い
- 現象:理想を追いすぎて進まない
- 効いた対策
- “80%でも本番”:対象業務とKPIを限定し、短サイクル改善
- 失敗時のフォールバック(テンプレFAQ、有人エスカレーション)
実装レシピ(最小構成)
- 前処理
- PDF/Office → テキスト抽出(Document Intelligence)
- セクション見出し、表タイトル、発行日、部署などメタ付与
- チャンク化(目安:300–800T、見出し同梱、表は1表=1チャンク)
- 埋め込み & インデックス
- text-embedding-3系で本文+メタ要約をベクター化
- Azure AI Searchにベクター+BM25+セマンティック再ランクを設定
- フィルタ(部署・機密・日付)を検索クエリで必須化
- 検索→生成
- クエリ拡張(用語辞書ベースで同義語追加)
- Top-k(例:k=8)を再ランク→上位3–5を引用
- 召喚文は手順型:「質問の再表現→根拠要約→回答→不確実性→引用」
- 可観測性 & ガードレール
- Application Insightsにプロンプト/応答/使用索引/コストを記録
- 出力検査(PII/機密ワード)とレッドアクション遮断
- 低信頼時は人手レビューへ
召喚文(プロンプト)断片(抜粋)
あなたは社内アシスタントです。次を厳守:
1) 回答は社内ドキュメントの根拠に基づく。根拠が弱い場合は「不明」とし、次の探索手を提案。
2) 引用は {文書名/見出し/URL/該当箇所} を3件以上、箇条書きで。
3) 専門用語は社内用語辞書に従って定義し、曖昧語は意味を明確化。
4) 機密・個人情報は出力しない。該当時は要約や一般化で置き換える。
参考コード(擬似・Python)
# 概念実装:ハイブリッドRAG(LangChain × Azure)
from langchain_openai import AzureChatOpenAI, AzureOpenAIEmbeddings
from langchain_community.vectorstores import AzureSearch
from langchain.chains import RetrievalQA
emb = AzureOpenAIEmbeddings(
azure_deployment="text-embedding-3-large",
)
vs = AzureSearch(
azure_search_endpoint="https://<search>.search.windows.net",
azure_search_key="<key>",
index_name="<index>",
embedding_function=emb.embed_query,
semantic_configuration_name="default", # セマンティック再ランク
fields={"content": "content", "vector": "content_vector", "metadata": "meta"},
)
retriever = vs.as_retriever(
search_type="hybrid", # ベクター+BM25
k=8,
)
llm = AzureChatOpenAI(
azure_deployment="gpt-4o",
temperature=0.2,
)
chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=retriever,
chain_type="stuff", # 必要に応じてmap_reduce等に
)
print(chain.invoke({"query": "新製品の出荷判定フローは?"}))
ポイント:ハイブリッド検索+セマンティック再ランクを有効化し、フィルタ(部署・機密区分)をRetrieval側で付与。
評価と運用(“実用”に効いたもの)
オフライン評価
- 正答性(Faithfulness)/根拠一致(Groundedness)
- 回答関連度(Answer Relevancy)/要約網羅率
- ゴールドセット(社内FAQ+トラブル事例)を回帰テストに
オンライン評価
- 引用クリック率/再質問率/解決までの時間
- 人手レビューの承認率(HITL通過率)
- コスト:1回答あたりのトークン・再ランク回数・キャッシュ率
運用の勘所
- コスト最適化:埋め込みのバッチ化、キャッシュ、短文は小モデルで
- モデル更新:ロールアウトは段階的+A/B
- 権限:RBAC+Managed Identity+Private Endpointで閉域化
- 監査:プロンプト・引用・検索クエリを追跡可能に
まとめ(学び)
- Azure中心で安全に運用しつつ、LangChain等で機動力を補うと実務に乗る。
- 成果を分けたのは、チャンク設計/ハイブリッド+再ランク/用語辞書/根拠表示。
- **“小さく本番→計測→改善”**のサイクルが最短距離。
次の一手(ロードマップ)
- 構造化RAG:表・手順・ポリシーなど文書タイプ別に分岐
- クエリ分類:要約/事実照会/プロセス案内でチェーンを切替
- 更新検知→再インデックスの自動化(Event Grid+Functions)
- Teams/Outlook統合で社内導線を最短化
付録:最小リソース表(例)
種別 | リソース |
---|---|
ネットワーク | VNet、Private Endpoint(Search/Blob/OpenAI) |
セキュリティ | Key Vault、Managed Identity、RBAC |
データ | Blob Storage(原本+前処理)、Azure AI Search(索引) |
AI | Azure OpenAI(埋め込み+生成) |
実行 | App Service / Functions、API Management |
監視 | Application Insights、Log Analytics |