はじめに
LangChainの会話履歴を保存するMemory機能の1つであるConversationEntityMemoryを検証してみました。LangChainのConversationEntityMemoryの挙動を確認したい方におすすめです。
開発環境
- Windows 11
- Python 3.11.5
- dotenv
- LangChain
- Azure OpenAI
実装
必要なパッケージのインストール
以下のコマンドで必要なパッケージをインストールします。
1 2 3 4 |
pip install langchain pip install openai pip install python-dotenv |
環境変数の設定と依存関係の読み込み
.envファイルを作成し、Azure Open AIの環境変数の設定をします。
ご自身の環境に合わせて設定してください。
1 2 3 4 5 6 7 8 9 |
# APIキー OPENAI_API_KEY = "XXXXX" # エンドポイント AZURE_OPENAI_ENDPOINT = "XXXXX" # 使用するOpenAI APIのバージョン OPENAI_API_VERSION = "XXXXX" |
必要なライブラリをインポートします。
1 2 3 4 5 6 7 8 9 |
<span class="c1"># 環境変数を.envファイルから読み込む </span><span class="kn">from</span> <span class="n">dotenv</span> <span class="kn">import</span> <span class="n">load_dotenv</span> <span class="nf">load_dotenv</span><span class="p">()</span> <span class="kn">from</span> <span class="n">langchain.chat_models</span> <span class="kn">import</span> <span class="n">AzureChatOpenAI</span> <span class="kn">from</span> <span class="n">langchain.chains</span> <span class="kn">import</span> <span class="n">ConversationChain</span> <span class="c1"># 会話専用のChain </span><span class="kn">from</span> <span class="n">langchain.memory</span> <span class="kn">import</span> <span class="n">ConversationEntityMemory</span> <span class="kn">from</span> <span class="n">langchain.memory.prompt</span> <span class="kn">import</span> <span class="n">ENTITY_MEMORY_CONVERSATION_TEMPLATE</span> <span class="c1"># ConversationEntityMemory専用のテンプレート </span> |
使用するモデルの準備
Azure Chat OpenAIを定義します。
1 2 3 4 5 |
<span class="n">llm</span> <span class="o">=</span> <span class="nc">AzureChatOpenAI</span><span class="p">(</span> <span class="n">temperature</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">azure_deployment</span><span class="o">=</span><span class="sh">"</span><span class="s">gpt-35-turbo-16k</span><span class="sh">"</span><span class="p">,</span> <span class="p">)</span> |
ConversationEntityMemoryの定義
以下のようにConversationEntityMemoryを定義します。
ConversationEntityMemoryは会話に含まれているエンティティ情報を保持します。
エンティティとは、話者や固有名詞など、会話中の特定の事物に関する情報のことです。
1 2 |
<span class="n">memory</span> <span class="o">=</span> <span class="nc">ConversationEntityMemory</span><span class="p">(</span><span class="n">llm</span><span class="o">=</span><span class="n">llm</span><span class="p">)</span> |
chainを作成し、実行
最後にchainを作成し、実行します。最初の質問ではトムとサムという人物がIT企業でエンジニアで働いていることを伝え、次の質問でそれを確かめる質問を投げます。
1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="n">conversation</span> <span class="o">=</span> <span class="nc">ConversationChain</span><span class="p">(</span> <span class="n">llm</span><span class="o">=</span><span class="n">llm</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">prompt</span><span class="o">=</span><span class="n">ENTITY_MEMORY_CONVERSATION_TEMPLATE</span><span class="p">,</span> <span class="n">memory</span><span class="o">=</span><span class="n">memory</span> <span class="p">)</span> <span class="n">result</span> <span class="o">=</span> <span class="n">conversation</span><span class="p">.</span><span class="nf">predict</span><span class="p">(</span><span class="nb">input</span><span class="o">=</span><span class="sh">"</span><span class="s">トムとサムはIT企業でエンジニアとして働いています。</span><span class="sh">"</span><span class="p">)</span> <span class="nf">print</span><span class="p">(</span><span class="n">result</span><span class="p">)</span> <span class="n">result</span> <span class="o">=</span> <span class="n">conversation</span><span class="p">.</span><span class="nf">predict</span><span class="p">(</span><span class="nb">input</span><span class="o">=</span><span class="sh">"</span><span class="s">トムとサムの職業について教えてください。</span><span class="sh">"</span><span class="p">)</span> <span class="nf">print</span><span class="p">(</span><span class="n">result</span><span class="p">)</span> |
これまでのPythonコードを上から順に記述し終わったら、Pythonファイルを実行します。
実行結果は以下のようになりました。
「Context」に固有名詞の情報が抽出されています。
その情報から2問目は回答していることが確認できます。
おわりに
LangChainの会話履歴を保存するMemory機能の1つであるConversationEntityMemoryを検証してみました。固有名詞の情報を保持して回答したい場合には有効です。ぜひ、試してみてください。
最後までお読みいただき、ありがとうございました! 記事に関する質問等ございましたら、コメントもしくは以下のDMにてよろしくお願いします。
https://twitter.com/t___tatsuki
参考文献
https://python.langchain.com/docs/modules/memory/types/entity_summary_memory