お仕事でめちゃくちゃ忙しくなりまして、更新が出来ずにおりました。
忙しくなった理由の1つとしてAzureなんですが、わたくしAzure触ったことありませんで、何をしようにも試行錯誤の日々になっております。。。
これまでRAGなどを机上で見てきたわけですが、お鉢が回ってきたということですなぁ。。。
というわけで、お勉強したことを何回かに分けて放出してみる。
azure-search-openai-demoのアプリ部分を抜き出したい
ひとまずのテーマはこれ。bicep(IaaC)を使ってワンタッチでプロビジョニング&デプロイをしてくれるのはいいんだけど、そんなのはお客様環境では怖くて出来ないわけで、なんとかアプリ部分だけ抜き出してよしなにしたい。
https://asashiho.github.io/azure-search-openai-demo/#/
資材としては↑のページを参考に作業を実施する。
実際どんなことをしたいかというと、Vnet上にAzureOpenAIやCognitiveSearviceを配置して、PrivateEndpoint経由でアプリケーションとやり取りできるようにしたい。
このハンズオンではすべてのサービスは公開設定になっていてどこからでもアクセスできるようになっているので、自分のニーズにはあっていない。だが、UIや裏のロジックなどはある程度流用できるとうれしい、というわけですね。
ただ、いきなり抜き出すのはわけがわからなくなるので、まずはどんな仕組みになっているかの理解から。
azd upではデプロイできない
環境構築はハンズオンページに任せるとして、2か所直さないとデプロイがされませんでした。
①predocs.shでエラー
これは改行コードがCR+LFだったため。LFに修正すると動くようになる。
②requirements.txtの記載不足でエラー
app/backend/requirements.txtに「Werkzeug==2.3.7」を追加。
↓はデプロイしたときのエラーログ。
ハンズオンでのプロビジョニング+デプロイの流れ
全体の流れ
ログや資材などからの推測になるけど、整理をしてみる。
以下はazd upを実行したときのVScodeのコンソールログ。
vscode ➜ /workspaces/azure-search-openai-demo (workshop) $ azd up
(中略)
(✓) Done: Resource group: aoai-workshop
(✓) Done: App Service plan: plan-gn6fybhzdg24g
(✓) Done: Form recognizer: cog-fr-gn6fybhzdg24g
(✓) Done: Storage account: stgn6fybhzdg24g
(✓) Done: Azure OpenAI: cog-gn6fybhzdg24g
(✓) Done: Azure API Management: apim-gn6fybhzdg24g
(✓) Done: Search service: gptkb-gn6fybhzdg24g
(✓) Done: App Service: app-backend-gn6fybhzdg24g
Executing postprovision hook => ./scripts/prepdocs.sh
azd upを実行すると、資材直下のazure.yamlを見に行くようになっている。
azure.yamlの中は割とシンプルで、
①./app/backendを対象にデプロイするよ
②でもその前に、frontendの中身をビルドしてね。「cd ../frontend; npm install; npm run build」がコマンド。
③インフラ回りのプロビジョニングが終わったら、predocs.shを実行してね。「./scripts/prepdocs.sh」
となっている。
①はazd deployに関係してくるので一旦スルー。
②が実行されてからのプロビジョニング。↑のログの「Done:XXXXXX」となってる部分。
それが終わると③が実行されて、最後に①の資材がApp Serviceにデプロイされる。
という形。
プロビジョニングの流れ
infraフォルダのmain.bicepが実行される。
RAGを実現する上でパラメータ的に重要なのが以下のパラメータ。
param searchIndexName string = 'gptkbindex'
param gptDeploymentName string = 'davinci'
param gptModelName string = 'gpt-35-turbo-16k'
param chatGptDeploymentName string = 'chat'
param chatGptModelName string = 'gpt-35-turbo-16k'
param embeddingDeploymentName string = 'embedding'
param embeddingModelName string = 'text-embedding-ada-002'
searchIndexName・・・アプリケーションで指定されるCognitiveSearchのインデックスの名前。
gptDeploymentName・・・ドキュメントサーチに使用するAOAIのデプロイ名。(モデル名ではない。)
gptModelName・・・ドキュメントサーチに使用するGPTのモデル。
chatGptDeploymentName・・・チャットに利用するAOAIのデプロイ名。
chatGptModelName・・・チャットに利用するGPTのモデル。
embeddingDeploymentName・・・embeddingをするAOAIのデプロイ名。
embeddingModelName・・・embeddingをするモデル名。
(モデル名以外は)AppServiceの環境変数に使われている模様です。
main.bicepの中身はめちゃくちゃ長いけど、やっていることはリソースをがちゃがちゃ書いてあるだけなので、割愛。
VnetとかSubnetとかネットワーク作成のコードもあったけど、実際には作られてなかった。何故だろう?未確認。
デプロイの流れ
ここの仕組みがよくわからんくて、理解するのに結構時間がかかった。
ここの理解に必要だったのが、main.bicepに書かれていた、
appCommandLine: 'python3 -m gunicorn "app:create_app()"'
scmDoBuildDuringDeployment: true
の2つ。
appCommandLineは、AppServiceにパッケージを送った後、docker runで指定されるコマンドラインのこと。
scmDoBuildDuringDeploymentは、trueになっているとプロジェクトのルートフォルダのpip install -r requirements.txtを実行する。つまりここでは、.app/requirements.txtを対象にpip installが行われる。(https://learn.microsoft.com/ja-jp/azure/app-service/configure-language-python)
同フォルダの中にはstart.shというファイルが入っているけど、それは全く使われていない様子。最初のうちはstart,shがどこで実行されてるんだ?という探し方をしてたんだけど、実行されてる気配がなかったのでだいぶ理解に苦しんだ・・・。
まとめ
azure-openai-search-demoのプロビジョニング~デプロイまでの流れをある程度理解しました。
azd upを実行した後の動きを見る限りでは、アプリだけを抜き出すのは簡単でappフォルダだけ持ってきてしまえばいいというところまでは分かった。
ただ、アプリの中にはCognitiveSearchを見に行ったりだとか、AADの認証?してたりだとかで、アプリだけをデプロイするのにも割と試行錯誤をした感じ。その奮闘はまた次の記事で。