likes
comments
collection
share

实现你自己的AgentGPT —— Langchain Agent

作者站长头像
站长
· 阅读数 4

Auto-GPT是什么?

在五一长假前的那段时间,GPT相关技术里最火的就是Auto-GPT和AgentGPT了,它们可以让GPT得到你的指令后,循环执行,不停地运算直到得到合适的答案,并且它拥有访问网络的能力。

相比于我们自己直接使用GPT,Auto-GPT/AgentGPT的特色在于它可以做更多的事情,比如官方视频中演示的google搜索,甚至订机票酒店等。

实现你自己的AgentGPT —— Langchain Agent

建议读者先自行了解一下Auto-GPT/AgentGPT的效果,本文着重的是技术上的分析。

Auto-GPT是怎么做到的?

Auto-GPT技术上的创新点有两个值得一说,这两点同样也是AgentGPT的创新点,此处以AutoGPT为例。

创新点1 —— 命令

AutoGPT“命令”其实只是一种由人类编写的程序函数,但它是提供给GPT调用的。比如谷歌搜索命令、文件操作命令、python执行命令等。

每个命令需要包含以下内容:功能描述、输入格式、输出格式。有了这些内容,GPT就知道它可以如何调用这些人类编写的函数,从而“获得”了网络访问能力和计算能力。

创新点2 —— 让GPT思考步骤

你向Auto-GPT发出指令后,它会让GPT不要马上给出答案,而是去分解任务,思考达成你的指令需要进行哪些步骤。

这样可以让GPT给出一个正确的思路,然后再根据这个思路给出答案,准确率会提高非常多。

所以在吴恩达发布的GPT prompt教程里其实就有提到这个技巧:给GPT思考的时间

它思考的“思路”并不是无依无据的,它是靠你提供给它的“命令”来思考的。在你提供了给AutoGPT足够的“命令”之后,它能较为准确地思考出得出答案的步骤,然后调用你提供给它的“命令”,更得心应手地完成任务,比如前面说到的google搜索案例。

Auto-GPT有什么问题?

虽然Auto-GPT看起来很厉害,但在实际使用中,人们发现它存在一些问题。比如,它可能会卡住,或者在一个已经有解任务中不停循环求解,或者花费超出预期的token使用量。这些问题的根源在于Auto-GPT的命令列表并不包含完成某些任务所需要的能力,或者出现幻觉,误以为某个命令可用,于是在不停调用中进入死循环。

在实际工作中,如果AI工具有这些特点,基本上意味着这个工具是不可用的。它会出现这样的问题主要是因为它所拥有的“命令”不够,无法用于完成你交给他的任务。

所以实际应用中,我们必须根据具体场景给GPT添加更多的“命令”,甚至自己打造一个新的类AutoGPT工具以切合我们真实的使用场景。

Auto-GPT的原理及其替代品

Auto-GPT的底层原理并不复杂,它是依靠prompt实现的。prompt engineering本身就是必须开源且非常容易被模仿的技术。因此,如果我们想自己定制类似AutoGPT的效果,其实是比较容易的。

而且,Auto-GPT的这个做法也并不是他首创,类似的做法在AgentGPT里有,在chatgpt-retrive-plugin里也能看得到类似的影子(gpt-plugin的plugin说明就是这套机制)。

所以重新打造Auto-GPT并不是一件有负担的事。笔者之前介绍向量索引的文章里提到的LangChain,也提供了类似Auto-GPT思路的能力 —— Tools和Agent。基于LangChain的封装打造类似Auto-GPT的能力,更为容易和清晰。

实现类似效果

如果想要实现类似Auto-GPT的效果,可以使用LangChain-Tools和LangChain-Agent。

LangChain-Tool

Langchain里名为Tool的概念,和AutoGPT的“命令”是一模一样的作用。我们可以在它的文档上找到示例,比如Calculator计算器工具

实现你自己的AgentGPT —— Langchain Agent

从代码里可以看出,一个Tool由名字,描述,和一个人工编写的函数组成(在Calculator的例子里,它借用expr-eval这个第三方包编写了计算函数)非常简单。

LangChain-Agent

有了Tool之后,接下来就需要让GPT能使用这些Tool了。这个就是LangChain的Agent的作用。Agent本身并不需要我们太关注实现细节,我们只需要按照文档使用即可。

实现你自己的AgentGPT —— Langchain Agent

tools数组中加上自己编写的Tool,就可以了。需要注意的是,如果你用的是davinci系列模型则使用无chat-的版本。

使用示例

拆分用户的提问

如果你想要用向量数据库实现GPT机器人,你可能会遇到这样的问题:如果用户在一句话里提出了几个问题,比如:

上一届世界杯是在哪年进行的?中国足球夺冠了吗?

如果你直接用向量搜索这个问题,数据库会优先匹配既包含世界杯举办年,又包含中国足球夺冠信息的内容。这时候很容易就会得到匹配度较低的参考资料,GPT也无法回答出正确的答案。

但实际上,我们的预期其实是将它作为两个独立的问题进行。先匹配世界杯举办年,回答第一个问题,再匹配国足夺冠,回答第二个问题。这种需求,我将其称之为问题拆分,就很适合通过自己编写的Agent完成。

我们需要编写三个Tool,第一个,用于问题的拆分。

实现你自己的AgentGPT —— Langchain Agent

第二个Tool,则是负责向量搜索(向量搜索的代码简化了) 实现你自己的AgentGPT —— Langchain Agent

再按照类似方式写一个Tool,负责得出最后的答案就可以了

将这几个Tool结合起来,创建一个Agent,就得到了一个有问题拆分能力的聊天机器人。

实现GPT分工的可能性

这个例子中,可以看到一点:我们可以将一个GPT包装成Tool,给另一个GPT使用。 也就是说,我们完全可以通过Tool和Agent,实现多个GPT的分工合作,减少它们的context token数的压力。从而让我们的整个系统能处理的总token增多。同时也有可能让一些功能性的大模型快速加入到生产中。(比如对中文更友好的大模型,token数限制更宽的模型等)

总之,通过Tool/Agent的模式,我们能看到基于大模型技术实现更大的系统的可能性。