はじめに
LangChainの会話履歴を保存するMemory機能の1つであるConversation Knowledge Graph Memoryを検証してみました。LangChainのConversation Knowledge Graph Memoryの挙動を確認したい方におすすめです。
開発環境
- 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">ConversationKGMemory</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> |
プロンプトの定義
使用するプロンプトを定義します。プロンプトは、こちらのプロンプトをそのまま活用しています。
1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="n">template</span> <span class="o">=</span> <span class="sh">"""</span><span class="s">The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know. The AI ONLY uses information contained in the </span><span class="sh">"</span><span class="s">Relevant Information</span><span class="sh">"</span><span class="s"> section and does not hallucinate. Relevant Information: {history} Conversation: Human: {input} AI:</span><span class="sh">"""</span> <span class="n">prompt</span> <span class="o">=</span> <span class="nc">PromptTemplate</span><span class="p">(</span><span class="n">input_variables</span><span class="o">=</span><span class="p">[</span><span class="sh">"</span><span class="s">history</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">input</span><span class="sh">"</span><span class="p">],</span> <span class="n">template</span><span class="o">=</span><span class="n">template</span><span class="p">)</span> |
Conversation Knowledge Graph Memoryの定義
以下のようにConversation Knowledge Graph Memoryを定義します。
Conversation Knowledge Graph Memoryはナレッジグラフを使って記憶を再現します。
ナレッジグラフとは、さまざまな知識(ナレッジ)を体系的に連結し、グラフ構造で表した知識のネットワークのことです。
1 2 |
<span class="n">memory</span> <span class="o">=</span> <span class="nc">ConversationKGMemory</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を作成し、実行します。私自身の自己紹介を3問投げた後、4問目で私について知っていることを回答させました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="n">conversation_with_kg</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">prompt</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_with_kg</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">土山竜輝は月に約400km走るエンジニアです。</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_with_kg</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">土山竜輝は生成AIを活用して仕事をしています。</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_with_kg</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">土山竜輝は社会人1年目です。</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_with_kg</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ファイルを実行します。
実行結果は以下のようになりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
<span class="gp">></span><span class="w"> </span>Entering new ConversationChain chain... <span class="go">Prompt after formatting: The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know. The AI ONLY uses information contained in the "Relevant Information" section and does not hallucinate. Relevant Information: Conversation: Human: 土山竜輝は月に約400km走るエンジニアです。 AI: </span><span class="gp">></span><span class="w"> </span>Finished chain. <span class="go">それはすごいですね!土山竜輝さんは月に約400km走るエンジニアなんですね。彼はどのようにしてその距離を走ることができるので しょうか? </span><span class="gp">></span><span class="w"> </span>Entering new ConversationChain chain... <span class="go">Prompt after formatting: The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know. The AI ONLY uses information contained in the "Relevant Information" section and does not hallucinate. Relevant Information: On 土山竜輝: 土山竜輝 は 月に約400km走るエンジニア. Conversation: Human: 土山竜輝は生成AIを活用して仕事をしています。 AI: </span><span class="gp">></span><span class="w"> </span>Finished chain. <span class="go">土山竜輝は月に約400km走るエンジニアです。彼は生成AIを活用して仕事をしているかどうかはわかりません。 </span><span class="gp">></span><span class="w"> </span>Entering new ConversationChain chain... <span class="go">Prompt after formatting: The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know. The AI ONLY uses information contained in the "Relevant Information" section and does not hallucinate. Relevant Information: On 土山竜輝: 土山竜輝 は 月に約400km走るエンジニア. 土山竜輝 は活用している 生成AI. 土山竜輝 している 仕事. Conversation: Human: 土山竜輝は社会人1年目です。 AI: </span><span class="gp">></span><span class="w"> </span>Finished chain. <span class="go">土山竜輝はエンジニアであり、月に約400km走ることができる人です。彼は生成AIを活用して仕事をしています。 </span><span class="gp">></span><span class="w"> </span>Entering new ConversationChain chain... <span class="go">Prompt after formatting: The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know. The AI ONLY uses information contained in the "Relevant Information" section and does not hallucinate. Relevant Information: On 土山竜輝: 土山竜輝 は 月に約400km走るエンジニア. 土山竜輝 は活用している 生成AI. 土山竜輝 している 仕事. 土山竜輝 は 社会人1年目. Conversation: Human: 土山竜輝について知っていることを教えてください。 AI: </span><span class="gp">></span><span class="w"> </span>Finished chain. <span class="go">土山竜輝は月に約400km走るエンジニアで、生成AIを活用して仕事をしています。彼は社会人1年目です。 </span> |
「Relevant Information」に会話履歴からの情報が生成されています。
その情報を元にして、4問目は回答していることが分かります。
おわりに
LangChainの会話履歴を保存するMemory機能の1つであるConversation Knowledge Graph Memoryを検証してみました。文脈を考慮した回答を生成したい場合には、おすすめです。ぜひ、試してみてください。
最後までお読みいただき、ありがとうございました!