著者 | 崔昊 レビュー | Chonglou まとめこの記事では、LangChain をベースにした新しいテクノロジーである LangGraph を紹介します。これは、循環グラフを通じて大規模なモデルと外部ツールを調整し、複雑なタスクを解決します。まず、単純なタスクを処理するための LangChain の DAG モデルと、循環グラフを使用して複雑なタスクを処理する LangGraph の原理を紹介します。次に、LangGraph の 3 つのコア コンポーネントである StateGraph、ノード、エッジについて詳しく説明します。最後に、エージェントの作成、グラフの状態、ノード、エッジの定義、ワークフローの実行など、LangGraph を使用して 2024 年の春節期間中の北京の観光状況を照会する方法を示す例を使用します。 導入今日のテクノロジー分野では、大規模言語モデル (LLM) が徐々に私たちの日常生活や仕事における強力なアシスタントになってきています。ライティング支援、プログラミングのデバッグ、簡単な質問応答システムなど、LLM は迅速かつ正確なサービスを提供できます。しかし、より複雑なタスクに直面した場合、LLM ではそのタスクに対処できない可能性があります。これらの課題に対処するために、より複雑なタスクやインタラクションを処理できる AI エージェントと組み合わせた新しいテクノロジーである LangGraph を導入します。 LangGraph は、LangChain 上に構築され、そのエコシステムと完全に互換性のある新しいライブラリです。アプリケーション シナリオにおける複雑な問題を解決するために、大規模なモデルと外部ツールを調整するためのサイクル グラフ メソッドを紹介します。 この記事では、2024 年の春節期間中の北京の観光状況を尋ねるという簡単な例を使用して、独自の LangGraph アプリケーションを作成する方法を説明します。 LangGraph の概念とコンポーネントを理解し、実際のシナリオに適用する方法を段階的に説明します。この例を通して、LangGraph がどのように作業効率を向上させ、複雑な問題を解決できるかを直感的に理解できるようになります。 LangGraph を使用する理由は何ですか?LangChain を使用したことがある友人は、LangChain の最大のメリットは、有向非巡回グラフ (DAG) に似た、通常は線形のカスタム チェーンを簡単に構築できることであることを知っています。 DAG は、タスクが特定の順序で実行され、各タスクには 1 つの出力と 1 つの後続タスクのみがあり、ループのない線形プロセスを形成するデータ構造です。たとえば、ベクター ライブラリからコンテンツを検索する場合、最初にプロンプト ワードを入力し、次にベクター比較で検索し、結果を返します。このプロセスは典型的な DAG であり、各ステップは厳密に順番に実行されます。 有向非巡回グラフ (DAG) は、データ オーケストレーションおよびワークフロー管理システムの基本的な概念です。これは、依存関係と関連性を持つタスクのセットを表し、タスクを実行する順序を示します。 DAG では、タスクはノードと見なされ、ノード間の有向エッジはノード間の依存関係を表し、先行タスクが正常に完了した後にのみタスクが実行されるようにします。 たとえば、基本的な有向非巡回グラフでは、タスク A、B、C、D を定義し、それらの実行順序と依存関係を明示的に示すことができます。この構造は、どのタスクを他のタスクの前に実行する必要があるかを示すだけでなく、明日から 5 分ごとに DAG を実行する、または 2024 年 1 月 1 日から 1 日に 1 回 DAG を実行するなどのスケジュール パラメータも指定します。 DAG の主な焦点は、タスクの内部動作メカニズムではなく、実行順序、再試行ロジック、タイムアウト、その他の運用上の問題など、タスクの実行方法です。この抽象化により、管理と監視が容易な複雑なワークフローを簡単に作成できます。 ただし、すべてのタスクがそれほど簡単というわけではありません。最初の検索で目的のものが見つからない場合など、複雑なタスクに遭遇した場合は、2 回目または 3 回目の検索を実行したり、ネットワーク検索を呼び出して完了したりする必要がある場合もあります。この場合、順次実行されるタスク (DAG) では明らかに要件を満たすことができません。この時点で、依頼者と検索者は複数回のコミュニケーションを行う必要があります。依頼者は、フィードバックに基づいて検索戦略を調整するよう検索者に依頼する場合があります。複数回のコミュニケーションサイクルを通じてのみ、最終的な答えに徐々に近づくことができます。 この場合、必要なのは DAG ではなく、最終的な答えを確認するために複数の参加者間で行われる複数回の会話とやり取りを記述できるサイクル グラフです。このループ図では、システムがフィードバックに基づいて適応および反復できるため、より曖昧で複雑なユースケースを処理できます。そして、サイクルグラフにおける動作モードはインテリジェントエージェント、つまりAIである。 エージェント。 AI エージェント、または人工知能エージェントは、強化学習理論に基づいて設計されたシステムです。下の図に示すように、強化学習は、エージェントが環境のさまざまな状態に基づいてアクションを実行し、最大の報酬を獲得できるようにする機械学習手法です。この学習プロセスでは、エージェントが環境と常に対話し、試行錯誤を通じてどのアクション戦略が最良の結果につながるかを学習します。 たとえば、WeChat の Jump Jump ゲームでは、エージェントはプラットフォームにジャンプするたびに報酬を受け取り、プラットフォームにジャンプできなかった場合はペナルティを受けます。この報酬と罰のメカニズムを通じて、エージェントはジャンプの力と方向を調整してより高いスコアを獲得する方法を学習できます。このプロセスは強化学習の単純な表現であり、インテリジェント エージェントは継続的なインタラクションを通じてアクション戦略を最適化します。 LangGraph では、AI エージェントは同様に動作します。 LLM (大規模言語モデル) は、実行するアクションとユーザーに提供する応答を決定し、それらのアクションを実行して最初のステップに戻るために使用されます。このプロセスは、最終的な応答が生成されるまで繰り返されます。これは、LangChain のコア AgentExecutor の動作サイクルの原則です。 しかし、実際のアプリケーションでは、インテリジェントエージェントに対するさらなる制御が必要であることがわかりました。たとえば、エージェントが常に特定のツールを最初に呼び出すようにしたり、ツールの呼び出し方法をより細かく制御したり、エージェントの状態に応じて異なるプロンプトを使用したりしたい場合があります。これらの問題を解決するために、LangGraph は「ステート マシン」の概念を提案しました。この方法では、グラフに対応するステート マシンを作成することで、インテリジェント エージェントのアクション フローをより適切に制御し、複雑なタスクをより柔軟かつ効率的に処理できるようになります。 LangGraphのコンポーネントLangGraph が「ステート マシン」を適用して AI エージェント機能を実装する方法を紹介する際には、理解しておく必要のある重要な概念がいくつかあります。これらは LangGraph の重要なコンポーネントでもあります。 ステートグラフまず、StateGraph のコアコンセプトを理解する必要があります。 StateGraph は、グラフ全体の構造を表す役割を担うクラスです。実行中に更新される中心的な状態オブジェクトを表す状態定義を渡すことによって、このクラスを初期化します。この状態オブジェクトはグラフ内のノードによって更新され、ノードはキーと値のペアの形式で状態プロパティに対する操作を返します。 状態オブジェクトのプロパティは、次の 2 つの方法で更新できます。 1. 上書き更新: 属性を新しい値に置き換える必要がある場合は、ノードに新しい値を返すようにすることができます。 2. 増分更新: プロパティがアクション (または同様の操作) のリストである場合、元のリストに新しいアクションを追加できます。 状態定義を作成するときは、プロパティを上書きするか増分するかのいずれかで更新する方法を指定する必要があります。 StateGraph の概念が理解しにくい場合は、旅行を計画していると想像してください。目的地の決定、フライトの予約、ホテルの予約など、旅行の基本を設定します。この情報は、計画の進行に応じて継続的に更新される中央状態オブジェクトのように機能します。たとえば、旅程に新しいアクティビティを追加したり、予算を変更したりすることができます。これらの更新はグラフ内のノードのようなもので、旅行計画の状態オブジェクトに対して動作します。 LangGraph では、StateGraph クラスはそのような旅行計画であり、ノードは目的地の決定、フライトの予約、ホテルの予約など、旅行計画のさまざまなステップのようなものです。各ステップでは、旅行計画が更新され、古い計画が完全に置き換えられるか、既存の計画に新しい情報が追加されます。 ノードStateGraphについて説明した後、グラフのノード部分に焦点を当てましょう。 StateGraph を作成したら、それにノードを追加する必要があります。ノードの追加は、`graph.add_node(name, value)` 構文で行います。 `name` パラメータは、エッジを追加するときにこのノードを参照するために使用される文字列です。 `value` パラメータは、ノードが呼び出されたときに実行される関数または LCEL (LangChain Expression Language) 実行可能インスタンスのいずれかである必要があります。これらは、State オブジェクトと同じ形式の辞書を入力として受け入れることができ、実行後に辞書を出力します。辞書内のキーは、State オブジェクトで更新される属性です。簡単に言えば、ノードの役割は「実行」することであり、実行後は StateGraph の状態が更新されます。 次に、上記の旅行計画の例では、ノードはフライトの予約やホテルの予約など、旅行計画で完了する必要があるタスクのようなものです。ノードは旅行の旅程 (State オブジェクト) を入力として受け取り、更新されたタスク状態 (完了したホテル予約など) を出力します。 つまり、複雑なタスクを完了するために、StateGraph に多数のノードを追加します。各ノードはタスクを表し、その実行結果は StateGraph の状態に影響します。これらのノードはエッジを介して相互に接続され、有向非巡回グラフ (DAG) を形成し、タスクの正しい実行順序を保証します。 エッジStateGraph について話した後は、Edge について言及する必要があります。 LangGraph では、エッジはノードを接続し、StateGraph 内のノードの実行順序を定義する重要な部分です。ノードを追加した後、エッジを追加してグラフ全体を構築できます。エッジにはいくつかの種類があります。
LangGraph では、エッジはノードを接続し、グラフ内のノードの実行順序を定義する重要な部分です。エッジは、グラフ内のタスクが事前に決められた順序で実行されることを保証する、ノードへのコントロールおよびリンクとして考えることができます。 LangGraph では、エッジはノード間の依存関係と実行順序を定義します。開始エッジはグラフの開始を決定し、通常エッジはタスクの正しい実行順序を保証し、条件エッジは特定の条件に基づいて次の操作を決定します。 LangGraph の活用LangGraph の設計原則と基本コンポーネントについて簡単に理解できたので、実際に LangGraph を使用して北京の2024 年春節の観光情報を照会する方法を例で見てみましょう。ビッグモデルに精通している友人は、ビッグモデルの欠点はリアルタイムの情報について何も知らないことだということを知っているかもしれません。新しい知識を吸収したい場合は、新しいデータセットでトレーニングする必要があります。そこで、LangGraphを使用してネットワーク検索機能を呼び出し、リアルタイムの情報を取得します。 LangChainプロキシを作成するLangChain では、エージェントは大規模なモデルを推論エンジンとして使用して、実行するアクションのシーケンスを決定します。これは、チェーンにハードコードされた一連のアクションとは異なります。端的に言えば、彼はこの任務を遂行する上での「キーパーソン」です。彼は「 2024年春節の北京の観光状況を調査する」という任務の全体責任者であり、最終的にユーザーに結果を提供します。 上記のコードの説明は次のとおりです。 1. `from langchain import hub` - `langchain` パッケージから `hub` オブジェクトをインポートします。langchain hub は、さまざまなアプリケーション シナリオ用に作成された多数のプロンプトを維持します。ユーザーは、作成したプロンプトをハブにアップロードすることもできます。 2. `from langchain.agents import create_openai_functions_agent` - OpenAI 関数に基づいてエージェントを作成するために使用される `langchain` パッケージから `create_openai_functions_agent` 関数をインポートします。 3. `from langchain_openai.chat_models import ChatOpenAI` – OpenAI チャット モデルと対話するために使用される `langchain_openai` パッケージから `ChatOpenAI` クラスをインポートします。 4. `from langchain_community.tools.tavily_search import TavilySearchResults` - 検索結果機能を提供するために使用される `langchain_community` パッケージから `TavilySearchResults` クラスをインポートします。 5. `tools = [TavilySearchResults(max_results=1)]` - 検索結果の数を最大 1 に制限する `TavilySearchResults` インスタンスを含むリスト `tools` を作成します。ここでは、Tavily のツールを使用してインターネット検索を実装する必要があります。 6. `prompt = hub.pull("hwchase17/openai-functions-agent")` - `hub` オブジェクトの `pull` メソッドを通じて `hwchase17/openai-functions-agent` という名前のプロンプトを取得します。 7. `print(prompt)` - 取得したプロンプトを出力します。 8. `llm = ChatOpenAI(model="gpt-3.5-turbo-1106", streaming=True)` - Large Language Model (LLM) チャットインスタンスを初期化し、`gpt-3.5-turbo-1106` モデルの使用を指定し、ストリーミングモードを有効にします。 9. `agent_runnable = create_openai_functions_agent(llm, tools, prompt)` – LLM インスタンス、ツールのリスト、およびプロンプトを指定して実行できる OpenAI 関数エージェントを作成します。 このコードの目的は、OpenAI Chat モデルと対話するための環境を初期化して構成することです。まず、コンテンツ管理用の `hub` オブジェクト、OpenAI 関数エージェントを作成するための `create_openai_functions_agent` 関数、OpenAI チャット モデルと対話するための `ChatOpenAI` クラス、検索機能を提供する `TavilySearchResults` クラスなど、必要なモジュールとクラスをインポートします。次に、コードはツール リストを作成し、langchain ハブから定義済みのプロンプトを取得します。 ここでプロンプトを表示します 印刷結果は以下のようになります。 このプロンプトはLangChainから来ています さまざまな大規模モデルプロンプトを検出して共有するために使用されるハブ。ここで使用するのは、他の人が定義したプロンプト ワード テンプレートです。エージェント操作の生成に使用される入力変数とメッセージを定義します。表示される「プロンプト」の内容を一つずつ説明します。 1. `input_variables=['agent_scratchpad', 'input']` - これは、`agent_scratchpad` と `input` を含む入力変数リストを指定します。 2. `input_types` - これは、次のキーとそれに対応する型を含むさまざまな入力タイプを定義する辞書です。
3. `messages` - これはいくつかの異なるタイプのテンプレートを含むリストです:
エージェントがメッセージと対話を処理する方法を定義します。エージェントを使用してタスクを実行する場合、このテンプレートを使用して、事前設定された形式に準拠した入力が生成され、エージェントの正しい応答とアクションが容易になります。 langchain hub.pull("hwchase17/openai-functions-agent") を使用してこのプロンプト テンプレートを langchain ハブからプルすると、このテンプレートを使用して、定義された入力タイプとメッセージ形式を理解して処理し、効率的で便利なアシスタントとして機能するようにエージェントを構成できます。ユーザーは、ニーズに応じて新しいプロンプトを作成し、ハブにアップロードしてさまざまなシナリオに適応することもできます。 グラフ状態を作成するエージェントを作成した後、次のステップはグラフの状態を定義することです。従来の LangChain エージェントの状態には、次のプロパティがあります。
コードは次のとおりです。 上記のコードでは以下の点を説明する必要があります。
ノードの定義グラフ状態を作成する方法を紹介した後、次に注目すべきはノードを定義する方法です。 LangGraph では、ノードは関数または実行可能なエンティティのいずれかになります。私たちのタスクでは、2 つのメイン ノードを定義する必要があります。
ノードを定義することに加えて、いくつかのエッジも定義する必要があります。これらのエッジの一部は条件付きである可能性があります。エッジは条件付きです。これは、ノードの出力に応じて複数の異なるパスが実行される可能性があるためです。ノードを実行するときに、特定のパスはビッグモデルによって決定される必要があります。 条件付きエッジ: プロキシが呼び出された後に何を実行するかを決定します。エージェントがアクションを実行する必要があるときはツールを呼び出す必要があります。エージェントがタスクを完了したと判断した場合は終了する必要があります。 通常のエッジ: ツールを呼び出した後は、常にエージェントに戻って次に何を行うかを決定する必要があります。 ここで、ノードと、どの条件エッジを取るかを決定する関数を定義しましょう。この関数は、エージェント ノードの出力に基づいて、ツールを呼び出すかプロセスを終了するかを決定します。このようにして、さまざまな状況に応じて適切なパスを選択できる柔軟なグラフを構築できます。 上記のコードからわかるように、3 つの関数が定義されています。
ワークフローの定義(グラフとエッジ)この時点で、エージェント、グラフの状態、ノードなどに関する情報が得られます。上記の情報を結び付けるためには、状態ベースのワークフローを構築する必要があります。ワークフローには条件付きノード遷移と線形ノード遷移が含まれており、特定の条件に基づいてプログラム内で次に実行する操作を決定するために使用されます。このプロセスは、さまざまな状態またはノードが特定のロジックに従って遷移できるイベントベースのシステムをシミュレートします。コードは次のとおりです。 コードはかなり長いので、次のように分解して説明します。
このコードはワークフローを定義し、ノードを追加し、エッジを設計します。次の図を使用してその原理を理解しましょう。エージェントは、ワークフロー全体が入るノードであり、一番左にあります。エージェントとアクションは共通のエッジを形成し、理解しやすいです。エージェントは検索タスクを開始し、アクションはタスクを完了します。次に、エージェント should_continue関数と同様に、条件を設定することで条件エッジが作成されます。 should_continue関数自体はノードではなく、判定条件です。関数の内容から、アクションが結果を取得した場合はワークフローが終了し (End)、そうでない場合は検索タスクが続行される (continue) ことがわかります。わかりやすくするために、ダイヤモンドで表現しています。Action が実行された後、should_continue によって判断され、正しいブランチが選択されます。続行を選択した場合、ワークフロー全体がループを形成することを意味します。アクションの作業が完了できない場合、つまりエージェントを満足できない場合は、実行回数が超過するまで検索作業を繰り返す必要があり、その後終了します。 検索タスクを実行する以上の操作により、ワークフローが作成され、実行できるようになります。上記のコード: 「 2024年の春節期間中の北京の観光状況はどうなっているか?」という質問をします。ワークフローインスタンスによる出力結果を次の図に示します。 最初のエージェント_outcome 、明らかにエージェントがコマンドを発行すると、 tavily 検索ツールが動作を開始します。 次はタビリー 検索ツールは、関連情報が取得された Web サイトのアドレスなど、検索の中間ステップを記録します。このとき、2 番目のエージェント_outcomeの内容はAgentFinish としてマークされています。これは、エージェントが結果に満足し、タスクを完了できることを意味します。同時に、検索の最終結果が示され、これは私たちの期待と一致しています。 要約するLangGraph テクノロジーは、複雑なタスクの処理において明らかな利点があります。円形グラフを使用することで、大規模なモデルと外部ツールを連携させ、複数回の対話と調整を実現し、最終的な答えにより近づくことができます。この技術は幅広い応用が期待でき、作業効率や問題解決能力を大幅に向上させることができます。ただし、Langgraphアプリケーションを作成するには、特定の技術的なしきい値も必要です。将来、Langgraphは複雑なタスクを処理する重要な技術的手段になると予想されています。 著者について51CTO コミュニティ エディター兼シニア アーキテクトの Cui Hao 氏は、ソフトウェア開発とアーキテクチャで 18 年の経験があり、分散アーキテクチャでは 10 年の経験があります。 |
<<: Kubernetes デバッグの究極の武器: K8sGPT
6月16日、MetaのCEOマーク・ザッカーバーグ氏とその代理人は、Metaが開発中の新しい人工知...
[[336522]]ビッグデータダイジェスト制作編集者: ルナ教科書で習ったことと実際の業務に乖離...
2月20日のニュースによると、コンピューティングコストが急騰しているため、人工知能業界の新興企業は...
自動運転車の主な目標、少なくともこの技術の支持者が推進している目標は、運転手や乗客の利便性を高めるこ...
AI は、ネットワークとデバイスが過去の決定から学習し、将来のアクティビティを予測し、パフォーマン...
10 年以内に、人々は複雑なデジタル環境において人工知能 (AI) にますます依存するようになるで...
序文ブルートフォース クラッキング ツール hashcat を使用したことがある人なら誰でも、このソ...
Transformer に関しては、Google DeepMind による新たな発見がかなりの論争を...
新型コロナウイルス肺炎の流行が始まって以来、多くのハイテク技術がこの疫病との戦いに後方支援を提供して...
人間とは異なり、人工ニューラル ネットワークは新しいことを学習するときに以前に学習した情報をすぐに忘...
この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...
[[328842]] 【51CTO.com クイック翻訳】世の中にはさまざまな種類の Python...