LangChainのDynamoDBChatMessageHistoryで少しハマった話
年末年始の自己学習として『Amazon Bedrock 生成AIアプリ開発入門』のハンズオンに挑戦していたときに少しハマった話です。
ハマった内容
ハンズオンの中でBedrockとの会話履歴をDynamoDBに保存することでチャット形式の継続したやり取りを実装するというものがありました。
イメージ
会話履歴をDyanmoDBに保存するということは、アプリを動かすSagemakerがDyanmoDBのテーブルに書き込める必要があるのですが、ここでハマりました。
イメージ
Sagemaker上で動かしてるアプリがDyanmoDBに履歴を書き込めないとエラーを吐きました。
その時のDynamoDBの設定をアプリのコードのDyanmoDBに係わる部分が以下の通りでした。
DynamoDB
テーブル名:BedrockChatSessionTable
パーティションキー:Sessionid
import streamlit as st
from langchain_aws import ChatBedrock
from langchain_community.chat_message_histories import DynamoDBChatMessageHistory
from langchain_core.messages import HumanMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
#セッションIDの定義
if "session_id" not in st.session_state:
st.session_state.session_id = "session_id"
#セッションに履歴を定義
if "history" not in st.session_state:
st.session_state.history = DynamoDBChatMessageHistory(
table_name="BedrockChatSessionTable", session_id=st.session_state.session_id
)
解決策
エラーの原因はDynamoDBのパーティションキーの設定でしてた。
LangChainのDynamoDBChatMessageHistoryでは、特に指定が無い場合デフォルトのキーが『SessionId』として指定されているそうです。
私は『SessionId』ではなく『Sessionid』(Idとidが違う)
でDyanmoDBを設定していたためSagemakerがDyanmoDBに会話履歴を保存できていませんでした。
このエラーはハンズオン資料をよく読んでDyanmoDBのテーブルを再作成することで解決しましたが、
SessionId以外のパーティションキーを使用することも可能です。
DynamoDBChatMessageHistoryでデフォルト以外のキーを使用する場合は
primary_key_nameで指定することが可能です。
テーブル名:DynamoDBChatMessageHistory_test
パーティションキー:Seesionid
(タイプミス超恥ずかしい)
上記のようなDyanmoDBに書き込む場合のコードは以下の通りです。
#セッションIDの定義
if "session_id" not in st.session_state:
st.session_state.session_id = "session_test"
#セッションに履歴を定義
if "history" not in st.session_state:
st.session_state.history = DynamoDBChatMessageHistory(
table_name="DynamoDBChatMessageHistory_test",
primary_key_name="Seesionid",
session_id=st.session_state.session_id,
)
DynamoDBに無事指定したSession_id(session_test)で書き込めていますね。
Discussion