本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 [署名 4.0 国际 (CC BY 4.0)](https://creativecommons.org/licenses/by/4.0/deed.zh) 本文作者: 苏洋 创建时间: 2024年05月22日 统计字数: 9608字 阅读时间: 20分钟阅读 本文链接: https://soulteary.com/2024/05/22/use-bytedance-doubao-llm-to-implement-the-simplest-ai-agent-app-on-dify-ai-information-retrieval.html ----- # 使用字节豆包大模型在 Dify 上实现最简单的 Agent 应用(四):AI 信息检索 这篇文章,我们继续聊聊,如何折腾 AI 应用,把不 AI 的东西,“AI 起来”。在不折腾复杂的系统和环境的前提下,快速完成轻量的 Agent 应用。 ## 写在前面 在上一篇文章《[使用 Dify、Meilisearch、零一万物模型实现最简单的 RAG 应用(三):AI 电影推荐](https://soulteary.com/2024/05/20/use-dify-with-meilisearch-and-01-ai-model-services-to-create-the-simplest-rag-application-ai-movie-recommendation.html)》中,我们分享过了在不折腾复杂的搜索引擎的前提下,如何快速完成轻量的 RAG 应用。 这篇文章里,我们来聊聊如何使用字节最新的豆包大模型,在 Dify 上来快速完成一个具备理解需求、自主规划、自主选择工具使用的简单智能体(Agent)。 目前 Dify 的 Agent 功能还在积极开发中,创建一个支持复杂 “CRUD” 的应用,或许需要等待社区的[这个 issue 完结](https://github.com/langgenius/dify/issues/3796)。 **但是,如果我们的使用场景是读去大量数据,然后进行整合,那么这个事情就很简单啦。** 我们可以快速的将上一篇文章中的“数据接口”制作成 Dify 的工具服务,然后让大模型根据用户实际的需求来选择使用。 本篇文章相关的代码开放在 [soulteary/dify-with-ai-agent](https://github.com/soulteary/dify-with-ai-agent),有需要自取,欢迎“一键三连”。 ### 豆包大模型 最近字节的新版豆包大模型的消息在几个群里有朋友讨论,从最初的技术讨论,很快演变成了价格的争议。**我个人觉得技术初期,还是多看看模型到底怎么样,以及如何能够用好模型,可能更为重要。** 上周有朋友问我,能否试试豆包在业务场景中的表现,当发现试用仅限企业后,我试着找了一位在火山引擎的同学,得到了下面的回答。 ![看来一时半会,个人开发者是用不上了](https://attachment.soulteary.com/2024/05/22/before.jpg) 于是,只好暂停了这个测试。 正巧这周的时候,朋友说他们的认证通过了,或许可以在 Dify 中配置下试试看效果,于是就有了这篇文章。 ![看起来可以试一试啦](https://attachment.soulteary.com/2024/05/22/verify.jpg) 下面,开始实践。 ## 准备工作 本文的准备过程除了模型之外,和上一篇文章没有差别,如果你已经实践过了上一篇文章中的内容,那么只需要了解如何开通豆包模型服务即可。 完整准备过程分为:准备 Docker 环境、启动 Dify 程序、启动 Meilisearch 搜索引擎并准备搜索引擎要检索的数据,以及准备模型服务。 **如果你不想使用豆包,你可以将豆包替换为任意其他的模型,除了执行结果可能因为模型能力和风格偏好有差异外,没有任何其他区别。** 本文的复现依旧很简单,如果你有 Docker 环境,将极大的减少不必要的折腾过程。 ### Docker 运行环境 想顺滑的完成实践,推荐你安装 Docker,不论你的设备是否有显卡,都可以根据自己的操作系统喜好,参考这两篇来完成基础环境的配置《[基于 Docker 的深度学习环境:Windows 篇](https://soulteary.com/2023/07/29/docker-based-deep-learning-environment-under-windows.html)》、《[基于 Docker 的深度学习环境:入门篇](https://soulteary.com/2023/03/22/docker-based-deep-learning-environment-getting-started.html)》。当然,使用 Docker 之后,你还可以做很多事情,比如:之前[几十篇有关 Docker 的实践](https://soulteary.com/tags/docker.html),在此就不赘述啦。 ### 使用 Docker 快速启动 Dify 项目 你可以参考下面的内容来完成 Dify 项目的一键启动: - 《使用 Dify 和 AWS Bedrock 玩转 Anthropic Claude 3》中的“[快速完成 Dify 的配置和启动](https://soulteary.com/2024/03/18/play-with-anthropopic-claude-3-using-dify-and-aws-bedrock.html#%E5%BF%AB%E9%80%9F%E5%AE%8C%E6%88%90-dify-%E7%9A%84%E9%85%8D%E7%BD%AE%E5%92%8C%E5%90%AF%E5%8A%A8)”。 - 《使用 Dify 和 Moonshot API 构建你的 AI 工作流(一):让不 AI 的应用 AI 化》中的 “[优化后的 Dify Docker 配置](https://soulteary.com/2024/04/24/use-dify-and-moonshot-api-to-build-your-ai-workflow-make-non-ai-applications-goto-ai.html#%E4%BC%98%E5%8C%96-dify-%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE)”。 唯一需要注意的是,文章内容提到的 dify docker 配置中版本号,可以更新为 `0.6.8` 啦: - `langgenius/dify-web:0.6.8` - `langgenius/dify-api:0.6.8` ### 使用 Docker 一键启动 Meilisearch 搜索引擎 Meilisearch 相关的内容,包括开箱即用的配置、一键拉起的 Docker 搜索引擎服务,步骤简单,但是篇幅较多,就不展开啦,我们完整参考上一篇文章即可。 ### 激活启用豆包大模型 当上面的内容都准备就绪后,我们来初始化豆包大模型。当前豆包大模型的入口和模型参数比较隐蔽,所以,我会在接下来的文章中,做必要的内容展开。 先来看看如何激活启用豆包大模型的模型 API 服务,完整过程类似 AWS Bedrock、Azure OAI 平台过程,如果你折腾过 Anthropic、OpenAI 的云服务部署,那么应该不会有太多疑问。 如果你之前使用过火山方舟,直接访问字节的 [ML MaaS 服务的云控制台](https://console.volcengine.com/ml-maas/),大概会看到“奇怪的”模型列表: ![字节火山方舟老版本控制台](https://attachment.soulteary.com/2024/05/22/old-model-list.jpg) 这是因为最近宣传的豆包模型,其实是上线在新的字节 [火山方舟 2.0 ARK 服务的云控制台](https://console.volcengine.com/ark/),访问新版本的控制台地址,我们就能够看到和 C 端设计语言一致的新界面,和我们想使用的新的版本的模型啦: ![字节火山方舟新版本控制台](https://attachment.soulteary.com/2024/05/22/new-model-list.jpg) 点击页面最左侧的侧边栏的 “开通管理”,我们将看到能够开通使用的模型列表,分别是六个豆包新版 LLM 模型,一个用户向量检索的 Embedding 模型,以及三个月之暗面的模型。 ![首批支持开通的模型列表](https://attachment.soulteary.com/2024/05/22/allow-enable-model-list.jpg) 根据我们自己的需求,点击右侧的“开通按钮”,将来到确认页面。 ![确认要开通使用的模型服务](https://attachment.soulteary.com/2024/05/22/enable-models.jpg) 在页面中确认你要开通和使用的模型服务即可,开通完毕,我们就能够使用上文中的方法,发挥模型的能力啦。 ## 步骤一:在 Dify 中配置豆包大模型 目前豆包 MaaS 平台还不是很完善,建议跟着下面的操作走一遍,“避免迷路”。 想要使用豆包模型作为 Agent 的驱动模型,我们首先要创建豆包模型的服务实例,并在 Dify 中完成部署。 打开火山引擎的[密钥管理](https://console.volcengine.com/iam/keymanage/)页面,创建一个用于调用账号云资源的“密钥对”,我们稍后使用。 ![创建一套密钥对](https://attachment.soulteary.com/2024/05/22/key-manage.jpg) 接着,打开火山引擎[方舟 2.0 的模型推理页面](https://console.volcengine.com/ark/region:ark+cn-beijing/endpoint),点击“创建推理接入点”按钮,进入模型实例创建流程: ![创建模型实例](https://attachment.soulteary.com/2024/05/22/create-instance.jpg) 上面的接入点名称可以随意添加,主要是展示使用。接入点限速这个话题,火山引擎的产品经理,显然经听过“使用 2G/3G/4G/5G 一晚上,睡醒可能出现高额账单的段子”,所以给了用户一个“慢点使用”模型的方法。点击模型选择,我们能够打开具体的模型选择列表: ![选择要创建的模型实例](https://attachment.soulteary.com/2024/05/22/create-model-list.jpg) 当选择好要创建的模型后,点击创建“接入点”,我们就能够看到创建好的模型实例了。找到你创建的实例接入点名称下方的 “`ep-2024xxxxxxxx`”,记录下来,稍后也要用。 ![创建好的模型列表(你可以创建多个)](https://attachment.soulteary.com/2024/05/22/model-instances.jpg) 最后,来收集最后一个要素,模型上下文参数,打开[方舟 2.0 的模型体验界面](https://console.volcengine.com/ark/region:ark+cn-beijing/experience)(模型 Playground),勾选你创建的模型实例,然后打开参数设置按钮,得到模型的具体参数(图为 128K): ![最下面的就是真实的模型参数值](https://attachment.soulteary.com/2024/05/22/get-model-params.jpg) 现在,我们可以打开 Dify 的界面,开始配置 Dify 中的模型后端啦。点击 Dify 界面右上角的用户头像,在下拉菜单中选择“设置”,在弹出的“设置”窗口左侧侧边栏“模型供应商”中选择“火山引擎”,点击“添加模型”按钮。 ![找到 Dify 的火山引擎模型后端](https://attachment.soulteary.com/2024/05/22/dify-models.jpg) 在弹出的模型设置对话框中,分别填入我们上文中折腾好的“密钥对”、“模型的接入点 ID”(其他选择默认值即可): ![找到 Dify 的火山引擎模型后端](https://attachment.soulteary.com/2024/05/22/set-model-backend-1.jpg) 接着,选择“模型类型”为自定义,设置上下文长度为我们之前在参数页面找到的具体数值(你也可以根据自己的需求设置小一些,即使你使用的是超大杯的长 Token 模型)。 ![找到 Dify 的火山引擎模型后端](https://attachment.soulteary.com/2024/05/22/set-model-backend-2.jpg) 点击保存,模型列表中就会出现可用的“豆包模型引擎”啦。 ![火山引擎模型后端就绪](https://attachment.soulteary.com/2024/05/22/dify-add-new-model.jpg) ## 步骤二:创建 Dify AI Agent 应用 在首页点击创建空白应用,然后在弹出窗口中选择“Agent”类型的应用,根据你的喜好填写应用名称和描述: ![创建 AI Agent](https://attachment.soulteary.com/2024/05/22/create-dify-agent.jpg) 在右侧模型列表中选择我们要使用的模型,比如刚刚新添加的豆包大模型: ![选择我们要使用的模型](https://attachment.soulteary.com/2024/05/22/dify-model-list.jpg) 然后,根据自己的需求,对模型超参数进行调整: ![更新模型参数](https://attachment.soulteary.com/2024/05/22/set-dify-model-params.jpg) 好了,基础的 Agent 应用就设置好了,我们来完善 Agent 能力,实现 Agent 可以调用的工具。 ## 步骤三:实现 Agent 工具 API 在上一篇文章中,我们一步一步的完成了如何和既有的系统接口打通的,能够从本地部署的搜索引擎中直接获取数据。这一部分的代码,我们就不再展开啦,只聊和这篇相关的内容。 目前,因为 Dify 的 Agent 功能还在迭代中,所以我们可以使用更简单的方法来定义一个 Dify 可用的接口,大概三十行左右(完整代码在 [soulteary/dify-with-ai-agent/dify/main.go](https://github.com/soulteary/dify-with-ai-agent/blob/main/dify/main.go),有需要自取): ```go func main() { router := gin.Default() router.GET("/new-api-for-dify", func(c *gin.Context) { s := strings.TrimSpace(c.Query("keyword")) if s == "" { c.JSON(http.StatusBadRequest, ExtensionPointResponse{Result: "empty keyword"}) return } movies, err := GetSearchResult(s, 3, "movies", 0, "soulteary") if err != nil { c.JSON(http.StatusBadRequest, ExtensionPointResponse{Result: err.Error()}) return } var result string for _, movie := range movies.Results { for _, hit := range movie.Hits { result += fmt.Sprintf("- 标题:%s\n", hit.Title) result += fmt.Sprintf("- 简介:%s\n\n", hit.Overview) } } c.JSON(http.StatusOK, ExtensionPointResponse{Result: result}) }) router.Run(":8084") } ``` 上面的代码中,我们定义了一个跑在 `8084` 端口的服务,其中主要提供功能支持的接口地址是 `/new-api-for-dify`,它接收来自 Dify Agent 发送的 GET 请求中的 `keyword` 参数,并将参数传递给上篇文章中“[步骤五:完成 AI 接口,让程序 AI 起来](https://soulteary.com/2024/05/20/use-dify-with-meilisearch-and-01-ai-model-services-to-create-the-simplest-rag-application-ai-movie-recommendation.html#%E6%AD%A5%E9%AA%A4%E4%BA%94%E5%AE%8C%E6%88%90-ai-%E6%8E%A5%E5%8F%A3%E8%AE%A9%E7%A8%8B%E5%BA%8F-ai-%E8%B5%B7%E6%9D%A5)”章节中,我们已经实现好的“电影数据检索”函数。 当我们完成上面的程序后,执行 `go run main.go`,就能得到一个运行在 `8084` 的新接口服务啦,接下来会使用。 你可以根据你的实际需求,来封装更多类似的信息检索,或者“动作 API”服务,让 Agent 来调用。 当我们完成了上面的操作后,就可以来完善上文中创建的 Dify 的 AI Agent 应用啦。从 Dify 顶部菜单选择“工具”,在工具页面点击左侧的“创建自定义工具”。 ![创建一个新的工具](https://attachment.soulteary.com/2024/05/22/create-new-ai-tool.jpg) 结合我们上面创建的接口信息,在弹出窗口填写适当的配置,就能够完成工具创建啦。参考上面的我们实现的接口,可以轻松实现一个 JSON 配置: ```json { "openapi": "3.1.0", "info": { "title": "电影搜索", "description": "从本地电影数据库中获取电影信息", "version": "v1.0.0" }, "servers": [ { "url": "http://10.11.12.90:8084" } ], "paths": { "/new-api-for-dify": { "get": { "description": "根据关键词获取电影信息", "operationId": "GetMoviesByKeyword", "parameters": [ { "name": "keyword", "in": "query", "description": "想要搜索的关键词", "required": true, "schema": { "type": "string" } } ], "deprecated": false } } }, "components": { "schemas": {} } } ``` 当我们把配置复制粘贴到弹出窗口中,界面中“可用工具”会出现可以调用的接口,我们可以点击“测试”按钮,来验证接口的可用性。 ![填写工具具体参数](https://attachment.soulteary.com/2024/05/22/update-ai-tool-config.jpg) 举个例子,我们在弹出窗口中输入“Titanic”(泰坦尼克),能够清楚看到工具是否能够正常工作: ![填写工具具体参数](https://attachment.soulteary.com/2024/05/22/api-test.jpg) ## 步骤四:完善 Dify AI Agent 应用 我们再次打开第二步中完成的 AI Agent 应用,开始完善它的具体实现,先设置一个合适的 Prompt。 ![更新 Agent Prompt](https://attachment.soulteary.com/2024/05/22/update-chat-tool.jpg) 接着,在界面左侧点击“添加工具”,将我们刚刚创建好的“电影搜索”工具添加到界面中。 ![添加新工具到 Agent](https://attachment.soulteary.com/2024/05/22/add-tool-to-chat.jpg) 因为 Agent 可以调用多个工具,考虑到演示的实用性,我这里添加了两个应用,我们创建的“电影搜索助手”和“飞书发送群消息”。 ![添加两个新的工具](https://attachment.soulteary.com/2024/05/22/update-tools-config.jpg) 设置和获取飞书通知工具需要的 WebHook Token,可以参考之前文章《轻量的 WebHook 工具:歪脖虎克》中提到过的“[设置飞书的 WebHook 功能](https://soulteary.com/2024/04/06/lightweight-webhook-tool.html#%E8%AE%BE%E7%BD%AE%E9%A3%9E%E4%B9%A6%E7%9A%84-webhook-%E5%8A%9F%E8%83%BD)”的步骤,介绍比较详细就不赘述啦。 ## 验证效果 和上一篇文章一样,我们可以根据自己的需求,搜索具体的电影名称,或者电影类型、概况中的关键字,电影的关键词等等,我这里搜索了“狮子王”,然后要求 Agent 将原本搜索出来的英文接口结果翻译为中文,发送给我设置好的飞书群里。 当然,我是懒人,所以上面的内容,我只是写了一句话:**“搜索 Lion King,将电影为什么值得看翻译为中文,结果发飞书。”** ![随手搜索一部电影,或者关键词](https://attachment.soulteary.com/2024/05/22/search-with-agent.jpg) 在上面的界面中,我们看到了模型在一步步的拆解和分析要做什么事情,当它做完所有的事情后,我们的飞书就能够收到提炼后的结果消息啦。 ![飞书中收到的消息](https://attachment.soulteary.com/2024/05/22/feishu-message-1.jpg) 当我们将鼠标移动到对话消息上面,我们能够打开具体的消息日志。在界面的左侧,我们能够看到所有的调用详情,方便我们查看模型某一步为什么没有符合预期。我们换一个能够搜索到多部内容的关键词,再次进行验证: ![查看 Agent 的每一步执行日志](https://attachment.soulteary.com/2024/05/22/agent-trace-logs.jpg) 在 Agent 执行完毕后,我们可以收到一条新的消息: ![一条新的飞书消息](https://attachment.soulteary.com/2024/05/22/feishu-message-2.jpg) 当然,如果模型总是不能符合预期,最好的方法是切换支持 Function Call 的模型,我们目前使用的豆包大模型,在 Agent 中的调用方式是 ReACT([ReAct: Synergizing Reasoning and Acting in Language Models](https://research.google/blog/react-synergizing-reasoning-and-acting-in-language-models/)),以及调整 Prompt 为模型更好理解的语言和组织方式。这些内容,我们在后续相关的文章中再展开吧。 ![当然模型使用的 Agent 模式](https://attachment.soulteary.com/2024/05/22/agent-mode.jpg) ## 其他 关于火山引擎和豆包模型还有许多可以聊的有趣内容,比如低成本的 SFT,以及通过它来做 ETL 等等,再多攒攒素材,写几篇有趣的实践。 ## 最后 这篇文章就先写到这里,下一篇相关的文章里,我们来聊聊其他的细节玩法。 —EOF