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

# はじめに

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

（このメモのほかの章へ：[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章](https://qiita.com/segavvy/items/a4f9d80fe6a3f541d4b5) / 10章 / [11章](https://qiita.com/segavvy/items/7e4c1af72b2280665be3) / [12章](https://qiita.com/segavvy/items/3833525ebace5ff24a4e) / [まとめ](https://qiita.com/segavvy/items/265b101a6ebb82284e4b)）

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

# 第10章 要件定義書生成AIエージェントの開発

前章に続き西見さんが担当された章です。

## 10.1 要件定義書生成AIエージェントの概要

この章はホントおもしろいです。要求を放り込むと要件定義ができるという夢のような仕組みを作るのですが、まずペルソナを生成して、そのペルソナに対してインタビューをする流れで要求を定義をするところが最高です。7章でRagasを使って合成テストデータを生成する際に[本の内容から脱線して最新のRagasを使ったらペルソナに質問を生成させる形になっていた](https://qiita.com/segavvy/items/ac0ce03f9b3cd83ee5ed#ragas%E3%81%AB%E3%82%88%E3%82%8B%E5%90%88%E6%88%90%E3%83%86%E3%82%B9%E3%83%88%E3%83%87%E3%83%BC%E3%82%BF%E7%94%9F%E6%88%90%E3%81%AE%E5%AE%9F%E8%A3%85)のですが、それに近いアイデアですね。

## 10.2 環境設定

この章は、これまでのようにGoogle Colabのセルにソースコードが埋まっているのではなく、GitHubからクローンしてくる形になっています。Google Colab上のセルではソースコードを触ることができません。

ただ、リポジトリのクローンを実行後にGoogle Colabの左のフォルダアイコンをクリックするとクローンで取得してきたファイル一覧が並びます。そこからmain.pyをダブルクリックすれば、右側にソースコードが表示されて自由に編集できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139624/16caf077-4a5e-b7d7-b129-85028e4dfa68.png)

## 10.3 データ構造の定義

Pydanticいいですね。私は過去に型で散々苦労してきたので、やっぱり型を明確にしたコードが好きです。

いつものように脱線しますが、「型を意識しない処理系」というのはお手軽に使えて便利な反面、型にまつわるトラブルも多く、また、その処理系を実装する側もとてつもなく大変です。過去にWindowsのC用のDLL（型の意識が必須）をExcelマクロのVBAや古いASPのVBScript（型を意識しなくても書ける）から利用できるようにするため、C++/ATLでラップしてCOMコンポーネント化する仕事を担当したのですが、型のマーシャリングで地獄を見ました。やっぱり型は明確な方が良いです、ホントに。

## 10.4 主要コンポーネントの実装

きちんとクラスで分けて、独立して品質を確保できるようになっている作りが好きです。実装工程で品質の作り込みをできる設計になっているのがいいですね。

あと、本の中でbatch関数の出力リストの順序に関する話がありましたが、現在の説明では、batch関数では出力の順番が保証され、batch_as_completed関数だとされないことが明記されていました。

https://python.langchain.com/docs/concepts/runnables/#optimized-parallel-execution-batch

## 10.5 ワークフロー構築

きちんとクラスで分けてパーツ化できているので、ワークフローの構築はそれをつなぐだけです。複雑なグラフ構造がシンプルに実装できていい感じ！

## 10.6 エージェントの実行と結果の確認

せっかくなので、本とは違う要求を放り込んでみました。

ちょうど先日、とあるサービスを立ち上げようとされている事業家の方とお話する機会があったのですが、その方はエンジニアリングの経験がなくエンジニア探しやその成果物の妥当性判断などに苦戦されていました。そこで、こんなサービスがあったらいいかも！と思いついたものを今回のAIエージェントに放り込んで要件定義させてみることにしました。

> Webサービスのアイデアはあるがサービス実装のための知識がない事業家と、サービス実装のスキルは持っているがアイデアは持っていないエンジニアをマッチングするためのWebサービスを開発したい。事業家はなるべく多くのエンジニアの中から適切な人を選び出したい。エンジニアは自分の興味と重なり自分のスキルが活かせる事業家を探したい。なるべく手軽に利用できて事業家とエンジニア双方の利用者が増やせるようなゲーミフィケーションの要素や、双方が自身をアピールすることができるような要素を入れ込みたい。また、模倣困難性も確保したい。

これを入力にそのまま放り込んで実行します。

```shell
!python -m documentation_agent.main --task "Webサービスのアイデアはあるがサービス実装のための知識がない事業家と、サービス実装のスキルは持っているがアイデアは持っていないエンジニアをマッチングするためのWebサービスを開発したい。事業家はなるべく多くのエンジニアの中から適切な人を選び出したい。エンジニアは自分の興味と重なり自分のスキルが活かせる事業家を探したい。なるべく手軽に利用できて事業家とエンジニア双方の利用者が増やせるようなゲーミフィケーションの要素や、双方が自身をアピールすることができるような要素を入れ込みたい。また、模倣困難性も確保したい。"
```

以下、その結果です。

```text:実行結果
# 要件文書

## 1. プロジェクト概要
本プロジェクトは、Webサービスのアイデアを持つ事業家と、実装スキルを持つエンジニアをマッチングするためのプラットフォームを開発することを目的としています。事業家は多くのエンジニアの中から適切なパートナーを選び、エンジニアは自分のスキルを活かせるプロジェクトを見つけることができます。ゲーミフィケーションや自己アピール機能を通じて、利用者のモチベーションを高め、模倣困難性を確保します。

## 2. 主要機能
1. **実績バッジシステム**: エンジニアが過去のプロジェクトやスキルに応じてバッジを獲得し、プロフィールに表示。
2. **プロジェクトチャレンジ**: 特定の技術的課題を解決するミニプロジェクトを設定し、クリアしたエンジニアに報酬や特典を提供。
3. **フィードバックと評価システム**: 過去のプロジェクトでのフィードバックや評価を共有。
4. **自己紹介動画**: エンジニアが自分のスキルやプロジェクトに対する情熱をアピールする動画を作成。
5. **コラボレーションプラットフォーム**: エンジニアと事業家がアイデアを共有し、ディスカッションを行うための専用プラットフォーム。
6. **ポイントシステムとランキング**: プロジェクトの提案やフィードバックに対してポイントを獲得し、ランキングを表示。
7. **プロジェクトポートフォリオ**: エンジニアが過去のプロジェクトや成功事例を紹介。

## 3. 非機能要件
1. **ユーザビリティ**: 直感的で使いやすいインターフェースを提供。
2. **スケーラビリティ**: 利用者数の増加に対応できるシステム設計。
3. **セキュリティ**: ユーザー情報の保護とデータの安全性を確保。
4. **パフォーマンス**: 高速なレスポンスと安定したサービス提供。

## 4. 制約条件
1. **技術スタック**: Webサービスは最新のWeb技術を用いて開発。
2. **法令遵守**: 個人情報保護法などの関連法令を遵守。
3. **多言語対応**: 日本語と英語をサポート。

## 5. ターゲットユーザー
1. **事業家**: Webサービスのアイデアを持つが技術的な知識が乏しい事業家。
2. **エンジニア**: 実装スキルを持ち、新しいプロジェクトに参加したいエンジニア。

## 6. 優先順位
1. **ユーザー登録とプロフィール作成機能**: 初期段階での最優先事項。
2. **マッチングアルゴリズムの開発**: 効果的なマッチングを実現するための重要機能。
3. **ゲーミフィケーション要素の実装**: ユーザーエンゲージメントを高めるための次のステップ。

## 7. リスクと軽減策
1. **模倣リスク**: 独自のアルゴリズムとデザインで模倣困難性を確保。
2. **ユーザー獲得の遅れ**: マーケティング戦略を強化し、ターゲットユーザーへのアプローチを積極的に行う。
3. **技術的な問題**: 定期的なシステムテストとバックアップを実施し、問題発生時の迅速な対応を準備。
```

いろいろと物足りないところはありますが、実績バッジシステムとかプロジェクトチャレンジとか基本的なアイデアは盛り込んでくれました。深掘りしていくスタート地点には悪くない感じがして、いろいろ可能性を感じさせてくれる結果です。

ちなみに、どんなペルソナを作り上げて、どんなインタービューをして、どんな回答が得られたのか？などはLangSmithで簡単に確認できます。

以下、今回のインタビューに答えてくれたペルソナさん。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139624/af3ef4eb-1f2f-2e53-f362-a20cce30919e.png)

