2/n 你问机器人现在几点了,机器人可以告诉你现在是下午4:27;你问机器人“29的平方根是多少?”,机器人会告诉你“29 的平方根是 5.39”
他也揭秘了机器人是如何实现报时的,也就是当有人问时间时,把当前的时间作为Prompt一起发送给机器人。
3/n 用户:“现在几点了?”
prompt:“请回答用户的问题:“现在几点了”,并且当前的时间是4:27。”
这个方案其实你一听你就明白怎么实现的了,但我更好奇的是另一件事:怎么知道现在用户问的是时间相关的问题?或者是数学相关的问题?
4/n 直到最近我学习了一下LanChain的Agent才明白是怎么做到的。
其实这些秘密都在prompt里面。
我们知道ChatGPT是有能力理解用户的问题,并且有一定的逻辑能力基于用户的输入做出一些判断和数据提取
所以要实现这样的机器人,首先你要定义好一些插件,比如我有两个插件,定义好名称、描述、执行程序
5/n name: 报时
description:当用户咨询当前时间使用这个工具
run: () => 现在下午4:27分
name: 计算器
description: 当用户询问数学计算时使用这个工具,并且把用户问题转换成可执行的python数学函数代码
run: (query) => eval(query)
6/n 当用户问“29开根号等于多少?”,第一次请求OpenAI的prompt会是这样:
“
你要帮助用户回答问题,这里有以下工具可供你选择:
报时:当用户咨询当前时间使用这个工具
计算器:当用户询问数学计算时使用这个工具,并且把用户问题转换成标准数学公式
7/n 你需要根据用户的问题输出:
工具名称:从上面的工具中选择一个
输入:要传入工具的值
用户的问题是:29开根号等于多少?
你的选择:
”
ChatGPT会给出结果:“
工具名称:计算器
输入:math.sqrt(29)
”
8/n 拿到OpenAI返回的结果后,调用计算器的run函数,计算出来math.sqrt(29)的结果5.385。
再次请求OpenAI的API,这次的prompt看起来像这样:
“已知math.sqrt(29)是5.385,请回复用户的问题:“29开根号等于多少?””
ChatGPT会返回:“29开根号等于5.385”
9/n 这样基本上就实现了一个简单的可执行子任务的AI机器人。
简单总结一下:
10/n • 事先你需要定义一系列工具插件,每个工具包含明显的名称、描述和参数定义。
• 当用户问到一个复杂问题时,先让ChatGPT根据用户的问题,去选择你有的最合适的工具,并且从用户的输入中提取出你这个工具可以执行的参数。
11/n • 然后根据ChatGPT返回的工具名称和参数去调用工具的代码去执行,得到运算结果。
• 上面两个步骤会反复执行,直到用户的所有问题都解决了,因为用户的问题可能需要多个工具或多次执行才能得到所有结果,当然ChatGPT会帮助你做出判断。
12/n • 当拿到所有结果后,将结果和用户的问题再次给到ChatGPT,ChatGPT归纳整理后,将最终结果返回给用户。
当然实际情况要复杂很多。
n/n 参考文档:
《LangChain Agents》
http://t.cn/A6NLaQZw
《LangChain Agent 执行过程解析 OpenAI》
http://t.cn/A6NLaQZZ
《ChatGPT|LangChain Agent原理介绍》
http://t.cn/A6NLaQZA