使用字节豆包大模型在 Dify 上实现最简单的 Agent 应用(四):AI 信息检索

这篇文章,我们继续聊聊,如何折腾 AI 应用,把不 AI 的东西,“AI 起来”。在不折腾复杂的系统和环境的前提下,快速完成轻量的 Agent 应用。

写在前面

在上一篇文章《使用 Dify、Meilisearch、零一万物模型实现最简单的 RAG 应用(三):AI 电影推荐》中,我们分享过了在不折腾复杂的搜索引擎的前提下,如何快速完成轻量的 RAG 应用。

这篇文章里,我们来聊聊如何使用字节最新的豆包大模型,在 Dify 上来快速完成一个具备理解需求、自主规划、自主选择工具使用的简单智能体(Agent)。

目前 Dify 的 Agent 功能还在积极开发中,创建一个支持复杂 “CRUD” 的应用,或许需要等待社区的这个 issue 完结。

但是,如果我们的使用场景是读去大量数据,然后进行整合,那么这个事情就很简单啦。 我们可以快速的将上一篇文章中的“数据接口”制作成 Dify 的工具服务,然后让大模型根据用户实际的需求来选择使用。

本篇文章相关的代码开放在 soulteary/dify-with-ai-agent,有需要自取,欢迎“一键三连”。

豆包大模型

最近字节的新版豆包大模型的消息在几个群里有朋友讨论,从最初的技术讨论,很快演变成了价格的争议。我个人觉得技术初期,还是多看看模型到底怎么样,以及如何能够用好模型,可能更为重要。

上周有朋友问我,能否试试豆包在业务场景中的表现,当发现试用仅限企业后,我试着找了一位在火山引擎的同学,得到了下面的回答。

看来一时半会,个人开发者是用不上了

于是,只好暂停了这个测试。

正巧这周的时候,朋友说他们的认证通过了,或许可以在 Dify 中配置下试试看效果,于是就有了这篇文章。

看起来可以试一试啦

下面,开始实践。

准备工作

本文的准备过程除了模型之外,和上一篇文章没有差别,如果你已经实践过了上一篇文章中的内容,那么只需要了解如何开通豆包模型服务即可。

完整准备过程分为:准备 Docker 环境、启动 Dify 程序、启动 Meilisearch 搜索引擎并准备搜索引擎要检索的数据,以及准备模型服务。

如果你不想使用豆包,你可以将豆包替换为任意其他的模型,除了执行结果可能因为模型能力和风格偏好有差异外,没有任何其他区别。

本文的复现依旧很简单,如果你有 Docker 环境,将极大的减少不必要的折腾过程。

Docker 运行环境

想顺滑的完成实践,推荐你安装 Docker,不论你的设备是否有显卡,都可以根据自己的操作系统喜好,参考这两篇来完成基础环境的配置《基于 Docker 的深度学习环境:Windows 篇》、《基于 Docker 的深度学习环境:入门篇》。当然,使用 Docker 之后,你还可以做很多事情,比如:之前几十篇有关 Docker 的实践,在此就不赘述啦。

使用 Docker 快速启动 Dify 项目

你可以参考下面的内容来完成 Dify 项目的一键启动:

  • 《使用 Dify 和 AWS Bedrock 玩转 Anthropic Claude 3》中的“快速完成 Dify 的配置和启动”。
  • 《使用 Dify 和 Moonshot API 构建你的 AI 工作流(一):让不 AI 的应用 AI 化》中的 “优化后的 Dify Docker 配置”。

唯一需要注意的是,文章内容提到的 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 服务的云控制台,大概会看到“奇怪的”模型列表:

字节火山方舟老版本控制台

这是因为最近宣传的豆包模型,其实是上线在新的字节 火山方舟 2.0 ARK 服务的云控制台,访问新版本的控制台地址,我们就能够看到和 C 端设计语言一致的新界面,和我们想使用的新的版本的模型啦:

字节火山方舟新版本控制台

