1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Microsoft Foundry】初めてのRAG構築【Azure】

1
Last updated at Posted at 2026-02-12

この記事では、Azure上で初めてRAG環境を作ったので、その手順や躓きポイントをまとめてみました。

はじめに

主にAzure環境で作っております。
具体的に使ったリソースは以下となります。

  • Azure OpenAI
  • Azure AI Search
  • Storage Account(Blob Storage)
    ※あとはVnetなど細かいのもありましたが、基本的にデフォルトで作る程度なので適宜対応してください。

RAGの環境が出来たら架空の人物を5人くらい用意して、blob storageにtext/wordでアップロードしておき、その人物の情報で問合せしてみる。といった機能を実装しています。

※リソース名が途中変わったりしているところもあるかもしれませんが、流れは抑えていると思うのであまり気にしないでください。

STEP 1:Azure リソースの準備

■ 1-1. リソースグループ作成

これは良しなにご作成ください。
image.png

■ 1-2. Azure OpenAI(East US2)を作成

  • リージョン:East US2
  • モデル:gpt‑4o-mini
  • デプロイ名:任意
    image.png

こんな感じです。
image.png

ここでいきなり注意ポイントですが、リージョン毎に扱えるモデルが違うので、使いたいモデルが指定したいリージョンでサポートしているか確認してください。

※最初JapanEastで作ろうと思いましたが、gpt-4o-mini(コスパよしのモデル)がサポートしていなかったのでUSで作っています。
↓こんな感じでクォータなしでサポートされてませんでした。
image.png

あと、これはどちらでもいいのですが、ネットワークは念のため送信元で絞るようにしました。
※一番下の選択肢のプライベートエンドポイントは回線が用意できない場合は選ばない方がいいかもしれませんね。
image.png

VnetとSubnetはデフォルト(いじらず)でファイアウォールのところだけ自宅のグローバルアドレスを入れてます。
こちらで確認できます。

ここまで出来たらリソース作成
image.png

リソースが出来たら次はリソースを選択肢、Foundryポータルに移動してください。
image.png

※こんな感じの画面にジャンプ
image.png

メニュー左の 「モデル カタログ」 からモデル(なんでもいいです)を選択してください。(ここではgpt-4o-mini)
image.png

「このモデルを使用する」 で有効化します。
image.png

※ほとんどデフォルトです。
image.png

これで 「リソースを作成してデプロイ」 が成功すればAIモデルまでの準備はOKです。

■ 1-3. Azure AI Search(Japan East)を作成

  • SKU:Basic 以上
    (後で Foundry UI からインデックスを作成します。)

リソースの検索から検索可能です。
image.png

作成においてもほぼデフォルトですが、注意点として 価格レベルは基本(Basic) 以上でないとインデックスが作れないのでご注意ください。(画像はStandardですが、FreeでなければOKです)
image.png

プランは以下のように用意されていますが、 「基本(Basic)」 以上にしてください。
プランを選んだら左下の「Select」を押せば決定できます。
image.png

レプリカやパーティションはご自身の環境に合わせて決定してください。(今回はデフォルト。Freeは変更不可)

■ 1-4. Blob Storage を作成

  • ストレージアカウント名:任意
  • ストレージの種類:Azure Blob Storage
  • パフォーマンス:Standard
  • 冗長性:ローカル冗長ストレージ(LRS)
    ストレージアカウントを検索し、ストレージアカウントを作成してください。
    image.png

Storage Accountが作成出来たら 「データストレージ」 から 「コンテナー」 を選択。
左上の 「コンテナーの追加」 で新しいコンテナーを作成(名前は任意)
image.png

※コンテナできました。
image.png

コンテナが出来たらファイルをアップロード

image.png

※アップロードしたファイルについて

RAGで検索するために以下の架空の人物のプロフィールを格納しています。
それぞれ一人ずつTextファイルとWordファイルに分けて作成しています。
※長いので非表示にしています。▶を押して開いてください。

プロフィール

① 山田 遼(やまだ りょう)

年齢:32
性別:男性
出身地:北海道札幌市
職業:プロダクトマネージャー
趣味:登山、クラフトビール巡り
特技:複雑な課題を分解して整理すること
座右の銘:「迷ったら、よりワクワクする方へ」
好きな食べ物:スープカレー
将来の夢:地方の若者向けにテック教育の学校を作ること
子供時代:好奇心旺盛で、家の家電を分解しては怒られていた。自由研究は毎年ロボット関連で、学校でも「機械のりょう」と呼ばれていた。


