BabyAGIコードリーディング
意外と短いnishio.icon
gpt.icon
このスクリプトは、OpenAIの2つのAPIとPineconeを使用して、「世界の飢餓を解決する」などの複雑な問題を解決するためのタスクリストを管理します。スクリプトは4つのエージェントを含んでいます:タスク作成エージェント、タスク優先エージェント、実行エージェント、コンテキストエージェント。
タスク作成エージェント: このエージェントはOpenAIの言語モデル(GPT-3モデルの text-davinci-003)を使用して、前回のタスクの結果に基づいて新しいタスクを生成します。目標、最後に完了したタスク、そのタスクの結果、未完了のタスクのリストが与えられます。そして、新しいタスクのリストを返します。
タスク優先エージェント: このエージェントはタスクを再優先します。これもOpenAIの言語モデルに基づいています。このエージェントはタスクリストを受け取り、メインの目標(この場合、「世界の飢餓を解決する」)を考慮してリストを並べ替えます。
実行エージェント: このエージェントは、目標とコンテキストエージェントから取得したコンテキストに基づいてタスクを実行します。また、タスクを実行し、コンテキストでプロンプトを生成するためにOpenAIの言語モデルを使用します。
コンテキストエージェント: このエージェントは、タスクに関連するコンテキストをPineconeベクトルデータベースから取得します。Pineconeのインデックスから上位5つの関連タスクを取得し、スコアでそれらをソートし、実行エージェントのコンテキストとしてそれらを返します。
スクリプトには、次のアクションを継続的に実行するメインループがあります:
現在のタスクリストを印刷します。
タスクリストから最初のタスクを引き出し、それを印刷します。
タスクを実行エージェントに送り、コンテキストに基づいてタスクを完了します。
完了したタスクの結果をPineconeに保存します。その際に、追加のメタデータも同時に保存します。
完了したタスクの結果と残りのタスクリストに基づいて新しいタスクを作成し、それらをタスクリストに追加します。
タスクリストを再優先します。
Pineconeベクトルデータベースは、各タスクのコンテキストが保存されるメモリバンクとして使用されます。スクリプトはPinecone環境を設定し、その中にインデックスを作成します。完成したタスクの結果は、追加のメタデータとともにこのインデックスに保存されます。
重要な注意点としては:
OpenAIとPineconeのAPIキーを適切に設定しなければ、このスクリプトは正常に動作しません。
このシステムで生成されるタスクは、OpenAI APIによって生成されるプロンプトと応答の品質によります。
このスクリプトでは、task_idは新しいタスクが作成されるたびに増分される整数です。完了したタスクの結果は、idとしてresult_{task_id}を使用してPineconeに保存されます。
このスクリプトには無限ループがあり、ループの各反復の終わりに1秒間のスリープがあります。必要に応じて終了条件を設定できます。
OpenAIの完了APIは、タスクと応答を生成するために使用されます。temperatureパラメータは生成されたテキストのランダム性を制御し、タスク作成と優先エージェントでは0.5、実行エージェントでは0.7に設定されています。
埋め込みを作成するためのモデルは "text-embedding-ada-002"で、言語モデルは "text-davinci-003"です。
結論として、このスクリプトは、以前に行われたタスクのコンテキストを利用して、将来のタスクを情報にするタスクの生成、実行、管理を自動化するシステムを表しています。
感想
「エージェント」と読んでるもの、単なる関数呼び出しだねnishio.icon
OpenAIのAPIを叩いてるとも限らない
Pinecoreはいらないな
実験
Pinecoreを削ってコンテキストエージェントを[]を返すように変更
code:py
OBJECTIVE = "Solve world hunger."
YOUR_FIRST_TASK = "Develop a task list."
タスクリストに一つしかないのでもちろんそれが選ばれる
実行エージェントはこのプロンプトを実行する
f"You are an AI who performs one task based on the following objective: {objective}.\nTake into account these previously completed tasks: {context}\nYour task: {task}\nResponse:",
code:result
1. Identify the causes of world hunger.
2. Analyze the current state of global food production and distribution.
3. Develop a strategy to increase access to food for underprivileged communities.
...
12. Develop a monitoring and evaluation system to track progress on food security initiatives.
この結果をPinecoreに入れるためにオブジェクトペイロードの形にする、この時点での実装では単に{"data": result}
このresultをベクトルに埋め込んで、ベクトルインデックスにいれる
次にタスクを作る
f"You are an task creation AI that uses the result of an execution agent to create new tasks with the following objective: {objective}, The last completed task has the result: {result}. This result was based on this task description: {task_description}. These are incomplete tasks: {', '.join(task_list)}. Based on the result, create new tasks to be completed by the AI system that do not overlap with incomplete tasks. Return the tasks as an array."
直前のタスクの結果を見て、既存のタスクリストと重複しないタスクを作れと指示している
順番を並び替える
究極の目的を参考にして並び替えている
プロンプトに「削除するな」などと書いてあるが、あっさり数が減っている
フォーマットが悪くてパースに失敗しているのか、プロンプトを無視して削除されてるのか
これは今だったらJSON形式でやり取りするようにするといいだろうな
これを踏まえて「Scrapboxに住んでるエージェント」について考える
この実装は最初は記憶喪失だが、Scrapboxに住んでるエージェントならScrapboxのJSONデータを受け取るのが自然
何も明示的なミッションがないならまずは新しい順に読むのが自然
それぞれのページを読むのが初期タスクになる
「読む」とは何か?
要約?
キーワードをピックアップ?
人間に対して質問する?
感想を書く?
人間も読んだもの全てに対してリアクションするわけではない
プロジェクトの目的などをプロンプトで与えるか?
これは自動化する前にローカルで動かすスクリプトを作るべきだな…
2023/8/9nishio.icon
更新されたページより新着ページを読むという選択肢もある