『LangChainとLangGraphによるRAG・AIエージェント［実践］入門』は、LangChain/LangGraphを日本語で学習したい人にとって必携の一冊 part1

<img src="https://raw.githubusercontent.com/GenerativeAgents/agent-book/refs/heads/main/assets/cover.jpg" width="400">

- [Amazon](https://www.amazon.co.jp/dp/4297145308/)
- [技術評論社](https://gihyo.jp/book/2024/978-4-297-14530-9)

タイトル: LangChainとLangGraphによるRAG・AIエージェント［実践］入門

以降、「本書」と呼称します。

書評は二部構成です。
- [第一部の書評](https://qiita.com/arrowKato/items/9794afd5c0890606fcea) OpenAIのチャットAPIとLangChainの基礎からRAGまで ここ
- [第二部の書評](https://qiita.com/arrowKato/items/af3d1cb5e0121db88f1e) AgenticなAIシステム と LangGraph

# 前置き
[LangGraphのお勉強してますアピール](https://github.com/arrowkato/langchain-academy)をしていると、ありがたいことに、[著者の吉田さん](https://twitter.com/yoshidashingo)から、ご恵贈いただきました。吉田さんと大嶋さん共著の[ChatGPT/LangChainによるチャットシステム構築［実践］入門](https://www.amazon.co.jp/dp/4297138395)には大変お世話になりましたし、本書も購入&熟読予定だったので、早速拝読しています。

自然言語よりもソースコードが読みたい方は、[GenerativeAgents/agent-book(公式)](https://github.com/GenerativeAgents/agent-book) 参照です。蛇足ですが、VS Codeのシンタックスハイライトが必要な人は、[docker+devcontainer+uvで動かしてみたリポジトリ](https://github.com/arrowkato/agent-book) を参考に動作環境を作られると良いかもしれません。

## 対象読者
OpenAI の API と LangChain については、0から解説されているので、ChatGPT, Claude, Gemini などのチャットアプリに触れたことがあり、Python の基礎知識があれば、読み始められると思います。

他の言い方するならば、  
![生成AI徹底理解](https://d23iyfk1a359di.cloudfront.net/files/topics/29775_ext_24_1.png?version=1706747411&v=1706747411&width=870&scale=2)
[サイバーエージェントの99.6%にあたる社員・全役員が受講した「生成AI徹底理解リスキリング」とは？](https://www.cyberagent.co.jp/way/list/detail/id=29775) より引用

で言うところの、
- 生成AI徹底理解リスキリング for Everyone の全エンジニア
- 生成AI徹底理解リスキリング for Developers の初級~中級エンジニア

の方には特におすすめです。

[LangChain 公式 doc の Instruction](https://python.langchain.com/docs/introduction/) にも
> LangChain is a framework for developing applications powered by large language models (LLMs).

とあり、LangChain自体は、Foundation model 自体の構築、いわゆる事前学習や fine tuning ではなく、LLM を組み込んで使うときの様々な処理を書きやすくするためのライブラリですので。

## LangChain が使いにくいという意見もありますが・・・
- [LangChainを使わない](https://tech-blog.abeja.asia/entry/advent-2023-day13)
- [LangChain は LLM アプリケーションの開発に採用すべきではない](https://zenn.dev/kurarrr/articles/c001548c981aca)

上記のように、LLM でのアプリケーション開発に、LangChain を採用しないという意見もあるものの、一度触ってみないと LangChain の良し悪しもわからないと思いますので、LangChain 導入に迷っている方も本書を一読されるのが良いのではないかと思います。

# 書籍の目次
496ページの立派な鈍器ですので、二部構成で書評を書いていきます。
注：以下の第一部、第二部という区分けは書評の都合上で行ったものであり、書籍自体に存在するわけではありません。

## 第一部: OpenAIのChat チャットAPIとLangChain自体の利用方法
- 第1章　LLMアプリケーション開発の基礎
- 第2章　OpenAIのチャットAPIの基礎
- 第3章　プロンプトエンジニアリング
- 第4章　LangChainの基礎
- 第5章　LangChain Expression Language（LCEL）徹底解説
- 第6章　Advanced RAG
- 第7章　LangSmithを使ったRAGアプリケーションの評価

[第一部の書評](https://qiita.com/arrowKato/items/9794afd5c0890606fcea) ここ

## 第二部: AgenticなAIシステム と LangGraph
- 第8章　AIエージェントとは
- 第9章　LangGraphで作るAIエージェント実践入門
- 第10章　要件定義書生成AIエージェントの開発
- 第11章　エージェントデザインパターン
- 第12章　LangChain/LangGraphで実装するエージェントデザインパターン

[第二部の書評](https://qiita.com/arrowKato/items/af3d1cb5e0121db88f1e)


# 第1章　LLMアプリケーション開発の基礎
- 1.1　活用され始めた生成AI
- 1.2　Copilot vs AIエージェント
- 1.3　すべてはAIエージェントになる
- 1.4　AIエージェントの知識地図
- 1.5　まとめ

導入なのであまり言うことはないです。
LLM以外の画像生成、音声合成、動画生成も生成AIの一部に入れたほうが正確ですが、本書が自然言語処理にフォーカスしていることが伺えます。

# 第2章　OpenAIのチャットAPIの基礎
- 2.1 OpenAIのチャットモデル
- 2.2 OpenAIのチャットAPIの基本
- 2.3 入出力の長さの制限や料金に影響する「トークン」
- 2.4 Chat Completions APIを試す環境の準備
- 2.5 Chat Completions APIのハンズオン
- 2.6 Function calling
- 2.7 まとめ


2章では、OpenAI の API キー取得から、チャットAPI の使用方法まで解説されています。LangChain 自体は LLM や API の本体ではありませんが、LangChain を利用する際にOpenAI 等の LLM の API を利用する場合がほとんどです。OpenAI 以外のClaude, Gemini などには触れていませんが、LLM のAPIの主要な機能は、OpenAI, Claude, Gemini 大体共通しているので、一度、OpenAI チャットAPIを学べば、他のAPIにも応用が効きますし、LangChainでLLMの切り替えをするのは容易です。ref. [Using Language Models](https://python.langchain.com/docs/tutorials/llm_chain/#using-language-models)

Function calling の解説では、公式サンプルと同じく天気予報の関数を呼び出しているものの、Function callingの一番の利点は、「事前に定義した(PythonやJavaScript/TypeScriptの)関数を自然言語での指示でを呼び出せること」なので、たまには他の関数の例が欲しかったです。[^1]


新しめのアップデートの話でいうと、
- o1-preview、o1-mini は名前を紹介するのみ
- 2024/10/01 リリースの [realtime API](https://platform.openai.com/docs/guides/realtime)や[prompt caching](https://platform.openai.com/docs/guides/prompt-caching)はノータッチ

でした。
GPT-4o や GPT-4o-miniを使ってのLangChain/LangGraphを利用するための解説が本書のメインです。


細かい事を言うと、roleで、 system, assistant, user を指定する際、
- user は、ユーザからの入力
- assistant は、LLMからのレスポンス

というのはすぐわかりますが、systemをどういう場面で使えばいいのかの記載があったほうがベターと思いました。

https://platform.openai.com/docs/guides/text-generation/building-prompts
> System messages
> Messages with the system role act as top-level instructions to the model, and typically describe what the model is supposed to do and how it should generally behave and respond.
> 
> Here's an example of a system message that modifies the behavior of the model when generating a response to a user message:  
> 
> (以下略)

> System messages
> `system` role を持つメッセージは、モデルに対するトップレベルの命令として機能し、通常、モデルが何をすることになっていて、一般的にどのように振る舞い、応答すべきかを記述します。
> 
> 以下は、ユーザー・メッセージに対する応答を生成するときにモデルの振る舞いを変更するシステム・メッセージの例です。  
>
> (以下略)

# 第3章　プロンプトエンジニアリング
- 3.1 プロンプトエンジニアリングの必要性
- 3.2 プロンプトエンジニアリングとは
- 3.3 プロンプトの構成要素の基本
- 3.4 プロンプトエンジニアリングの定番の手法
- 3.5 まとめ


本書のメインは LangChain なので、プロンプトエンジニアリング自体は基礎の解説にとどまっています。
読者が、プロンプトエンジニアリングの必要性に大きく迫られたなら、本文中でも挙げられている[Prompt Engineering Guide](https://www.promptingguide.ai/jp) の [プロンプトエンジニアリング技術](https://www.promptingguide.ai/jp/techniques) を参考にしてください。

個人的には、
1. プロジェクト or プロダクトの指標が決まる。
2. その指標を満たすための十分なテストデータを集める&評価基盤を作る(7章参照)
3. 実際に計測してみる
4. 足りない精度を埋めるための1つの方法として、プロンプトエンジニアリングをする
5. 3章を読んでプロンプトの改善をする
6. プロダクトのドメイン知識を学習する&ユーザの挙動を注意深く観察して、プロンプトを改善する
7. 6.でも足りない場合は、[Prompt Engineering Guide](https://www.promptingguide.ai/jp) や、[OpenAIのPrompt engineering](https://platform.openai.com/docs/guides/prompt-engineering)などのドキュメントを読んで改善する
8. 「Chain of Thought + 最終回答だけユーザに返答する」 or Self-Reflection を試す。(LLM複数回呼び出しは、応答速度の低下に直結するので。)
9. fine tuningを試す。(fine tuning用の十分な質と量のデータを集めるの労力と金銭がかかりがち、かつ、学習が毎回安定するとは限らないので)

という順で改善していくのが一案です。8.と9.の順序は逆でも良いと思います。
私が社内ツールを作ったときを例でいうと、1人で開発していてそれほど手間を掛けられなかったので、最初から fine tuning をするつもりはなかったです(小声)。

どこまでプロンプトエンジニアリングをして、どこから fine tuning するべきかは永遠の課題と思いますが、
PharmaXさんの[GPT-4o-miniのファインチューニングのすゝめ](https://zenn.dev/pharmax/articles/40c0e385a8956b)によれば、

> 下記の数値もただのイメージですが、
> まずはプロンプトを作り込んで
> GPT-4oのクオリティ（あるいは精度）が90%で、
> 同じプロンプトでGPT-4o-miniのクオリティが75%
> ぐらいまで持っていきます。
> （全く同じプロンプトで比較すれば、GPT-4o-miniはGPT-4oの8割〜9割程度の精度になるというのが私の経験則です。）
> 
> そのタイミングで、
> GPT-4oの出力をきちんと人の手で修正した100%近いクオリティのデータセットを与えてGPT-4o-miniをファインチューニングします。
> そうすれば、GPT-4o-miniのクオリティはGPT-4oのクオリティを結構簡単に超えてくるんじゃないかと感じています。
> 
> あらゆるタスクに対して検証したわけではないので、あくまで私たちの実験結果ですが、
> データセット数も3桁（少なければ2桁）のファインチューニングで十分なクオリティが出ます。

とのことです。

# 第4章　LangChainの基礎
- 4.1 LangChainの概要
- 4.2 LLM/Chat model
- 4.3 Prompt template
- 4.4 Output parser
- 4.5 Chain―LangChain Expression Language（LCEL）の概要
- 4.6 LangChainのRAGに関するコンポーネント
- 4.7 まとめ

3章までを踏まえて、シンプルなRAGを実装できるところまで解説しています。
[ChatGPT/LangChainによるチャットシステム構築［実践］入門](https://www.amazon.co.jp/dp/4297138395) (2023/10月発売)と比較すると、LangChainに、LCELが導入されたのが大きな差分です。v0.0系でLangChainを一度触って、v0.1系以降を触っていない人 or LangChain初学者はこの章からきちんと読むことをお勧めします。

本章を読めば、下記のようなシンプルなRAGを実装できるようになります。
- 前準備
    - LangChain の公式docを embedding model の `text-embedding-3-small` でベクトル化して、
    - Vector Store: Chroma に格納する
- QA
    - クエリを`text-embedding-3-small` でベクトル化して、類似文章を検索して、
    - その結果をLLMのプロンプトに入力して、ユーザの質問に答える

これに適当なUIを実装すれば、簡単なQAシステムができます。
Streamlit でのUIの実装例が必要なら、[つくりながら学ぶ！生成AIアプリ＆エージェント開発入門](https://www.amazon.co.jp/dp/B0D6VWX1T8) などを参考にされると良いと思います。



# 第5章　LangChain Expression Language（LCEL）徹底解説
- 5.1 RunnableとRunnableSequence―LCELの最も基本的な構成要素
- 5.2 RunnableLambda―任意の関数をRunnableにする
- 5.3 RunnableParallel―複数のRunnableを並列につなげる
- 5.4 RunnablePassthrough―入力をそのまま出力する
- 5.5 まとめ

個人的に、LangChain を使いこなすうえでの最初の難関は LCEL と思います。
LangChain の公式doc等の解説はあるものの、日本語での解説はまだまだ貴重だと思いますので、母国語で解説を読める幸せを噛み締めましょう。

RAG等も凝った実装をする場合は、検索結果や返答結果を再度使いたいことがあり、そのときに、[itemgetter](https://docs.python.org/ja/3/library/operator.html#operator.itemgetter)とRunnableParallelを併用して前のchainの内容を参照したり、assign()メソッドを利用するなどがあると思います。

読んでみて、
- `@chain` デコレータで、関数をRunnableに変換できること
- RunnablePassthrough.assign() メソッド

は、本書で初めて知りました。


# 第6章　Advanced RAG
- 6.1　Advanced RAGの概要
- 6.2　ハンズオンの準備
- 6.3　検索クエリの工夫
- 6.4　検索後の工夫
- 6.5　複数のRetrieverを使う工夫
- 6.6　まとめ


プロンプトエンジニアリング以外で、RAGのシステムの精度を上げる必要があり、必要RAGの手法の知見を深めたい向けの章です。初学者は手法に飛びつくよりも、7章の評価の話を読んでから、本章に戻って来る方が良いかもしれません。しれっと、「精度」という言葉を使いましたが、これを開発するシステムで定義して、評価するためのデータセットを集めることは一つのトピックになるくらいの話です。

- 6.2　ハンズオンの準備 -> ベースとなるシンプルなRAGの実装例
- 6.3　検索クエリの工夫 -> HyDE(Hypothetical Document Embeddings)
- 6.4　検索後の工夫 -> RAG-Fusion
- 6.5　複数のRetrieverを使う工夫 -> 全文検索(BM25) +  VectorDB(Chroma) + cohereのリランクモデルを利用することによるハイブリッド検索

です。
詳細を書くと怒られるので、購入して読んで下さい。
手法名をみて、https://arxiv.org で検索して、論文を読むのも一つの手ですが、それができる人は本書を読む必要がない上級者と思われます。[^2]



# 第7章　LangSmithを使ったRAGアプリケーションの評価
- 7.1　第7章で取り組む評価の概要
- 7.2　LangSmithの概要
- 7.3　LangSmithとRagasを使ったオフライン評価の構成例
- 7.4　Ragasによる合成テストデータの生成
- 7.5　LangSmithとRagasを使ったオフライン評価の実装
- 7.6　LangSmithを使ったフィードバックの収集
- 7.7　フィードバックの活用のための自動処理
- 7.8　まとめ

おめでとうございます。LangChain.com の課金ポイントに到着しました。もうすでにLangChainから離れられない体になってますねw。

...冗談はおいておいて、
> Developer プラン
> 1 ユーザーのみ、無料で使い始めることができるプランです。
> (中略)
> 開発者 1 名で使い始める場合は、Developer プランで基本的な機能を無料で使い始めることがで きます。本書の範囲であれば、Developer プランでも実施可能です。

なので安心してDeveloperプランを試用してください。
評価指標を定義して、改善サイクルを回すにあたって便利な機能が搭載されているので、チーム開発をする場合は、Developerプラン以外のプランを検討しても良いかもしれません。

一点注意点を追記しておくと、業務で LangSmith を用いる場合、LLM との Chat のやり取りは業務上の秘密の含む可能性があるので、それを LangSmith 上に保存してよいかどうかは、お勤め先のポリシーによります。念の為、上長や法務部に確認されることをお勧めします。例えば、VectorDB に Embeddingとともに社内限定の文章が入っており、RAGでその文章の一部を入力している場合、それが LangSmith 上に保存されます。[^3]

LLMを使ったシステム、もっと言えば、ML系のシステムを初めて構築する人へ補足しておくと、ルールベースのシステム開発で言うところの Unit Test, Integration Test, E2E Test に相当するものが、オフライン評価と思って下さい。 本章を読めば、そのためのツール(LangSmithとRagas)の使い方はわかりますし、合成データもLLMが作ってくれます。ただし、その合成データの正しさを人間がチェックする必要もありますし、LLM as a Judge を使うとしてもLLMでの評価と人間の評価が高い割合で一致することが前提です。 アプリケーションの品質の定義と、どこがどのくらい間違っているのかを知らずに性能改善はできません。いわゆる、「測れないものは改善できない」です。はっきり言って、手間もかかりますし、面倒な話ばかりです。それはテストコードを書く話と同じなので、それなり以上の労力を使って評価用のデータを集めて下さい。

[第二部(9章以降)はこちら](https://qiita.com/arrowKato/items/af3d1cb5e0121db88f1e)

# 脚注

[^1]: LLMの知識のカットオフは半年以上前であることが多く、今日のお天気をLLM自体が持っている知識では知りようがないので、天気予報での例示をしたい気持ちもわかるのですが・・・

[^2]: 対象読者は、生成AI徹底理解リスキリング for Developers の初級~中級エンジニア と僕は思っています。

[^3]: https://docs.smith.langchain.com/self_hosting にあるように、Enterpriseプランに入っているなら、セルフホストするという選択肢もあります。