その中の一人、シリアルアントレプレナーの田中一郎さんに対するインタビューの質問とその結果。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139624/8075f945-c278-ae83-5ca3-99b3baf23bf1.png)

いやー、LangSmith便利すぎる！

## 10.7 全体のソースコード

ソースの`main()`を見て気付いたのですが、Pythonにはargparseという便利なライブラリがあるんですね。コマンドラインの解析とヘルプ表示をやってくれるのは便利です。

```shell
!python -m documentation_agent.main --help
```

```shell
usage: main.py [-h] [--task TASK] [--k K]

ユーザー要求に基づいて要件定義を生成します

options:
  -h, --help   show this help message and exit
  --task TASK  作成したいアプリケーションについて記載してください
  --k K        生成するペルソナの人数を設定してください（デフォルト:5）
```

## 10.8 まとめ

2年くらい前のChatGPTが出た頃にいろいろ壁打ちしていたことが、ちょっとしたコードで自動化できるようになってきたのがすごいです。どんどん任せられることが増えてワクワクしますね。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章](https://qiita.com/segavvy/items/a4f9d80fe6a3f541d4b5) / 10章 / [11章](https://qiita.com/segavvy/items/7e4c1af72b2280665be3) / [12章](https://qiita.com/segavvy/items/3833525ebace5ff24a4e) / [まとめ](https://qiita.com/segavvy/items/265b101a6ebb82284e4b)）