Zenn
🕳️

LangChainのDynamoDBChatMessageHistoryで少しハマった話

2024/12/29に公開

年末年始の自己学習として『Amazon Bedrock 生成AIアプリ開発入門』のハンズオンに挑戦していたときに少しハマった話です。

https://www.amazon.co.jp/Amazon-Bedrock-生成AIアプリ開発入門-AWS深掘りガイド-御田/dp/4815626448

ハマった内容

ハンズオンの中で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』として指定されているそうです。

https://python.langchain.com/docs/integrations/memory/aws_dynamodb/

私は『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

ログインするとコメントできます