🐎BLOG🐎

AutoGPT,AgentGPTについて軽く整理

pulished:

Auto GPT


  1. ユーザーが設定したゴールをAIにいくつかの問い(タスク)に分解させる
  2. それぞれの問いに回答を出させ、その結果を踏まえて追加で必要な問いを考えさせてタスクリストに追加する という、自問自答のループを回している。

[ソース] Significat Gravitas https://github.com/Significant-Gravitas/Auto-GPT

[特徴]

  1. インターネット検索機能を搭載
  2. ロングタームとショートタームメモリ機能を搭載
  3. 一般的なテキストを生成するためにGPT-4を利用
  4. 人気のサイトやプラットフォームにアクセスする機能を搭載⑤ファイルのストレージと要約のためにGPT-3.5を利用

[必要なもの]

画像で仕組み説明


Agent GPT

[ソース] Reworked https://github.com/reworkd/AgentGPT

何がすごい

1. ユーザーが設定したゴールをAIにいくつかの問い(タスク)に分解させる
2. それぞれの問いに回答を出させ、その結果を踏まえて追加で必要な問いを考えさせてタスクリストに追加する
という、自問自答のループを回している

プラスで更に実践的なことをしている↓

といった処理を行えるコマンドをGPT-4に使わせることで、情報の探索と処理を行いながら長期記憶も駆使して思考プロセスを進めるようにしている。

仕組み

AgentGPTでは3種類のプロンプトを組み合わせることで、探索的な思考を実現している

[startGoalPrompt]

AgentGPT/src/utils/chain.ts : lines 20 - 24

const startGoalPrompt = new PromptTemplate({
  template:
    "You are an autonomous task creation AI called AgentGPT. You have the following objective `{goal}`. Create a list of zero to three tasks to be completed by your AI system such that your goal is more closely reached or completely reached. Return the response as an array of strings that can be used in JSON.parse()",
  inputVariables: ["goal"],
});

[executeTaskPrompt]

AgentGPT/src/utils/chain.ts : lines 34 - 38

const executeTaskPrompt = new PromptTemplate({
  template:
    "You are an autonomous task execution AI called AgentGPT. You have the following objective `{goal}`. You have the following tasks `{task}`. Execute the task and return the response as a string.",
  inputVariables: ["goal", "task"],
});

[createTaskPrompt]

AgentGPT/src/utils/chain.ts : lines 50 - 54

const createTaskPrompt = new PromptTemplate({
  template:
    "You are an AI task creation agent. You have the following objective `{goal}`. You have the following incomplete tasks `{tasks}` and have just executed the following task `{lastTask}` and received the following result `{result}`. Based on this, create a new task to be completed by your AI system ONLY IF NEEDED such that your goal is more closely reached or completely reached. Return the response as an array of strings that can be used in JSON.parse() and NOTHING ELSE",
  inputVariables: ["goal", "tasks", "lastTask", "result"],
});

[AutonomousAgentクラス] 実際の思考プロセスはこのクラスの中で行われる

AgentGPT/src/components/AutonomousAgent.ts : line 39 - 129

 // Initialize by getting tasks
    try {
      this.tasks = await this.getInitialTasks();
      for (const task of this.tasks) {
        await new Promise((r) => setTimeout(r, 800));
        this.sendTaskMessage(task);
      }
    } catch (e) {
      console.log(e);
      this.sendErrorMessage(
        this.modelSettings.customApiKey !== ""
          ? `ERROR retrieving initial tasks array. Make sure your API key is not the free tier, make your goal more clear, or revise your goal such that it is within our model's policies to run. Shutting Down.`
          : `ERROR retrieving initial tasks array. Retry, make your goal more clear, or revise your goal such that it is within our model's policies to run. Shutting Down.`
      );
      this.shutdown();
      return;
    }

    await this.loop();
  }

  async loop() {
    console.log(`Loop ${this.numLoops}`);
    console.log(this.tasks);

    if (!this.isRunning) {
      this.sendManualShutdownMessage();
      this.shutdown();
      return;
    }

    if (this.tasks.length === 0) {
      this.sendCompletedMessage();
      this.shutdown();
      return;
    }

    this.numLoops += 1;
    const maxLoops = this.modelSettings.customApiKey === "" ? 4 : 50;
    if (this.numLoops > maxLoops) {
      this.sendLoopMessage();
      this.shutdown();
      return;
    }

    // Wait before starting
    await new Promise((r) => setTimeout(r, 1000));

    // Execute first task
    // Get and remove first task
    this.completedTasks.push(this.tasks[0] || "");
    const currentTask = this.tasks.shift();
    this.sendThinkingMessage();

    const result = await this.executeTask(currentTask as string);
    this.sendExecutionMessage(currentTask as string, result);

    // Wait before adding tasks
    await new Promise((r) => setTimeout(r, 1000));
    this.sendThinkingMessage();

    // Add new tasks
    try {
      const newTasks = await this.getAdditionalTasks(
        currentTask as string,
        result
      );
      this.tasks = this.tasks.concat(newTasks);
      for (const task of newTasks) {
        await new Promise((r) => setTimeout(r, 800));
        this.sendTaskMessage(task);
      }

      if (newTasks.length == 0) {
        this.sendActionMessage("Task marked as complete!");
      }
    } catch (e) {
      console.log(e);
      this.sendErrorMessage(
        `ERROR adding additional task(s). It might have been against our model's policies to run them. Continuing.`
      );
      this.sendActionMessage("Task marked as complete.");
    }

    await this.loop();
  }

[おおまかな思考プロセス]

  1. 初期化処理としてゴール設定・タスク作成のプロンプトをAIに渡して、作成してもらったタスクリストを保持する
  2. タスクを解くようにAIに指示し、その結果を受け取る
  3. AIにゴール・直前に解いたタスクの内容・タスクの結果を渡しつつ、新しいタスクを考えて配列で返すように指示する。受け取った新しいタスクの配列をタスクリストに追加する
  4. 2-3を、25回ループするかタスクリストが空になるまで実行する

画像で仕組み説明

Goal GPT

[GoalGPT]https://beta.nando.ai/goalgpt.php] GoalGPT Twitter

参照

おまけ