② 佐藤 美咲(さとう みさき)

年齢:28
性別:女性
出身地:東京都世田谷区
職業:グラフィックデザイナー
趣味:美術館巡り、写真撮影
特技:色彩感覚と構図のセンス
座右の銘:「美しさは細部に宿る」
好きな食べ物:ティラミス
将来の夢:自分の作品集を出版し、海外のギャラリーで展示すること
子供時代:幼い頃から絵を描くのが好きで、ノートの端はいつも落書きでいっぱい。小学校の図工の時間は誰よりも楽しみにしていた。


③ 中村 海斗(なかむら かいと)

年齢:41
性別:男性
出身地:福岡県福岡市
職業:システムエンジニア
趣味:釣り、ガジェット収集
特技:トラブルシューティング
座右の銘:「焦らず、慌てず、諦めず」
好きな食べ物:明太子パスタ
将来の夢:海沿いに小さなコワーキングスペースを作ること
子供時代:外で遊ぶより室内でゲームやパソコンに触れる時間が多かった。中学生の頃には自作 PC を組み立てていた。


④ 高橋 さくら(たかはし さくら)

年齢:35
性別:女性
出身地:京都府京都市
職業:小学校教師
趣味:読書、ヨガ
特技:子どもたちの個性を見抜くこと
座右の銘:「学びは一生の宝」
好きな食べ物:抹茶スイーツ
将来の夢:教育に関するエッセイ本を出版すること
子供時代:本が大好きで、図書館に入り浸っていた。友達に勉強を教えるのが得意で、自然と「先生になりたい」と思うようになった。


⑤ 井上 翼(いのうえ つばさ)

年齢:30
性別:男性
出身地:大阪府堺市
職業:スタートアップ経営者
趣味:ランニング、海外旅行
特技:人を巻き込むリーダーシップ
座右の銘:「挑戦しない後悔より、挑戦した後悔」
好きな食べ物:たこ焼き
将来の夢:自社サービスを世界展開すること
子供時代:活発で負けず嫌い。学級委員や部活のキャプテンを務めることが多く、周囲から頼られる存在だった。



STEP 2:Foundry UI でインデックスを作成

  1. Foundry の「データソース」で Blob Storage を接続
  2. プロファイル情報を読み込み
  3. 「インデックス作成」から Azure AI Search にインデックスを作成
  4. インデックス:任意
    始めに、Microsoft Foundryに改めて移動し、管理センターに移動します。

移動したら 「Connected resources」「+新しい接続」 を選択します。
image.png

外部資産への接続を追加する で 「ストレージアカウント」 を追加します。
image.png

ストレージアカウントの追加で 「接続を追加する」 を押下します。
※認証はAccount keyでOKです。(Entra ID等ご自身の環境に合わせていただいてもOKです)
image.png

接続済みになったらOK
※接続されているリソースの一覧(Connected resources)に戻ったらこの接続も追加されているはずです。
image.png

改めてMicrosoft Foundryに戻ります(「Go to project」押下でも戻れます)
戻ったら 「プライグラウンド」「チャットグラウンド」 を選択します。
image.png

切り替わったら、チャットプレイグラウンドの 「データを追加する」 を展開し、 「+データソースの追加」 を押下します。
image.png

データソースには「Azure Blob Storage(プレビュー)」を選択します。
image.png

データ管理ではそれぞれ作成したリソースを選択してください(サブスクリプション、ストレージリソース、ストレージコンテナー、Azure AI Search)インデックス名は任意です。
インデクサーのスケジュールも今回はOnce(一回)にしましたが、デイリーとか選べるので好きなものを選んでください。
image.png

検索の種類・サイズはデフォルトで選択しています(セマンティック、1024)※こちらも適宜チューニングしてください。
image.png

データ接続はAPIキーを選択します(こちらもご自身の環境に合わせてください。)
image.png

上手く接続できるとデータソースやリソースの種類などが表示され、右のプロンプトに何か打ち込むと回答が返ってきます。(画像では資料を認識しているか確認するために「資料は何がありますか?」と質問しています。)
image.png


STEP 3:プロンプトの準備

■ 3-1. プロジェクトフォルダを作成する

何でも良いです。ここに.envとPythonコードを入れます。
(慣れている方はやり易いように作ってください。)

■ 3-2. .envファイルを作成する

プロジェクト直下に .env を作成し、以下を記述:

AZURE_OPENAI_ENDPOINT=<OPEN-AIのリンク>
AZURE_OPENAI_KEY=<Azure OpenAI のキー>
AZURE_SEARCH_ENDPOINT=<Searchのリンク>
AZURE_SEARCH_KEY=<Search の管理キー>
AZURE_SEARCH_INDEX=<インデックス名(当方はtag-test-index)>

※<>で囲まれている範囲を<>ごと(<>を含めず)変更してください。
なお、上の二つのOpenAI関連はAzure Open>AIのリソースの「キーとエンドポイント」で確認できます。
image.png

※もしAIモデルについてエラーが出たら以下のところからも情報を取得できるので置き換えてみてください。
MS Foundry ⇒ モデルカタログ ⇒ 既存のデプロイ ⇒ エンドポイントの取得
image.png

SearchのリンクはAzure AI Searchのリソースの概要にあります。
image.png

Serchの管理キーはAzure AI Searchの設定⇒キーにあります。
image.png

APIキーの取り扱いには十分にお気を付けください。
そのままGithubなどに上げないようにしてください。

■ 3-3. Python コードを作成

ファイル名を適当にして以下のコードを張り付けてください。(一部修正ポイントあり)
※ここではファイル名は「rag_test.py」にしています。

import os
from dotenv import load_dotenv
from azure.search.documents import SearchClient
from azure.core.credentials import AzureKeyCredential
from openai import AzureOpenAI

load_dotenv()

# Azure OpenAI クライアント
client = AzureOpenAI(
    azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"),
    api_key=os.getenv("AZURE_OPENAI_KEY"),
    api_version="2024-10-21" # ← 指定しないとエラーになるので、ご利用のものと合わせてください
)

# Azure AI Search クライアント
search_client = SearchClient(
    endpoint=os.getenv("AZURE_SEARCH_ENDPOINT"),
    index_name=os.getenv("AZURE_SEARCH_INDEX"),
    credential=AzureKeyCredential(os.getenv("AZURE_SEARCH_KEY"))
)

def search_documents(query):
    """Azure AI Search で検索して content をまとめて返す"""
    results = search_client.search(query)
    docs = []
    for r in results:
        docs.append(r["content"])
    return "\n\n".join(docs)

def ask_rag(question):
    """検索 → LLM に渡して回答を生成"""
    context = search_documents(question)

    response = client.chat.completions.create(
        model="aoai-Deploy-name-eastus2",  # ← Azure OpenAI のデプロイ名(ここは変更してください。モデル名ではありません!)
        messages=[
            {"role": "system", "content": "以下のコンテキストを使って質問に答えてください。"},
            {"role": "user", "content": f"質問: {question}\n\nコンテキスト:\n{context}"}
        ]
    )

    return response.choices[0].message.content

if __name__ == "__main__":
    while True:
        question = input("質問を入力してください(終了するには exit と入力): ")

        if question.lower() == "exit":
            print("終了します。")
            break

        answer = ask_rag(question)
        print("\n回答:", answer)
        print("-" * 40)

■ 3-3. 必要なライブラリをインストール(必要な場合)

ターミナル(PowerShell)で以下実行:

pip install azure-search-documents openai python-dotenv

以上で大方準備は完了です。


STEP 4:実行

ここまで準備が出来たら後は実際に動かしてみます。

まず、Powershellを立ち上げたら.env及びpythonファイル(rag_test.py)が置いてあるフォルダに移動(>cd パス名)します。

そして以下を実行

> python rag_test.py

すると:

質問を入力してください(終了するには exit と入力):

と表示され、自由に質問できます。
image.png

実際に色々質問してみました。

PS C:\Users*****\OneDrive\デスクトップ\RAGテスト用> python rag_test.py
質問を入力してください(終了するには exit と入力): 誰の情報がありますか?

