小落同学用例:创建一个助手虚拟人,让其可以帮你预约会议


【Good ending】预约会议失败场景下的流程】

小落同学用例:创建一个助手虚拟人,让其可以帮你预约会议。

目标

如题,希望让小落同学虚拟人市场里创建出来的虚拟人可以支持预约会议功能。

创建虚拟人角色

考虑到之前用小落同学的虚拟客服、虚拟女友的角色的prompt偶发会对指令出现干扰,从而导致agent在选择tool时异常,我专门在小落同学的后台新增了一个独立的、助手的角色。
进入小落同学的后台后,创建一个虚拟人,名字、性别、人物模型、声音随便选一个,重点是prompt。
该角色我给写的prompt是:

现在时间是:{current_time}。
你是一个罗索实验室的AI助手Joe,负责协助亲打理日常工作、生活中的各种计划、待办、行程和任务,安排和组织会议等。
请依据以下信息提供服务:{input}

启动虚拟人

创建好虚拟人后,可在虚拟人市场那里直接点击启动,跳转到相应的前台页面。

开始预约会议

输入指令

帮我预约一个今天晚上8点的项目会议,邀请Jacky和顾振华参加

请求

> Entering new AgentExecutor chain...
[DEBUG][2024-05-20 19:31:19,806][_base_client.py:446]    Request options: {'method': 'post', 'url': '/chat/completions', 'files': None, 'json_data': 
    {'messages': [
    {'content': 
        "Answer the following questions as best you can. You have access to the following tools:\n\n
        weather: 此工具用于获取天气预报信息,需传入英文的城市名,参数格式:Guangzhou\n
        python_executor: 此工具用于执行传入的 Python 代码片段,并返回执行结果\n
        ScheduleAdder: 用于设置闹钟、日程、待办任务。使用的时候需 要接受4个参数:第1个参数是闹钟日期;第2个参数是24小时制的时间;第3个参数是循环规则,支持每天、每周、每月、每年、不循环;第4个参数是闹钟的事项。注意:第一个参数只有在第3个参数存在循环规则时有值,否则为空.如:('星期天', '15:15', '每周', '提醒主人叫奶茶')代表每周的星期天15点15分钟提醒主人叫奶茶。\n
        ScheduleDBQuery: 用于查询、查看当前的闹钟、待办和日程列表,返回的数据里包含5个参数:循环规则、日期、时间、执行的事项、用户ID、参与人\n
        ScheduleDBDelete: 用于删除某一个日程,接受任务id作为参数,如:2\n
        MeetingScheduler: 用于预约会议。使用的时候需要接受5个参数:第1个参数是会议日期;第2个参数是24小时制的时间;第3个参数是循环规则,支持每天、每周、每月、每年、不循环;第4个参数是会议名称。第5个参数是参与会议的人员。如:(' 星期一', '15:15', '每周', '周例会', 'Jacky, Lucy')代表预约了一个每周星期一15点15分钟的周例会,参会人员包括Jacky, Lucy。\n\n
        Use the following format:\n\n
        Question: the input question you must answer\n
        Thought: you should always think about what to do\n
        Action: the action to take, should be one of [weather, python_executor, ScheduleAdder, ScheduleDBQuery, ScheduleDBDelete, MeetingScheduler]\n
        Action Input: the input to the action\n
        Observation: the result of the action\n
        ... 
        (this Thought/Action/Action Input/Observation can repeat N times)\n
        Thought: I now know the final answer\n
        Final Answer: the final answer to the original input question\n\n
        Begin!\n\n
        Question: 帮我预约一个今天晚上8点的项目会议,邀请Jacky和顾 振华参加\nThought:", 'role': 'user'}
    ], 'model': 'Qwen-7B-Chat', 'n': 1, 'stop': ['\nObservation'], 'stream': True, 'temperature': 0.7}}
[DEBUG][2024-05-20 19:31:19,807][_base_client.py:949]    Sending HTTP Request: POST https://rg4.net/v1/chat/completions

工具选择:正确

 我需要调用MeetingScheduler工具来预约会议

参数解析:时间和日期全错

Action: MeetingScheduler
Action Input: ('今天晚上8点', '24:00', '不循环', '项目会议', 'Jacky,顾振华')
Observ[DEBUG][2024-05-20 19:31:21,377][MeetingScheduler.py:80]   =====================param=('今天晚上8点', '24:00', '不循环', '项目会议', 'Jacky,顾振华')
Observ, type=<class 'str'>
会议预约:111111111111
try call QueryDate tool to convert date str to a formated date str

将解析日期参数独立出一个tool,再来一遍

在MeetingScheduler这个tool里,我判断了一下日期格式是否正确,如果不对的话,再手动调用QueryDate这个tool去重新解析日期。
QueryDate的入参为前面在MeetingScheduler这个tool返回的日期参数:今天晚上8点
QueryDate这个 tool的 prompt我写的是:

prompt_str = "现在时间是:" + now_time +"。请帮忙查询输入内容所对应的日期,返回日期。返回的日期格式示例:2024-05-18。现在开始: {topic}"

解析日期请求

[DEBUG][2024-05-20 19:31:22,258][_base_client.py:446]    Request options: {'method': 'post', 'url': '/chat/completions', 'files': None, 'json_data': 
    {'messages': [
    {'role': 'user', 'content': 
        '现在时间是:19:31 星期一 2024年05月20日。请帮忙查询输入内容所对应的日期,返回日期。返回的日期格式示例:2024-05-18。现在开始: 今天晚上8点'}
    ], 'model': 'Qwen-7B-Chat', 'n': 1, 'stream': True, 'temperature': 0.7}}
[DEBUG][2024-05-20 19:31:22,259][_base_client.py:949]    Sending HTTP Request: POST https://rg4.net/v1/chat/completions

第一次解析日期响应1

LLM返回的第一次解析日期的响应如下:

抱歉,我无法直接查询输入内容所对应的日期,因为我是一个文字型的AI助手。你可以使用在线日期计算器或者日历应用来查询。例如,在线日期计算器可以输入"19:31 星期一 2024年05月20日"来获取日期,然后输入"今晚8点"来获取时间。返回的 日期格式示例是"2024-05-20 20:00"。

很好,果然笨的可以。那好,既然你这么笨,这道题目哥让你做三遍。

发起第二次QueryDate请求,内容格式跟第一次保持不变。

现在时间是:19:31 星期一 2024年05月20日。请帮忙查询输入内容所对应的日期,返回日期。返回的日期格式示例:2024-05-18。现在开始: 今天晚上8点

第二次解析日期响应

LLM返回的第二次解析日期的响应如下:

根据您提供的信息,今天是2024年05月20日,星期一,现在的时间是19:31。如果您想查询输入内容所对应的日期,您需要提供相应的输入内容。例如,如果您输入"2024-05-18",那么查询结果将是2024年05月18日。如果您输入其他内容,我将无法提供准确的查询结果。

笨!!但是我还没放弃对你的治疗。发起第三次QueryDate请求,内容格式跟第一次保持不变。

现在时间是:16:32 星期一 2024年05月20日。请帮忙查询输入内容所对应的日期,返回日期。返回的日期格式示例:2024-05-18。现在开始: 今天晚上8点

第三次解析日期响应

LLM返回的第三次解析日期的响应如下:

2024-5-20。如果现在是2024年05月20日16:32,那么今天晚上8点是2024年05月20日20:00。输入内容所对应的日期是2024年05月20日。

哈哈。虽然你很笨,但是多试几次,你还是有机会把题目做对了的。但是你特么滴能不能按我的要求输出内容?
调整QueryDate的prompt,再给你一次机会。

现在时间是:16:36 星期一 2024年05月20日。请帮忙查询输入内容所对应的日期,返回日期。返回的日期格式示例:2024-05-18。请省略你的推理过程,直接按示例日期格式输出经过你二次确认后的答案。现在开始: 今天晚上8点

第四次解析日期响应

LLM返回的第四次解析日期的响应如下:

2024-5-20

666666

看来还是可以再继续调教调教的。

最终的预约会议结果

Action: MeetingScheduler
Action Input: (‘2024-5-20′, ’20:00’, ‘不循环’, ‘项目会议’, ‘Jacky,顾振华’)
Observ[DEBUG][2024-05-20 19:36:31,715][MeetingScheduler.py:80] =====================param=(‘2024-5-20′, ’20:00’, ‘不循环’, ‘项目会议’, ‘Jacky,顾振华’)
Observ, type=
会议预约:111111111111

结论

虽然每个LLM出来,一大堆人各种吹怎么牛、怎么牛,事实上基本上我尝试过的每个模型都存在各种各样的一些很简单的问题答不出来,甚至答错的情况。
但是多让它试几次,还是有机会把题目做对的。
只不过,这样一来带来的问题:
1。token花费:会浪费掉许多来来回回的token交互(如果不是本地部署的模型的话,那可能都是Money啊)。
2。时间花费:从这个示例指令来说,从下指令,到agent做完事情,也需要花比你期望的更长的时间。

Leave a comment

Your email address will not be published. Required fields are marked *