見出し画像

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作成編


この記事が気に入ったらサポートをしてみませんか?