見出し画像

RAG検索にスキルセットを組み合わせてみた

本日は、RAG(Retrieval-Augmented Generation)システムにおける 検索精度向上のためのスキルセット活用 の実例をご紹介します。特に、Azure AI Searchでの キーフレーズ抽出機能 を利用したインデクサの作成と動作確認にフォーカスします。



1. RAGシステムの概要

RAGシステムでは、データソースからインデックスを作成し、検索に利用します。本記事では インデックス作成の流れ を具体的に解説します。

図1. インデックス作成の概要図
  • データソース:元データへのアクセスを定義

  • インデクサ:データソースを介してインデックスを作成する処理を定義

  • インデックス:検索用のデータ構造で、項目と内容を保持

さらに、インデクサの処理の中で スキルセット を利用することができます。スキルセットは特定の処理機能を提供するもので、本記事では「キーフレーズ抽出」を例にします。


2. リソース作成の手順

2-① AI Servicesの作成

# リソースグループ作成
az group create --name rg-kraft12345 --location japaneast

# AI Services アカウント作成
az cognitiveservices account create \
  --name kraft-cogsvc \
  --resource-group rg-kraft12345 \
  --kind CognitiveServices \
  --sku S0 \
  --location japaneast \
  --yes

# キーとエンドポイントの確認
az cognitiveservices account keys list --name kraft-cogsvc --resource-group rg-kraft12345
az cognitiveservices account show --name kraft-cogsvc --resource-group rg-kraft12345 --query "properties.endpoint"

2-② AI Searchの作成

# AI Search サービス作成
az search service create \
  --name kraft-search-svc \
  --resource-group rg-kraft12345 \
  --sku basic \
  --location japaneast

# キーの確認
az search admin-key show --service-name kraft-search-svc --resource-group rg-kraft12345

2-③ Blobストレージの作成

# ストレージアカウント作成
az storage account create \
  --name kraftstorage12345 \
  --resource-group rg-kraft12345 \
  --location japaneast \
  --sku Standard_LRS

# コンテナ作成
az storage container create --name search-container --account-name kraftstorage12345

# 接続文字列の確認
az storage account show-connection-string \
  --name kraftstorage12345 --resource-group rg-kraft12345 --query connectionString --output tsv

2-④ スキルセットの作成(キーフレーズ抽出)

curl -X POST "https://kraft-search-svc.search.windows.net/skillsets?api-version=2023-11-01" \
  -H "Content-Type: application/json" \
  -H "api-key: <AI Search キー>" \
  -d '{
    "name": "my-skillset",
    "description": "Detect language and extract key phrases",
    "skills": [
      {
        "@odata.type": "#Microsoft.Skills.Text.KeyPhraseExtractionSkill",
        "defaultLanguageCode": "ja",
        "inputs": [
          { "name": "text", "source": "/document/content" },
          { "name": "languageCode", "source": "/document/language" }
        ],
        "outputs": [
          { "name": "keyPhrases", "targetName": "keywords" }
        ]
      }
    ],
    "cognitiveServices": {
      "@odata.type": "#Microsoft.Azure.Search.CognitiveServicesByKey",
      "description": "kraft-cogsvc",
      "key": "<AI Services キー>"
    }
  }'

2-⑤ データソースの作成

curl -X POST "https://kraft-search-svc.search.windows.net/datasources?api-version=2023-11-01" \
  -H "Content-Type: application/json" \
  -H "api-key: <AI Search キー>" \
  -d '{
    "name": "blob-data-source",
    "type": "azureblob",
    "credentials": {
      "connectionString": "<ストレージ接続文字列>"
    },
    "container": {
      "name": "search-container"
    }
  }'

2-⑥ インデックスの作成

curl -X POST "https://kraft-search-svc.search.windows.net/indexes?api-version=2023-11-01" \
  -H "Content-Type: application/json" \
  -H "api-key: <AI Search キー>" \
  -d '{
    "name": "blob-index",
    "fields": [
      { "name": "id", "type": "Edm.String", "key": true, "filterable": true },
      { "name": "content", "type": "Edm.String", "searchable": true },
      { "name": "title", "type": "Edm.String", "searchable": true },
      { "name": "metadata", "type": "Edm.String", "searchable": true },
      { "name": "author", "type": "Edm.String", "searchable": true },
      { "name": "created_date", "type": "Edm.DateTimeOffset", "filterable": true, "sortable": true },
      { "name": "updated_date", "type": "Edm.DateTimeOffset", "filterable": true, "sortable": true },
      { "name": "keywords", "type": "Collection(Edm.String)", "searchable": true },
      { "name": "summary", "type": "Edm.String", "searchable": true },
      { "name": "url", "type": "Edm.String", "retrievable": true }
    ],
    "scoringProfiles": [
      {
        "name": "titleBoost",
        "text": {
          "weights": {
            "title": 2.0,
            "keywords": 1.0,
            "content": 1.0,
            "summary": 1.0
          }
        }
      }
    ]
  }'