点击页面最左侧的侧边栏的 “开通管理”,我们将看到能够开通使用的模型列表,分别是六个豆包新版 LLM 模型,一个用户向量检索的 Embedding 模型,以及三个月之暗面的模型。

首批支持开通的模型列表

根据我们自己的需求,点击右侧的“开通按钮”,将来到确认页面。

确认要开通使用的模型服务

在页面中确认你要开通和使用的模型服务即可,开通完毕,我们就能够使用上文中的方法,发挥模型的能力啦。

步骤一:在 Dify 中配置豆包大模型

目前豆包 MaaS 平台还不是很完善,建议跟着下面的操作走一遍,“避免迷路”。

想要使用豆包模型作为 Agent 的驱动模型,我们首先要创建豆包模型的服务实例,并在 Dify 中完成部署。

打开火山引擎的密钥管理页面,创建一个用于调用账号云资源的“密钥对”,我们稍后使用。

创建一套密钥对

接着,打开火山引擎方舟 2.0 的模型推理页面,点击“创建推理接入点”按钮,进入模型实例创建流程:

创建模型实例

上面的接入点名称可以随意添加,主要是展示使用。接入点限速这个话题,火山引擎的产品经理,显然经听过“使用 2G/3G/4G/5G 一晚上,睡醒可能出现高额账单的段子”,所以给了用户一个“慢点使用”模型的方法。点击模型选择,我们能够打开具体的模型选择列表:

选择要创建的模型实例

当选择好要创建的模型后,点击创建“接入点”,我们就能够看到创建好的模型实例了。找到你创建的实例接入点名称下方的 “ep-2024xxxxxxxx”,记录下来,稍后也要用。

创建好的模型列表(你可以创建多个)

最后,来收集最后一个要素,模型上下文参数,打开方舟 2.0 的模型体验界面(模型 Playground),勾选你创建的模型实例,然后打开参数设置按钮,得到模型的具体参数(图为 128K):

最下面的就是真实的模型参数值

现在,我们可以打开 Dify 的界面,开始配置 Dify 中的模型后端啦。点击 Dify 界面右上角的用户头像,在下拉菜单中选择“设置”,在弹出的“设置”窗口左侧侧边栏“模型供应商”中选择“火山引擎”,点击“添加模型”按钮。

找到 Dify 的火山引擎模型后端

在弹出的模型设置对话框中,分别填入我们上文中折腾好的“密钥对”、“模型的接入点 ID”(其他选择默认值即可):

找到 Dify 的火山引擎模型后端

接着,选择“模型类型”为自定义,设置上下文长度为我们之前在参数页面找到的具体数值(你也可以根据自己的需求设置小一些,即使你使用的是超大杯的长 Token 模型)。

找到 Dify 的火山引擎模型后端

点击保存,模型列表中就会出现可用的“豆包模型引擎”啦。

火山引擎模型后端就绪

步骤二:创建 Dify AI Agent 应用

在首页点击创建空白应用,然后在弹出窗口中选择“Agent”类型的应用,根据你的喜好填写应用名称和描述:

创建 AI Agent

在右侧模型列表中选择我们要使用的模型,比如刚刚新添加的豆包大模型:

选择我们要使用的模型

然后,根据自己的需求,对模型超参数进行调整:

更新模型参数

好了,基础的 Agent 应用就设置好了,我们来完善 Agent 能力,实现 Agent 可以调用的工具。

步骤三:实现 Agent 工具 API

在上一篇文章中,我们一步一步的完成了如何和既有的系统接口打通的,能够从本地部署的搜索引擎中直接获取数据。这一部分的代码,我们就不再展开啦,只聊和这篇相关的内容。

