[生成AI] Cursor/Claude 3.7 Sonnet - tninkingを使って検索エージェントを作成

# 1.動機
情報を自動収集したかったので、CursorとClaude 3.7 Sonnet - tninkingを使用して、検索エージェントを作成してみました。当初、<font color="red">思っていたものとは、間違ってはいないけど、なんかちょっと違うもの</font>が出来上がりました。<font color="red">最初に与える要件をもっと明確に記載すべきでした。</font>

# 2.開発
### 2.1.要件と開発ルール
Cursorのプロジェクトルールに下記のような開発ルールと要件を与えました。この辺りをブラッシュアップしていくと、開発が楽になっていくと思います。

```ruby:.cursor\rules\project.mdc
---
description: 
globs: 
alwaysApply: false
---
(a)開発の進め方（★重要）		
	1) ユーザの要件に対して、要件分析を行う。	
	 - 要件分析の過程で、不足している条件がある場合、ユーザにヒアリングを行う。	
	 - 次工程の外部設計が実施可能となるだけの情報が分析、整理できているかを確認する。	
	 - 要求分析の結果をドキュメントとして出力する。	
		
	2) 要件分析の結果に従い、外部設計を行う。	
	 - 開発すべきシステムが持つ機能を分析し、整理する。	
	 - 開発すべきシステムの境界面と、外部との入出力を明確にする。	
	 - 開発すべきシステムの構成モジュールを明確にする。	
	 - 構成モジュールは、システム、サブシステム、プロセス等の観点や、file, class, functionなどの観点で、階層的、内包的に検討すべきである。	
	 - システムが扱うべきデータを明確にする。	
	 - データの内容や属性、及び、どのようなタイミングでデータのCRUDが発生するかを明確にする。	
     - 外部設計の結果をドキュメントに出力する。		
		
	3) 要件分析と外部設計の結果に基づき、実装計画を立てる。	
	 - 実際に必要な内容を整理し、優先順を検討し、計画を立てる。	
	 - 適切に実装されているかを確認するテスト方法、テスト内容も計画に含める。	
	 - テストは可能な限り自動実行できることが望ましい。	
		
	4) 要件分析、外部設計、実装計画に基づき、ユーザの要件を実現する、システムを作成する。	
	5) 設計、デバッグ中の方針	
	 - デバッグするときは、考えられる原因を複数想定し、ロジカルに原因を分析し、テストコードで確認した上で、対策を実施する。	
     - 必要なテスト実行コードを作成し、テスト結果を集計できるようにする。		
	 - システム作成中に、不具合等が発生したときは、不具合の現象、調査結果、対策内容等を整理したドキュメントを作成する。	
	 - システム作成中に、試行錯誤した内容は、解決しようとした課題、試行内容、試行結果、最終的な結論などを整理したドキュメントを作成する。	
	 - 作成中に、ドキュメントは適宜、最新状況に更新する。	
		
(b)ユーザの要件		
    1)開発すべきシステムの概要
	 - ユーザから提供された条件に基づき、情報の検索方法、検索先、検索条件を決定し、情報を検索し、まとめるエージェントを開発する。	
	 - langchain v0.3,LangGraph,TypeScriptで、ReAct技術を使用したエージェントを活用する。　	
		
	2)基本機能	
	 - OpenAI, Gemini、Claude、DeepSeekの複数のモデルを、ユーザが切り替えて使用できる。
	 - 使用できるモデルは下記の通り。
	 -- Anthropic:	claude-3-7-sonnet-20250219, claude-3-5-sonnet-20241022, claude-3-5-haiku-20241022
	 -- Google:	gemini-2.0-flash, gemini-1.5-flash, gemini-1.5-pro
	 -- OpenAI:	gpt-4.5-preview-2025-02-27, gpt-4o-2024-08-06, gpt-4o-mini-2024-07-18
	
	 - エージェントは一つにするか、複数に分けるかは、外部設計で決定する。
	 - ユーザから提供される条件の記載方法は下記のいずれとも対応する。
  	 -- ユーザから提供される条件の入手形態: URL, ローカルファイル, テキスト情報
     -- 最初に検索を実行したい、ユーザから提供された条件が記載されたサイトは、下記である。
     --- https://zenn.dev/discus0434/articles/6e5add61970786
     --- ただし、他の条件での検索も実行することを想定した、汎用的な仕組みが必要である。

     - ユーザからて提供される条件を理解し、情報の検索方法、検索先、検索手順、そのほか、必要なことを検索条件として整理する。
	 - 上記で整理した検索条件に基づき、検索を実行する。
	 - 検索実行結果をまとめ、人間が読みやすい形で整理する。
	 - 定期的に検索を実行して、情報を蓄積するための仕組みを用意する。

	3)保守機能	
	 - システムのログをファイルに記述する。ログレベルはINFO,WARN,ERRのレベル分けをする。	
	 - システム内でエラーが発生したときに、発生したエラーやスタックとレースが必ずログに残るようにする。	
	 - AIとのエージェントレベルのやり取りを、チャットログファイルに記録する。	
	 - ログ系のファイルは同一日付に発生した情報は、同一ファイルに記録する。
		
	4)その他	
	 - langChain v0.2とv0.3では、大きな非互換性があります。参考にするソースコードがv0.3であることを常に注意すること。	
	 - Langchainのモジュールを新たにインポートするときは、Webサイトの公式情報や関連情報を検索し、最新状況を確認すること。	
	 - フォルダ構成は、"doc"が設計ドキュメント等、"src"がプログラムコード等、"test"がテストコード等の格納先です。

```

