AutoGen: 业务流程与任务执行

881 阅读6分钟

关注公众号:闲人张,了解更多内容:

AutoGen入门学习:hello world!

AutoGen: 代码执行与工具调用

AutoGen: ReAct 和 RAG

AutoGen: 搭建一个医疗系统

本文主要介绍AutoGen中如何通过多个智能体协同工作,完成业务流程及任务。同时通过感知、思考、行动的步骤来拆分智能体,保证整个流程的自动化及执行的准确性。

AI 生态应是分布式的,理想状态是多智能体协同。一个完整的智能体应当具备感知、规划、决策、行动的能力,而规划与决策我们又可统一为思考的过程,从而与认知结构三角模型保持一致。

下面我们从感知、思考、行动的步骤来拆分智能体,让多个智能体协同工作,完成目标。首先我们创建对应的智能体,然后将业务流程提前赋予给感知智能体,以此循环,达到具身认知的效果。

创建智能体

创建感知、思考、行动智能体,并赋予业务流程。

# 感知
perceive_agent = autogen.AssistantAgent(
    name="perceive",
    system_message="你是一个具有感知能力的助手,根据用户的问题,感知用户的需求,根据业务流程或者任务技能的需求描述,告知thingking下一步需要做什么。当任务完成时将完整答案告知用户并回复:'TERMINATE'"
                   "上课流程:根据日期获取课程,根据课程获取教室信息",
    human_input_mode="NEVER",
    is_termination_msg=lambda msg: msg.get("content") is not None and "TERMINATE" in msg["content"],
    llm_config={
        "config_list": config.config_list
    }

)
# 思考
thingking_agent = autogen.AssistantAgent(
    name="thingking",
    system_message="你是一个具有思考能力的助手,根据用户的需求及perceive给出的计划,将执行前的思考及所需的参数等信息告知用户",
    human_input_mode="NEVER",
    is_termination_msg=lambda msg: msg.get("content") is not None and "TERMINATE" in msg["content"],
    llm_config={
        "config_list": config.config_list,
    }
)
# 行动
action_agent = autogen.ConversableAgent(
    name="action",
    system_message="你是一个具有执行能力的助手,根据用户的输入及thingking给出的参数等信息后执行对应的流程及任务,将执行的动作告知用户,当用户输入Params 参数时,按照用户输入的参数执行函数",
    human_input_mode="ALWAYS",
    code_execution_config=False,
    llm_config={
        "config_list": config.config_list,
    }
)

创建一个人类智能体,用于与用户进行交互。

student_agent = autogen.ConversableAgent(
    name="liming",
    system_message="你是一名大二学生,名叫李明,正在大学完成学业",
    human_input_mode="NEVER",
    code_execution_config=False,
)

创建业务流程所需的技能

上述我们创建了一个上课的业务流程,需要根据日期获取课程,然后根据课程获取教室信息。下面我们创建对应的技能,并将技能赋予给智能体。

# 获取教室地址
def get_address_by_course(course: str) -> str:
    if course == "语文":
        return "教学楼1楼503"
    elif course == "数学":
        return "教学楼1楼504"
    return "宿舍"

# 根据日期查询今天的课程
def get_course_by_date(date: str) -> str:
    if date == "星期一":
        return "Result:今天的课程有语文和数学"
    elif date == "星期二":
        return "Result:今天的课程有数学"
    return "Result:今天没有课程"

赋予思考智能体获取课程和教室地址的技能及行动智能体执行技能的能力。

register_function(
    get_address_by_course,
    caller=thingking_agent,
    executor=action_agent,
    name="get_address_by_course",
    description="""根据课程获取地址,参数course,eg:{"course":"英语"}""",
)

register_function(
    get_course_by_date,
    caller=thingking_agent,
    executor=action_agent,
    name="get_course_by_date",
    description="""根据日期获取课程,参数date,eg:{"date":"星期一"}}""",
)

自定义智能体选择

因为感知、思考、行动是一个标准的流程,是可控的,为了提高效率及可控性,我们提供一个自定义智能体选择的功能。

def custom_speaker_selection_func(last_speaker: Agent, group_chat: autogen.GroupChat):
    messages = group_chat.messages
    if len(messages) <= 1:
        return student_agent
    if last_speaker is student_agent:
        if "执行" in messages[-1]["content"]:
            return action_agent
        return perceive_agent
    elif last_speaker is perceive_agent:
        return thingking_agent
    elif last_speaker is thingking_agent:
        if len(messages[-1]["content"]) < 1:
            return action_agent
        return thingking_agent
    elif last_speaker is action_agent:
        if "Result:" in messages[-1]["content"]:
            return perceive_agent
        elif "Params:" in messages[-1]["content"]:
            return student_agent
        return perceive_agent
    else:
        return "auto"

