Created
Sep 13, 2024 12:15 AM
Favorite
Favorite
Priority
备注
推荐
🌟🌟🌟
类型
模型测试
notion image
来源|TesterHome社区
作者(ID)|恒温
最近公司多了很多 AI 的业务,大多数都是原有业务 +AI,都要搞 AI Agent,做知识库啊,快速问答啊。搞 AI 成为比较时髦的事情。那对于测试同学来说,要测试 AI Agent,至少得知道 AI Agent 是什么,知道怎么构建一个 AI Agent。
作为刚入门 AI 测试的小学生,我在网上找了挺多资料的,本着能 copy from github 的原则,最后找到了一个比较靠谱的教学,我也在本地跑了起来,效果还算可以。如果代码能力比较好,AI 也有些基础的可以直接看 github 库:https://github.com/lihuazhang/ai-agents-with-llama3,顺便也致敬下 Ransaka/ai-agents-with-llama3
感谢通义灵码,帮我解读代码的时候,还能翻译英文,厉害了!

背景

让我们假设一个场景,你想购买一些东西。你前往一个电子商务网站,使用搜索功能来找到你需要的商品。也许你还有一堆其他商品也需要购买。所以这个过程不是很高效,对吧?现在想象一下这样的场景:你打开一个应用,用简单的英语描述你想要的东西,然后按下回车键。所有的搜索和价格比较都会自动为你完成。是不是很酷?—— 现在的购物软件其实也想做这个导购,其实真能解决很多问题,比如中午吃什么的灵魂问题,让 AI 为你做主。
这正是我们在本教程中将要构建的内容。
先来看一些例子。
notion image
这个例子就是问导购 AI Agent,我想给娃买把十字弩,给自己买个宝可梦,顺便搞个拼图游戏。Agent 回答的有模有样的,“我帮你娃找到了一把十字弩,给你找到了宝可梦,给你的家人找了个解谜游戏,下面是细节:十字弩是咋样的,宝可梦是咋样的,拼图是咋样的,吧啦吧啦”,直接省去了大家自己搜索的麻烦,分类啊、选型啊、价格啊等等。
notion image
这个例子就更加人性化了,我想每个买一样,请给我最划算的选项。Agent 直接给出了答案,这简直是自动比价网啊。
那么我们就一起看看怎么实现这个 Agent。在这里,我们将使用 Meta 的 Llama 3.1 模型,该模型具备调用函数的能力。根据他们的公告,3.1 版本的模型能够更有效地使用工具和函数。这些模型支持多语言,并且具有长达 128K 的上下文长度、最先进的工具使用能力以及整体更强的推理能力。
然而,在这篇文章中,我将使用 Groq Cloud,因此我会使用他们的 Groq/Llama-3-Groq-70B-Tool-Use 模型。根据这个应用的初始工作流程,它应该包括一个嵌入模型、一个检索器和两个主要工具,用于处理用户的购买兴趣和成本相关的问题。长话短说,先看看流程图:
notion image
现在我们需要使用一个 LLM(大语言模型)编排框架。为此,我选择我一直以来的最爱,Haystack。(老外的最爱,中文用户超级不友好,国内文章还很少)
好了,我们已经准备好了所需的一切。让我们开始真正的工作吧!

加载和索引数据

注意哦:代码库里有一个 csv 数据文件:amazon_product_sample.csv
由于我们有一个 RAG(Retrieval-Augmented Generation)管道,我们应该首先构建一个文档索引服务。(这里得解释下,因为大模型肯定不知道仓库里有哪些货物和东西,大模型的信息是滞后的,所以这里要挂一个 RAG,来提供更多和更及时的信息)。因为这是一个演示,我将使用 Haystack 提供的内存向量数据库。请注意,我们向量数据库中的每个文档包含以下内容:
  • content — 用于执行相似性搜索的内容
  • Id — 唯一标识符
  • Price — 产品价格
  • URL — 产品 URL
