AIパーソナル・ラーニング
と実践的なガイダンス
ビーンバッグ・マースコード1

LangGraph: 有向非循環グラフトポロジーに基づくAIエージェント構築・実行フレームワーク

人工知能(AI)は急速に成長している分野である。言語モデルは、AIエージェントが複雑なタスクを実行し、複雑な意思決定を行えるように進化してきた。しかし、これらのエージェントのスキルが成長し続けるにつれて、それをサポートするインフラは追いつくのに苦労している。

LangGraphは、AIエージェントに革命をもたらす画期的なライブラリです。 ビルドとランタイム 実施する。


ラングラフが新しいエージェントを発表ビルドとランタイムエージェントのワークフローを循環グラフトポロジーに基づく構造として捉える構成的パラダイム。

 

LangGraphとは?

LangChainの重要な価値提案は、カスタムチェーンを簡単に作成できることです。しかし、LangChainにはチェーンにループを導入する簡単な方法がありません。実際、これらのチェーンは有向無サイクルグラフ(ディーエージー) - ほとんどのデータ・オーケストレーション・フレームワークがそうであるように。

複雑なLLMアプリケーションを作るときによくあるパターンは、ランタイムにループを導入することだ。これらのループは、ループ内の次のアクションを推論するためにLLMを利用することが多い。これは本質的にLLMをforループで実行するのと同じことだ。このようなシステムはしばしばエージェントと呼ばれる。

最も単純な形は、2つのステップを持つループである:

  1. LLMを呼び出して、どのようなアクションを取るべきか、あるいはどのような応答をユーザーに与えるべきかを決定する。
  2. 指定された操作を実行し、ステップ1に戻る。

このステップを最終レスポンスが生成されるまで繰り返します。これはLangChainの心臓部であるAgentExecutorを駆動するループです。 非常にシンプルなループですが、LLMの手にほとんどすべての意思決定と推論力を委ねるため、最も重要なループでもあります。

このプロセスは通常、より多くの制御を必要とすることに注意することが重要です。例えば、エージェントに特定のツールを最初に起動させる、ツールの起動方法をより制御する、エージェントの状態に応じて異なるプロンプトを表示する、などです。

これらは制御されたプロセスで、LangChainでは "ステートマシン "と呼んでいる。

これらのステートマシンにはループ機能があるが、このループの構築には人間の介入が必要である。

LangGraphは、グラフとして指定することで、これらのステートマシンを作成する。

LangGraphはLangChainの上に構築されており、LangChainエコシステムと完全な互換性があります。相互運用性.主にループ図を簡単に作成する方法を導入することで、新たな価値を付加しています。これはエージェントのランタイムを作成する際に非常に便利である。

このアプローチにより、エージェントは従来の線形実行モデルよりも多様で微妙な挙動を示すことができます。グラフ理論を用いて、LangGraphは複雑なネットワーク化されたエージェントシステムを開発する新しい方法を提供します。

図:コード生成のためのLangGraph

例:動的質疑応答システム

取る 一度にすべての情報を送るのではなく、段階を追ってモデルに情報を提供する。

処方 環状図を使ってください:

  1. LLMに初期応答を生成させる。
  2. 回答が不完全であったり、より多くの情報が必要な場合は、新しい質問を生成し、ユーザーに質問を続けます。
  3. 問題が解決したことをユーザーが確認するまで。

サイクルダイヤグラムの構造

  • ノード各ノードは、テキスト生成、質問応答、データ処理など、特定のタスクや操作を表す。
  • エッジノード間の接続はタスクの実行順序を示す。
  • ルーピング・パスループは、あるノードの出力を前のノードにフィードバックする必要がある場合や、繰り返し実行する必要がある場合に形成される。
  • 停止条件例えば、結果の品質が要求を満たしたとき、設定された回数制限に達したとき、あるいは外部トリガーの停止信号が作動したときなどである。

 

なぜLangGraphを使うのか?

  • 熟練 AIエージェントが進化するにつれて、開発者は、パーソナライズされたアクションプランと意思決定手順を可能にするために、エージェントのランタイムをよりコントロールする必要があります。
  • AIの推論の循環的性質 複雑なLLMアプリケーションの多くは、連鎖推論のようなストラテジーを使うとき、サイクリックな実行に依存している。LangGraphは、このようなサイクリックなプロセスをモデル化するための自然なフレームワークを提供する。
  • マルチインテリジェンス・システム マルチインテリジェンス・ワークフローが一般的になるにつれ、複数の自律的インテリジェンスを効率的に管理・調整できるシステムの必要性が高まっている。

 

コードを使ってLangGraphがどのように機能するか見てみよう

