LangGraphのQuickStartを写経した。（前半）

## はじめに
**LangGraph**はLLMエージェントアプリケーション構築用のツールとして話題ですが、触れる機会がなかったので、QuickStartを写経してみました。

基本的には自分用の覚書レベルのメモですが、もしかしたら誰かの役に立つかもしれないので公開することにしました。

今回は、前半としてQuickStartのPart.4までをやっています。

### 参考サイト
写経に際して参考にしたサイトを先に掲載します。
- [【LangChainゆる勉強会#6】LangGraphのチュートリアルを動かしながら解説](https://studyco.connpass.com/event/318741/)
- [上記動画アーカイブ](https://www.youtube.com/live/v3b4MEII-cc?feature=shared)
- [LangGraph公式のQuickStart](https://langchain-ai.github.io/langgraph/tutorials/introduction/)

### 動作環境
QuickStartは特に実行環境を定めていませんが、今回は以下のような環境で実行しています。
- OS : macOS Sonoma
- Pythonパッケージ管理 : poetry
- 各ライブラリーバージョン : 
    - [こちらを参照ください](https://github.com/tis-abe-akira/langchain-study6/blob/main/pyproject.toml)

## 写経の内容
ほぼ公式のままコマンド実行できるようにしていますが、一部変更している箇所もあります。
その点を中心に補足していきます。

### 全般的な変更点
QuickStartではanthropic社（Claude）のAPIを使っていますが、今回はOpenAI（GPT-4o）を使用しています。

### Part 1: Build a Basic Chatbot
#### このパートの概要
LangGraphを使って、簡単なチャットボットを作成します。
![Screenshot 2024-09-02 at 8.41.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/1cab04d4-f31a-c33f-7c78-7b02eedc9b87.png)


#### コード
[お手本](https://langchain-ai.github.io/langgraph/tutorials/introduction/#part-1-build-a-basic-chatbot)
[写経結果](https://github.com/tis-abe-akira/langchain-study6/blob/main/src/1_basic_chatbot.py)

#### 変更箇所
ここでは、Mermaid記法のGraph図をコマンド実行時にHTMLファイルへ出力するため、自作のユーティリティーを呼び出すようにしました。

```python:1_basic_chatbot.py
""" 呼び出し箇所の抜粋 """

graph = graph_builder.compile()

# Mermaid記法のGraph図を生成
mermaid_code = graph.get_graph().draw_mermaid()

# Mermaid記法のGraph図をHTMLファイルに出力
save_mermaid_to_html(mermaid_code, "out/basic_graph.html")
```

```pyton:utils.py
def save_mermaid_to_html(mermaid_code, output_file="graph.html"):
    html_content = f"""
    <!DOCTYPE html>
    <html>
    <head>
        <script type="module">
            import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs';
            mermaid.initialize({{ startOnLoad: true }});
        </script>
    </head>
    <body>
        <div class="mermaid">
            {mermaid_code}
        </div>
    </body>
    </html>
    """

    with open(output_file, "w") as file:
        file.write(html_content)

    print(f"Graph has been written to {output_file}. Open this file in a web browser to view the graph.")
```

#### 実行イメージ

<details><summary>特筆すべき点がないので折りたたみにしました。</summary>

シンプルなフローなので実質LLMとチャットするだけの挙動です。
```bash
% poetry run python src/1_basic_chatbot.py 
Graph has been written to out/basic_graph.html. Open this file in a web browser to view the graph.
User: LangChainとLangGraphの違いを教えてください。
Assistant: LangChainとLangGraphは、どちらも自然言語処理（NLP）と機械学習を活用したツールですが、用途や機能にいくつかの違いがあります。以下にそれぞれの概要と主な違いを説明します。

### LangChain
LangChainは、主に言語モデル（例：GPT-3）を活用したアプリケーションの開発を支援するためのフレームワークです。以下のような特徴があります。

1. **チェーン構造**: 複数の言語モデルやタスクを連結して、一連の処理を行うことができます。例えば、テキスト生成の後に感情分析を行うといったチェーンを構築できます。
2. **柔軟な統合**: さまざまなAPIやサービスと簡単に統合できるように設計されています。
3. **カスタマイズ性**: 特定のユースケースに合わせてカスタマイズが容易です。
4. **ユースケース**: チャットボット、テキスト要約、質問応答システムなど、多岐にわたるNLPアプリケーションの開発に適しています。

### LangGraph
LangGraphは、主に言語モデルをグラフ構造として視覚化し、解析するためのツールです。以下のような特徴があります。

1. **グラフ解析**: 言語モデルの出力や内部表現をグラフとして視覚化し、分析できます。
2. **データの可視化**: 言語モデルのトークン間の関係や相互作用を視覚的に理解するための機能を提供します。
3. **モデルのデバッグ**: モデルの挙動や性能をデバッグするためのツールとしても利用されます。
4. **研究用途**: モデルの内部構造やトークンの相互作用を深く理解するための研究に適しています。

### 主な違い
1. **目的**:
   - **LangChain**: 言語モデルを使ったアプリケーションを開発・実装するためのフレームワーク。
   - **LangGraph**: 言語モデルの解析と視覚化を主な目的としたツール。

2. **機能**:
   - **LangChain**: チェーン構造で複数のタスクを連結し、実際のNLPアプリケーションを構築する機能に特化。
   - **LangGraph**: モデルの出力や内部表現をグラフとして視覚化し、解析する機能に特化。

3. **用途**:
   - **LangChain**: 実際のプロダクト開発や商用アプリケーションの構築。
   - **LangGraph**: 研究やモデルのデバッグ、理解のためのツール。

これらの違いを理解することで、どのツールが自分のプロジェクトやニーズに適しているかを判断するのに役立つでしょう。
User: exit
Goodbye!
```
</details>

### Part 2: Enhancing the Chatbot with Tools
#### このパートの概要
LangGraphを使って、Web検索を伴うチャットボットを作成します。
エージェントの基本的な機能の実装です。
![Screenshot 2024-09-02 at 8.43.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/f5c8d69d-1eca-80ae-3688-3f7cd2714e09.png)



#### コード
[お手本](https://langchain-ai.github.io/langgraph/tutorials/introduction/#part-2-enhancing-the-chatbot-with-tools)
[写経結果](https://github.com/tis-abe-akira/langchain-study6/blob/main/src/2_chatbot_with_tools.py)

#### 実行イメージ

<details><summary>実行イメージはこちらを展開すると見れます。</summary>

```bash
% poetry run python src/2_chatbot_with_tools.py 
Graph has been written to out/chatbot_with_tools.html. Open this file in a web browser to view the graph.
User: LangGraphの直近のアップデートを教えてください。回答は日本語でお願いします。
Assistant: 
Assistant: [{"url": "https://github.com/langchain-ai/langgraph", "content": "Overview. LangGraph is a library for building stateful, multi-actor applications with LLMs, used to create agent and multi-agent workflows. Compared to other LLM frameworks, it offers these core benefits: cycles, controllability, and persistence. LangGraph allows you to define flows that involve cycles, essential for most agentic architectures ..."}, {"url": "https://blog.langchain.dev/langgraph-cloud/", "content": "LangGraph is giving us the control and ergonomics we need to build and ship powerful coding agents.\" - Michele Catasta (VP of AI @ Replit) For the most complex or sensitive tasks, human collaboration is still needed to supplement agentic automation. LangGraph makes human-agent collaboration possible through its built in persistence layer."}]
Assistant: 直近のLangGraphのアップデートに関して、詳細な情報は公式のGitHubリポジトリやLangGraphのブログで確認できます。

- **GitHubリポジトリ**: [LangGraph GitHub](https://github.com/langchain-ai/langgraph)
  - LangGraphは、状態を持つマルチアクターアプリケーションを構築するためのライブラリです。LLM（大規模言語モデル）を利用してエージェントやマルチエージェントのワークフローを作成するのに使用されます。サイクル、コントロール性、永続性といったコアなメリットを提供します。

- **公式ブログ**: [LangGraphのブログ](https://blog.langchain.dev/langgraph-cloud/)
  - 最新のアップデート情報や使い方についての詳細が記載されています。また、LangGraphは人間とエージェントのコラボレーションを可能にする永続性レイヤーを内蔵しており、複雑なタスクやデリケートな作業においても対応できるよう設計されています。

最新の機能やアップデート内容についてはこれらのソースを確認することが推奨されます。
User: exit
Goodbye!
```
</details>

#### LangSmithで制御の流れをチェック
LangSmithで見ると、Tavilyを使ってWeb情報を検索しているのがわかります。
![Screenshot 2024-09-02 at 8.37.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/1b0f76af-9f47-926e-7e3a-d74ee9d8ed54.png)

ネット検索不要な場合の挙動：
ネット検索が不要な質問の場合には、Web検索をせずに回答しています。
![Screenshot 2024-09-02 at 8.45.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/f6413c6e-df33-08ed-4937-bf9d4e5dab95.png)


### Part 3: Adding Memory to the Chatbot
#### このパートの概要
LangGraphを使って、Web検索を伴うチャットボットを作成します。
会話履歴を保存するために、checkpointを使います。

#### コード
[お手本](https://langchain-ai.github.io/langgraph/tutorials/introduction/#part-3-adding-memory-to-the-chatbot)
[写経結果](https://github.com/tis-abe-akira/langchain-study6/blob/main/src/3_chatbot_with_checkpoint.py)

#### 実行イメージ

<details><summary>実行イメージはこちらを展開すると見れます。</summary>

```bash
% poetry run python src/3_chatbot_with_checkpoint.py 
================================ Human Message =================================

LangGraphの最近の主要なアップデートについて教えてください。
================================== Ai Message ==================================
Tool Calls:
  tavily_search_results_json (call_u9zQqycwMPguphhieVO5xpOy)
 Call ID: call_u9zQqycwMPguphhieVO5xpOy
  Args:
    query: LangGraph recent major updates 2023
================================= Tool Message =================================
Name: tavily_search_results_json

[{"url": "https://changelog.langchain.com/?date=2024-06-01", "content": "Check out the latest product updates on the LangChain LaunchNotes page. ... \u2601 \ud83d\ude80 LangGraph Cloud: Deploy at scale, monitor carefully, iterate boldly ... December 2023 November 2023 October 2023. Powered by LaunchNotes. Subscribe to updates"}, {"url": "https://blog.langchain.dev/langgraph-studio-the-first-agent-ide/", "content": "In January 2023, we launched LangGraph, a highly controllable, low-level orchestration framework for building agentic applications. ... LangGraph Studio detects changes to the underlying code files, allowing you to update prompts in your code editor and rerun nodes if an agent responds poorly. This can make it much easier to iterate on long ..."}]
================================== Ai Message ==================================

ここにLangGraphの最近の主要なアップデートに関する情報があります：

1. **LangGraph Cloud**: これは大規模なデプロイメント、慎重なモニタリング、および大胆なイテレーションを可能にする新しい機能です。このアップデートにより、LangGraphのクラウド環境での利用が容易になり、スケールアウトが可能になります。

2. **LangGraph Studio**: 2023年1月にリリースされたLangGraphは、エージェントアプリケーションを構築するための低レベルのオーケストレーションフレームワークです。LangGraph Studioは、基盤となるコードファイルの変更を検出し、コードエディタ内でプロンプトを更新し、エージェントが適切に応答しない場合にノードを再実行することができます。これにより、長時間にわたるイテレーションが容易になります。

さらに詳細な情報は、LangGraphの公式サイトやブログで確認することができます。
================================ Human Message =================================

アップデートの中から最も重要なものを一つ選んでください
================================== Ai Message ==================================

最も重要なアップデートとして選ぶべきは**LangGraph Cloud**です。

### なぜLangGraph Cloudが重要なのか

- **スケーラビリティ**: 大規模なデプロイメントが可能になるため、より多くのユーザーやデータを扱うことができます。
- **モニタリング**: システムのパフォーマンスやエージェントの動作を慎重に監視する機能が強化されており、問題の早期発見と解決が可能です。
- **イテレーション**: クラウド環境での連続的な改善と更新が容易になるため、迅速なアップデートとフィードバックループが実現できます。

このように、LangGraph Cloudは全体的なシステムのパフォーマンスと効率を大幅に向上させ、より信頼性の高い運用を支援します。これは、エンタープライズレベルのアプリケーションやサービスを提供する上で極めて重要です。
```
</details>

LangSmithで見ると（少々分かりづらいですが）以前の会話を元にして（記憶を元にして）回答をしている様子が伺えます。

![Screenshot 2024-09-02 at 8.55.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/68b03d62-94e1-a152-9ef2-2bf8520a9a9f.png)


### Part 4: Human-in-the-loop
#### このパートの概要
このセクションでは、LangGraphのinterrupt_before機能を使って、ツール・ノードを常にブレークさせる方法を説明します。
![Screenshot 2024-09-02 at 9.01.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/be89e20d-c262-d732-941a-5a022a76ab0b.png)

#### コード
[お手本](https://langchain-ai.github.io/langgraph/tutorials/introduction/#part-4-human-in-the-loop)
[写経結果](https://github.com/tis-abe-akira/langchain-study6/blob/main/src/4_human_in_the_loop.py)

#### コード補足説明
```python: interruptを埋め込む
graph = graph_builder.compile(
    checkpointer=memory,
    # This is new!
    interrupt_before=["tools"],
    # Note: can also interrupt __after__ actions, if desired.
    # interrupt_after=["tools"]
)
```

```python: Noneを追加することにより処理を再開する
# `None` will append nothing new to the current state, letting it resume as if it had never been interrupted
print("")
print("-------------------------- resuming --------------------------")
print("")
events = graph.stream(None, config, stream_mode="values")
for event in events:
    if "messages" in event:
        event["messages"][-1].pretty_print()

```
#### 実行イメージ

<details><summary>実行イメージはこちらを展開すると見れます。</summary>

```bash
% poetry run python src/4_human_in_the_loop.py
Graph has been written to out/human_in_the_loop.html. Open this file in a web browser to view the graph.
================================ Human Message =================================

LangGraphを学んでいます。それについて少し調べ日本語でまとめてもらえますか?
================================== Ai Message ==================================
Tool Calls:
  tavily_search_results_json (call_I0pzksIGv8rBC0bDNIvbw6v8)
 Call ID: call_I0pzksIGv8rBC0bDNIvbw6v8
  Args:
    query: LangGraph
('tools',)
[{'name': 'tavily_search_results_json', 'args': {'query': 'LangGraph'}, 'id': 'call_I0pzksIGv8rBC0bDNIvbw6v8', 'type': 'tool_call'}]

-------------------------- resuming --------------------------

================================== Ai Message ==================================
Tool Calls:
  tavily_search_results_json (call_I0pzksIGv8rBC0bDNIvbw6v8)
 Call ID: call_I0pzksIGv8rBC0bDNIvbw6v8
  Args:
    query: LangGraph
================================= Tool Message =================================
Name: tavily_search_results_json

[{"url": "https://www.langchain.com/langgraph", "content": "LangGraph is a framework for building stateful, multi-actor agents with LLMs that can handle complex scenarios and collaborate with humans. Learn how to use LangGraph with Python or JavaScript, and deploy your agents at scale with LangGraph Cloud."}, {"url": "https://www.datacamp.com/tutorial/langgraph-tutorial", "content": "LangGraph is a library within the LangChain ecosystem that simplifies the development of complex, multi-agent large language model (LLM) applications. Learn how to use LangGraph to create stateful, flexible, and scalable systems with nodes, edges, and state management."}]
================================== Ai Message ==================================

LangGraphについて調べた結果、以下の情報をまとめました。

### LangGraphとは
LangGraphは、複数のアクター（エージェント）が協力して複雑なシナリオを処理できるフレームワークです。このフレームワークは、LLM（Large Language Model）を活用して、状態管理が必要なシステムを構築するために設計されています。

### 主な特徴
1. **ステートフルなエージェント**: LangGraphは、エージェントがその状態を保持しながら動作することを可能にします。これにより、より複雑で柔軟なシステムを構築できます。
2. **マルチアクター対応**: 複数のエージェントが協力して動作するシステムを簡単に構築できます。これにより、人間とのコラボレーションや複数のタスクを同時に処理するシナリオが実現可能です。
3. **スケーラビリティ**: LangGraph Cloudを使用することで、大規模なデプロイメントも可能です。

### 使用言語
LangGraphは、PythonおよびJavaScriptで使用可能です。これらの言語を用いて、エージェントの開発やデプロイを行います。

### 利用方法
LangGraphを利用することで、ノード、エッジ、状態管理を組み合わせたシステムを構築できます。これにより、複雑なシナリオやタスクを効率的に処理することが可能となります。

さらに詳しい情報や具体的なチュートリアルについては、[LangChainの公式サイト](https://www.langchain.com/langgraph)や[DataCampのチュートリアル](https://www.datacamp.com/tutorial/langgraph-tutorial)を参照してください。
```
</details>


## まとめ
なかなかLagnGraphを使う機会がありませんでしたが、使ってみると、かなり複雑なフローを構築できるので、LangChainのAgentsなどよりも細かい制御ができそうです。

まずはツールなどの構築に使ってみようと思います。