目前,因为 Dify 的 Agent 功能还在迭代中,所以我们可以使用更简单的方法来定义一个 Dify 可用的接口,大概三十行左右(完整代码在 soulteary/dify-with-ai-agent/dify/main.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 stringfor _, 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 起来”章节中,我们已经实现好的“电影数据检索”函数。

当我们完成上面的程序后,执行 go run main.go,就能得到一个运行在 8084 的新接口服务啦,接下来会使用。

你可以根据你的实际需求,来封装更多类似的信息检索,或者“动作 API”服务,让 Agent 来调用。

当我们完成了上面的操作后,就可以来完善上文中创建的 Dify 的 AI Agent 应用啦。从 Dify 顶部菜单选择“工具”,在工具页面点击左侧的“创建自定义工具”。

创建一个新的工具

结合我们上面创建的接口信息,在弹出窗口填写适当的配置,就能够完成工具创建啦。参考上面的我们实现的接口,可以轻松实现一个 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": {}}
}

当我们把配置复制粘贴到弹出窗口中,界面中“可用工具”会出现可以调用的接口,我们可以点击“测试”按钮,来验证接口的可用性。

填写工具具体参数

举个例子,我们在弹出窗口中输入“Titanic”(泰坦尼克),能够清楚看到工具是否能够正常工作:

填写工具具体参数

步骤四:完善 Dify AI Agent 应用

我们再次打开第二步中完成的 AI Agent 应用,开始完善它的具体实现,先设置一个合适的 Prompt。

更新 Agent Prompt

接着,在界面左侧点击“添加工具”,将我们刚刚创建好的“电影搜索”工具添加到界面中。

添加新工具到 Agent

因为 Agent 可以调用多个工具,考虑到演示的实用性,我这里添加了两个应用,我们创建的“电影搜索助手”和“飞书发送群消息”。

添加两个新的工具

设置和获取飞书通知工具需要的 WebHook Token,可以参考之前文章《轻量的 WebHook 工具:歪脖虎克》中提到过的“设置飞书的 WebHook 功能”的步骤,介绍比较详细就不赘述啦。

验证效果

和上一篇文章一样,我们可以根据自己的需求,搜索具体的电影名称,或者电影类型、概况中的关键字,电影的关键词等等,我这里搜索了“狮子王”,然后要求 Agent 将原本搜索出来的英文接口结果翻译为中文,发送给我设置好的飞书群里。

当然,我是懒人,所以上面的内容,我只是写了一句话:“搜索 Lion King,将电影为什么值得看翻译为中文,结果发飞书。”

随手搜索一部电影,或者关键词

在上面的界面中,我们看到了模型在一步步的拆解和分析要做什么事情,当它做完所有的事情后,我们的飞书就能够收到提炼后的结果消息啦。

飞书中收到的消息

当我们将鼠标移动到对话消息上面,我们能够打开具体的消息日志。在界面的左侧,我们能够看到所有的调用详情,方便我们查看模型某一步为什么没有符合预期。我们换一个能够搜索到多部内容的关键词,再次进行验证:

查看 Agent 的每一步执行日志

在 Agent 执行完毕后,我们可以收到一条新的消息:

一条新的飞书消息

当然,如果模型总是不能符合预期,最好的方法是切换支持 Function Call 的模型,我们目前使用的豆包大模型,在 Agent 中的调用方式是 ReACT(ReAct: Synergizing Reasoning and Acting in Language Models),以及调整 Prompt 为模型更好理解的语言和组织方式。这些内容,我们在后续相关的文章中再展开吧。

当然模型使用的 Agent 模式

其他

关于火山引擎和豆包模型还有许多可以聊的有趣内容,比如低成本的 SFT,以及通过它来做 ETL 等等,再多攒攒素材,写几篇有趣的实践。

最后

这篇文章就先写到这里,下一篇相关的文章里,我们来聊聊其他的细节玩法。

–EOF


我们有一个小小的折腾群,里面聚集了一些喜欢折腾、彼此坦诚相待的小伙伴。

我们在里面会一起聊聊软硬件、HomeLab、编程上、生活里以及职场中的一些问题,偶尔也在群里不定期的分享一些技术资料。

关于交友的标准,请参考下面的文章:

