Skip to content

宿泊施設の提案機能の追加#30

Merged
korryu3 merged 29 commits intomainfrom
features/reservation
Feb 14, 2024
Merged

宿泊施設の提案機能の追加#30
korryu3 merged 29 commits intomainfrom
features/reservation

Conversation

@korryu3
Copy link
Copy Markdown
Owner

@korryu3 korryu3 commented Feb 9, 2024

概要

宿泊施設の提案機能を追加しました。

Booking.comのAPIを使う条件がいまいちよく分からなかったので、楽天のAPIを使って情報を叩くようにしています。
なので、予約を自然言語で実現する機能はありません。無念。

変更点

LangChain, FastAPIなどのバージョンアップ

必ずpip install -r requirements.txtを実行してください。

Azure App InsightsにLogを送信

エラーが起きた際は、Azure Application Insightsにログを飛ばすようにしました。
また、デバッグ用にsrc/logs/にも飛ばすようにしています。

楽天APIを用いた宿泊施設情報の取得

LangChainのAgentsのToolで、必要であれば楽天の宿泊施設の情報を取得するようにしました。
動作的にはTripadvisorの際とほぼ同じです。

フォーマッターを用いたプログラムの整形

Black Formatter, isortを使い、プログラムをフォーマットしています。
変更箇所は多いですが、プログラムの動き自体は変わっていない箇所が多いです。
特に、tripalgpt.py辺りはこれによる変更が多いです。

/set-cookieエンドポイントを追加

session用のCookieをセットできるエンドポイントを追加しました。
セット内容は20文字のランダムな文字列です。
今のところ実験的な試みなので、フロントからリクエストを送らなくても問題ないです。

その他

  • markdownブランチでrequirements.txtが更新?されているから、コンフリクトしないか怖いねえ
  • プロンプトインジェクションが思いの外硬すぎたので、prompt_injection_defense()は一つにしてます。

ユーザーに問いかける内容を厳格にしました。
入出力のlog取得のために色々実験
DBへの履歴保存のために、Sec-Websocket-Keyを用いてprimary keyを作る予定

また、ローカルのログ保存として、loggingを使用
一応ファイルに落ちるようにはしてるけど、今後どうするかは未定
if文の条件の明示化
log出力先をlogsディレクトリに変更。エラーはファイルに書き出す。
例を追加したり色々
LangChain、並びにその他の依存関係のバージョンを上げました。
そのため、必ず`pip install -r requirements.txt`を再度実行してください。
PEP8に準拠したコードフォーマットを行うために、Black Formatterとisortを導入しました。
いろいろ変わってますが、コード自体は変わっていません。
実験的に、app.pyに /set-cookie を追加しました。
ここにリクエストを送ると、cookieを設定することができます。
セットするcookieは、ランダムな20文字の文字列です。

また、returnとして、"message"と"session_id"を返します。
下記のような重大な脆弱性が報告されているようなので、パッチを適用しました。
若干バージョンが上がっています。

報告されている脆弱性は、FastAPIのバージョン0.109.0未満に存在する脆弱性です。

---

<h2>脆弱性のサマリー</h2>
form dataを使用するとき、python-multipartはHTTP Content-Typeヘッダーを正規表現で解析しますが、この正規表現に対して攻撃者が特殊なオプションを送信すると、CPUリソースを消費し、メインイベントループを停止させることができます。
これはReDoS(正規表現によるサービス拒否)と呼ばれる攻撃です。

<h2>影響範囲</h2>
この脆弱性は、python-multipartというパッケージを使用してform dataを解析するStarletteというフレームワークにも影響します。
Starletteは、FastAPIの基盤となっています。
PEP8に準拠していないコードをチェックするために、Flake8を導入しました。

VSCodeの拡張機能として利用できます。
私はそれで使っています。
Toolで楽天トラベルの宿泊施設の情報を取得する機能を追加しました。

取得できる情報としては、ホテル名、特徴、郵便番号、住所1、住所2、電話番号、ホテル情報URL、宿泊プラン一覧ページ、最低料金、アクセス方法があります。
エラーが起きた際に、ログをAzure Application Insightsに送信するようにしました。
既存のログハンドラーに加えて、AzureLogHandlerを追加しました。

また、そのために`APPLICATIONINSIGHTS_CONNECTION_STRING`という環境変数を追加しました。
何をインストールすべきかは、いつかpyproject.tomlに移行すると思う。
環境変数の読み込み位置を修正しました。
今までなんでAzureLogHandlerが動いてたのか、謎で仕方がない。
デプロイ後のデバッグがしやすいように、ログに出力する情報を追加しました。

特にFunction Callingで起きたバグは原因を特定しずらいからね。
@korryu3
Copy link
Copy Markdown
Owner Author

korryu3 commented Feb 12, 2024

謎バグとコンフリクト直しといた

@korryu3
Copy link
Copy Markdown
Owner Author

korryu3 commented Feb 12, 2024

Azure Application Insightsにログを送信できないバグに遭遇。原因不明。意味不明

info情報は全部common.logに出力するように設定
普通に意味不明なので、Azure Application Insightsへのデバッグログは諦めました。
これについてはissueも立てているので、何か解決策が見つかればまた挑戦したいと思います。
@korryu3
Copy link
Copy Markdown
Owner Author

korryu3 commented Feb 13, 2024

#33
これは一旦諦めた。
マージが遅くなるのだけは避けたい。

logファイルは今まで通りgitで管理しないが、logsディレクトリはgitで管理するように変更する。
また、logsの中身はgitで管理しないように.gitignoreを追加。
ローカルはos.chdirでpathが変わるが、dockerでは初めからsrcディレクトリにいるため、pathが異なることでエラーが起きていた。
そこで、func_call_toolsディレクトリの中でos.chdirを使っていた部分を修正し、pathを絶対パスで指定することで解消した。

三項演算子を使っているため、よくわからない部分があるかもしれないが、単にsrcディレクトリにいるかどうかでpathを変えるようにしているだけ。
@korryu3 korryu3 merged commit d57d739 into main Feb 14, 2024
@korryu3 korryu3 deleted the features/reservation branch February 14, 2024 11:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants