社内向けAIアシスタントをAzureで作ってみた!〜RAGシステムの挑戦と学び〜

azure Azure/OpenAI API

結論

  • AzureだけでもRAG基盤は組めるが、実務ではLangChain等の補助ライブラリを併用した方が速く確実。
  • 効いたのは、ハイブリッド検索(BM25+ベクター+セマンティック再ランク)用途別のチャンク設計根拠表示用語辞書
  • 完璧主義より**“80%で本番→計測→改善”**。運用(監視・権限・コスト)設計が実用性を決める。

はじめに

社内の膨大なナレッジを活かすには、検索と要約だけでなく**“根拠に基づく回答”が必要です。そこでAzureを主軸にRAG(Retrieval Augmented Generation)**でAIアシスタントを構築。背景、設計、詰まった点と打ち手、学びを共有します。


アーキテクチャ概観(採用スタック)

レイヤ採用候補役割・ポイント
取得(Ingest)Azure AI Document Intelligence / Logic Apps / FunctionsPDF/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、有人エスカレーション)

実装レシピ(最小構成)

  1. 前処理
    • PDF/Office → テキスト抽出(Document Intelligence)
    • セクション見出し、表タイトル、発行日、部署などメタ付与
    • チャンク化(目安:300–800T、見出し同梱、表は1表=1チャンク)
  2. 埋め込み & インデックス
    • text-embedding-3系で本文+メタ要約をベクター化
    • Azure AI Searchにベクター+BM25+セマンティック再ランクを設定
    • フィルタ(部署・機密・日付)を検索クエリで必須化
  3. 検索→生成
    • クエリ拡張(用語辞書ベースで同義語追加)
    • Top-k(例:k=8)を再ランク→上位3–5を引用
    • 召喚文は手順型:「質問の再表現→根拠要約→回答→不確実性→引用」
  4. 可観測性 & ガードレール
    • 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(索引)
AIAzure OpenAI(埋め込み+生成)
実行App Service / Functions、API Management
監視Application Insights、Log Analytics