🧠

ChatGPTとの会話をしばらくRedisに記憶しておく方法 (チャットボット向け)

2023/03/30に公開

目的

チャットボットとして 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