Azure OpenAIでRAGが簡単にできるようになっていた
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()
ディスカッション
コメント一覧
まだ、コメントがありません