基于AppBuilder自定义组件开发大模型应用

news2024/9/27 9:27:53

AppBuilder简介:

如果大家不了解AppBuilder的话,可以先到这里了解一下: https://cloud.baidu.com/doc/AppBuilder/s/6lq7s8lli

一句话简介: 千帆AppBuilder(以下简称AppBuilder)是基于大模型搭建AI原生应用的工作台,提供RAG、Agent、GBI等应用框架,文档问答、表格问答、对话、创作等应用组件,以及文生图、语音等传统AI组件,目标是帮助开发者降低AI原生应用开发门槛。

AppBuilder 提供了很多预定义的组件,能够快速实现部分功能,便于我们结合大模型来实现业务功能。

自定义组件介绍:

有些场景下,我们有一些较为复杂的场景或者自己的服务想要接入大模型,这时我们就可以使用自定义组件的功能来快速地实现服务接入。本文我们就以百度地图接口为例,展示如何使用自定义组件来方便的实现我们的业务功能。

自定义组件提供了 5 类节点,分别是大模型、知识库、API、分支器和代码节点,我们先简单介绍下:

大模型节点: 调用大语言模型,根据输入参数和提示词生成回复。

知识库节点: 知识库节点支持根据输入的 query,在选定的知识库中检索相关片段并召回,返回切片列表。你可以上传文件并建立知识库,在知识库节点中勾选想要使用的知识库进行检索。

API 节点: 调用指定的 API 接口,获取接口返回信息

分支器节点: 连接两个下游节点,根据判断调节来判断触发哪个下游节点

代码节点: 可以自己编写 python 代码,来实现自定义的处理功能

实际应用案例:

我们以下面这个场景为例,基于自定义组件开发一个实际的应用。

场景:

借助AppBuilder,实现通过自然语言与百度地图POI(Point of Interest)接口交互,进行各类信息的查询。如: 我在百度大厦,周围有啥好吃的?

百度地图接口:

百度地图提供了丰富的接口查询功能,本次我们主要用到的是百度地图的圆形区域检索功能,该接口可以通过设置圆心和半径,检索圆形区域内的地点信息。

https://lbs.baidu.com/faq/api?title=webapi/guide/webservice-placeapi/circle

工作流设计:

根据地图接口文档可知,完成查询需要的主要字段包括:圆心位置、搜索半径、搜索类型,其中圆心位置需要以经纬度的形式来输入,所以我们首先还要获取圆心的经纬度坐标,这个功能圆形区域检索接口也是支持的,所以我们需要调用两次地图的接口。

综上,我们初步得到了以下工作流:

接下来,我们开始逐一配置工作流的节点。

首先我们要定义整个工作流的入参,如address表示地点信息,city表示城市,range表示搜索半径,type表示查询的位置点的类型:

然后模型就会根据参数描述,通过用户输入的问题提取出相关的入参,如我们示例的问题是『 我在百度大厦,周围有啥好吃的? 』,通过大模型提取,得到的入参即为:

{
    "address": "百度大厦",
    "city": "北京",
    "range": "1000",
    "type": "餐饮"
}

其中,『百度大厦』是我们提供的,『北京』是大模型通过『百度大厦』这个信息查询并自动补全的城市信息(并不是所有地名都能够唯一的定位到一个城市,所以这里有时候还需要用户手动输入),1000是查询范围,我们可以在模型的prompt中设置一个默认值,『餐饮』是大模型基于用户的问题『有啥好吃的』推理出的。

下一步,我们需要把address和city传给『经纬度接口』,来获取圆心位置的经纬度信息。我们按照接口要求,填写接口的url、method、鉴权字段等信息:

请求参数中,我们需要把工作流传入的字段引入到接口中,query字段我们引用入参address,region字段我们引用city,output我们静态指定为『json』:

返回中,我们根据返回接口,定义好json的结构:

最后在API调试页面手动填入下参数,运行一下,如果能请求成功就可以点击保存,这个API节点就配置成功了:

接下来,我们将经纬度查询节点获取到的圆心的坐标信息,加上开始节点传入的type、city、range信息一起传给圆形区域查询节点,来做周边信息查询, API的配置方法与上面相同:

