更新时间:2024-10-16 GMT+08:00
分享

运行Agent

  • 单轮执行
    调用run接口运行一个Agent:
    agent.run("帮我定个下午3点到8点2303会议室")
    Agent的运行时会进行自我迭代,并且选择合适的工具,在日志中打印最终的执行结果:
    用户: 帮我定个下午3点到8点2303会议室
    助手: 好的,2023-11-17 15:00到2023-11-17 20:00的2303会议室已为您预定成功。 
     - 步骤1:
       思考:好的,我需要先查询2303会议室的状态,如果可用,我将为您预定。
       行动:使用工具[reserve_meeting_room],传入参数{"start": "2023-11-17 15:00", "end": "2023-11-17 20:00", "meeting_room": "2303"}
       工具返回:2023-11-17 15:00到2023-11-17 20:00的2303已预定成功
     - 步骤2
       答复:好的,2023-11-17 15:00到2023-11-17 20:00的2303会议室已为您预定成功。
  • 多轮执行:
    messages = [ConversationMessage(role=Role.USER, content="定个2点的会议"),
                ConversationMessage(role=Role.ASSISTANT, content="请问您的会议预计何时结束?另外,您是需要预订线上会议还是实体会议室?"),
                ConversationMessage(role=Role.USER, content="4点结束,线上会议")]
    agent.run(messages)
    运行结果示例:
    用户: 定个2点的会议
    助手: 请问您的会议预计何时结束?另外,您是需要预订线上会议还是实体会议室?
    用户: 4点结束,线上会议
    助手: 已为您预定2023年6月29日14:00至16:00的线上会议,请准时参加。 
     - 步骤1:
       思考:好的,我将为您预定2点至4点的线上会议。
       行动:使用工具[reserve_meeting],传入参数{"start": "2023-06-29 14:00", "end": "2023-06-29 16:00"}
       工具返回:2023-06-29 14:00到2023-06-29 16:00的线上会议已预定成功
     - 步骤2
       答复:已为您预定2023年6月29日14:00至16:00的线上会议,请准时参加。 
  • 多轮执行增强
    上述的例子中实际运行时只提供给模型多轮的对话,并没有提供工具执行的过程,为了让大模型的效果更好,可以传入agent_session。
    用户: 定个金桥203会议室的会议
    助手: 好的,请问会议具体是什么时候开始和结束?请按照"yyyy-MM-dd HH:mm"的格式告诉我。 
     - 步骤1
       答复:好的,请问会议具体是什么时候开始和结束?请按照"yyyy-MM-dd HH:mm"的格式告诉我。 
    用户: 下午2点到4点
    助手: 已经成功为您预定了2023年6月22日下午2点到4点的金桥203会议室。 
     - 步骤1:
       思考:好的,我现在就去为您预定金桥203会议室,时间是下午2点到4点。
       行动:使用工具[reserve_meeting_room],传入参数{"start": "2023-06-22 14:00", "end": "2023-06-22 16:00", "meeting_room": "金桥203"}
       工具返回:2023-06-22 14:00到2023-06-22 16:00的金桥203已预定成功
     - 步骤2
       答复:已经成功为您预定了2023年6月22日下午2点到4点的金桥203会议室。 
    用户: 再定一个明天8点到9点的会议室
    助手: 好的,请问您希望预定哪个会议室?
     - 步骤1
       答复:好的,请问您希望预定哪个会议室?
    用户: 同一个会议室
    助手: 已经成功为您预定了2023年6月23日早上8点到9点的金桥203会议室。 
     - 步骤1:
       思考:好的,我现在就去为您预定金桥203会议室,时间是明天8点到9点。
       行动:使用工具[reserve_meeting_room],传入参数{"start": "2023-06-23 08:00", "end": "2023-06-23 09:00", "meeting_room": "金桥203"}
       工具返回:2023-06-23 08:00到2023-06-23 09:00的金桥203已预定成功
     - 步骤2
       答复:已经成功为您预定了2023年6月23日早上8点到9点的金桥203会议室。

    如果服务是分布式的,需要将session对象在外部持久化。

  • 单步执行
    有时并不希望Agent完全自主执行,在某些关键节点,让用户先进行确认,确认后再执行,或者用户对模型的结果有异议或者想法有变化,想对当前结果进行更改。此时可以单步运行Agnet:
    """
    单步执行Agent,提供干预能力
    :param agent_session: 包括初始状态,以及执行步骤间的agentSession,可以使用AgentSessionHelper类辅助处理
    :return: Agent执行的结果
    """
    run_step(agent_session: AgentSession) -> AgentSession
    以下为一个完整的示例:
    agent.clear_tool()
    agent.add_tool(RiskDetectionTool())
    session = AgentSessionHelper.init_agent_session("请帮我查一下方欣科技有限公司今年1月的经营异常风险")
    # 预期Agent返回reportType为经营异常风险检测的Json,呈现给终端用户
    session = agent.run_step(session)
    # 终端用户反悔,想改成欠税信息检测,修改信息后继续让Agent执行
    AgentSessionHelper.set_user_feedback(session, "改为欠税信息")
    
    # 预期Agent返回reportType为欠税信息体检的Json,呈现给终端用户
    session = agent.run_step(session)
    # 终端用户确认,调用外部系统,进一步确认公司名称和编号,补充信息后,让Agent继续执行
    AgentSessionHelper.set_user_feedback(session, "公司改为金财互联数据服务有限公司,nsrsbh为91440101MA59JN5456")
    
    # 预期Agent更新companyName和nsrsbh
    session = agent.run_step(session)
    # 此时已经得到完整调用信息了,调用risk_detection API,将API返回结果给Agent继续执行
    AgentSessionHelper.set_tool_output(session, "金财互联数据服务有限公司1月份存在异常经营风险")
    
    session = agent.run_step(session)
    # 打印
    if session.agent_session_status == "FINISHED":
        AgentSessionHelper.update_assistant_message(session, True)
        print(AgentSessionHelper.print_plan(session))

    上述例子中,终端用户对Agent即将要执行的API做了2次修改,最终进行了执行。

    run_step的入参为AgentSession,有较大的灵活性,因此提供了辅助类AgentSessionHelper帮助开发者更容易处理:

    • init_agent_session:使用用户消息初始化一个AgentSession。
    • set_tool_output:向Agent的当前步骤设置工具返回结果。
    • set_user_feedback:向Agent的当前步骤设置用户反馈。
    打印结果为:
    用户: 请帮我查一下方欣科技有限公司今年1月的经营异常风险
    助手: 根据企业健康体检工具的结果,金财互联数据服务有限公司1月份存在异常经营风险。 
     - 步骤1:
       思考:好的,我将使用企业健康体检工具来查询方欣科技有限公司今年1月的经营异常风险。首先,我需要确认工具调用的参数。根据工具定义,需要的参数包括"report_type"和"company_name"。用户已经提供了公司名称"方欣科技有限公司",并指定了时间范围为今年1月。我将设置"report_type"为"经营异常风险检测",并将"skssqq"设置为"2024-01-01","skssqz"设置为"2024-01-31"。现在,我将调用工具。
       行动:使用工具[risk_detection],传入参数{"report_type": "经营异常风险检测","company_name": "方欣科技有限公司","skssqq": "2024-01-01", "skssqz": "2024-01-31"}
       用户反馈:改为欠税信息
     - 步骤2:
       思考:好的,我将修改"report_type"参数为"欠税信息体检",并重新调用工具。
       行动:使用工具[risk_detection],传入参数{"report_type": "欠税信息体检","company_name": "方欣科技有限公司","skssqq": "2024-01-01", "skssqz": "2024-01-31"}
       用户反馈:公司改为金财互联数据服务有限公司,nsrsbh为91440101MA59JN5456
     - 步骤3:
       思考:好的,我将更新"company_name"参数为"金财互联数据服务有限公司",并添加"nsrsbh"参数为"91440101MA59JN5456"。现在,我将再次调用工具。
       行动:使用工具[risk_detection],传入参数{"report_type": "欠税信息体检","company_name": "金财互联数据服务有限公司","skssqq": "2024-01-01", "skssqz": "2024-01-31", "nsrsbh": "91440101MA59JN5456"}
       工具返回:金财互联数据服务有限公司1月份存在异常经营风险
     - 步骤4
       答复:根据企业健康体检工具的结果,金财互联数据服务有限公司1月份存在异常经营风险。
    有时会需要Agent对之前的思考、行动回答用户的最终问题,如果对模型返回的结果不满意,可以选择使用AgentSessionSkill解决:
    llm_api = LLMs.of("pangu", llm_config=LLMConfig(llm_param_config=LLMParamConfig(temperature=0.01), llm_module_config=LLMModuleConfig( module_version="N2_agent_v2")))
    agent = ReactPanguAgent(llm=llm_api)
    agent.set_max_iterations(5)
    agent.add_tool(QueryScoreTool())
    
    agent_session = agent.run("我的数学成绩和语文成绩分别是多少")
    
    summary_llm_api = LLMs.of("pangu", llm_config=LLMConfig(llm_module_config=LLMModuleConfig(url="https://pangu.cn-southwest-2.myhuaweicloud.com/v1/infers/N2-基础模型的调用地址")))
    agent_session_skill = AgentSessionSkill(llm=summary_llm_api)
    print(agent_session_skill.summary(agent_session))
    运行结果示例:
    助手: 您的语文成绩是56分。 
     - 步骤1:
       思考:好的,我需要调用 query_score 工具来查询您的成绩。首先,我将查询您的数学成绩。
       行动:使用工具[query_score],传入参数{"arg": "数学"}
       工具返回:你的数学的成绩是55分
     - 步骤2:
       思考:您的数学成绩是55分。接下来,我将查询您的语文成绩。
       行动:使用工具[query_score],传入参数{"arg": "语文"}
       工具返回:你的语文的成绩是56分
     - 步骤3
       答复:您的语文成绩是56分。
    最终结果: 您的数学成绩是55分,而语文成绩是56分。

    AgentSessionSkill使用的大模型建议为N2-基础模型或者其他同等类型的模型。

相关文档