LangGraphとlangchainで作る!簡単チャットボット構築ガイド [Google Generative AI gemini]

今回は、LangChainとGoogle Generative AI APIを使って、シンプルなチャットボットを構築する方法を紹介します。このプログラムは、ユーザーの入力に自然言語で応答する基本的なチャットボットを作成して試してみます。

まず、gemini+langchainの動作方法については、前回の記事で記載していますので、確認してみてください。

LangGraphとは?

LangGraphは、状態グラフを使って、複雑なプログラムの処理フローを管理するPythonライブラリで、状態グラフを使ってプログラムの処理フローを管理する強力なツールです。複雑な処理フローを簡潔で理解しやすいコードで記述できるため、さまざまなアプリケーション開発に役立ちます。Langchainと親和性が高く、よく一緒に使われますが、LangGraphを単体で、使用することも可能です。

チャットボット、ワークフロー管理システム、ゲームのAIなど、さまざまなアプリケーションで使用することができます。

ライブラリのインストール

まずはライブラリのインストールです。
以下の通りコマンドを実行し、langgraphをインストールします。

pip install langgraph

プログラム全貌

まずはプログラムの全体です。

import os
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph,START,END

from langgraph.graph.message import add_messages
from langchain_google_genai import GoogleGenerativeAI
from IPython.display import Image, display

class State(TypedDict):
    # Annotatedでstateを更新するreducerを指定する
    messages: Annotated[list[str], add_messages]


api_key = os.environ.get('GEMINI_API_KEY')
llm = GoogleGenerativeAI(model="gemini-1.5-flash", google_api_key=api_key)

# Nodeを宣言
def chatbot( state: State ):
    return {"messages": [llm.invoke(state["messages"])]}

def main():

    graph_builder = StateGraph(State)
    graph_builder.add_node("chatbot", chatbot)
    graph_builder.add_edge(START, "chatbot")
    graph_builder.add_edge("chatbot", END)
    graph = graph_builder.compile()

    while True:
        user_input = input("User: ")
        if user_input.lower() in ["quit", "exit", "q"]:
            print("Goodbye!")
            break
        for event in graph.stream({"messages": ("user", user_input)}):
            for value in event.values():
                print("Assistant:", value["messages"][-1])

if __name__ == '__main__':
    main()

実行結果

動作確認の結果は以下のような感じになりました。
Userは、ユーザーの入力で、AssistantがAIの回答結果になります。

User: Hellow
Assistant: Hello! How can I help you today? 

User: 今日の大阪の天気は?                             
Assistant: 申し訳ありませんが、私はリアルタイムの情報を提供することはできません。最新の天気予報を確認するには、信頼できる天気予報ウェブサイトやアプリをご利用ください。 

プログラム解説

処理の流れは以下の通りになっています。

  1. 状態グラフを構築するためのインスタンスを取得
  2. ノードの生成
  3. ノードの登録
  4. エッジの設定
  5. グラフのコンパイル
  6. グラフの実行

では説明していきます。

1.状態グラフを構築するためのインスタンスを取得

以下でグラフインスタンスを取得します。

graph_builder = StateGraph(State)

2.ノードの生成

ノードの生成と言っていますが、ただ、ノードの処理関数を作成してるだけです。

def chatbot( state: State ):
    return {"messages": [llm.invoke(state["messages"])]}

3.ノードの登録

次は、作成しておいたノードをグラフに追加します。
追加となっているのは通常複数登録するので、add関数となっています。

graph_builder.add_node("chatbot", chatbot)

4.エッジの登録

次は、エッジの登録処理です。
エッジは、状態の遷移先のことを言います。
以下のSTARTが、遷移元で、”chatbot”が遷移先になります。
※STARTやENDなどの特殊なもの以外は、先に追加しているNodeを設定します。

graph_builder.add_edge(START, "chatbot")

5.グラフのコンパイル

これで、設定したグラフの設定を確定させます。この処理の戻り値を実行することで、設定したフローを実行できます。

graph = graph_builder.compile()

6.グラフの実行

以下が設定したグラフを実行しています。
ユーザーからのメッセージを受け取って、状態グラフを行使して、Nodeの関数が呼び出されることでAIを呼び出ししています。今回は、chatbotが呼び出されます。
このあとは、グラフの実行が終わって、再度入力待ちに入る形となります。
“quit”, “exit”, “q”が入力されれば、プログラムを終了します。

    while True:
        user_input = input("User: ")
        if user_input.lower() in ["quit", "exit", "q"]:
            print("Goodbye!")
            break
        for event in graph.stream({"messages": ("user", user_input)}):
            for value in event.values():
                print("Assistant:", value["messages"][-1])

まとめ

今回は、Langgraphを使って、簡易的なチャットボットを作成してみました。memory機能などを使わないあくまで簡易なものなので、前回の問い合わせ内容は覚えていないなどありますが、非常に簡単にチャットボットを作成できました。
次回は、もう少し複雑なフローとメモリー機能の追加などを試してみたいと思いますので、期待ください。


最後に、Pythonの基礎を学びたい方は以下がおすすめです。私も持っていてたまに眺めて勉強していますものですのでぜひ購入して学習してみてください。

langchainについて学びたいという方は,以下をちょっと見繕ってみましたので、参考にしてみてください。

にいやん

出身 : 関西 居住区 : 関西 職業 : 組み込み機器エンジニア (エンジニア歴13年) 年齢 : 38歳(2022年11月現在) 最近 業務の効率化で噂もありPython言語に興味を持ち勉強しています。 そこで学んだことを記事にして皆さんとシェアさせていただければと思いブログをはじめました!! 興味ある記事があれば皆さん見ていってください!!