LangGraphの機能はいくつかの基本要素に基づいている:

  • ノード これらは機能やエージェントのためのツールである。
  • エッジ。 エージェントシステムにおける実行とデータフローのパスを定義し、ノードを接続します。
  • StateGraph。 LangGraphでは、ステート・オブジェクトを管理・更新することで、実行サイクル間で永続的なデータを維持することができる。

図:LangGraphの基本ワークフロー

ステートグラフ

StateGraph はグラフを表すクラスである。グラフを作成するには state 定義を使用してこのクラスを初期化します。状態定義は、時間の経過とともに更新される中央の状態オブジェクトを表す。この状態は、グラフ内のノードによって更新され、ノードは、キー・バリュー・ストアの形でこの状態の属性に対する操作を返す。

import os  # 导入操作系统模块
os.environ['OpenAI_API_KEY'] = 'hk-iwtbi1e427'
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
class State(TypedDict):
    # messages 的类型为“list”。Annotated中的“add_messages” 定义了如何更新messages
    # 在本例中,messages是追加到list中的,而不是覆盖
    messages: Annotated[list, add_messages]
# 创建StateGraph的实例,传入State类
graph_builder = StateGraph(State)

ノード

を作成する。 StateGraph その後 graph.add_node(name, value) ノードを追加する構文。 name 引数はノード名の文字列である。 value 引数は、呼び出される関数または実行可能なLCELである。

この関数 /LCEL は、以下のような関数を受け付ける。 State オブジェクトは入力と同じ形式の辞書を持ち、その辞書を出力する。 State オブジェクトのキーで辞書を更新する。

from langchain_openai import ChatOpenAI  # 从langchain_openai模块导入ChatOpenAI
llm = ChatOpenAI(  # 创建ChatOpenAI的实例
    model="gpt-4o-mini",  # 指定模型
    temperature=0,  # 设置温度
    base_url="https://api.openai-hk.com/v1"# 设置基础URL
)
def chatbot(state: State):# 定义chatbot函数,接受State类型的参数
    """
    处理聊天机器人请求并返回消息。
    参数:
    state (State): 包含消息的状态。
    返回:
    dict: 机器人生成的消息的字典。
    """
    return {"messages": [llm.invoke(state["messages"])]}  # 返回包含消息的字典
# 第一个参数是节点name
# 第二个参数是被调用的函数或对象
graph_builder.add_node("chatbot", chatbot)  # 向图中添加节点,节点名称为"chatbot"

エッジ

一方のノードが常にもう一方のノードの後に呼び出されることを示す。

# 添加从START到"chatbot"的边
graph_builder.add_edge(START, "chatbot")  
# 添加从"chatbot"到END的边
graph_builder.add_edge("chatbot", END)  

コンパイル コンパイル

グラフを定義したら、コンパイルして実行可能にする!LangChainと同じメソッド ( .invoke 属 .stream 属 .astream_log など)、チェーンと同じように呼び出すことができる。

graph = graph_builder.compile()  # 编译图

うごきだす

def stream_graph_updates(user_input: str):  # 定义stream_graph_updates函数,接受用户输入
    """
    使用user_input流式更新图的消息。
    参数:
    user_input (str): 用户输入的消息。
    返回:
    None
    """
    # 遍历图的流事件,传入用户消息以获取模型的响应
    for event in graph.stream({"messages": [("user", user_input)]}):  # 遍历图的流事件
        for value in event.values():  # 遍历事件的值
            print("Assistant:", value["messages"][-1].content)  # 打印助手的最后一条消息
whileTrue:
    try:
        user_input = input("User: ")  # 获取用户输入
        if user_input.lower() in ["quit", "exit", "q"]:  # 检查用户是否想退出
            print("Goodbye!")
            break# 退出循环
        # 调用stream_graph_updates函数处理用户输入
        stream_graph_updates(user_input)
    except:  # 捕获异常
        # fallback if input() is not available
        user_input = "What do you know about LangGraph?"# 设置默认用户输入
        print("User: " + user_input)  # 打印用户输入
        stream_graph_updates(user_input)  # 调用stream_graph_updates函数处理默认输入
        break# 退出循环

視覚化「ダイアグラム」(オプション)

Jupyter Notebook環境で「ダイアグラム」を視覚化する

営業効果

LangGraphのようなフレームワークは、AIの進化とともにますます重要になってきている。

開発者がLangGraphの機能をより使いこなすようになれば、より複雑なタスクを実行できる、より高度なAIエージェントの登場が期待できる。

要約すると、LangGraphはAIエージェント開発における重要な進歩です。LangGraphは今後のAI開発の方向性に大きな影響を与える可能性を秘めています。

無断転載を禁じます:チーフAIシェアリングサークル " LangGraph: 有向非循環グラフトポロジーに基づくAIエージェント構築・実行フレームワーク
ja日本語