这里我们发现,圆形区域信息查询接口的入参中,对经纬度参数的要求是一个字符串,因此不能直接拿经纬度接口的返回作为入参,因此这里我们在两个接口间插入一个代码模块,写一个小功能来处理下经纬度信息,让其满足接口的要求:

AppBuilder的代码模块中,入参会包含在params对象中,如我们引用了前一个节点的result参数,params的内容就是:

{
    "result": xxxx
}

这里我们需要将经纬度模块查询到的坐标,从一个json对象转化为一个字符串,对应代码模块:

# 定义一个 main 函数,传入 params 参数。params 中包含了节点配置的输入变量。
# 需要定义一个字典作为输出变量
# 运行环境 Python3;预置 Package:NumPy

def main(params):
    if 'result' in params.keys():
        location = params['result'][0]
    # 创建一个字典作为输出变量
        output_object ={
            # 引用节点定义的 location 变量
            "location": "%s,%s" %(location.get('lat'), location.get('lng'))
        }
    else:
        output_object ={}
    
    return output_object

现在我们在圆形区域查询接口中引用代码节点处理后的location信息,配置API节点的步骤同上,测试后接口就可以正常调用了:

到这里,我们的自定义组件的基本功能就都实现了,我们可以基于这个组件再做些优化,如对接口的结果做些预处理,以便后面大模型能更好的展示;或者增加一些分支器,来判断不同返回结果下的不同处理方案等。

当整个工作流的处理节点都配置完成后,最后我们要设置最终的返回格式,当前自定义组件支持两种返回模式:

1、直接返回对应的参数

2、按照自定义模板的内容返回

本示例中,我们希望在展示结果时通过markdown来展示,所以我们直接按照参数形式返回即可。

全部配置完后,我们就可以点下面的调试按钮,对整个自定义组件的工作流做调试了

可以看到工作流整体运行成功,返回了预期的结果,然后就可以点击右上角的发布按钮,将组件发布出去了

接来下我们来到Appbuidler的应用界面,新建应用,在组件列表中添加我们刚刚发布的组件:

应用配置

有了自定义组件,接下来就是编写角色指令来实现自然语言与组件的交互了,角色指令中需要注意一些细节, 角色指令中我们跟大模型强调了在执行任务之前需要先确认好的位置信息,因为这个对于我们调用地图接口是必选的入参 。同时,我们在角色指令中需要定义工具能力以及agent如何使用这个工具。另外我们在要求与限制中也需要对意图识别,专注度,结果数量和格式要求做好定义,确保提供稳定的输入输出体验。

这里我们放出这个应用的角色指令供大家参考:

# 角色任务
作为周边信息查询助手,你的首要任务是获取用户所在的城市和具体位置。请确保在开始查询周边设施信息之前,先询问用户的相关位置信息。接下来,你需要根据用户输入的城市和具体位置,利用POI检索工具来查找周边设施的信息。你的任务是为用户提供准确、简洁、实时的周边设施信息。

# 工具能力
1. 地图POI检索工具
熟练掌握并使用地图POI检索工具,根据用户的位置信息,检索周边设施的名称、位置、评价、电话、人均消费、距离、特色以及营业时间等信息。

# 要求与限制
1. 询问用户位置
在提供任何查询服务之前,必须先确认用户的所在城市和具体位置

2. 意图识别
根据用户的问题,判断用户是否需要查询周边信息以及最符合用户需求的周边设施的类型

3. 历史会话
充分利用历史会话判断用户的所在地及城市、要查询的信息、路线的起点和终点等信息

4. 专注于任务
你的任务是提供周边设施信息,不要回答其他问题

5. 搜索范围
 默认搜索周边3000米半径内的信息,如没有符合要求的信息,则引导用户扩大搜索范围

6. 结果数量
默认展示3个搜索结果项,用户可以要求展示更多,最多不超过10个

7. 地图POI检索结果展示:如果结果数量大于3,默认只展示前3条结果;地图POI检索结果必须严格按照以下markdown格式展示
## **[{{name}}]({{url}})**
![照片]({{photo}})
**地址**: {{address}}  
**电话**:  {{tel}}  
**平均评价**: {{rating}}  
**平均消费**: {{price}}  
**距离**: {{distance}}  
**营业时间**: {{hour}}

