LangChain 本身自带了很多工具,我们也可以自己定义工具,这些工具可以是一个类,让它实施一下 Tool 这个类。或者也可以直接用 DynamicTool 来定义工具。
比如我现在想定义一个可以返回当前年份还有月份的工具。先在这个 Node.js 程序文件的顶部,导入 DynamicTool,它来自 langchain/tools 这个包 。
然后声明一个 getCurrentYearMonth,它的值可以新建一个 DynamicTool,提供一个对象,里面先用 name 属性给这个工具起个名字,比如 current_year_month,然后再设置一下 description,它的值是这个工具的描述,比如可以描述一下这个工具的功能,还有它接收的参数。'call this to get the current year or month, input should be a string of year or month.' ,Agent 会根据工具的描述判断是否要使用这个工具。
再添加一个 func ,它的值是一个函数,也就是这个工具具体要做的事情,它有个 input 参数,这个参数的值可能是字符串 year 或者 month。
函数返回一个 Promise,新建一个 Promise,提供一个回调,有个 resolve 参数。在里面声明一个 now ,它的值可以新建一个 Date。然后声明一个 year,它的值是一个字符模板,用一下 now.getFullYear 这个方法,后面再加上一个字符串 “年”。再声明一个 month,它也是一个字符模板,里面用一下 now.getMonth() 再加上 1 ,然后再加上字符串 “月”。
声明一个 result,它的值可以判断一下 input 是不是等于 year,如果是,就让这个 result 等于 year,不然就让它等于 month。下面用一下这个 resolve ,把 result 交给它。
在这个 tools 里面,再添加一个 getCurrentYearMonth。然后试一下,问一个问题,比如 “今年还剩几个月” 。在终端,运行一下应用,然后观察控制台上输出的这些内容。
这里 Agent 给出结论,说我们要知道当前月份,并且需要用 12 减去当前月份,得到剩下的月份。这里先要执行的 Action 是 current_year_month,Action Input,也就是这个动作对应的输入是字符串 'month'。
代理执行器执行了 current_year_month 这个工具得到的结果是 “4月”,这些信息再次交给 Agent 处理,得到的 Thought,说我们得用 12 减去当前月份,算出剩下的月份。 对应要执行的 Action 是 calculator,它的 Action Input 是 12 - 4 。结果是 8 。所以最终得到了问题的答案就是 8 。