2023年に公開されたGPT関連repositoryから、AIエージェント間のインタラクション実装について考える

本記事は [リンクアンドモチベーション Advent Calendar 2023](https://qiita.com/advent-calendar/2023/lmi) の11日目になります。

# この記事について

2023年は、GPTを始めとした生成AIの発展が目覚ましい1年でした。
生成AIを使った様々なツールが出てきたり、自分たちでも生成AIをプロダクトに実装してみたりしました。
その中で、生成AIによってより複雑な問題を解決するには、複数のAIエージェントによる役割分担と、エージェント同士のインタラクションが重要になってくると感じました。
そこで今回は、2023年に発表された生成AI関連のOSSのうち、個人的に興味があったGenerative Agents, ChatDev, AutoGenという３つのプロジェクトを、AIエージェント間のインタラクションという側面からまとめてみます。

# Generative Agents

Generative Agenstsは、2023/04/07にこちらの論文で発表されました。
https://arxiv.org/abs/2304.03442
自律的に動作する25名のAIエージェントたちによる、２次元空間での社会のシミュレーションを実現しています。

リポジトリはこちら
https://github.com/joonspk-research/generative_agents

個人的には、Generative Agentsの凄さは、reflectionを用いたmemoryモジュールのアイデアだと思っていますが、あくまで今回はエージェント同士のインタラクションに焦点を当ててみます。

例えばChatGPTは、「人が話しかけてくるのを待つ」「話しかけると、絶対に返答する」という風に「会話の開始」「会話の終了」という意思決定を人間に委ねています。

しかしエージェント同士の対話だと、何かしらのトリガーで会話を開始し、終了させる必要があります。
その方法の一つとして、例えば
- エージェント同士が出会ったら強制的に会話開始
- 会話のターン数を限定し、規定ターンに達したら終了

とする方法もありますが、Generative Agentsでは、「会話を開始するか？」と「会話を終了するか？」の判定も、LLMに行わせることで解決しています。

超ざっくりした流れ
```mermaid
graph LR;
  近くに他のエージェントがいる?--yes-->start{{会話を開始する?}};
  start--yes-->utt{{発話を生成}};
  utt---->endchat{{会話を終了する?}};
  endchat--no-->utt;
  endchat--yes-->終了;
  start--no-->終了;
  近くに他のエージェントがいる?--no-->終了;
```
この後に出てくる２つは、この会話終了を判定する仕組みと、ターン数による管理を組み合わせて、会話の終了を管理しています。

# ChatDev
ChatDevでは、様々なロールを持った複数のエージェント同士が協力することでソフトウェア開発を行います。
https://github.com/OpenBMB/ChatDev


Generative Agentsと違い、誰と誰がいつ会話を開始するのかについては事前に設定が必要です。
ChatDevにおけるエージェント同士のインタラクションでは
- タスクを実現するためにどんなフェーズが必要か
- 各フェーズにおいて誰と誰を会話させるか
- 各フェーズで実際にどんな作業が必要か
- 各ロールの人たちがどんなスキルを持っているか

などうまく分解してデザインすることが重要になります。
例えばChatDevのDefaultの設定をシークエンスに書き起こすと以下のようになります。
(矢印の元→先に向かってタスクを依頼するような流れです)

```mermaid
sequenceDiagram
    participant CEO as Chief Executive Officer
    participant CPO as Chief Product Officer
    participant CTO as Chief Technology Officer
    participant Programmer as Programmer
    participant CR as Code Reviewer
    participant STE as Software Test Engineer

    CEO->>CPO: DemandAnalysis
    CEO->>CTO: LanguageChoose
    CTO->>Programmer: Coding
    CTO->>Programmer: CodeComplete
    Programmer->>CR: CodeReviewComment
    CR->>Programmer: CodeReviewModification
    STE->>Programmer: TestErrorSummary
    STE->>Programmer: TestModification
    CTO->>Programmer: EnvironmentDoc
    CEO->>CPO: Manual
```

ChatDevは、これらのタスクの分解、役割分担をユーザーがデザインすることでエージェント同士のインタラクションを実現しています。




# AutoGen
AutoGenはMicrosoftが開発しているOSSです。タスクを解決するために互いに会話できる複数のエージェントを使用して、LLMアプリケーションの開発を可能にするフレームワークです。
https://github.com/microsoft/autogen

エージェント間の対話という観点で見た時のAutoGenの凄さは、GroupChatManagerクラスによる、複数人のエージェント同士の対話のターン管理だと思います。
事前に、各エージェント事のロールを定義しておけば、あとはGroupChatManagerによって、対話のターン管理が自動的になされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539670/4e9b82d8-a1f2-8073-3bfe-cd518637ae48.png)
(参考: https://www.microsoft.com/en-us/research/blog/autogen-enabling-next-generation-large-language-model-applications/)

ChatDevは完全に順番を決めておく必要があったのと比べ、エージェント同士の会話状況を踏まえて柔軟に会話の順番を変更できることで、より柔軟な課題解決ができるようになる可能性があります。


# 最後に

この辺りの実装を読んで、今後の問題解決エージェントは
- GroupChatManagerのように、実行順を管理するマネージャーに、タスクの実行順を管理させる
- ChatDevのように、細かいタスクの実行内容、必要なロールを定義する
    - 各タスク内での会話はまた別のグループマネージャーによって管理される

といったような組み合わせを作ることで、より複雑な問題解決が可能になるのではないかと思いました。

今回はエージェント同士のインタラクションに注目しましたが、最近では人間の脳の構造を模したmemoryモジュールの実装なども進んでいるので、それもまた何処かでまとめたいなと思います。