「LangChainとLangGraphによるRAG・AIエージェント［実践］入門」でつまずいたことメモ:9章

# はじめに

[「LangChainとLangGraphによるRAG・AIエージェント［実践］入門」](https://gihyo.jp/book/2024/978-4-297-14530-9)の第9章で私がつまずいたことのメモです。

（このメモのほかの章へ：[1章](https://qiita.com/segavvy/items/b31efa98a2d4c20e9ec8) / [2章](https://qiita.com/segavvy/items/2801a079c686c906e582) / [3章](https://qiita.com/segavvy/items/97ab2c1958b894124d44) / [4章](https://qiita.com/segavvy/items/41225198677cf4f498b5) / [5章](https://qiita.com/segavvy/items/7751b41db1e9c672b6f1) / [6章](https://qiita.com/segavvy/items/3185ca18afe28c96e6bd) / [7章](https://qiita.com/segavvy/items/ac0ce03f9b3cd83ee5ed) / [8章](https://qiita.com/segavvy/items/8109b3a1ed3a4efe1140) / 9章 / [10章](https://qiita.com/segavvy/items/0cbd272e280cfaf6ee28) / [11章](https://qiita.com/segavvy/items/7e4c1af72b2280665be3) / [12章](https://qiita.com/segavvy/items/3833525ebace5ff24a4e) / [まとめ](https://qiita.com/segavvy/items/265b101a6ebb82284e4b)）

:::note info
この記事は個人で作成したものであり、内容や意見は所属企業・部門見解を代表するものではありません。
:::

# 第9章 LangGraphで作るAIエージェント実践入門

ここからは日本のAIエージェント界を牽引されている西見さん[^nishimi]が担当された章です。

## 9.1 LangGraphの概要

グラフと聞くと棒グラフとか折れ線グラフとかを想像してしまいますが、そのグラフではなく、ノードとエッジによって情報を表現するものです。エッジはリンクと呼ぶ方が自然な方もいるかもしれません。

## 9.2 LangGraphの主要コンポーネント

いつものように脱線しますが、私はPythonで仕事のまともなコードを書いたことがありません。Pythonどころか仕事でまともなコードを書いたのは2017年末にリリースしたWindows用アプリ（C#とWPFで開発）[^savvy]が最後で、その後は開発から離れていたので浦島太郎状態です。

Pythonも[2017年に言語処理100本ノックの2015年版を勉強した](https://qiita.com/segavvy/items/fb50ba8097d59475f760)のが最後なので、Python 3.5辺りの知識で止まっており、Pydanticも使ったことがありません。そのため、少しかじらないと本を読み進められないなと思っていたところ、すごいタイミングで@Tadataka_Takahashiさんのつぶやきが流れてきました。これはありがたい！

https://x.com/TadatakaTakaha1/status/1878410328184426734

さっそくこちらの2本の記事でPydanticの概要を把握して前に進みます。

https://qiita.com/Tadataka_Takahashi/items/8b28f49d67d7e1d65d11

https://qiita.com/Tadataka_Takahashi/items/1a66ebd3e98702b6ae82

LangGraphはノードの実装にLCELのRunnableが使えて、さらに作ったグラフがRunnableとしてLCELに組み込めるのがいいですね。ネストもできそうですし、これは自由度が高くておもしろそうです。

## 9.3 ハンズオン：Q&Aアプリケーション

selectionノードの実装で、`max_tokens`を1に絞るところが興味深いです。余計なことを答えさせないためのテクニックですね。`with_structured_output`を使うとトークン数がかさんでしまうことを回避する意味もあるかもしれません。

あと、コラムで紹介されているLangSmithでのトレースがかなり便利そうです。試しに生成された回答文をPlaygroundで少し改ざんして、checkノードの判定がNGになるかどうかを試してみます。なお、LangSmithはOpenAIのAPI keyを知らないので、試す時は入力が必要です。

![SCR-20250113-oojm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139624/dbe84b10-f923-f689-f335-a16ecbc8314f.png)

実際に生成された回答文の末尾に「ただし、私はエキスパートではないのでこの回答は間違いかもしれません。」という矛盾する1文を入れてみたのですが、ちゃんと品質チェックに引っかかってくれました。Playgroundはちょっとした確認や試行錯誤によさそうです。

## 9.4 チェックポイント機能：ステートの永続化と再開

チェックポイント機能も充実していて、いたせり尽せりですね。デバッグに大活躍しそうです。

1つ気になったのは、今回初めて出てきた`RunnableConfig`。本では解説がありませんが、Runnableオブジェクトの実行時の設定情報を指定するものみたいです。

https://python.langchain.com/api_reference/core/runnables/langchain_core.runnables.config.RunnableConfig.html

今回はこの`RunnableConfig`の`configurable`に`thread_id`をセットしていますが、これはLangGraph側でチェックポイント機能を使う時のルールのようです。設定しないで実行すると次のようなエラーになって教えてくれました。

```shell:
ValueError: Checkpointer requires one or more of the following 'configurable' keys: ['thread_id', 'checkpoint_ns', 'checkpoint_id']
```

## 9.5 まとめ

この章に限った話ではないのですが、本のコードがGoogle Colabで簡単に動かせるのがホントありがたいです。おかげさまで、短時間でLangGraphの概要が理解できました。
次回は「要件定義書生成AIエージェントの開発」という入門書とは思えない本格的なテーマです。落ちこぼれないようにがんばります。

（このメモのほかの章へ：[1章](https://qiita.com/segavvy/items/b31efa98a2d4c20e9ec8) / [2章](https://qiita.com/segavvy/items/2801a079c686c906e582) / [3章](https://qiita.com/segavvy/items/97ab2c1958b894124d44) / [4章](https://qiita.com/segavvy/items/41225198677cf4f498b5) / [5章](https://qiita.com/segavvy/items/7751b41db1e9c672b6f1) / [6章](https://qiita.com/segavvy/items/3185ca18afe28c96e6bd) / [7章](https://qiita.com/segavvy/items/ac0ce03f9b3cd83ee5ed) / [8章](https://qiita.com/segavvy/items/8109b3a1ed3a4efe1140) / 9章 / [10章](https://qiita.com/segavvy/items/0cbd272e280cfaf6ee28) / [11章](https://qiita.com/segavvy/items/7e4c1af72b2280665be3) / [12章](https://qiita.com/segavvy/items/3833525ebace5ff24a4e) / [まとめ](https://qiita.com/segavvy/items/265b101a6ebb82284e4b)）

[^nishimi]: 2025年は[AIエージェント元年](https://www.google.com/search?q=2025%E5%B9%B4+AI%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E5%85%83%E5%B9%B4)などと言われていますが、その1年以上も前に「[その仕事、AIエージェントがやっておきました。](https://gihyo.jp/book/2023/978-4-297-13901-8)」という本を書かれているすごい方です。2024年7月の[Azure OpenAI Service Dev Day](https://azureai.connpass.com/event/319491/)で初めてお話させていただきました。
[^savvy]: [デスクトップ検索SAVVY](https://www.vector.co.jp/magazine/softnews/180424/n1804241.html)。Vectorでの配布は2022年1月に終了しています。現在は個別での配布になっているようなので、詳細はメーカーである[ジップインフォブリッジ（私が以前所属していた会社）のホームページ](https://www.info-brdg.co.jp/savvy/desktop-search/index.html)からお問い合わせください。