📗

「つくりながら学ぶ!生成AIアプリ&エージェント開発入門」を出版しました

2024/07/18に公開

みなさん、こんにちは!

Twitterでも告知させていただきましたが、2024年7月18日に 「つくりながら学ぶ!生成AIアプリ&エージェント開発入門」 を出版しました。今回は宣伝がてら、本書の特徴や執筆の経緯について少しお話させていただきます。

https://amzn.to/467bng6

執筆の経緯

この本の原点は、昨年出版したWEB Bookにあります。このWEB Bookは、LLM初心者の方でも躓かないよう、ステップバイステップで解説し、実際に「作って動かす」という体験を重視した内容でした。

https://zenn.dev/ml_bear/books/d1f060a3f166a5

今回の書籍でも、この「つくりながら学ぶ」スタイルを大切にしています。技術的な詳細は必要最小限に抑え、実践を通じて理解を深められるよう工夫しました。

WEB Bookが予想以上に好評だったことがきっかけとなり、マイナビの編集者さんからTwitter DMでお声がけいただいたのが、この本の始まりでした。当初は、AIエージェントの章を追加するだけの簡単な企画のはずでした。しかし、生成AI技術の急速な進歩や新サービスの登場により、何度も内容を見直す必要が生じ、結果的に1年もの歳月を要することになりました。

幾度となく書き直しを重ね、担当の編集者さんや家族には大変迷惑をおかけしましたが、その甲斐あって、WEB Bookから大幅にパワーアップした内容をお届けできたと思います。本書で新たに追加した主な内容は以下の通りです:

  1. Claude&Gemini対応
  2. AIエージェント実装
  3. Streaming表示
  4. OpenAI新プロダクト対応
    • 画像認識・画像生成
    • AssistantsAPI
  5. 便利な周辺サービスの紹介

以下、これらの新しい要素について簡単に紹介させていただきます。

本書の特徴

1. Claude&Gemini対応

WEB BookではChatGPTのみの対応でしたが、本書ではほぼ全ての章で複数LLM(ChatGPT・Claude・Gemini)に対応しています。複数LLMを簡単に切り替えられる実装の生成AI技術書は少ないと思うので貴重かなと思っています😇 (自画自賛)

この変更には少し裏話があります。2024年初旬、Claude3 Opusが登場し、その日本語能力の高さに驚きました。それまで本の全編を通じて「ChatGPT-4が最強」という前提で書いていたため、書き直しが必要になりました。

当初は大規模な書き直しが必要になると懸念していましたが、LangChainを使用していたおかげで、変更は予想外に少なくて済みました。具体的には、以下のようなコードで複数のLLMを切り替えています:

from langchain_openai import ChatOpenAI
from langchain_anthropic import ChatAnthropic
from langchain_google_genai import ChatGoogleGenerativeAI

def select_model():
    models = ("GPT-3.5", "GPT-4", "Claude 3.5 Sonnet", "Gemini 1.5 Pro")
    model = st.sidebar.radio("Choose a model:", models)
    if model == "GPT-3.5":
        return ChatOpenAI(model_name="gpt-3.5-turbo")
    elif model == "GPT-4":
        return ChatOpenAI(model_name="gpt-4")
    elif model == "Claude 3.5 Sonnet":
        return ChatAnthropic(model_name="claude-3-5-sonnet-20240620")
    elif model == "Gemini 1.5 Pro":
        return ChatGoogleGenerativeAI(model="gemini-1.5-pro-latest")

# モデルの選択と使用
llm = select_model()
response = llm.invoke("AIの未来について教えてください。")
print(response)

脱稿直前にClaude 3.5 Sonnetが登場して急遽対応したのですが、モデル選択部分以外のコードの変更は全く不要でした。今後また別のLLMが出てきても対処可能なコードにできたと自負しています。

ただ、LangChain v0.2 以降はinit_chat_modelを用いてさらに簡単に実装することも可能とのこと。本書ではこのアップデートまで対応できなかったため、改訂版を出すことがあれば修正を検討します。

`init_chat_model`を用いた実装
from langchain.chat_models import init_chat_model

def select_model():
    models = ("GPT-4", "Claude 3.5 Sonnet", "Gemini 1.5 Pro")
    model = st.sidebar.radio("Choose a model:", models)
    if model == "GPT-4":
        return init_chat_model("gpt-4o")
    elif model == "Claude 3.5 Sonnet":
        return init_chat_model("claude-3-5-sonnet-20240620")
    elif model == "Gemini 1.5 Pro":
        return init_chat_model("gemini-1.5-pro")