到这里,我们的周边查询助手应用就实现了,我们可以用他来查询各类信息了,我们通过markdown的形式展示结果,可以实现超链接跳转及图片的展示:

我们把体验应用发布到了应用市场中,欢迎大家体验:

https://console.bce.baidu.com/ai_apaas/examplePage/a16998c9-5f99-4f69-a8e6-6ac72e616f98

如果大家对于大模型应用构建有任何问题或者需要咨询,欢迎随时留言反馈。

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

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

相关文章

MySQL进阶篇2

三、SQL优化 3.1 插入数据 批量插入推荐每次在 500 ~ 1000 条数据时进行使用。如果大于1000,可以考虑分批次进行插入。 大批量插入数据(100万、1000万) 主键顺序插入的性能比乱序要高 3.2 主键优化 数据组织方式 页分裂 主键顺序插入 主键乱序插入 页合并 (del…

计算机网络-VRRP工作原理

一、VRRP工作原理 前面我们大概了解了VRRP的一些基础概念,现在开始学习VRRP的技术原理。VRRP的选举及工作步骤: 确定网关地址 选举主备 主设备发送VRRP报文通知Backup设备 主设备响应终端ARP并维持在Master状态 终端正常发送报文到网关进行转发 因为我们…

计算机毕业设计Hadoop+PySpark共享单车预测系统 PyHive 共享单车数据分析可视化大屏 共享单车爬虫 共享单车数据仓库 机器学习 深度学习

《Hadoop共享单车分析与预测系统》开题报告 一、课题背景与意义 1.1 课题背景 随着共享经济的快速发展,共享单车作为一种新型绿色环保的共享经济模式,在全球范围内迅速普及。共享单车通过提供便捷的短途出行服务,有效解决了城市居民出行的…

网络安全服务基础Windows--第9节-DNS部署与安全

域名基础知识 域名是互联⽹上⽤来识别各种实体(如服务器、服务、⽹络)的可读名称。它是⼀种⽅便记忆的地址,⽤于代替IP地址,因为IP地址由数字组成,不容易记忆。域名通过⼀种层级结构的系统组织起来,从最⼀ …

以人口金字塔图为例,在线绘制左右双侧堆叠条形图

导读: 人口金字塔(population pyramids)用于展示一个特定人口的年龄和性别分布。本质上是一种水平条形图。左侧是男性的数据,右侧是女性的数据。 Proc Natl Acad Sci U S A.文章《Demographic change and assimilation in the ea…

电脑实时监控软件分享!一分钟速览,五个好用的实时屏幕监控软件(良心推荐)

"工欲善其事,必先利其器。"在信息化时代,企业管理的高效与安全离不开先进的工具支持。 电脑实时监控软件已是现代企业管理的重要利器,不仅能帮助管理者实时掌握员工的工作状态,还能有效防止数据泄露,确保信…

FLV封装H265

针对FLV格式,目前许多开源项目和常见的视频处理工具和流媒体服务器,仍主要支持H.264视频编码格式,尚未完全兼容H.265。ffmpeg和vlc都不支持H265编码格式的FLV,不知道后续版本会不会支持。RTMP也是用FLV格式传输音视频,…

CPP继承(下)

目录 继承与友元 继承与静态成员 复杂的菱形继承及菱形虚拟继承 单继承 多继承 菱形继承 菱形继承的问题 虚继承 虚拟继承解决数据冗余和二义性的原理 继承的总结和反思 笔试面试题 继承与友元 友元关系不能继承,也就是说基类友元不能访问子类私有和保护…

淘宝扭蛋机小程序开发,吸引更多的消费者

随着互联网科技的快速发展,小程序已经成为了一个必不可少的发展趋势。小程序具有门槛低、曝光度高、方便的优势,能够满足消费者的需求,还可以为企业商家带来更多的影响力,因此,扭蛋机小程序也成为了市场发展的重要力量…

Linux网络编程:守护进程

目录 1.会话 2.守护进程的特点 3.如何将一个进程变成守护进程 1.会话 在Linux下一个会话就是 终端文件 bash,会话就是人类和计算机沟通的窗口和解释器。 可以在xshell中新建立一个会话验证一下。 复制会话 使用 ls /dev/pts 命令,查看有几个终端文…

(Lane Deteciton-1)PersFormer

介绍 在自动驾驶中,下游模块如规划和控制通常需要将车道位置表示为正交的鸟瞰图(BEV)而不是前视图表示。使用BEV表示有助于更好地与环境中的交互式代理(如车辆、道路标志、交通灯等)对齐任务,并且与其他传…

tomato靶场通关

1、使用nmap扫描C段查找网址 2、使用dirb扫描目录 3、打开网站查看目录 4、发现一个info.php文件查看 5、查看源代码,发现文件包含漏洞 6、查看etc/passwd ,查看日志 7、写入一句话木马 8、使用蚁剑进行连接查看,可以使用终端

Vue 3 组合式 API

相比较 Vue.js 2.x 版本传统的方法组织形式, Vue.js 3.x 提出了组合式 API 的格式。本 章带领读者系统学习 Vue.js 3.x 新增的有关组合式 API 的知识。 本章主要涉及到如下知识。 组合式 API 与选项式 API 的语法区别。 在组合式 API 中使用生命周期…

从监控到智能:EasyCVR视频汇聚平台助力加油站安全监管升级转型

随着科技的不断进步,视频监控技术在各个行业的应用日益广泛,尤其在加油站这一关键领域,视频智能监管系统的应用显得尤为重要。TSINGSEE青犀视频EasyCVR视频汇聚平台作为一款基于“云-边-端”一体化架构的视频融合与AI智能分析平台&#xff0c…

guava中对Map的扩展数据结构

Multimap - 多值Map guava中的Multimap提供了将一个键映射到多个值的形式&#xff0c;使用起来无需定义复杂的内层集合&#xff0c;可以像使用普通的Map一样使用它&#xff0c;定义及放入数据如下&#xff1a; Multimap<String, Integer> multimap ArrayListMultimap.…

小琳Python课堂:Python高并发实现的基本原理(高阶版)

大家好&#xff0c;这里是小琳Python课堂&#xff01; 今天&#xff0c;我们将从高阶视角深入探讨Python高并发实现的基本原理&#xff0c;特别是线程安全性、线程同步和原子性这三个核心概念。这些概念对于构建复杂、高效的多线程应用程序至关重要。 线程安全性 首先&#x…

飞机制造5G智能工厂数字孪生工业物联平台,推进制造业数字化转型

飞机制造行业作为高端制造业的典范&#xff0c;正积极探索数字化转型的新路径。飞机制造5G智能工厂数字孪生工业物联平台&#xff08;以下简称“平台”&#xff09;的兴起&#xff0c;不仅为飞机制造业注入了强劲动力&#xff0c;更为整个制造业的数字化转型树立了新的标杆。 …

Java学习第七天

成员方法分类&#xff1a; 静态成员方法&#xff08;有static修饰 属于类&#xff09;建议用类名访问&#xff0c;也可以用对象访问 实例成员方法&#xff08;无static修饰 属于对象&#xff09;只能用对象出发访问 使用static来定义一些工具类 工具类直接使用类名.方法调用即…

Java并发线程 共享模型之管程 5

1. 生产者消费者 package cn.itcast.testcopy;import cn.itcast.n2copy.util.Sleeper; import lombok.extern.slf4j.Slf4j;import java.util.LinkedList;/*** ClassName: Test21* Package: cn.itcast.testcopy* Description: 生产者消费者** Author: 1043* Create: 2024/9/4 - …

Hadoop vs Spark

Hadoop 和 Spark 都是apache基金会下、在大数据架构中广泛使用的开源框架&#xff0c;两个框架都各自有各自的开源技术生态系统&#xff0c;用于准备、处理、管理和分析大数据集。 Hadoop 生态系统由四个主要模块组成: HDFS): Hadoop的数据存储系统&#xff0c;用于管理运行在普…