苏洋:致新朋友:为生活投票,不断寻找更好的朋友

当然,通过下面这篇文章添加好友时,请备注实名和公司或学校、注明来源和目的,珍惜彼此的时间 😄

苏洋:关于折腾群入群的那些事


本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

本文作者: 苏洋

创建时间: 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/13676.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PDF Reader Pro for Mac 直装激活版:专业PDF阅读编辑软件

在数字化时代,PDF文件已成为我们日常工作和学习中不可或缺的一部分。然而,如何高效、便捷地阅读、编辑和管理这些PDF文件,却一直是许多人面临的难题。现在,有了PDF Reader Pro for Mac,这些难题将迎刃而解。 PDF Reade…

GPIO模拟IIC通信测量环境光

目录 iic.h iic.c ap3216c.h ap3216.c main.c 实验效果 iic.h #ifndef __IIC_H__ #define __IIC_H__#include "stm32mp1xx_gpio.h" #include "stm32mp1xx_rcc.h" //SDA 数据线为PF15 //SCL 时钟线为PF14//配置PF15为输出模式 #define SET_SDA_OUT d…

列举几个淘宝商品详情API接口测试示例

API名:item_get 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheString否[yes…

网络模型-Qinq配置与应用

Qinq配置与应用 通过配置Qinq来实现利用公网提供的VLAN100使企业1互通,利用公网提供的VLAN200使企业2互通不同企业之间互相隔离。并通过在连接其它厂商设备的接口上配置修改0in0外层VLAN Tag的TPID值,来实现与其它厂商设备的互通。 一、创建VLAN #在Swi…

等风来不如追风去 火星皮卡与罗乐的逐梦之旅

都说,男人至死皆少年。少年有梦,不应止于心动。于是,家在毕节的罗乐在节前果断为自己购入了一辆全尺寸火星皮卡当作自己的新年礼物。从此火星皮卡便与罗乐相伴义无反顾地踏上这场热辣滚烫的逐梦之旅 “全尺寸火星满足了我对Dream Car的所有幻…

DVWA代码审计--文件上传

NO.1 Low 首先来看下代码 <?php if( isset( $_POST[ Upload ] ) ) { // Where are we going to be writing to? $target_path DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/"; $target_path . basename( $_FILES[ uploaded ][ name ] ); // Can we move the f…

netcat一键开始瑞士军刀模式(KALI工具系列五)

目录 1、KALI LINUX简介 2、netcat工具简介 3、在KALI中使用netcat 3.1 目标主机IP&#xff08;win&#xff09; 3.2 KALI的IP 4、命令示例 4.1 测试某IP的端口是否打开 4.2 TCP扫描 4.3 UDP扫描 4.4 端口刺探 4.5 直接扫描 5、即时通信 5.1 单击对话互联 5.2 传…

知识表示概述

文章目录 知识表示研究现状技术发展趋势 知识表示 知识是人类在认识和改造客观世界的过程中总结出的客观事实、概念、定理和公理的集合。知识具有不同的分类方式&#xff0c;例如按照知识的作用范围可分为常识性知识与领域性知识。知识表示是将现实世界中存在的知识转换成计算机…

巨某量引擎后台登录实战笔记 | Playwright自动化框架

前言 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 入正题看看滑块是怎么个事…

网络的基础理解

文章目录 网络的基础认识 网络协议协议分层OSI七层模型TCP/IP 五层/四层 模型 网络的基础认识 先来看下面几个问题 什么是网络&#xff1f; 网络就是有许多台设备包括计算机单不仅限于计算机&#xff0c;这些设备通过相互通信所组成起来系统&#xff0c;我们称之为网络所以如…

Gartner发布中国数据安全安全与风险管理领导者指南:将孤立的数据安全产品集成到数据安全平台中,实施一致的数据安全策略

在中国开展业务或与中国相关的组织面临着越来越多的数据安全风险和法规。安全和风险管理领导者必须采用风险优先的数据安全计划和投资&#xff0c;以响应监管要求&#xff0c;以增强数据驱动的数字创新能力。 主要发现 跨组织职能的分散的数据安全举措和不协调的利益相关者责任…

服务器c盘爆满了,这几种方法可以帮助C盘“瘦身”

我们在使用服务器的时候基本不会在C盘安装软件&#xff0c;那么用久了发现C盘满了&#xff0c;提示空间不足&#xff1f;那么这是怎么回事&#xff0c;为什么空间会占用这么快呢&#xff1f; 原因一&#xff1a; C盘满了&#xff0c;很可能是因为电脑里的垃圾文件过多。操作系…

薪资不公、晋升无望?动笔写一份申诉材料吧!

薪资不公、晋升无望&#xff1f;动笔写一份申诉材料吧&#xff01; 引言&#xff1a;每个努力工作的人都值得公平对待 在职场上&#xff0c;我们付出了汗水和智慧&#xff0c;期待着相应的回报——合理的工资和公正的晋升机会。然而&#xff0c;现实并不总是如此美好。当你感觉…

芯片设计公司外协ERP数字化运营:科技与管理的融合

随着信息技术的快速发展&#xff0c;ERP(企业资源计划)系统已经成为现代企业管理不可或缺的一部分。在芯片设计行业&#xff0c;由于产品的复杂性、技术的高要求以及市场的快速变化&#xff0c;外协ERP数字化运营显得尤为重要。 芯片设计公司的外协ERP数字化运营&#xff0c;主…

xxe漏洞--xml外部实体注入漏洞

1.xxe漏洞介绍 XXE&#xff08;XML External Entity Injection&#xff09;是一种攻击技术&#xff0c;它允许攻击者注入恶意的外部实体到XML文档中。如果应用程序处理XML输入时未正确配置&#xff0c;攻击者可以利用这个漏洞访问受影响系统上的敏感文件、执行远程代码、探测内…

晶体振荡器

一、晶振与晶体区别 晶振是有源晶振的简称&#xff0c;又叫振荡器&#xff0c;英文名称是oscillator&#xff0c;内部有时钟电路&#xff0c;只需供电便可产生振荡信号&#xff1b;晶体是无源晶振的简称&#xff0c;也叫谐振器&#xff0c;英文名称是crystal&#xff0c;是无极…

机械臂与Realsense D435 相机的手眼标定ROS包

本教程主要介绍机械臂与 Realsense D435 相机手眼标定的配置及方法。 系统&#xff1a;Ubuntu 20.0.4 ◼ ROS&#xff1a;Noetic ◼ OpenCV 库&#xff1a;OpenCV 4.2.0 ◼ Realsense D435&#xff1a;librealsense sdk&#xff08;2.50.0&#xff09;、realsense-ros 功能包&…

Kafka-文件存储机制

Kafka概述 Kafka-文件存储机制 1. 分区&#xff1a; Kafka中的每个主题&#xff08;topic&#xff09;都可以分成一个或多个分区。 Topic是逻辑上的概念&#xff0c;而Partition是物理上的概念。 分区是消息的基本单元&#xff0c;每个分区都是一个有序的log日志文件。 Pr…

Linux网络配置全攻略:解读/etc/network/interfaces文件的精髓

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Linux网络配置全攻略&#xff1a;解读/etc/network/interfaces文件的精髓 前言文件结构与基本概念配置网络接口的常用参数高级网络配置技巧实用工具与调试技巧实战案例与最佳实践 前言 在我们的日常生…

【数据库基础】基本认识数据库--入门引导

文章目录 什么是数据库&#xff1f;主流数据库基本使用安装MySQL连接服务器服务器、数据库、表关系使用案例数据逻辑存储 MySQL架构SQL语句分类什么叫存储引擎 什么是数据库&#xff1f; 数据库是指在磁盘和内存中存储特定结构组织的数据。数据库通常用于存储于某个系统、组织或…