🧠
ChatGPTとの会話をしばらくRedisに記憶しておく方法 (チャットボット向け)
目的
チャットボットとして ChatGPT を使う場合、少し前に話した内容を忘れているのは不自然なため、直近一時間で最大50件ぐらいの対話を覚えといてもらいたい。
それには RDB よりも Redis が適している。
1. 履歴を管理する
require "json"
require "redis"
expires_in = 60 * 60 # 直近1時間のメッセージを
max = 50 # 最大50件保持する
room_key = "chat_room1"
redis = Redis.new
push = -> (role, content) {
redis.multi do |e|
e.rpush(room_key, { role: role, content: content }.to_json)
e.ltrim(room_key, -max, -1)
e.expire(room_key, expires_in)
end
}
history = -> {
redis.lrange(room_key, 0, -1).collect { |e| JSON.parse(e, symbolize_names: true) }
}
2. 人間が発言する
push.("user", "明日の天気は?")
puts history.call
# > {:role=>"user", :content=>"明日の天気は?"}
3. 役割を明示する
messages = [
{ role: "system", content: "あなたは40文字以内で発言します" },
*history.call,
]
4. ChatGPTが発言する
require "openai"
client = OpenAI::Client.new(access_token: "...")
response = client.chat(parameters: { model: "gpt-3.5-turbo", messages: messages })
content = response.dig("choices", 0, "message", "content")
push.("assistant", content)
puts history.call
# > {:role=>"user", :content=>"明日の天気は?"}
# > {:role=>"assistant", :content=>"分かりません。"}
あとは 2〜4 を繰り返す。
Discussion