更新时间:2024-10-16 GMT+08:00
运行Agent
- 单轮执行
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-基础模型或者其他同等类型的模型。
父主题: Agent(智能代理)