### 2.2.与えた指示
全ての指示は記載しませんが、下記のような指示を与え自動開発をしていきました。

技術的な指示は、「自動でスクリプト終了時に、末尾で停止しており、ユーザがプロセスの終了を操作しています。改善するために、テスト実行用のPowershellのスクリプトですが、"テスト成功時の処理末尾にprocess.exit(0);"を入れてください。」の1回だけでした。

あとは、AIによるプログラムの自動生成とテストの自動実行で、とりあえず動作するところまでできました。

##### (a)最初の指示
:::note info
".cursor\rules\project.mdc"に基づいた、ソフトウェアを開発します。要件分析、外部設計、実装計画を検討して、その結果をdocフォルダ配下に格納してください。

:::

##### (b)再設計
最初の指示時の指定モデルがdefaultでしたが、イマイチだったのでClaude 3.7 Sonnet-tninkingに切り替えて再設計を指示しました。

:::note info
docフォルダ配下に作成された要件分析、外部設計、実装計画をレビューし、不足部分や改善すべき部分を整理してください。
:::

##### (c)テスト計画立案
テスト計画を立てて、テストを実施するために、下記の指示をしました。今後は、開発ルールの方に入れていく方がよいと考えています。

:::note info
現在の実装状況が妥当であるかを検証するために、テスト計画を立案してください。テスト計画には、テスト方針、テストの観点、テスト項目などが整理されている必要があります。
:::

##### (d)テストの実行
テストの実行では、いろいろ試行錯誤しています。

:::note info
検討したテスト計画を、docフォルダ配下にファイルとして、残してください。そして、テスト計画に基づき、テストプログラムを作成し、テストを実行してください。テスト実行に失敗したときには、原因を調査し、対策してください。すべてのテストが成功するまで、テストを実行してください。そして、テストの実行結果と、バグの現象、原因、対策方針、今後のノウハウなどもドキュメントに残してください。
:::

:::note info
テスト実行可能な状態になるまでの、すべてのファイルの作成、更新を実行してください。APIキーを人間が設定するので、テスト実行はしないでください。
:::

:::note info 
すべてのテストが成功するまで、テストを実行してください。テスト実行に失敗したときには、原因を調査し、対策してください。そして、テストの実行結果と、バグの現象、原因、対策方針、今後のノウハウなどもドキュメントに残してください。
:::

<font color="red">テストで失敗が残っているのに、AIが問題ないということがある</font>ので、下記の指示をしました。

::: note info
全てのテストがpassになり、failedが0になるまで、テストの実行と、テスト失敗の原因調査と対策を繰り返してください。
:::

