Azure OpenAIでRAGが簡単にできるようになっていた

2024年12月6日

Azure OpenAIの研修を受けていて、RAGのやり方が変わったことに気づいたのでメモがてら記事に残しておきます。

RAGの流れ

Ⅰ:以前までの方法(私の認識、ざっくりした流れ)

①アプリがユーザプロンプトをAzure OpenAIに渡し、Azure OpenAIがアプリにAI Searchの検索クエリを返信する

②アプリが検索クエリを元に、AI Searchに検索クエリを投げる

③AI Searchからの回答結果をアプリが受け取り、AI Searchからの回答結果(+最初のユーザプロンプト)を Azure OpenAIに渡し、最初のユーザプロンプトに対する回答を返信する

Ⅱ:今回新たに知った方法

①アプリがユーザプロンプトとAI Searchに関する情報(エンドポイント、キー、インデックス名)をAzure OpenAIに渡し、Azure OpenAI側でAI Searchクエリ作成実行し、AI Searchからの回答結果とユーザプロンプトの内容を踏まえて回答を作成し、アプリに返信する

補足

  • 以前はざっくり3ステップ必要だったのが、1ステップでRAGができるようになったようです。
  • 新しい方法だと、Azure OpenAIがどのような検索クエリを作って、AI Searchに検索投げているかなどがブラックボックスになると思うので、ユーザプロンプトに対しての期待した回答結果が得られない場合、切り分け、対処が難しくなりそう。。。

「Ⅱ:今回新たに知った方法」を実現するための具体的なアプリのコード

こちらの演習サイトで紹介されていました。

https://learn.microsoft.com/ja-jp/training/modules/apply-prompt-engineering-azure-openai/5-exercise

背景を黄色にしている箇所が関連個所です。

import os
import json
from dotenv import load_dotenv
# Add OpenAI import
from openai import AzureOpenAI

def main():
    try:
        # Flag to show citations
        show_citations = False

        # Get configuration settings
        load_dotenv()
        azure_oai_endpoint = os.getenv("AZURE_OAI_ENDPOINT")
        azure_oai_key = os.getenv("AZURE_OAI_KEY")
        azure_oai_deployment = os.getenv("AZURE_OAI_DEPLOYMENT")
        azure_search_endpoint = os.getenv("AZURE_SEARCH_ENDPOINT")
        azure_search_key = os.getenv("AZURE_SEARCH_KEY")
        azure_search_index = os.getenv("AZURE_SEARCH_INDEX")

        # Initialize the Azure OpenAI client
        client = AzureOpenAI(
            base_url=f"{azure_oai_endpoint}/openai/deployments/{azure_oai_deployment}/extensions",
            api_key=azure_oai_key,
            api_version="2023-09-01-preview"
        )

        # Get the prompt
        text = input('\nEnter a question:\n')

        # Configure your data source
        extension_config = dict(
            dataSources=[
                {
                    "type": "AzureCognitiveSearch",
                    "parameters": {
                        "endpoint": azure_search_endpoint,
                        "key": azure_search_key,
                        "indexName": azure_search_index,
                    }
                }
            ]
        )

        # Send request to Azure OpenAI model
        print("...Sending the following request to Azure OpenAI endpoint...")
        print("Request: " + text + "\n")

        response = client.chat.completions.create(
            model=azure_oai_deployment,
            temperature=0.5,
            max_tokens=1000,
            messages=[
                {"role": "system", "content": "You are a helpful travel agent"},
                {"role": "user", "content": text}
            ],
            extra_body=extension_config
        )

        # Print response
        print("Response: " + response.choices[0].message.content + "\n")

        if show_citations:
            # Print citations
            print("Citations:")
            citations = response.choices[0].message.context["messages"][0]["content"]
            citation_json = json.loads(citations)
            for c in citation_json["citations"]:
                print("  Title: " + c['title'] + "\n    URL: " + c['url'])

    except Exception as ex:
        print(ex)

if __name__ == '__main__':
    main()

AI Services

Posted by mitsuru