回答: 提供された情報には、高橋さくらさん、佐藤美咲さん、山田遼さん、井上翼さん、中村海斗さんの5人のプロフィールがあります。各人物の年齢、性別、出身地、職業、趣味、特技、座右の銘、好きな食べ物、将来の夢、子供時代のエピソードが含まれています。質問があれば、具体的にお聞きください。


質問を入力してください(終了するには exit と入力): 佐藤さんの趣味を教えてください。

回答: 佐藤さんの趣味は美術館巡りと写真撮影です。


質問を入力してください(終了するには exit と入力): 高橋さんの座右の銘を教えてください。

回答: 高橋さんの座右の銘は「学びは一生の宝」です。


質問を入力してください(終了するには exit と入力): 全員の平均年齢を教えてください。

回答: 全員の年齢は以下の通りです:

  • 井上 翼: 30歳
  • 高橋 さくら: 35歳
  • 山田 遼: 32歳
  • 佐藤 美咲: 28歳
  • 中村 海斗: 41歳

これらの年齢を合計すると、30 + 35 + 32 + 28 + 41 = 166歳です。

人数は5人なので、平均年齢は166 ÷ 5 = 33.2歳です。

したがって、全員の平均年齢は33.2歳です。


質問を入力してください(終了するには exit と入力): 明太子パスタが好きな人は誰ですか?

回答: 明太子パスタが好きな人は中村海斗(なかむら かいと)です。


質問を入力してください(終了するには exit と入力): たこ焼きが好きな人はいますか?

回答: はい、たこ焼きが好きな人はいます。井上翼さんがたこ焼きが好きな食べ物として挙げています。


質問を入力してください(終了するには exit と入力): チョコフォンデュが好きな人はいますか?

回答: コンテキストに提供された情報には、チョコフォンデュが好きということを示唆する人は含まれていません。ただし、好きな食べ物や趣味が異なる他の人物が紹介されていますので、特にチョコフォンデュ好きの方については分かりません。もし具体的にチョコフォンデュが好きな人を知りたい場合は、他の情報源や個人に尋ねる必要があります。


質問を入力してください(終了するには exit と入力): IT業界に関わっている人は誰ですか?

回答: IT業界に関わっている人は以下の2名です。

  1. 山田 遼(やまだ りょう) - プロダクトマネージャーとしてテック教育の学校を作ることを夢見ています。
  2. 中村 海斗(なかむら かいと) - システムエンジニアとして、トラブルシューティングの特技を持っています。

他の人物は異なる職業に従事しているため、IT業界には関わっていません。


質問を入力してください(終了するには exit と入力): 女性を教えてください。

回答: 高橋さくらさん(35歳)は、京都府京都市出身の女性で、小学校教師として働いています。趣味は読書やヨガで、特技は子どもたちの個性を見抜くことです。座右の銘は「学びは一生の宝」で、抹茶スイーツが好きです。将来の夢は教育に関するエッセイ本を出版することで、子供時代は本が大好きで図書館に入り浸っていたそうです。友達に勉強を教えるのが得意で、自然と「先生になりたい」と思うようになったとのことです。

もう一人の女性、佐藤美咲さん(28歳)は、東京都世田谷区出身でグラフィックデザイナーをしています。趣味は美術館巡りや写真撮影で、特技は色彩感覚と構図のセンスです。座右の銘は「美しさは細部に宿る」で、ティラミスが好きです。将来の夢は自分の作品集を出版し、海外のギャラリーで展示すること。子供時代から絵を描くのが好きで、ノートの端はいつも落書きでいっぱいだったそうです。


質問を入力してください(終了するには exit と入力):exit
終了します。

実際に用意したプロフィール(blobに格納したファイル)と照らし合わせて正確に回答できていることを確認しました。

まとめ

今回の構成は、Azure の RAG を最小構成で動かすことを目的に最小構成で作っています。
最低限なのでコストはほとんどかかっていませんが、OpenAIやAzure AI Search、Blobなどは有料リソースなので十分にご理解いただいた上でご利用ください。
また、使わない場合は後からプラン変更できないものもあるため、リソースの削除をお勧めします。
※当方も既にすべて削除しました。

最後に

今回初めてRAGを組んでみましたが、非常に簡単に作れました。
色々エンドポイント(URL)やAPIがあるので、適切に用意・指定ができればそれほど難しいものではないかなと思います。
今後はデータ構造化やDatabase(NoSQLなど)との連携も試していきたいと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?