### (e)実装の再開
<font color="red">「中断した作業を再開するとき」「テストと実装を切り替えるとき」「OOM(Out Of Memory)が発生してCursorが落ちたとき」などで、実装再開の指示をすることがありました。</font>だんだん短くなっていきました:sweat_smile:

::: note info
現在、要件の実現は完了していないと考えています。docフォルダ配下に含まれた、要件分析、外部設計、実装計画、及び、テスト関係の資料を元に、実装を進めるためのタスクを計画してください。それに基づき、実装計画、及び、そのほか必要なドキュメントを更新してください。
:::

::: note info
docフォルダ配下の要件分析、外部設計、実装計画、及び、各種ドキュメントに基づき、実装を進めてください。
:::

::: note info
要求分析、外部設計、実装計画、及び、その他のドキュメントに従い、実装を進めてください。
:::

### (f)ドキュメント作成
<font color="red">「人間とAIの情報の共有」「AIがやろうとしていることと、AIがやったことを残す」「作業再開時の資料共有」のために、いろいろドキュメントの作成を指示しました。</font>上記以外にも、タイミングを見て、最新状況への更新の指示しています。

::: note info
現在の状況を確認し、ドキュメント類を最新に更新の上、コミットして下さい。
:::

::: note info
要件分析、外部設計、実装計画、及び、そのほかのドキュメントを元に、未実装の機能を整理し、実装計画を更新してください。
:::

::: note info
現状を確認し、Readme.md、及び、docフォルダ配下のドキュメント類を最新状態にしてください。また、言語の実装計画、及び、テスト計画も検討してください。
:::

ほぼ動作するようになってから、最後に内部設計を残すようにしました。ただ、最初の指示だと、タイムアウトしたので、作業を分割するようにしました。

::: note info
ソフトウェアの内部設計が分かるように、詳細設計書を作成してください。詳細設計書には、ソフトウェアの概要、使い方、構造、シーケンス、クラスレベルや関数レベルの概要、そのほか、技術的なノウハウやあい路が記載されている必要があります。
:::

::: note info
詳細設計書を作成する作業を、タスクを分割して、順次実行していってください。
:::

# 3.成果
### 3.1.プログラムの動作
ちょっとしか動かしていませんが、欲しい情報をgoogleで検索して、表示してくれました。

```ruby:実行結果

:::PS C:\work\collecting-info-agent> npm start -- --query "AIエージェントの最新状況" --model claude-3-opus

> collecting-info-agent@1.0.0 start
> node dist/index.js AIエージェントの最新状況 claude-3-opus

2025-03-10T11:35:05.474Z info: 設定ファイルを読み込みました
2025-03-10T11:35:05.478Z info: 情報収集エージェントを起動しています...

検索クエリ: "AIエージェントの最新状況"

情報を収集しています...

2025-03-10T11:35:05.485Z info: モデルセレクターを初期化しました。利用可能なモデル: 9
2025-03-10T11:35:05.489Z info: Web検索を実行します
2025-03-10T11:35:05.490Z info: Web検索を開始します
(node:21844) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
(Use `node --trace-deprecation ...` to show where the warning was created)
2025-03-10T11:35:06.244Z info: 検索が完了しました
2025-03-10T11:35:06.245Z info: 検索結果を処理します
2025-03-10T11:35:06.245Z info: 検索結果の処理を開始します
2025-03-10T11:35:06.245Z info: モデル claude-3-5-sonnet-20241022 を使用して情報を処理します
2025-03-10T11:35:19.928Z info: 結果処理が完了しました
=== 検索結果 ===

# AIエージェントの最新状況

## 定義と特徴
- AIエージェントは、従来のチャットボットやRPAとは異なり、**複雑なデータや状況に自律的に適応できる**AI技術です[1]
- これは単なる定義された作業手順の自動化を超えた能力を持っています[1]

## 最新の動向と展開

### 主要企業の取り組み
1. **Microsoft**
   - 「Agentic World」という新ビジョンを展開[6]
   - Copilotを「AIを使用するためのUI」として再定義[6]

2. **大和証券**
   - 生成AIを活用した「AIオペレーター」を導入[2]
   - マーケット情報提供や手続き関連の問い合わせ対応の効率化を実現[2]

### 技術的進展
- 複数のAIエージェントが協力して作業を行う新しいトレンドが出現[7]
- Google CloudのGeminiなど、最新の生成AI技術との統合が進んでいる[8]

## 応用分野と効果
- **業務効率化**：顧客体験の改革や情報提供の自動化[2]
- **問題解決**：単純な問題から複雑な課題まで対応可能[5]
- **情報活用**：業務効率化における新しい可能性を開拓[8]

## 今後の展望
- AIエージェントは人間同士の引き継ぎプロセスを変革する可能性がある[9]
- バーティカルAIエージェントの分野で多くのスタートアップが活動[10]

## 使用した情報源
- [1] Gartnerによるトレンド分析
- [2] Microsoft日本の事例研究
- [5] Zendeskヘルプ情報
- [6] Microsoft Ignite 2024情報
- [7] ブレインパッド技術トレンド分析
- [8] Google Cloud AI Agent Summit情報
- [9] Salesforce予測レポート
- [10] スタートアップ動向分析

*注: 一部の詳細（具体的な市場規模、導入コスト、具体的な成功率など）については、提供された情報源からは確認できません。*

=== 処理完了 ===

```

