OpenAI × 長期記憶 × DynamoDB 取得編 2023/7/22
OpenAIに長期記憶を実装したい
dynamoDBを使ってみる
2023/07/22 0:04
ラボの活動の一環で、OpenAIを使ったLINEBOTのサービス開発に挑んでいます。
その中で、長期記憶の実装という課題があって、これがなにかというと
いつも使ってるChatGPTには元々ある程度の会話記憶機能が
ついているんですが、OpenAIのAPIとしてGPTを使った場合
一切の会話記憶機能を持たなくなります。
いつも「はじめまして」の状態になっちゃうんです。
これはなぜかというとそもそもAPIはRESTという設計モデルに基づいてデータの送受信が行われているんですが、そのRESTの設計原則の一つに
ステートレスがあります。
ステートとは状態、レスとはそれが無いということなので状態を持たない、
つまりクライアントの情報を一切保持しないという意味です。
RESTについては詳しくはこちら参照↓
ユーザーの情報とか会話履歴をDynamoDBというAWSのデータベースに保持して使うことにしました!
テーブル作成とラムダの権限設定まではこちらの記事を参照↓
上記の記事を参考にテーブル作成とBOT用に作っておいたラムダ関数に
DynamoDBへアクセス出来る権限を設定しました。
試しに作ったDynamoDBのテーブルに適当に値を入れておきます。。。
次に、DynamoDBから値を取得するためにPythonのライブラリであるboto3を使います。
import boto3
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('bot_test')
dbselect = table.get_item(Key={
'id': '1234'})
items = dbselect['Item']
↑ソースコード、dynamodbを呼び出してるところだけ抜粋するとこんな感じ。
★解説★
dynamodb = boto3.resource('dynamodb')
→初期化処理。
table = dynamodb.Table('bot_test')
→取得するテーブルの名前。
dbselect = table.get_item(Key={ 'id': '1234'})
→get_itemメソッドでKeyに設定された値と一致するプロパティをbot_testテーブルから取得してくる。
items = dbselect['Item']
→['Item']の中には取得した情報が全て入っている。
例えばidを参照したい場合は
items['id']でidの値を参照出来る。
ちなみにboto3をLambdaで使う場合レイヤーに追加する必要があります。
レイヤー追加の方法は以下の記事の「Lambda Layerに設定するBoto3の準備」から参考になります。バージョンは最新のでいいです。
で、レイヤー追加して
使ってみたけど
boto3をレイヤー追加してからずっとこれに悩まされる
調べた結果
なんと!先月から
この症状でるようになったんだとか><
で、記事に書いてあるやり方でなぜか出来なかったので別のやり方で
試すが治らず。
urllib3が原因じゃないのか?と思って調べていると…
あー。なるほど、zip固める前のフォルダ名は「python」じゃないとだめだったのか。
フォルダ名適当にして固めてたわ。
それはあかん。
で、もう一回試したらできましたw
urllib3全然関係なかったですw
user_name = items['user_name']
goal = items['goal']
print(user_name)
print(goal )
取得出来ているかどうか確かめるために取得したuser_nameとgoalをprintで
ログに吐き出してみます。
こんな感じでログに吐き出されました!(^^)
参考にした記事↓
長期記憶を実装する為にはDBから参照するだけじゃなくて会話履歴を
DynamoDBに保存して、それをOpenAIにリクエストしなきゃいけません。が、いったんここまで!
こちらの記事に、長期記憶の詳しいソースコードが置いてます!
有料ですが興味ある方ぜひ♪↓
この記事が気に入ったらサポートをしてみませんか?