[生成AI] エージェント作成で難航中

# 1.状況
N番煎じですが、プログラムを自動生成するプログラムの作成にチャレンジしています。

https://qiita.com/michihiro88/items/f0aa3b0d59fcc87675f9

前に作ったものを元に、AIエディタを使って、膨らまそうとしていますが、いろいろ難航しています:sweat_smile:

やりたいことは、エージェントとのやり取りをするスケルトンを作成して、プロンプトをいろいろいじりたいのだけど、AIエディタでバトルしています。手動で全部作りたくなってくる今日この頃:sweat:

# 2. 挫折パターン
### 2.1 AIの出力チェックで破綻
前に作ったものは、インプットの要件に対して、一気通貫で最終生成物まで作るようになっていましたので、所々でユーザの確認とフィードバックを入れようと考えていました。

それ自体は、いったんできたのですが、ChatGPT APIのチャージ分が切れたので、AIモデルをGeminiに切り替えて試してみました。

そこで、何が起きたかというと、
「AIの出力のJSON形式が期待と違う」⇔「出力結果をハンドリングする処理で、JSONのフォーマットチェックを強化」を、繰り返すようになりました。

下記の理由で、このコードは、没としました。
<DL>
<dt>・イタチごっごになって、なかなか収束しそうになかった。</dt>
<dt>・AI Modelごとの癖があるので、おそらくチェックロジックが、AI Modelごとに差異が出る。</dt>
<dd>直前までChatGPT4で動いていたのを、Geminiに切り替えたら動かなくなったし。
<dt>・AIの出力に対して、プログラム的なチェックが厳しすぎると、今後の拡張性、柔軟性に欠く。</dt>
<dd>プロンプト修正したら、エラーハンドリングのプログラムの修正も必要になると思われる。<dt>
<dt>・JSON内に、改行コード付きの文章が含まれていると、人間は読みづらい。</dt>
</DL>

### 2.1 ログがうまく取れない。
下記のプロンプトで、最初からやり始めて、Agentを呼出すところまではうまく動きました。しかし、AIモデルとの細かいログをファイルに記録しようとして、破綻しました。<font color="red">あとから横断的な機能を入れると結構きついようです。</font>

langfuse/langsmithで解決することなのかも:sweat_smile:

```
既存のSecondStudy/MyChatbot.jsを参考に、新しいjsファイルを作成し、下記の機能を実現してください。
・ユーザの指示で、AIモデルを切り替えることができる。対象はMyChatbot.jsと同等。
・ユーザが入力する要件をもとに要件分析を行うエージェントを作成する。
・エージェントは、必要に応じてWebの検索、ユーザへの確認を行う機能を持つ。
・要求分析の結果は、Markdown記法を使用して表現する。
・ユーザが承認した要求分析結果をファイルに出力する。
```

### 2.3 テストプログラムで破綻(CommonJS Modules vs ES Modules)
最初のプロンプトを改善しましたが、今度はテストコードが完成しませんでした。どうも、<font color="red">CommonJS ModuleとES Modulesの不整合を、AIエディタは解決することが苦手なようです</font>。いま、言語をtypescriptに指定して、やり直していますが、このパターンの解消しました:sweat_smile:

```
下記の機能を持つlangchain v0.3,JavaScriptで、ReAct技術を使用したエージェントを開発してください。
(a)基本機能
 - OpenAI, Gemini、Claude、DeepSeekの複数のモデルを、ユーザが切り替えて使用できる。
 - 使用できるモデルは、gpt-4-turbo、gpt-4o、gpt-4o-mini、gemini-2.0-flash、gemini-1.5-flash、gemini-1.5-pro、claude-3-5-sonnet-20241022、claude-3-5-haiku-20241022、claude-3-opus-20240229とする。
 - エージェントは、ユーザから要件を取得し、要件分析を実行し、実装が可能なレベルで、外部設計までを行う。
 - エージェントは、必要鵜に応じて、ユーザに検討結果を提示し、フィードバックを得る。
 - 要件分析の結果や、外部設計の結果はmarkdwon形式のファイルで出力する。また、必要に応じて、UMLのダイアグラムや画面レイアウトなども出力する。
 

(b)保守機能
 - アプリケーションのログをファイルに記述する。ログレベルはINFO,WARN,ERRのレベル分けをする。
 - AIとのHTTP通信の送受信結果を通信ログファイルに記録する。
 - AIとのエージェントレベルのやり取りを、チャットログファイルに記録する。
　 チャットログには、llm/start, llm/end, chain/start, chain/end等の情報も含める。
 - アプリケーションログ、通信ログ、チャットログとも、同一日付の記録は同一ファイルとする。

(c)その他
 - 作成するアプリは、auto-dev/ThirdStudyフォルダ下に作成してください。
 - 必要なテスト実行コードを作成し、テスト結果を集計できるようにしてください。
 - langChain v0.2とv0.3では、大きな非互換性があります。参考にするソースコードがv0.3であることを常に注意してください。
 - デバッグするときは、考えられる原因を複数想定し、ロジカルに原因を分析し、テストコードで確認した上で、対策してください。

```

# 3. 解決したけど手間取ったパターン
### 3.1 langchain v0.2とv0.3の非互換性
langchain v0.2とv0.3では、モジュール構成が大きく違います。そして、読み替えだけで解決せず、どこへ行ったか探すのが大変なものもありました。結局コツをまとめると、下記のようになります。

<dl>
<dt>・人間の目で解決する:sweat_smile:</dt>
<dd>AIがv0.2とv0.3の表記を行ったり来たりし始めたら要注意。はっきりとRejectする。</dt>
<dt>・AIに解決させるときは、「公式サイトを検索しろ」と指示を出す。</dt>
<dt>・AIが生成したpackage.jsonのバージョンは信じない。最新版を、手動でインストールする。</dt>
<dt>インポートパスが正しいけど、そこにモジュールがないということもありました</dt>
</dl>

「何が正だかよくわからない」「前は、同じようなロジックが動作したはずだけど」というときに、 前に自分でまとめていたものが役に立ちました。

 https://qiita.com/michihiro88/items/e765ec5b29bb9b0f0c7f

 https://qiita.com/michihiro88/items/23b93659707854b32fe7

 ちなみに、いまテストロジックのモック作成で、v0.2とv0.3の非互換でトラブっているようです。:sob:
 がんばれ、Cursor!

 ### 3.2. コンソール入出力でのチャタリング
 コンソールの入出力に、readlineモジュールのcreateInterface関数によるインスタンスを使用するものでしたが、"web"と入力したら"wweebb"と表示されるような、チャタリングが起きました。それも二パターン。
 
 AI自力では解決が厳しそうでしたが、人間が原因を説明することで、AIも解決できました。

<dl>
<dt>・main処理とエージェントのコールバックで別々にcreateInterface関数を実行
<dd>⇒AIでは原因がわからず、明後日の方に対策して言って解決しなかったので、員スタンを二重に作っていることを指摘。AIで、使用するインスタンスを共通化する対策を立案</dd><br/>
<dt>・エージェント内のイベントが非同期で発生しており、コールバックで同時に呼ばれる。
<dd>⇒状況を説明し、並行動作の観点で検討させることで、入出力インタフェースの使用に同期をかけることを立案</dd>
</dl>

2025.02.23 山崎作成