LangChain+LangGraphという体系をまとめてみます

コースをすべて修了していないため

LangChain+LangGraphという体系をまとめてみます

しかし、実際にはすでにいくつかの概念は理解しています

これまで、いくつかの概念について誤解していました

1. GPTとは何か、

2. ChatGPTとは何か

3. エージェントとは何か

4. 従来のエンジニアリング型プログラミングとエージェントそれぞれの長所・短所

5. LangChain+LangGraphという技術スタックを使用するためのデモを構築する

6. LangChain+LangGraphという技術スタックがどのような仕組みを提供しているか

? まず、いくつかの基本概念を整理しましょう

技術スタックを深く掘り下げる前に、基本的でありながら混同されやすいいくつかの概念を明確にしておく必要があります。

  • GPTとは何か?

    GPT (Generative Pre-trained Transformer) は、OpenAIが開発した具体的な大規模言語モデル(LLM)です。これは強力な「スーパーブレイン」と捉えることができ、その中核となる能力は人間の言語を理解し生成することです。市場には他にもGoogleのGeminiやAnthropicのClaudeなどがあり、これらはすべて異なるベンダーが開発した「ブレイン」です。

  • ChatGPTとは?

    ChatGPTは、OpenAI社がGPTモデルに基づいて構築した具体的な製品(アプリケーション)です。これはチャットインターフェースであり、その背後にはGPTという「脳」が駆動しています。

  • エージェント(インテリジェントエージェント)とは?

    GPTを「脳」、ChatGPTを「話すことができる脳」と例えるなら、エージェントとは「行動し、協調し、学習できるデジタル従業員」のことです。

    単に受動的に質問に答えるだけでなく、目標が与えられると、自律的にタスクの分解、計画、ツール(検索や天気予報など)の呼び出し、そして振り返りを行うことができます。その中核となるメカニズムは、「思考-行動-観察」というサイクルであり、環境からのフィードバックに基づいて戦略を絶えず調整し、目標を達成するまで継続します。

⚖️ 従来のエンジニアリング型プログラミング vs. Agent:長所・短所の比較

Agentとは何かを理解した上で、私たちが慣れ親しんでいる従来のプログラミングとはどう異なるのでしょうか?簡単に言えば、これは**「確定的な実行」から「自律的な意思決定」**への転換です。

次元 従来のエンジニアリング型プログラミング エージェント (インテリジェントエージェント)
意思決定者 人間(開発者) AI(モデル自体)
中核ロジック 事前定義:すべてのルール、プロセス、および例外処理は事前に記述しておく必要がある。 動的計画法:目標に基づいてタスクを自律的に分解し、どのツールを呼び出し、どのような順序で実行するかを決定する。
プロセス制御 決定性:コードはあらかじめ定められたA→B→Cの経路で実行され、結果は予測可能である。 不確実性:実行経路は、モデルの各ステップにおける「思考」と外部環境からのフィードバックによって決まる。
適用シーン ビジネスロジックが明確かつ安定しており、正確性と制御性が極めて求められるシーン(例:金融取引、基盤インフラ)。 タスクが複雑でオープンであり、非構造化情報の処理と自律的な意思決定が必要なシナリオ(例:AIカスタマーサービス、パーソナルアシスタント)。
長所 正確で制御可能、安定性と信頼性が高く、デバッグが容易。各行のコードのロジックは確定している。 柔軟かつインテリジェントで、複雑なタスクを処理できる。従来のプログラミングではルールを定義しにくかった問題を解決できる。
欠点 柔軟性に欠ける。事前に定義されていない状況に遭遇すると失敗し、ルールの複雑さが増すにつれて保守コストも上昇する。 予測不可能、デバッグが困難、コストが高い。「幻覚」を生じたり、誤った判断を下したりする可能性がある。

?️ LangChain + LangGraph 技術スタックの分析

さて、この技術スタックそのものに注目してみましょう。

1. 構築と設定方法は?その「生息地」はどこにあるのか?
  • LangChain :これは主にPythonおよびJavaScriptのライブラリです。その「生息地」は、あなたのコードプロジェクトです。パッケージマネージャー(例:pip install langchain)を使用してプロジェクトにインストールし、コード内でimportによって利用します。
  • LangGraph :これも同様にライブラリ(pip install -U langgraph)であり、単独で使用することもできますが、LangChainと組み合わせて使用されることが一般的です。その「生息地」も、あなたのコードプロジェクト内です。
2. どのような分野の問題を解決するのか?
  • LangChain :解決するのは、「ブロックを使って家を建てる」という課題です。各種大規模モデル、外部データ、ツールと連携するためのテンプレートなど、標準化された「ブロック」(コンポーネント)を多数提供し、開発者が効率的かつ柔軟に様々なLLMアプリケーションを組み立てられるようにします
  • LangGraph :解決するのは、「複雑なエージェントプロジェクトのために、正確な施工フロー図を作成する方法」という問題です。これは、ステートを持つ、多段階の、複雑な意思決定を必要とするAIエージェント(Agent)の構築に特化しています。
