译者 | 朱先忠
审校 | 重楼
简介
想象一下,你想买点东西。于是,你访问某个电子商务网站并使用搜索选项查找所需内容。也许你有很多东西要买,所以这个过程不是很有效。现在,请考虑一下这样一个场景:打开一个应用程序,用简单的英语描述一下你想要的东西,然后按下回车键。你不必担心搜索和价格比较,因为应用程序会自动为你处理了。很酷,对吧?这正是我们将在本文中要构建的目标程序。
下面,先让我们先看一些例子。
用户同时请求多个产品
用户咨询他/她能做出的最划算的购买
接下来,让我们为这个应用程序增强一些功能。我们将使用Meta公司开发的具有函数调用功能的Llama 3开源模型。不过,本文示例程序也可以使用此模型的3.1版本来实现。根据Meta公司的公告(https://ai.meta.com/blog/meta-llama-3-1/),3.1版本模型可以更有效地使用工具和函数。
【注意】这些模型是支持多语言的,具有128K的更长的上下文长度和最先进的工具使用能力和整体更强的推理能力。
我将在本文示例开发中使用Groq云平台,特别是他们在本文中的大数据模型。此应用程序的初始工作流程包括一个嵌入模型、一个检索器,还有两个主要工具,用于处理用户购买兴趣和与成本相关的问题。总之,我们需要类似于下图所述的组件内容。
示例应用程序架构图
现在,我们必须要在开发中选择使用一个LLM组件框架。为此,我选择了我一直最喜欢的生产级开源AI平台框架Haystack(https://haystack.deepset.ai/)。
准备好了我们需要的内容后,接下来就让我们开始投入关键的开发工作吧!
加载和索引数据
由于我们本示例程序中使用了一个RAG管道,我们首先构建一个文档索引服务,将使用Haystack提供的内存向量数据库。请注意,我们矢量数据库中的每个文档都包含如下字段:
- 内容(Content)——我们用来执行相似性搜索的内容
- Id——唯一标识符
- 价格(Price)——产品价格
- URL——产品URL
当调用我们的RAG管道时,Content字段用于向量搜索。所有其他字段都作为元数据包含在矢量数据库中。注意,保存这些元数据是至关重要的,因为它们在用户的前端演示中至关重要。
接下来,让我们看看如何实现这一点。
太好了,我们已经完成了AI代理应用程序的第一步。现在,是时候构建产品标识符函数工具了。为了更好地理解产品标识符的主要任务,让我们考虑下面的示例。
用户查询内容如下:
英语原文: I want to buy a camping boot, a charcoal and google pixel 9 back cover.
中文意思:我想买一双露营靴、一块木炭和谷歌pixel 9手机外壳。
现在,先让我们了解一下产品标识符函数的理想化工作流程。
产品标识函数工作流程
首先,我们需要创建一个工具来分析用户查询并识别用户感兴趣的产品。我们可以使用下面的代码片段构建这样一个工具。
构建用户查询分析器
好了,现在我们已经完成了第一个函数的一半,现在是时候通过添加RAG管道来完成该函数了。
产品标识功能工作流程
创建RAG管道
执行上面的代码之后,我们就完成了RAG和查询分析管道的构建。现在是时候把它转换成一个工具了。为此,我们可以使用常规函数声明,如下所示。为AI代理创建工具就像创建Python函数一样。如果你有类似于下面这样的问题:
代理如何调用这个函数?
解决方案很简单:利用特定于模型的工具模式。当然,我们将在稍后的步骤中加入该模式。现在,是时候创建一个同时使用查询分析器和RAG管道的包装器函数了。
还是先让我们来明确一下这个函数的目标。
目标1:识别用户感兴趣的所有产品,并将其作为列表返回。
目标2:对于每个已识别的产品,从数据库中检索最多五个产品及其元数据。
实现产品标识符函数
产品标识函数工作流程
至此,我们完成了代理的第一个工具的构建。现在,先让我们来看看它是否按预期工作。
成功了!然而,值得注意的是这里返回的输出模式。下面给出输出的总体模式架构。
这正是我们建议RAG管道中生成的模式。下一步,让我们构建一个名为find_budget_friend_option的可选工具函数。
让我们关注这个应用程序最关键的方面,也就是,让AI代理能够根据需要使用这些功能。正如我们之前所讨论的,这可以通过特定于模型的工具模式来实现。因此,我们需要定位特定于所选模型的工具模式。幸运的是,Groq模型库(https://huggingface.co/Groq/Llama-3-Groq-70B-Tool-Use)中提到了这一点。我们仅需要把它调整一下,以适应我们的使用场景即可。
最终确定聊天模板
现在,只剩下几步了。在做任何事情之前,还是先让我们来测试一下我们的代理。
至此,我们已经完成了大约90%的工作。
工作接近尾声。
在上述响应结果中,你可能已经注意到XML标签<tool_call>包含了工具调用。因此,我们需要开发一种机制来提取tool_call对象。
完成此步骤后,当代理调用工具时,我们可以直接访问代理的响应。现在唯一悬而未决的是获取工具调用对象并相应地执行函数。让我们也把这一部分完成。
现在,是时候将前面的每个组件连接在一起,从而构建一个完整的聊天应用程序了。为此,我选择使用强大的开源的深度学习模型可视化工具Gradio。
就是这么简单!至此,我们已经成功构建了一个基于Llama 3模型的人工智能代理程序,它本身具有函数调用功能。你可以从GitHub仓库(https://github.com/Ransaka/ai-agents-with-llama3)访问其完整的源代码。
此外,你可以通过Kaggle链接(https://www.kaggle.com/datasets/promptcloud/amazon-product-dataset-2020)访问本文中使用的数据集。
结论
归纳来看,在构建基于人工智能代理的系统程序时,重要的是要考虑完成任务所需的时间以及每个任务所使用的API调用(令牌)的数量。这方面开发面临的一个主要挑战是减少系统中的幻觉,这也是当前一个十分活跃的研究领域。因此,构建LLM和代理系统没有固定的规则。开发团队有必要耐心和战略性地规划工作,以确保人工智能代理LLM正常运行。
最后,除非另有说明,本文中所有图片均由作者本人提供。
参考资料
- 《Llama 3.1简介:我们的迄今为止最强大的模型》,我们的最新模型为所有人带来了开放式智能,扩展了上下文长度,增加了对八种语言的支持,等等。链接地址:https://ai.meta.com/blog/meta-llama-3-1/?source=post_page-----7e74f79d1ccc--------------------------------
- 《Groq/Llama-3-Groq-70B-Tool-Use · Hugging Face》,我们正在通过开源和开放科学推进人工智能并使其民主化。链接地址:https://huggingface.co/Groq/Llama-3-Groq-70B-Tool-Use?source=post_page-----7e74f79d1ccc--------------------------------
- https://docs.together.ai/docs/llama-3-function-calling
译者介绍
朱先忠,51CTO社区编辑,51CTO专家博客、讲师,潍坊一所高校计算机教师,自由编程界老兵一枚。
原文标题:Using Llama 3 for Building AI Agents,作者:Ransaka Ravihara