# モデルの選択と使用
llm = select_model()
response = llm.invoke("AIの未来について教えてください。")
print(response)

各社のモデルの比較表を掲載していますが、すぐに陳腐化してしまうなと思っています。こちらはZennの記事に最新の情報を更新していくので以下の記事を参考にしていただけますと幸いです。

https://zenn.dev/ml_bear/articles/3c5e7975f1620a

2. AIエージェント実装を簡単に

紙の本を出版しようと思った理由の一つが、AIエージェント実装の普及です。GPT-4やClaude3 Opusなど高度な知性を持つLLMに適切なツールを与えると、さまざまな知的労働を行わせることが可能だというのは、皆さんもご存知かと思います。

調査を進める中で、LangChainのAgentExecuterという機能を使えば、このようなAIエージェントを比較的簡単に実装できることがわかりました。この発見を読者の皆さんにうまく伝えたいという思いが、本書執筆の大きな動機となっています。

本書の後半で以下のようなエージェントの実装方法を詳しく解説しています。

  1. ネットで情報を検索するエージェント
  2. カスタマーサポートを行うエージェント
  3. データ分析を行うエージェント(BigQueryからのデータ取得にも対応)

エージェントの実装には前提知識なため、本書の前半では、エージェント実装で躓かないように必要な知識を地道に積み上げていくように工夫しました。Function Callingの利用法なども丁寧に解説しました。

なお、説明が煩雑になりすぎる可能性があったため、本書ではLangGraphは使用していません。ワークフロー型のエージェントやアプリケーションの作成に有用かもしれませんが、本書で取り扱うぐらいのタスクでは不要だと判断しました。LangGraphの活用法は僕自身が今後探求していく所存です。

3. Streaming表示対応

地味な点かもしれませんが、AIアプリ・AIエージェントともに全面的にStreaming表示に対応しました。WEB Book執筆時はコードが複雑になるので対応していなかったのですが、LangChainの新記法導入とStreamlitの新機能対応で、ものすごく簡単に書けるようになりました。

具体的には chainstream で発火して、それを st.wirte_stream のなかに読み込ませるだけです。詳細な説明は書籍をご覧いただければ幸いです。

chain = init_chain()
with st.chat_message('ai'):
    response = st.write_stream(
        chain.stream({"user_input": user_input})
    )

4. OpenAI新プロダクト対応

ここまではClaude3などOpenAI以外の対応の話が多かったですが、OpenAIの新しいプロダクトにも対応しました。多くの紙面を割いたわけではありませんが、以下の二つの機能を取り上げました:

  1. 画像認識・画像生成(DALL-E 3)
  2. Assistants API

画像関連では、第6章で実践的なアプリケーションを実装しました。ユーザーがアップロードした画像をChatGPTで認識し、その後ユーザーの指示に基づいてDALL-E 3で新しい画像を生成するというものです。本書で実装したのは一例にしかすぎませんが、画像認識・画像生成をこれほどまで簡単に扱えるようになったのか、ということをご理解いただければ嬉しいです。

Assistants APIについては、その登場当初、エージェント実装の方法が完全に切り替わるのではないかと考えていました。しかし、登場から半年以上が経過した現在、そこまでの大きな変化は見られていません。

ただ、Assistants APIのCode Interpreterは便利だったため、エージェントのコード実行環境として利用してみました。レイテンシーがやや気になるものの、Assistants APIの概念の簡単な解説と併せて、何かに役立てていただけると思います。

5. 便利な周辺サービスも紹介

前職では半年以上にわたって生成AIチームの仕事をしていました。ダッシュボードサービスのLangSmithや、Streamilitでのフィードバック収集ライブラリなど、その経験から学んだ実務で役立つサービスもいくつか紹介しています。

また、すぐに使わないかもしれませんが、知っておくと良い話(OSSの話やLLMのLeaderBoardの話など)も小話として随所に盛り込んでいます。

コードのレポジトリ

本書に掲載したコードは以下のレポジトリに保存しています。何か不都合な点がありましたらissueやTwitterでお伝えいただけますと幸いです。

https://github.com/naotaka1128/llm_app_codes

おわり

簡単ではありますが以上が本書の主な特徴です。生成AI技術は日々進化していますが、本書で解説している基本的な考え方や実装方法は、今後も長く活用できるものだと自負しています。

気になったところがあれば、ぜひ手に取ってみてください🤗

https://amzn.to/467bng6

Discussion