加入智能体组

创建智能体组,加入智能体,并开始对话

group_chat = autogen.GroupChat(
    agents=[student_agent, perceive_agent, thingking_agent, action_agent],
    messages=[],
    max_round=50,
    speaker_selection_method=custom_speaker_selection_func,
    send_introductions=True,
)

manager = autogen.GroupChatManager(groupchat=group_chat, llm_config={
    "config_list": config.config_list,
})

student_agent.initiate_chat(
    manager,
    message="今天是星期一该去哪上课",
)

查看运行结果,通过结果可以看到即使上个业务流程返回多个结果,智能体也可以将其完整且正确的执行处理。另外运行多次,会发现即使中间存在错误,智能体也会自动进行修正。

image.png

通过这个示例可以看出AutoGen的强大能力。

liming (to chat_manager):
今天是星期一该去哪上课
--------------------------------------------------------------------------------
perceive (to chat_manager):
感知到用户李明需要知道今天的课程信息,接下来需要查询今天的课程信息。thingking需要确定查询日期为今天。
--------------------------------------------------------------------------------
thingking (to chat_manager):
根据perceive的指示,接下来我的任务是根据当前日期去查询课程信息。参数信息如下:
{
  "date": "星期一"
}
--------------------------------------------------------------------------------
thingking (to chat_manager):
***** Suggested tool call (call_gqB8aOXsxllBzUK6EPSiIJ6C): get_course_by_date *****
Arguments: 
{
  "date": "星期一"
}
***********************************************************************************
--------------------------------------------------------------------------------
Provide feedback to chat_manager. Press enter to skip and use auto-reply, or type 'exit' to end the conversation: 
>>>>>>>> NO HUMAN INPUT RECEIVED.
>>>>>>>> USING AUTO REPLY...
>>>>>>>> EXECUTING FUNCTION get_course_by_date...
action (to chat_manager):
***** Response from calling tool (call_gqB8aOXsxllBzUK6EPSiIJ6C) *****
Result:今天的课程有语文和数学
**********************************************************************
--------------------------------------------------------------------------------
perceive (to chat_manager):
事先获取到的信息是:今天是星期一的课程有语文和数学。我们下一步需要获取这两门课程的上课地点信息,thingking需要确定课程名称为语文和数学。
--------------------------------------------------------------------------------
thingking (to chat_manager):
根据perceive的指示,接下来我的任务是查询语文和数学的课程地址。具体参数如下:
{
  "course": "语文"
},
{
  "course": "数学"
}
--------------------------------------------------------------------------------
thingking (to chat_manager):
***** Suggested tool call (call_7yXnVdvu0dvvy3QYfAAI5Y5Z): get_address_by_course *****
Arguments: 
{
  "course": "语文"
}
**************************************************************************************
--------------------------------------------------------------------------------
Provide feedback to chat_manager. Press enter to skip and use auto-reply, or type 'exit' to end the conversation: 
>>>>>>>> NO HUMAN INPUT RECEIVED.
>>>>>>>> USING AUTO REPLY...
>>>>>>>> EXECUTING FUNCTION get_address_by_course...
action (to chat_manager):
***** Response from calling tool (call_7yXnVdvu0dvvy3QYfAAI5Y5Z) *****
教学楼1楼503
**********************************************************************
--------------------------------------------------------------------------------
perceive (to chat_manager):
已获取到的信息是:语文课在教学楼1楼503教室。再次查询数学课的上课地点,thingking需要确定课程名称为数学。
--------------------------------------------------------------------------------
thingking (to chat_manager):
***** Suggested tool call (call_eDrqVKf2zWJUlBxXVULtQuqr): get_address_by_course *****
Arguments: 
{
  "course": "数学"
}
**************************************************************************************
--------------------------------------------------------------------------------
Provide feedback to chat_manager. Press enter to skip and use auto-reply, or type 'exit' to end the conversation: 
>>>>>>>> NO HUMAN INPUT RECEIVED.
>>>>>>>> USING AUTO REPLY...
>>>>>>>> EXECUTING FUNCTION get_address_by_course...
action (to chat_manager):
***** Response from calling tool (call_eDrqVKf2zWJUlBxXVULtQuqr) *****
教学楼1楼504
**********************************************************************
--------------------------------------------------------------------------------
perceive (to chat_manager):
已获取到的信息是:数学课在教学楼1楼504教室。任务已完成,告知用户李明今日课程及上课地点。 
TERMINATE
李明,您今天的课程有语文和数学,语文课在教学楼1楼503教室,数学课在教学楼1楼504教室。
--------------------------------------------------------------------------------
Process finished with exit code 0

解锁更多精彩关注公众号:闲人张