微信扫码
与创始人交个朋友
我要投稿
智能体的概念可以溯源到人工智能与强化学习,尤其是在强化学习中得到了延伸与实际的应用。在MetaGPT看来,可以将智能体想象成环境中的数字人,其中
❝智能体 = 大语言模型(LLM) + 观察 + 思考 + 行动 + 记忆
这个公式概括了智能体的功能本质。为了理解每个组成部分,可以与人类进行类比:
多智能体系统可以视为一个智能体社会,其中
❝多智能体 = 智能体 + 环境 + 标准流程(SOP) + 通信 + 经济
这些组件各自发挥着重要的作用:
在MetaGPT中,一个智能体运行周期的流程图如下:
在MetaGPT中,对于智能体来说,思考与行动是必不可少的,主要是基于ReAct理论框架[1],其流程主要是observe -> think -> act
即一个react的流程;MetaGPT实现了三种模式的react,具体请看:思考与行动 | MetaGPT[2]。
在MetaGPT中,有两个关键对象定义了智能体的基础:Action
、Role
。
Action
类是动作的逻辑抽象。用户可以通过简单地调用 <font style="color:rgb(60, 60, 67);">self._aask</font>
函数令 LLM 赋予这个动作能力,即这个函数将在底层调用 LLM api。Role
类是智能体的逻辑抽象。一个 Role
能执行特定的/多个 Action
,拥有记忆、思考并采用各种策略行动。基本上,它充当一个将所有这些组件联系在一起的凝聚实体。对于Action
来说,一般继承此类,重载run
方法即可。
class Action(SerializationMixin, ContextMixin, BaseModel):
model_config = ConfigDict(arbitrary_types_allowed=True)
# 省略其它....
async def _aask(self, prompt: str, system_msgs: Optional[list[str]] = None) -> str:
"""Append default prefix"""
return await self.llm.aask(prompt, system_msgs)
async def _run_action_node(self, *args, **kwargs):
"""Run action node"""
msgs = args[0]
context = "## History Messages\n"
context += "\n".join([f"{idx}: {i}" for idx, i in enumerate(reversed(msgs))])
return await self.node.fill(context=context, llm=self.llm)
async def run(self, *args, **kwargs):
"""Run action"""
if self.node:
return await self._run_action_node(*args, **kwargs)
raise NotImplementedError("The run method should be implemented in a subclass.")
而对于智能体的抽象类Role
来说,里面的方法就更复杂一些,代码地址:Role.py[3];一些关键的方法如下:
对于智能体的实现来说,主要是看当前智能体的业务场景,实现不同的重载,从而实现不同的react模式,适应不同的业务;从源码来看,MetaGPT对扩展的支持真的很强。
MetaGPT提供了的多个示例[4]是基于数据解释器DataInterpreter[5]来实现的。数据解释器是一个通过编写代码来解决数据相关问题的智能体。它能理解用户需求,制定计划,编写执行代码,并在必要时使用工具;这些能力使它能够处理广泛的场景。
对于数据解释器agent而言,其主要的思想是规划与行动(plan_and_act)。
# 提示词
REACT_THINK_PROMPT = """
# User Requirement
{user_requirement}
# Context
{context}
Output a json following the format:
.....
"""
class DataInterpreter(Role):
# 设置react模式为plan_and_act
@model_validator(mode="after")
def set_plan_and_tool(self) -> "Interpreter":
# code....
return self
# 设置持久化
@property
def working_memory(self):
return self.rc.working_memory
# 重写_think方法
async def _think(self) -> bool:
# code....
return need_action
# 重写_act方法
async def _act(self) -> Message:
# code....
return Message(content=code, role="assistant", cause_by=WriteAnalysisCode)
# 重写_plan_and_act方法
async def _plan_and_act(self) -> Message:
try:
# code....
return rsp
except Exception as e:
await self.execute_code.terminate()
raise e
# 重写_act_on_task方法
async def _act_on_task(self, current_task: Task) -> TaskResult:
# code....
return task_result
# 实际action的抽象
async def _write_and_exec_code(self, max_retry: int = 3):
# code....
return code, result, success
async def _write_code(
self,
counter: int,
plan_status: str = "",
tool_info: str = "",
):
# code....
return code, todo
async def _check_data(self):
# code....
对于我们自己要做智能体的话,数据解释器agent是一个很好的参考,而且还有论文详述。
不过这是一个单智能体,这点是要注意的,相比较多智能体来说,除却react模式的选择和业务的差异,单智能体会少一个watch
环节,主要是不需要智能体彼此间的通信。
这是一个多agent的示例,但我个人觉得并不是一个标准的agent示例,因为其代码结构来说,只有一个agent,只是通过不同的属性初始化辩手智能体,不过也是可以借鉴的。相关描述请查看:辩论[6],完整代码查看:debate.py[7]
# action
class SpeakAloud(Action):
"""Action: Speak out aloud in a debate (quarrel)"""
PROMPT_TEMPLATE: str = """
## BACKGROUND
Suppose you are {name}, you are in a debate with {opponent_name}.
## DEBATE HISTORY
Previous rounds:
{context}
## YOUR TURN
Now it's your turn, you should closely respond to your opponent's latest argument, state your position, defend your arguments, and attack your opponent's arguments,
craft a strong and emotional response in 80 words, in {name}'s rhetoric and viewpoints, your will argue:
"""
name: str = "SpeakAloud"
async def run(self, context: str, name: str, opponent_name: str):
prompt = self.PROMPT_TEMPLATE.format(context=context, name=name, opponent_name=opponent_name)
# logger.info(prompt)
rsp = await self._aask(prompt)
return rsp
# agent智能体
class Debator(Role):
name: str = ""
profile: str = ""
opponent_name: str = ""
def __init__(self, **data: Any):
super().__init__(**data)
self.set_actions([SpeakAloud])
self._watch([UserRequirement, SpeakAloud])
async def _observe(self) -> int:
await super()._observe()
# accept messages sent (from opponent) to self, disregard own messages from the last round
self.rc.news = [msg for msg in self.rc.news if msg.send_to == {self.name}]
return len(self.rc.news)
async def _act(self) -> Message:
logger.info(f"{self._setting}: to do {self.rc.todo}({self.rc.todo.name})")
todo = self.rc.todo # An instance of SpeakAloud
memories = self.get_memories()
context = "\n".join(f"{msg.sent_from}: {msg.content}" for msg in memories)
# print(context)
rsp = await todo.run(context=context, name=self.name, opponent_name=self.opponent_name)
msg = Message(
content=rsp,
role=self.profile,
cause_by=type(todo),
sent_from=self.name,
send_to=self.opponent_name,
)
self.rc.memory.add(msg)
return msg
# 根据不同的属性初始化两个agent实例使用
Biden = Debator(name="Biden", profile="Democrat", opponent_name="Trump")
Trump = Debator(name="Trump", profile="Republican", opponent_name="Biden")
大概的走读了解的一些MetaGPT框架的agent开发流程,从我个人所需的agent技能点来看,MetaGPT支持的不错,而且扩展做的蛮好的,代码也已读简洁,相比较autogen而言。感觉可以继续深挖MetaGPT,而且在开发的过程中,我个人一个最大的感受——好像是在基于Spring等框架——做业务开发,现在的AI发展趋势,尤其是在agent侧,的确是越来越简化AI的开发,对于我们来说,只需要了解agent框架,而后基于业务开发即可。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-11-07
LLM 是否消除了对编程语言的需求?
2024-11-06
OpenAI官方推荐!Exponent:AI结对编程,轻松构建全栈应用
2024-11-06
Apple Intelligence体验报告/使用教程(一):写作工具篇
2024-11-05
对话「42章经」曲凯:越早勇敢相信 AI 的人越有机会获得更大的回报|AI应用100问
2024-11-05
AI助力短剧,技术、艺术踏入同一条河流
2024-11-05
AI Agent智能代理如何快速变现
2024-11-05
PDF Extract API:OCR文档提取与解析工具,Python+自然语言实现
2024-11-04
产品界面的 AI 设计,为什么没人关注了?
2024-09-04
2024-09-03
2024-09-06
2024-07-23
2024-08-18
2024-06-14
2024-09-02
2024-07-19
2024-06-16
2024-07-31