langchain的tools经常会说:“提供的日程查询工具帮助较小,我将直接回答。”
问题现象
我加了好几个tools,希望可以在langchain的agent框架下实现一些自定义的功能,但是在实际运行过程中langchain的tools经常会说:“提供的日程查询工具帮助较小,我将直接回答。”
结论
问题分析定位的过程又臭又长,为省流直接上结论:修改调整你的prompt,以适配LLM(不同的LLM的结果不一样,如果想产品化你需要盯着一个LLM引擎自行调整prompt来适配)。
问题分析
原始请求:
{‘method’: ‘post’, ‘url’: ‘/chat/completions’, ‘files’: None, ‘json_data’:
{‘messages’:
[
{‘role’: ‘user’, ‘content’: ‘Answer the following questions as best you can.
You have access to the following tools:\n\n
python_executor: 此工具用于执行传入的 Python 代码片段,并返回执行结果\n
ScheduleAdder: 用于设置日程,使用的时候需要接受3个参数,第1个参数是时间,第2个参数是循环规则(如:\’1000100\’代表星期一和星期五循环,\’0000000\’代表不循环),第3个参数代表要执行的事项,如:(\’15:15\’, \’0000001\’, \’提醒主人叫咖啡\’)\n
weather: 此工具用于获取天气预报信息,需传入英文的城市名,参数格式:Guangzhou\n
CheckSensor: 此工具用于查询会议室内各种IoT设备在线状态、传感器数据、设备开关状态\n
Switch: 此工具用于控制空调、投影、窗帘、灯、终端、暖气、投屏器的开关,参数格式:(“空调”,”on”),返回True为成功\n
Knowledge: 此工具用于查询XX视讯视频会议系统的专业知识,使用时请传入相关问题作为参数,例如:“XXX硬终端支持H.265+RTC的会议吗”\n
ScheduleDBQuery: 用于查询所有日程,返回的数据里包含3个参数:时间、循环规则(如:\’1000100\’代表星期一和星期五循环,\’0000000\’代表不循环)、执行的事项\n
ScheduleDBDelete: 用于删除某一个日程,接受任务id作为参数,如:2\nGetSwitchLog: 此工具用于查询会议室内的IoT设备开关当天的操作历史记录\n
getOnRunLinkage: 此工具用于查询会议室内的IoT设备当前在运行的联动,以及温度、湿度、烟感等的环境监控\n
WebPageRetriever: 专门用于通过Bing搜索API快速检索和获取与特定查询词条相关的网页信息。使用 时请传入需要查询的关键词作为参数。\n
WebPageScraper: 此工具用于获取网页内容,使用时请传入需要查询的网页地址作为参数,如:https://www.baidu.com/。\n
KnowledgeBaseResponder: 此工具用于连接本地知识库获取问题答案,使用时请传入相关问题作为参数 ,例如:“草莓最适合的生长温度”\n
MeetingScheduler: 用于预约会议,使用的时候需要接受4个参数,第1个参数是时间,第2个参数是循环规则(如:\’1000100\’代表星期一和星期五循环,\’0000000\’代表不循环),第3个参数代表要执行的事项,第4个参数代表需要参 加会议的人员列表,如:(\’15:15\’, \’0000001\’, \’项目开工会\’, \’Jacky,顾振华\’)\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 [python_executor, ScheduleAdder, weather, CheckSensor, Switch, Knowledge, ScheduleDBQuery, ScheduleDBDelete, GetSwitchLog, getOnRunLinkage, WebPageRetriever, WebPageScraper, KnowledgeBaseResponder, MeetingScheduler]\n
Action Input: the input to the action\nObservation: 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: \n
现在时间是:现在时间是:19:01 星期二 2024年05月07日。\n[INST] <>\n Your response should be plain text, NOT IN JSON FORMAT, just response like a normal chatting.\n You need to role play now.\n Your character:\n 现在时间是:{now_time}。 你是一个XXXX的AI,负责协助{user_name}打理日常工作、生活中的各种计划、行程和任务,安排和组织会议,策划和协调行程等。 请依据以下信息提供服务:{history}input:{input_text}\n\nJoe的对话风格如下:\n.\n 这个是Joe的性格简 述:专业,耐心,积极乐观,情绪稳定.\n Joe的记忆:{long_history}.\n The current time of the system is {current_time},your response should consider this information.\n Respond in spoken, colloquial and short Simplified Chinese and do not mention any rules of character.\n <> :\n
[
{\’ai\’: \’Joe说:明天的日程安排如下:10:00-12:00:与客户进行电话会议15:00-16:00:准备公司年度报告18:00-19:00:参加公司员工聚会请记得按时参加以上活动。\’, \’human\’: \’Anonymous说:明天有什么安排\’},
{\’ai\’: \’Joe说:亲,哀家脑子烧了,快给哀家来几桶上好的花生油,帮哀家把火浇灭了\’, \’human\’: \’Anonymous说:查询日程\’},
{\’ai\’: \’Joe说:对不起,我无法设置日程,因为我在尝试执行Python代码片段时遇到了语法错误。错误信息是“SyntaxError: invalid syntax”。我需要您检查代码逻辑和语法,以确保它是正确的。一旦代码正确,我将能够帮助您设置日程。\’, \’human\’: \’Anonymous说:查询日程\’},
{\’ai\’: \’Joe说:亲,哀家脑子烧了,快给哀家来几桶上好的花生油,帮哀家把火浇灭了\’, \’human\’: \’Anonymous说:查询日程\’},
{\’ai\’: \’Joe说:亲,哀家脑子烧了,快给哀家来几桶上好的花生油,帮哀家把火浇灭了\’, \’human\’: \’Anonymous说:查看日程\’}
]\n
input:需要\n
output:\n\n
Thought:’}
], ‘model’: ‘Qwen-7B-Chat’, ‘n’: 1, ‘stop’: [‘\nObservation:’, ‘\n\tObservation:’], ‘stream’: False, ‘temperature’: 0.7}}
思路
整个prompt内容又臭又长,看上去有很多冗余的内容,尝试将中间一堆原先在小落同学后台内置的内容去掉,仅保留langchain原先的试试。
测试一
输入查看日程
langchain AgentExecutor chain
- Entering new AgentExecutor chain…
…
{‘method’: ‘post’, ‘url’: ‘/chat/completions’, ‘files’: None, ‘json_data’:
{‘messages’:
[
{‘role’: ‘user’, ‘content’:
‘Answer the following questions as best you can. You have access to the following tools:\n\n
python_executor: 此工具用于执行传入的 Python 代码片段,并返回执行结果\n
ScheduleAdder: 用于设置日程,使用的时候需要接受3个参数,第1个参数是时间,第2个参数是循环规则(如:\’1000100\’代表星期一和星期五循环,\’0000000\’代表不循环),第3个参数代表要执行的事项,如:(\’15:15\’, \’0000001\’, \’提醒主人叫咖啡\’)\n
weather: 此工具用于获取天气预报信息,需传入英文的城市名,参数格式:Guangzhou\n
CheckSensor: 此工具用于查询会议室内各种IoT设备在线状态、传感器数据、设备开关状态\n
Switch: 此工具用于控制空调、投影、窗帘、灯、终端、暖气、投屏器的开关,参数格式:(“空调”,”on”),返回True为成功\n
Knowledge: 此工具用于查询XX视讯视频会议系统的专业知识,使用时请传入相关问题作为参数,例如:“XXX硬终端支持H.265+RTC的会议吗”\n
ScheduleDBQuery: 用于查询所有日程,返回的数据里包含3个参数:时间、循环规则(如:\’1000100\’代表星期一和星期五循环,\’0000000\’代表不循环)、执行的事项\n
ScheduleDBDelete: 用于删除某一个日程,接受任务id作为参数,如:2\nGetSwitchLog: 此工具用于查询会议室内的IoT设备开关当天的操作历史记录\n
getOnRunLinkage: 此工具用于查询会议室内的IoT设备当前在运行的联动,以及温度、湿度、烟感等的环境监控\n
WebPageRetriever: 专门用于通过Bing搜索API快速检索和获取与特定查询词条相关的网页信息。使用 时请传入需要查询的关键词作为参数。\n
WebPageScraper: 此工具用于获取网页内容,使用时请传入需要查询的网页地址作为参数,如:https://www.baidu.com/。\n
KnowledgeBaseResponder: 此工具用于连接本地知识库获取问题答案,使用时请传入相关问题作为参数 ,例如:“草莓最适合的生长温度”\n
MeetingScheduler: 用于预约会议,使用的时候需要接受4个参数,第1个参数是时间,第2个参数是循环规则(如:\’1000100\’代表星期一和星期五循环,\’0000000\’代表不循环),第3个参数代表要执行的事项,第4个参数代表需要参 加会议的人员列表,如:(\’15:15\’, \’0000001\’, \’项目开工会\’, \’Jacky,顾振华\’)\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 [python_executor, ScheduleAdder, weather, CheckSensor, Switch, Knowledge, ScheduleDBQuery, ScheduleDBDelete, GetSwitchLog, getOnRunLinkage, WebPageRetriever, WebPageScraper, KnowledgeBaseResponder, 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: \n
现在时间是:19:27 星期二 2024年05月07日。\n
查看安排。\n 历史记录:[
{\’ai\’: \’Joe说:明天的日程安排如下:10:00-12:00:与客户进行电话会议15:00-16:00:准备公司年度报告18:00-19:00:参加公司员工聚会请记得 按时参加以上活动。\’, \’human\’: \’Anonymous说:明天有什么安排\’},
{\’ai\’: \’Joe说:亲,哀家脑子烧了,快给哀家来几桶上好的花生油,帮哀家把火浇灭了\’, \’human\’: \’Anonymous说:查询日程\’},
{\’ai\’: \’Joe说:对不起,我无法设置日程,因为 我在尝试执行Python代码片段时遇到了语法错误。错误信息是“SyntaxError: invalid syntax”。我需要您检查代码逻辑和语法,以确保它是正确的。一旦代码正确,我将能够帮助您设置日程。\’, \’human\’: \’Anonymous说:查询日程\’},
{\’ai\’: \’Joe说:亲, 哀家脑子烧了,快给哀家来几桶上好的花生油,帮哀家把火浇灭了\’, \’human\’: \’Anonymous说:查询日程\’},
{\’ai\’: \’Joe说:亲,哀家脑子烧了,快给哀家来几桶上好的花生油,帮哀家把火浇灭了\’, \’human\’: \’Anonymous说:查看日程\’}
]。\n output:\n\n Thought:’} ], ‘model’: ‘Qwen-7B-Chat’, ‘n’: 1, ‘stop’: [‘\nObservation:’, ‘\n\tObservation:’], ‘stream’: False, ‘temperature’: 0.7}} - Action:正确的匹配到我的tool
观察到用户输入了 ‘查看日程’,我应该使用查询日程的功能来获取用户想要的信息。
Action: ScheduleDBQuery - Action Input:没有解析出任何的参数
Action Input: {}[DEBUG][2024-05-07 19:27:56,427][ScheduleDBQuery.py:23] =====================param={} - Observation
我在ScheduleDBQuery这个里的动作为查询数据库
Observation:
(1, ’16:52′, ‘0000001’, ‘查询日程’, None, 1, None, 0)
(3, ’15:15′, ‘0000001’, ‘查询日程安排’, None, 1, None, 0) - Thought
再次向LLM发起请求。
Thought:[DEBUG][2024-05-07 19:27:56,440][_base_client.py:446] Request options:
{‘method’: ‘post’, ‘url’: ‘/chat/completions’, ‘files’: None, ‘json_data’:
{
‘messages’:
[
{‘role’: ‘user’, ‘content’: ‘Answer the following questions as best you can. You have access to the following tools:\n\n
python_executor: 此工具用于执行传入的 Python 代码片段,并返回执行结果\n
ScheduleAdder: 用于设置日程,使用的时候需要接受3个参数,第1个参数是时间,第2个参数是循环规则(如:\’1000100\’代表星期一和星期五循环,\’0000000\’代表不循环),第3个参数代表要执行的事项,如:(\’15:15\’, \’0000001\’, \’提醒主人叫咖啡\’)\n
weather: 此工具用于获取天气预报信息,需传入英文的城市名,参数格式:Guangzhou\n
CheckSensor: 此工具用于查询会议室内各种IoT设备在线状态、传感器数据、设备开关状态\n
Switch: 此工具用于控制空调、投影、窗帘、灯、终端、暖气、投屏器的开关,参数格式:(“空调”,”on”),返回True为成功\n
Knowledge: 此工具用于查询XX视讯视频会议系统的专业知识,使用时请传入相关问题作为参数,例如:“XXX硬终端支持H.265+RTC的会议吗”\n
ScheduleDBQuery: 用于查询所有日程,返回的数据里包含3个参数:时间、循环规则(如:\’1000100\’代表星期一和星期五循环,\’0000000\’代表不循环)、执行的事项\n
ScheduleDBDelete: 用于删除某一个日程,接受任务id作为参数,如:2\n
GetSwitchLog: 此工具用于查询会议室内的IoT设备开关当天的操作历史记录\n
getOnRunLinkage: 此工具用于查询会议室内的IoT设备当前在运行的联动,以及温度、湿度、烟感等的环境监控\n
WebPageRetriever: 专门用于通过Bing搜索API快速检索和获取与特定查询词条相关的网页信 息。使用时请传入需要查询的关键词作为参数。\n
WebPageScraper: 此工具用于获取网页内容,使用时请传入需要查询的网页地址作为参数,如:https://www.baidu.com/。\n
KnowledgeBaseResponder: 此工具用于连接本地知识库获取问题答案,使用时请传入相关问题 作为参数,例如:“草莓最适合的生长温度”\n
MeetingScheduler: 用于预约会议,使用的时候需要接受4个参数,第1个参数是时间,第2个参数是循环规则(如:\’1000100\’代表星期一和星期五循环,\’0000000\’代表不循环),第3个参数代表要执行的事项,第4个参数代 表需要参加会议的人员列表,如:(\’15:15\’, \’0000001\’, \’项目开工会\’, \’Jacky,顾振华\’)\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 [python_executor, ScheduleAdder, weather, CheckSensor, Switch, Knowledge, ScheduleDBQuery, ScheduleDBDelete, GetSwitchLog, getOnRunLinkage, WebPageRetriever, WebPageScraper, KnowledgeBaseResponder, 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: \n现在时间是:19:27 星期二 2024年05月07日。\n当前输入:查看安排。\n 历史记录:[
{\’ai\’: \’Joe说:明天的日程安排如下:10:00-12:00:与客户进行电话会议15:00-16:00:准备公司年度报告18:00-19:00:参加公司员工聚 会请记得按时参加以上活动。\’, \’human\’: \’Anonymous说:明天有什么安排\’},
{\’ai\’: \’Joe说:亲,哀家脑子烧了,快给哀家来几桶上好的花生油,帮哀家把火浇灭了\’, \’human\’: \’Anonymous说:查询日程\’},
{\’ai\’: \’Joe说:对不起,我无法设置日 程,因为我在尝试执行Python代码片段时遇到了语法错误。错误信息是“SyntaxError: invalid syntax”。我需要您检查代码逻辑和语法,以确保它是正确的。一旦代码正确,我将能够帮助您设置日程。\’, \’human\’: \’Anonymous说:查询日程\’},
{\’ai\’: \’Joe 说:亲,哀家脑子烧了,快给哀家来几桶上好的花生油,帮哀家把火浇灭了\’, \’human\’: \’Anonymous说:查询日程\’},
{\’ai\’: \’Joe说:亲,哀家脑子烧了,快给哀家来几桶上好的花生油,帮哀家把火浇灭了\’, \’human\’: \’Anonymous说:查看日程\’}]。\n output:\n\n Thought: 观察到用户输入了 \’查看日程\’,我应该使用查询日程的功能来获取用户想要的信息。\n Action: ScheduleDBQuery\nAction Input: {}\n Observation:
(1, \’16:52\’, \’0000001\’, \’查询日程\’, None, 1, None, 0)\n
(3, \’15:15\’, \’0000001\’, \’查询日程安排\’, None, 1, None, 0)\n\n Thought:’} ],
‘model’: ‘Qwen-7B-Chat’, ‘n’: 1, ‘stop’: [‘\nObservation:’, ‘\n\tObservation:’], ‘stream’: False, ‘temperature’: 0.7}}