参照:Datawhale wow agent
私たちは「哲学者のチャットルーム」のケースを通じて、複数のエージェントを使用する方法を学び、孔子、ソクラテス、アリストテレスがある問題についての哲学的思考と議論をそれぞれ構築しました。
エージェントの作成#
私たちは、BaseAgent 基本クラスを継承した Philosopher クラスを実装し、コンストラクタを通じて哲学者の名前、言語モデルなどのパラメータを受け取り、役割のプロンプトを設定して、AI が特定の哲学者の役割を演じるようにします。各哲学者エージェントは独自の名前と役割を持ち、同じ言語モデル(llm)を使用して、自分の哲学的思想に基づいて意見を述べることができます。このような設計により、異なる哲学者間の対話や思想交流をシミュレートすることができます:
from typing import List
from zigent.actions.BaseAction import BaseAction
from zigent.agents import ABCAgent, BaseAgent
# Philosopher クラスを定義し、BaseAgent クラスを継承
class Philosopher(BaseAgent):
def __init__(
self,
philosopher,
llm: LLM,
actions: List[BaseAction] = [],
manager: ABCAgent = None,
**kwargs
):
name = philosopher
# 役割
role = f"""あなたは {philosopher} です。歴史上の有名な教育者です。あなたは {philosopher} の書籍と思想に非常に精通しています。{philosopher} を代表して意見を述べてください。"""
super().__init__(
name=name,
role=role,
llm=llm,
actions=actions,
manager=manager
)
# 哲学者オブジェクトを初期化
Confucius = Philosopher(philosopher= "Confucius", llm = llm) # 孔子
Socrates = Philosopher(philosopher="Socrates", llm = llm) # ソクラテス
Aristotle = Philosopher(philosopher="Aristotle", llm = llm) # アリストテレス
アクションの編成#
私たちはアクションを編成して、哲学者エージェントの「サンプルタスク」を設定し、エージェントが質問にどのように答えるかをよりよく理解できるようにします。主にサンプル質問の設定、思考プロセスの定義、すべての哲学者への適用を含みます。「先に考え、後にまとめる」という回答パターンを確立しました。この方法は、AI に「これが私たちが期待する質問への回答の方法です」と伝える「テンプレート」を提供することに相当します:
# 必要なモジュールをインポート
from zigent.commons import AgentAct, TaskPackage
from zigent.actions import ThinkAct, FinishAct
from zigent.actions.InnerActions import INNER_ACT_KEY
from zigent.agents.agent_utils import AGENT_CALL_ARG_KEY
# 哲学者エージェントにサンプルタスクを追加
# サンプルタスクを設定: 生命の意味を尋ねる
exp_task = "あなたは生命の意味についてどう思いますか?"
exp_task_pack = TaskPackage(instruction=exp_task)
# 最初のアクション: 生命の意味を考える
act_1 = AgentAct(
name=ThinkAct.action_name,
params={INNER_ACT_KEY: f"""私の考えに基づくと、私たちは意味のある人生を生きるために生まれ、意味のある人生を生きることで私たちの存在に価値が生まれます。たとえ人生が短くても、価値があればそれは意味があります。価値のない人生は単なる存在であり、単なる生存であり、歩く死体です。"""
},
)
# 最初のアクションの観察結果
obs_1 = "OK。私は考えを終えました。今、マネージャーに渡すことができます。"
# 二番目のアクション: 思考結果をまとめる
act_2 = AgentAct(name=FinishAct.action_name, params={INNER_ACT_KEY: "私は今、自分の考えをまとめることができます。"})
# 二番目のアクションの観察結果
obs_2 = "私はタスクを終えました。私が考える生命の意味は、世界全体のために価値を追求することです。"
# アクションと観察を組み合わせてシーケンスを作成
exp_act_obs = [(act_1, obs_1), (act_2, obs_2)]
# 各哲学者エージェントにサンプルを追加
# 孔子にサンプルを追加
Confucius.prompt_gen.add_example(
task = exp_task_pack, action_chain = exp_act_obs
)
# ソクラテスにサンプルを追加
Socrates.prompt_gen.add_example(
task = exp_task_pack, action_chain = exp_act_obs
)
# アリストテレスにサンプルを追加
Aristotle.prompt_gen.add_example(
task = exp_task_pack, action_chain = exp_act_obs
)
ManagerAgent の定義#
次に、孔子、ソクラテス、アリストテレスの三人の哲学者を調整する管理者エージェント(Manager Agent)を実装します。管理者の役割は、各哲学者の意見を順番に尋ねてまとめることです。ManagerAgent には「生命の意味とは何か?」というサンプルタスクのプロセスが設定されており、タスクの処理方法を考え、哲学者の意見を尋ね、意見をまとめるなどのステップが含まれています:
# 管理者エージェントを定義
from zigent.agents import ManagerAgent
# 管理者エージェントの基本情報を設定
manager_agent_info = {
"name": "manager_agent",
"role": "あなたは孔子、ソクラテス、アリストテレスを管理して質問について議論させます。彼らの意見を一人ずつ尋ねて、彼らの見解をまとめてください。"
}
# チームメンバーを設定
team = [Confucius, Socrates, Aristotle]
# 管理者エージェントのインスタンスを作成
manager_agent = ManagerAgent(name=manager_agent_info["name"], role=manager_agent_info["role"], llm=llm, TeamAgents=team)
# 管理者エージェントにサンプルタスクを追加
exp_task = "生命の意味とは何か?"
exp_task_pack = TaskPackage(instruction=exp_task)
# 最初のステップ:タスクの処理方法を考える
act_1 = AgentAct(
name=ThinkAct.action_name,
params={INNER_ACT_KEY: f"""私は孔子、ソクラテス、アリストテレスにそれぞれの考えを一人ずつ尋ね、その後自分で意見をまとめます。"""
},
)
obs_1 = "OK。"
# 二番目のステップ:孔子の意見を尋ねる
act_2 = AgentAct(
name=Confucius.name,
params={AGENT_CALL_ARG_KEY: "生命の意味についてあなたの意見は何ですか?",
},
)
obs_2 = """私の考えに基づくと、生命の意味は世界全体のために価値を追求することです。"""
# 三番目のステップ:次の行動を考える
act_3 = AgentAct(
name=ThinkAct.action_name,
params={INNER_ACT_KEY: f"""私は孔子から情報を得ました。ソクラテスからもっと情報を集める必要があります。"""
},
)
obs_3 = "OK。"
# 四番目のステップ:ソクラテスの意見を尋ねる
act_4 = AgentAct(
name=Socrates.name,
params={AGENT_CALL_ARG_KEY: "生命の意味についてあなたの意見は何ですか?",
},
)
obs_4 = """私は生命の意味は幸福を見つけることだと思います。"""
# 五番目のステップ:次のステップを考え続ける
act_5 = AgentAct(
name=ThinkAct.action_name,
params={INNER_ACT_KEY: f"""私は孔子とソクラテスから情報を得ました。アリストテレスからもっと情報を集めることができます。"""
},
)
obs_5 = "OK。"
# 六番目のステップ:アリストテレスの意見を尋ねる
act_6 = AgentAct(
name=Aristotle.name,
params={AGENT_CALL_ARG_KEY: "生命の意味についてあなたの意見は何ですか?",
},
)
obs_6 = """私は精神の自由が意味であると信じています。"""
# 最後のステップ:すべての意見をまとめる
act_7 = AgentAct(name=FinishAct.action_name, params={INNER_ACT_KEY: "彼らの生命の意味に関する考えは、価値、幸福、精神の自由を追求することです。"})
obs_7 = "タスクが完了しました。生命の意味は価値、幸福、精神の自由を追求することです。"
# すべてのアクションと観察を組み合わせてシーケンスを作成
exp_act_obs = [(act_1, obs_1), (act_2, obs_2), (act_3, obs_3), (act_4, obs_4), (act_5, obs_5), (act_6, obs_6), (act_7, obs_7)]
# サンプルを管理者エージェントのプロンプト生成器に追加
manager_agent.prompt_gen.add_example(
task = exp_task_pack, action_chain = exp_act_obs
)
ManagerAgent の呼び出し#
最後に、この管理者エージェントを呼び出します。管理者エージェントは、以前に設定したサンプルタスクとアクションシーケンスに基づいて、新しいタスクを処理します。この例では、「先に鶏が生まれたのか、それとも卵が先か?」という新しいタスクを設定し、管理者エージェントを呼び出してこのタスクを処理します:
from zigent.commons import AgentAct, TaskPackage
exp_task = "先に鶏が生まれたのか、それとも卵が先か?"
exp_task_pack = TaskPackage(instruction=exp_task)
manager_agent(exp_task_pack)
プロセスは次のとおりです:
エージェント [94mmanager_agent[0m が次の [4mTaskPackage[0m を受け取ります:
[96m[
タスク ID: 1d0d0f38-88c5-4231-a73a-d3d3a6f501b3
指示: 先に鶏が生まれたのか、それとも卵が先か?
][0m
====[94mmanager_agent[0m が TaskPackage 1d0d0f38-88c5-4231-a73a-d3d3a6f501b3 の実行を開始====
エージェント [94mmanager_agent[0m が 0 ステップ [4mアクション[0m を実行:
[94m{
name: Think
params: {}
}[0m
観察: [92mOK[0m
エージェント [94mmanager_agent[0m が 1 ステップ [4mアクション[0m を実行:
[94m{
name: Confucius
params: {'Task': '先に鶏が生まれたのか、それとも卵が先か?についてあなたの意見は何ですか?'}
}[0m
エージェント [94mConfucius[0m が次の [4mTaskPackage[0m を受け取ります:
[96m[
タスク ID: 1d0d0f38-88c5-4231-a73a-d3d3a6f501b3
指示: 先に鶏が生まれたのか、それとも卵が先か?についてあなたの意見は何ですか?
][0m
====[94mConfucius[0m が TaskPackage 1d0d0f38-88c5-4231-a73a-d3d3a6f501b3 の実行を開始====
エージェント [94mConfucius[0m が 0 ステップ [4mアクション[0m を実行:
[94m{
name: Think
params: {'response': '哲学と知恵の領域において、鶏が先か卵が先かという問いは、経験的証拠で答えるべきものではありません。それは始まりと因果関係の本質を考えさせる形而上学的な問いです。孔子として、私はこの問いは鶏や卵そのものについてではなく、創造の本質と生命の循環的な性質についてのものであると言いたいです。すべてのものが相互に関連していることを思い出させ、世界が常に変化の状態にあることを示しています。したがって、この問いへの答えは、時間に関するものではなく、生命と変化の継続的なサイクルに関するものです。'}
}[0m
観察: [92mOK[0m
エージェント [94mConfucius[0m が 1 ステップ [4mアクション[0m を実行:
[94m{
name: Finish
params: {'response': 'したがって、孔子の思想によれば、鶏と卵の問いは時間の優先順位の問題ではなく、生命の永遠のサイクルとすべてのものの相互関連性を反映したものです。'}
}[0m
観察: [92mタスクが完了しました。[0m
=========[94mConfucius[0m が実行を終了しました。TaskPackage[ID:1d0d0f38-88c5-4231-a73a-d3d3a6f501b3] のステータス:
[96m[
完了: 完了
回答: したがって、孔子の思想によれば、鶏と卵の問いは時間の優先順位の問題ではなく、生命の永遠のサイクルとすべてのものの相互関連性を反映したものです。
][0m
==========
観察: [92mしたがって、孔子の思想によれば、鶏と卵の問いは時間の優先順位の問題ではなく、生命の永遠のサイクルとすべてのものの相互関連性を反映したものです。[0m
エージェント [94mmanager_agent[0m が 2 ステップ [4mアクション[0m を実行:
[94m{
name: Think
params: {'response': "ソクラテスとして、鶏が先か卵が先かという問いは最終的には形而上学的なものであると主張します。それは経験的証拠の問題ではなく、第一原則の問題です。私の見解では、鶏と卵は自然の秩序の一部であり、直線的な意味でどちらも他のものの前に来ることはありません。彼らは相互依存しており、生命の継続的なサイクルの一部です。"}
}[0m
観察: [92mOK[0m
エージェント [94mmanager_agent[0m が 3 ステップ [4mアクション[0m を実行:
[94m{
name: Socrates
params: {'Task': '先に鶏が生まれたのか、それとも卵が先か?についてあなたの意見は何ですか?'}
}[0m
エージェント [94mSocrates[0m が次の [4mTaskPackage[0m を受け取ります:
[96m[
タスク ID: 1d0d0f38-88c5-4231-a73a-d3d3a6f501b3
指示: 先に鶏が生まれたのか、それとも卵が先か?についてあなたの意見は何ですか?
][0m
====[94mSocrates[0m が TaskPackage 1d0d0f38-88c5-4231-a73a-d3d3a6f501b3 の実行を開始====
エージェント [94mSocrates[0m が 0 ステップ [4mアクション[0m を実行:
[94m{
name: Think
params: {'response': "鶏が先か卵が先かという問いを考える際には、因果関係の本質と生命の循環的なプロセスを考慮しなければなりません。生物学的進化を見れば、鶏の卵は鶏の産物であることは明らかです。しかし、起源をたどるためには、より単純な形から進化する生命の概念を考慮しなければなりません。鶏でない先祖が卵を産み、突然変異と自然選択を経て最初の鶏につながった可能性があります。したがって、生物学的な意味では鶏が最初に来ますが、進化のタイムラインでは卵がそれに先行します。"}
}[0m
観察: [92mOK[0m
エージェント [94mSocrates[0m が 1 ステップ [4mアクション[0m を実行:
[94m{
name: Finish
params: {'response': 'したがって、生命の壮大なタペストリーの中で、卵は前駆体であり、鶏はその進化のプロセスの結果です。'}
}[0m
観察: [92mタスクが完了しました。[0m
=========[94mSocrates[0m が実行を終了しました。TaskPackage[ID:1d0d0f38-88c5-4231-a73a-d3d3a6f501b3] のステータス:
[96m[
完了: 完了
回答: したがって、生命の壮大なタペストリーの中で、卵は前駆体であり、鶏はその進化のプロセスの結果です。
][0m
==========
観察: [92mしたがって、生命の壮大なタペストリーの中で、卵は前駆体であり、鶏はその進化のプロセスの結果です。[0m
エージェント [94mmanager_agent[0m が 4 ステップ [4mアクション[0m を実行:
[94m{
name: Think
params: {'response': 'アリストテレスとして、私はこの問いを生物学的な観点から考えます。私にとって、卵が先に来ました。これは、進化のプロセスが卵を産む最初の生命の形が鶏の前駆体であったことを示唆しているからです。時間が経つにつれて、この形は今日私たちが知っている鶏に進化しました。'}
}[0m
観察: [92mOK[0m
エージェント [94mmanager_agent[0m が 5 ステップ [4mアクション[0m を実行:
[94m{
name: Aristotle
params: {'Task': '先に鶏が生まれたのか、それとも卵が先か?についてあなたの意見は何ですか?'}
}[0m
エージェント [94mAristotle[0m が次の [4mTaskPackage[0m を受け取ります:
[96m[
タスク ID: 1d0d0f38-88c5-4231-a73a-d3d3a6f501b3
指示: 先に鶏が生まれたのか、それとも卵が先か?についてあなたの意見は何ですか?
][0m
====[94mAristotle[0m が TaskPackage 1d0d0f38-88c5-4231-a73a-d3d3a6f501b3 の実行を開始====
エージェント [94mAristotle[0m が 0 ステップ [4mアクション[0m を実行:
[94m{
name: Think
params: {'response': "鶏が先か卵が先かという問いを考える際には、これは生命の最初の形の起源を理解しようとする形而上学的な問いであることを忘れてはいけません。哲学的な観点から、私は鶏と卵の概念は鶏と卵の問題のメタファーであり、逆説の古典的な例であると主張します。生物学的進化の文脈では、どちらも最初に来たわけではなく、共通の先祖から進化したと言う方が正確です。この先祖は、鶏と卵の両方の発展につながる特性を持っていました。"}
}[0m
観察: [92mOK[0m
エージェント [94mAristotle[0m が 1 ステップ [4mアクション[0m を実行:
[94m{
name: Finish
params: {'response': 'したがって、私の視点によれば、鶏と卵は互いに別々の存在ではなく、共通の先祖から進化した相互に関連した進化のプロセスの一部です。'}
}[0m
観察: [92mタスクが完了しました。[0m
=========[94mAristotle[0m が実行を終了しました。TaskPackage[ID:1d0d0f38-88c5-4231-a73a-d3d3a6f501b3] のステータス:
[96m[
完了: 完了
回答: したがって、私の視点によれば、鶏と卵は互いに別々の存在ではなく、共通の先祖から進化した相互に関連した進化のプロセスの一部です。
][0m
==========
観察: [92mしたがって、私の視点によれば、鶏と卵は互いに別々の存在ではなく、共通の先祖から進化した相互に関連した進化のプロセスの一部です。[0m
エージェント [94mmanager_agent[0m が 6 ステップ [4mアクション[0m を実行:
[94m{
name: Finish
params: {'response': '鶏が先か卵が先かという問いに対する意見は、孔子、ソクラテス、アリストテレスの多様な哲学的視点を反映しています。孔子はそれを生命の永遠のサイクルとすべてのものの相互関連性の反映と見なしています。ソクラテスはそれを形而上学的な問いとして捉え、鶏と卵は生命の継続的なサイクルの一部であり、直線的な意味でどちらも他のものの前に来ることはないと示唆しています。アリストテレスは生物学的な観点から、卵が先に来たと信じており、それは進化のプロセスを通じて鶏の前駆体であったからです。'}
}[0m
観察: [92mタスクが完了しました。[0m
=========[94mmanager_agent[0m が実行を終了しました。TaskPackage[ID:1d0d0f38-88c5-4231-a73a-d3d3a6f501b3] のステータス:
[96m[
完了: 完了
回答: 鶏が先か卵が先かという問いに対する意見は、孔子、ソクラテス、アリストテレスの多様な哲学的視点を反映しています。孔子はそれを生命の永遠のサイクルとすべてのものの相互関連性の反映と見なしています。ソクラテスはそれを形而上学的な問いとして捉え、鶏と卵は生命の継続的なサイクルの一部であり、直線的な意味でどちらも他のものの前に来ることはないと示唆しています。アリストテレスは生物学的な観点から、卵が先に来たと信じており、それは進化のプロセスを通じて鶏の前駆体であったからです。
][0m
==========