見出し画像

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のテーブルに適当に値を入れておきます。。。

bot_testというテーブルを作りました。goalは目標です。
作っているBOTはトレーニングBOTです!(^^)

次に、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」が、つい2週間前(2023年6月前半)にLatestが、
1系から2系になったことによるものらしい。

なんと!先月から
この症状でるようになったんだとか><

で、記事に書いてあるやり方でなぜか出来なかったので別のやり方で

試すが治らず。
urllib3が原因じゃないのか?と思って調べていると…

あー。なるほど、zip固める前のフォルダ名は「python」じゃないとだめだったのか。
フォルダ名適当にして固めてたわ。
それはあかん。
で、もう一回試したらできましたw
urllib3全然関係なかったですw

user_name = items['user_name']
goal = items['goal']
print(user_name)
print(goal )

取得出来ているかどうか確かめるために取得したuser_nameとgoalをprintで
ログに吐き出してみます。

上がuser_name
下がgoal

こんな感じでログに吐き出されました!(^^)

参考にした記事↓


長期記憶を実装する為にはDBから参照するだけじゃなくて会話履歴を
DynamoDBに保存して、それをOpenAIにリクエストしなきゃいけません。が、いったんここまで!

こちらの記事に、長期記憶の詳しいソースコードが置いてます!
有料ですが興味ある方ぜひ♪↓


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