3. 完全なビジネスフローとは何か?
  • 入力側(プロデューサー) :通常はエンドユーザーまたは上流システムであり、これらが複雑な目標や問題を提示します。
  • 処理プロセス(ブラックボックス)
    1. LangChainは**「組織化」を担当します:ユーザーの要求、外部データ、ツール呼び出しなどを線形のステップシーケンス**としてオーケストレーションし、段階的に大規模モデルに処理を委ねます。
    2. LangGraphは**「スケジューリング」を担当します:処理プロセス全体をグラフ(Graph)**としてモデル化します。状態(State)は、ノード(Node)(「モデルの呼び出し」や「ツールの実行」といった処理ステップを表す)の間を移動し、プロセスは条件に応じてノード間をエッジ(Edge)を介して移動したり、ループしたり、さらには一時停止したりすることができます。
  • 出力側(コンシューマー):処理完了後、結果をユーザーまたは下流システムに返します。
4. どのような中核的なメカニズムが提供されていますか?(APIと抽象化)
  • LangChain :中核となるのは**「コンポーネント化」と「線形オーケストレーション」**です。
    • コンポーネント(Components)PromptTemplate(プロンプトテンプレート)、DocumentLoader(ドキュメントローダー)、OutputParser(出力パーサー)など、さまざまな標準化されたパーツを提供します。
    • LCEL (LangChain Expression Language) :宣言型構文であり、簡潔な|パイプ記号を用いてコンポーネントをチェーン状に連結できる。
  • LangGraph :中核となるのは**「グラフベースのステートマシン(Graph-based State Machine)」**である。
    • State(状態):ワークフロー全体を通じて渡され、共有されるグローバルオブジェクトです。
    • Node(ノード) :ワークフロー内のステップの一つであり、通常は関数として、Stateを受け取り、更新されたStateを返します。
    • Edge(エッジ) :ノードを接続し、実行の流れを定義します。確定的なエッジである場合もあれば、条件付き(Conditional Edge)エッジである場合もあり、Stateの値に基づいて、次のステップでどのノードに進むかが決定されます。
5. コード内でこれを「有効化」するには?(実装設定)

非常にシンプルな「Hello World」レベルの例を見てみましょう:

LangChain の例(LCEL を使用):

# 1. インストール: pip install langchain langchain-openai
# 2. 設定: 環境変数 OPENAI_API_KEY を設定

from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate

# 3. モデルとプロンプトテンプレートの初期化 (コンポーネントを使用)
model = ChatOpenAI(model=「gpt-3.5-turbo」)
prompt = ChatPromptTemplate.from_template(「{topic} に関するジョークを一つ教えて」)

# 4. LCELの | パイプ演算子を使ってそれらを「チェーン」として連結する(線形オーケストレーション)
chain = prompt | model

# 5. チェーンを呼び出し、入力を渡す
response = chain.invoke({「topic」: 「プログラマー」})
print(response.content)

この例は、LangChainがコンポーネントとLCELを使用して線形フローを迅速に構築する方法を示しています。

LangGraphの例(StateGraphを使用):

# 1. インストール: pip install langgraph
# 2. 設定: 追加の設定は不要

from typing import TypedDict
from langgraph.graph import StateGraph, END

# 3. 状態(State)の定義
class MyState(TypedDict):
    topic: str
    joke: str

# 4. ノード(Node)関数の定義
def generate_joke(state: MyState):
    # 通常はここでLLMを呼び出しますが、簡略化のため直接返します
    return {「joke」: f「これは {state[『topic』]} に関するジョークです」}

# 5. グラフの構築(Graph-based State Machine)
graph = StateGraph(MyState)
graph.add_node(「generate」, generate_joke) # ノードを追加
graph.set_entry_point(『generate』) # エントリポイントを設定
graph.add_edge(「generate」, END) # 終了ノードへのエッジを追加

# 6. コンパイルして実行
app = graph.compile()
result = app.invoke({「topic」: 『人工知能』})
print(result[「joke」])

この例では、LangGraphがStateNodeEdgeを定義することで、実行可能なワークフローを構築する方法を示しています。

? まとめ:図でわかる両者の関係

  • GPT/LLM:「脳」であり、思考と生成を担当します。
  • ChatGPT:「製品」であり、具体的なチャットアプリケーションです。
  • エージェント:「デジタル従業員」であり、ツールを自律的に使用して目標を達成できます。
  • 従来のプログラミング vs. エージェント:「指示を正確に実行する」ことと「自律的な意思決定で目標を達成する」ことの違いです。
  • LangChain:「ツールキットとブロック」であり、様々なパーツとシンプルな線形組み立て方法(A→B→C)を提供します。
  • LangGraph:「インテリジェントなフローチャート作成・実行エンジン」であり、ループ、分岐、意思決定が可能な複雑なステートマシンを構築するために使用されます。

これらは競合関係にあるのではなく、互いに補完し合うものです。LangChainは豊富な「ブロック」(ツールやコンポーネント)を提供し、LangGraphはより強力な「組み立て方法」(グラフ状態機のオーケストレーション)を提供します。実際の開発では、LangGraphのグラフノード内部でLangChainのコンポーネントを使用してタスクを完了させることも可能です。