Azure OpenAI x Pinecone x TeamsでFAQ検索ボットを作成する~postgresqlアップロード編
この記事について
この記事ではApp ServiceのPostgreSQLへのアップロードが行えるところまでを解説しています。ところどころソースは載せていますが、常に最新とはいかないので、参考までにしてください。
手順
1.App Serviceを作成する
App Serviceで作成するのは「Webサービス+データベース」です。
・基本
地域はどこでも大丈夫です。私は「Japan East」にしました。
・Webアプリの詳細
名前は好きな名前で大丈夫ですが、urlにもなるので注意が必要です。
Webアプリ名+.azurewebsites.netがurlになります。
ランタイムスタックは今回は「python3.11」を選択しました。
・データベース
エンジンは今回は「PostgreSQL - Flexible Server」を選択しました。自分が使いやすいものでいいと思ます。
・サーバ名、データベース名はわかりやすいものを付けます。
・Azure Cache for Redis を追加しますか?は「いいえ」で大丈夫です。
・ホスティング プランは今回「Basic」にします。トライアルですからね。
2.データベース情報の取得
作成したApp Serviceを開くと、左側のペインに設定があるので構成を開きます。画面の中ほどに「AZURE_POSTGRESQL_CONNECTIONSTRING」があり、データベースの名前や、ホスト名、ユーザー名、パスワードなどを見ることができるので、コピーして保存しておきます。
3.flask db init/flask db migrate/flask db upgrade
まず、ゼロからapp.pyを作るのはつらいので。。。Azureの公式ホームページ、Deploy a Python (Django or Flask) web app with PostgreSQL in Azureこちらのリンクからサンプルをダウンロードしてしまいましょう。最終的に使うのはapp.pyとmodels.pyぐらいですが。。。
models.pyを自分の都合の良いカラムで作成します。
#models.py
from sqlalchemy import Column, Integer, String
from app import db
from initcloud import pcone as pcn
class originaldata(db.Model):
__tablename__ = 'faqdata'
id = Column(Integer,primary_key=True)
textdata = Column(String(1000 + 1))
url = Column(String(200 + 1))
title = Column(String(100 + 1))
def __init__(self,id,textdata,url,title):
self.id = id
self.textdata = textdata
self.url = url
self.title = title
書いてみたんですが、__init__っているんですかね。。。不明です。
サンプルにはいろいろ書いてあって、サブフォルダーのpyまで参照していますが、
#app.pyの抜粋
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy
SQLALCHEMY_DATABASE_URI = 'postgresql://{user}:{password}@{host}/{name}'.format(**{
'user': '上の手順でユーザー名は取得済み',
'password': '上の手順でパスワードは取得済み',
'host': '上の手順でhost名は取得済み',
'name': '上の手順でデータベース名は取得済み'
})
app.config['SQLALCHEMY_DATABASE_URI'] = SQLALCHEMY_DATABASE_URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_ECHO']=True
# データベースへの接続を初期化します
db = SQLAlchemy(app)
# この1行で"flask db init/migrate/upgrade" が機能します。
# 超重要ではないかなと。
migrate = Migrate(app, db)
# このインポートはdbの初期化の後にする必要があります。循環インポートの問題があるため
from models import faqdata
if __name__ == '__main__':
with app.app_context():
db.create_all()
app.run()
削って行ったら、これでもなんとかなりました。そして、私のやり方では with app.app_context(): db.create_all()
このパートは機能せず。
・flask db init
azureのサンプルでやると、すでにinitは実行済みなので、怒られます。
・flask db migrate
なにか起きます。
・flask db upgrade
なにか起きます。
出力された文字を読んでいる時間が惜しかったので。。。
結局うまくいったかどうかはApp Serviceのsshでsshに接続して、
apt install -y postgresql-client
クライアントをインストールして直に確認しました。毎回入れないといけないのが面倒なんですけどね。
4.アップロード
アップロードはAzure上のDBには直接できないので、App Service経由でアップロードします。app.pyに次のようなコードを追加します。
#app.py
@app.route('/update', methods=['POST'])
def update_data():
try:
id = request.json["id"]
text = request.json["textdata"]
url = request.json["url"]
title = request.json["title"]
except:
return('{"Status":"Nothing"}')
# この行でmodelsに沿うようにデータを入れておくこのデータをaddすることになる。
data = faqdata(id=id,textdata=text,url=url,title=title)
count = db.session.query(faqdata).filter_by(id=id).count()
if(count != 0):
db.session.query(faqdata).filter_by(id=id).delete()
db.session.add(data)
db.session.commit()
return('{"Status":"Update"}')
else :
db.session.add(data)
db.session.commit()
return('{"Status":"Insert"}')
何のことはなく、POSTで送られてきたjsonをmodels.pyに書いたようにデータを分解してdbにidがあるかどうかをqueryしてあれば、消して書き換える、なければ、追加するというだけの操作です。コスト的にどうなのかは私にはわからないです。
db.session.query(faqdata)
これがちょっとはまってdb.session.query(modelsからカラムを持ってくる)という意味だったんですね。sqlalchemyを普段から使っていると常識なんでしょうけど、なにせ初利用だったので、はまりました。
5.検索
psqlで接続してselect * from faqdata;でいいと思います。
相互リンク
概要編
Pineconeアップロード編
pineconeにqueryを投げる+LLMで回答を作成する編
Logic App作成編
この記事が気に入ったらサポートをしてみませんか?