让我们看看如何实现这一点。
注意:老外用的是 jupyter notebook,所以是一个个 code block。
太好了,我们完成了 AI Agent 的第一步。现在是时候构建产品识别工具了。为了更好地理解产品识别的主要任务,让我们考虑以下示例。
用户查询:我想买一双露营靴、一些木炭和一个谷歌 Pixel 9 的后壳。让我们来了解一下我们理想的产品识别功能的工作流程。
notion image
首先,我们需要创建一个工具来分析用户的查询,并识别用户感兴趣的产品。我们可以使用以下代码片段来构建这样一个工具。这个其实是用 prompt 工程来分析用户查询,用了
few-shot
notion image

构建用户查询分析器

notion image
好的,现在我们已经完成了第一个函数的一半,现在是时候通过添加 RAG 管道来完成这个函数了。
notion image
测试下:

构建 RAG 管道

经过这一阶段,我们已经完成了 RAG 和查询分析器管道。现在是时候将它们转换成一个工具了。为此,我们可以使用如下面所示的常规函数声明。这里,为 Agent 创建一个工具与创建一个 Python 函数没有区别。如果你有疑问,
Agent 是如何调用这个函数的?
答案很简单:通过使用特定于模型的工具模式。我们将在后续步骤中实现这一点。目前,我们需要创建一个包装函数,该函数同时使用查询分析器和 RAG 管道。

把产品识别器集成到 RAG 管道中来

notion image
至此,我们完成了 Agent 的第一个工具。让我们看看它是否如预期那样工作。
测试一下:
成功了!!不过,值得注意的是返回的输出模式。你可以看到下面的一般模式:
这正是我们在 RAG 管道中指导模型生成的输出形式。作为下一步,让我们构建一个可选工具,名为 find_budget_friendly_option。
好的,现在我们来到了这个应用最关键的部分,即允许 Agent 在必要时使用这些函数。正如我们之前讨论的,这是通过一个特定于模型的工具模式实现的。所以我们需要找到适用于所选模型的工具模式。幸运的是,在 Groq/Llama-3-Groq-70B-Tool-Use 的模型卡片中提到了这一点。让我们将其适配到我们的用例中。

把聊天的模板定下来

现在只剩下几个步骤了。在做任何事情之前,让我们先测试一下我们的 Agent。
输出值:
到这里差不多好了。你可能在上面的响应中注意到的一点是,工具调用被封装在 XML 标签 中。因此,我们需要构建一种机制来提取 tool_call 对象。
完成这一步后,当 Agent 调用工具时,我们可以直接访问其响应。现在唯一剩下的就是获取工具调用对象并相应地执行函数。让我们也完成这部分内容。
现在是时候将各个组件组合在一起,构建一个完整的聊天应用了。为此,我将使用 gradio。(这里得安装 gradio pip install gradio
我们运行起来,就像下面一样:
notion image
发现中文也可以哈:
notion image

Done

至此,都可以跑起来了,看起来很简单,中间过程还比较坎坷,因为我想用自己部署的 ollma,但是 ollma generator 问题很多,也不支持 tool calling,然后也试了 qwen2,发现人家的生态里对国内 llm 支持的非常不友好,看来国货当自强。
点击文末“阅读原文”进入社区帖子,与作者交流~
notion image
notion image
Loading...
Alan_Hsu
Alan_Hsu
许心志我在 蓝湛阔天海 中定自主宰
统计
文章数:
176
Latest posts
python中 self cls的区别
2025-1-11
2025_周报 #01
2025-1-5
2024_年终总结: [代码与咖啡]打工人的漂流记
2025-1-4
2024_半年总结_工作篇
2025-1-4
🎄✨ 圣诞特辑 | 美食简餐 🎁🍷
2025-1-3
基于大模型搭建本地私有化知识库的搭建与研究
2025-1-2