※この記事を書いてて築きましたが、引数で"claude-3-opus"を指示して、動作では"claude-3-5-sonnet-20241022"を選択と表示されていますね:sweat_smile:


### 3.2.ドキュメント
ドキュメント体系を定義していなかったので、大量なドキュメントができてしまいました。特に、実装計画やテスト計画のファイルは、どれが最新なのか分かりづらくなってしまいました。:sweat_smile:

https://github.com/michihiro88/collecting-info-agent/tree/main/doc

[ドキュメントのまとめ](https://github.com/michihiro88/collecting-info-agent/blob/main/doc/summary.md)

[要件分析](https://github.com/michihiro88/collecting-info-agent/blob/main/doc/requirements_analysis.md)

[外部設計](https://github.com/michihiro88/collecting-info-agent/blob/main/doc/external_design.md)

[詳細設計](https://github.com/michihiro88/collecting-info-agent/blob/main/doc/detailed_design_document.md)

[詳細設計の図](https://github.com/michihiro88/collecting-info-agent/blob/main/doc/detailed_design_document_mermaid.md)

### 4.今後の改善点
今後は、下記のことを改善していこうと思います。

<dl>
<dt>(a)失敗するコマンドを回避する方法をルールに記載要</dt>
失敗することで、CursorやWindsurfの使用回数を浪費してしまうので、失敗するコマンドはルールで事前に抑止したい。</dt>
<dd>・Windows/Powershellでは、コミットログの'\n'による複数行記載ができない。</dd>
<dd>・Powershellのスクリプトでエンコーディング関係のエラーが出る。</dd><br/>

<dt>(b)インプットの要件の明確化</dt>
<dd>思っていたものとは、間違ってはいないけど、なんかちょっと違うものにならないよう、最初に与える要件をもっと明確に記載する</dd><br/>

<dt>(c)テストの実行指示の工夫</dt>
<dd>テストが全部成功してないのに、理由をつけて、問題ありませんということがあった。「全てのテストがpassになり、failedが0になるまで、テストの実行と、テスト失敗の原因調査と対策を繰り返してください」という指示は効果があった。</dd><br/>


<dt>(d)ドキュメント体系を指示</dt>
<dd>実装計画とテスト計画のファイルがたくさんできた。</dd>
<dd>ノウハウ整理の資料が、一つのファイルで更新されたり、別のファイルになったりした</dd><br/>

<dt>(e)その他</dt>
<dd>・コミット時に、シークレット情報が混入しないようにチェックを入れる。</dd>
<dd>・OOM問題。ある程度の間隔で、新規セッションとする。</dd>
<dd>・タイムアウト問題。最後に詳細設計書をまとめて作成するような、大きなファイルが想定されるときは、作業の分割を指示する</dd>
<dd>・マーメイド記法のエラー対応。エンティティーやリレーションをダブルコーテーションで囲まないと、日本語を使用した場合エラーになる。

</dl>

# 5.リポジトリ
https://github.com/michihiro88/collecting-info-agent

2025.03.10 山崎作成