2-⑦ インデクサの作成

curl -X POST "https://kraft-search-svc.search.windows.net/indexers?api-version=2023-11-01" \
  -H "Content-Type: application/json" \
  -H "api-key: <AI Search キー>" \
  -d '{
    "name": "blob-indexer",
    "dataSourceName": "blob-data-source",
    "targetIndexName": "blob-index",
    "skillsetName": "my-skillset",
    "schedule": { "interval": "PT1H" },
    "fieldMappings": [
      { "sourceFieldName": "metadata_storage_path", "targetFieldName": "url" },
      { "sourceFieldName": "metadata_storage_name", "targetFieldName": "title" }
    ],
    "outputFieldMappings": [
      { "sourceFieldName": "/document/keywords", "targetFieldName": "keywords" }
    ]
  }'

3. 動作確認

  • サンプルテキストをBlobストレージにアップロード(個数:20個)

  • インデクサを実行し、インデックスを作成

画面1. インデクサ実行画面
curl -X POST "https://kraft-search-svc.search.windows.net/indexes/blob-index/docs/search?api-version=2023-11-01" \
  -H "Content-Type: application/json" \
  -H "api-key: <AI Search キー>" \
  -d '{
    "search": "*",
    "top": 1
  }'
  • ポータル画面の「インデックス表示」ボタンからも確認可能

画面2. インデックス表示画面
  • キーワード(keywords)にはスキルセットで抽出された キーフレーズ が保存されます

インデックスデータ(一例):

{
      "@search.score": 1,
      "id": "aHR0cHM6Ly9rcmFmdHN0b3JhZ2UxMjM0NS5ibG9iLmNvcmUud2luZG93cy5uZXQvc2VhcmNoLWNvbnRhaW5lci8lRTMlODIlQTYlRTMlODIlOTklRTMlODIlQTclRTMlODMlQUElRTMlODMlODYlRTMlODIlQTMlRTMlODMlQkIlRTMlODIlQkQlRTMlODMlQUElRTMlODMlQTUlRTMlODMlQkMlRTMlODIlQjclRTMlODMlQTclRTMlODMlQjMlRTMlODIlQjklRTMlODIlOTkudHh00",
      "content": "ヴェリティ・ソリューションズは、デジタルフォレンジックとサイバーセキュリティの専門企業です。本社はロンドンにあり、2010年に元MI6のセキュリティ専門家によって設立されました。\n同社の技術は、企業のデータ漏洩をリアルタイムで検知し、即座に対応するAIベースのセキュリティシステムに特化しています。主要なプロダクトである「Verity Guardian」は、大規模な金融機関や政府機関で採用され、ハッキングや内部不正の防止に貢献しています。\nまた、ヴェリティ・ソリューションズはブロックチェーン技術を活用したデジタル証拠管理システムの開発も進めており、法執行機関や国際刑事裁判所と連携し、デジタル犯罪の証拠保全を強化する取り組みを行っています。\n\n",
      "title": "ヴェリティ・ソリューションズ.txt",
      "metadata": null,
      "author": null,
      "created_date": null,
      "updated_date": null,
      "keywords": [
        "対応するAIベース",
        "ヴェリティ・ソリューションズ",
        "デジタルフォレンジック",
        "サイバーセキュリティ",
        "専門企業",
        "本社",
        "ロンドン",
        "2010年",
        "セキュリティ専門家",
        "同社",
        "技術",
        "リアルタイム",
        "即座",
        "セキュリティシステム",
        "大規模な金融機関",
        "政府機関",
        "ハッキング",
        "内部不正",
        "防止",
        "た",
        "デジタル証拠管理システム",
        "開発",
        "法執行機関",
        "国際刑事裁判所",
        "デジタル犯罪",
        "証拠保全を強化する取り組み"
      ],
      "summary": null,
      "url": "https://kraftstorage12345.blob.core.windows.net/search-container/%E3%82%A6%E3%82%99%E3%82%A7%E3%83%AA%E3%83%86%E3%82%A3%E3%83%BB%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B9%E3%82%99.txt"
    }

インデックスでスコア算出の重みづけを以下のように設定しています。

"weights": {
  "title": 2.0,
  "keywords": 1.0,
  "content": 1.0,
  "summary": 1.0
}
  • title:最も重要な検索対象(2.0)

  • keywords / content / summary:次に重要、検索スコアを補助(1.0)

これにより、タイトルの次にキーフレーズ抽出結果が検索スコアに影響する設計としています。


4. まとめ

今回は、AI Searchにおける キーフレーズ抽出スキルセットの活用例 を紹介しました。

  • スキルセットは様々な種類があり、用途に応じて組み合わせ可能

  • キーワードブーストを設定することで、検索精度を意図的に調整できる

RAGシステムの検索精度向上の 第一歩として役立つ手法 です。本記事が皆様の実装のヒントになれば幸いです。

いいなと思ったら応援しよう!