【LLMOps】小白详细教程,在Dify中创建并使用自定义工具

文章目录

    • 博客详细讲解视频
    • 点击查看高清脑图
  • 1. 搭建天气查询http服务
    • 1.1. flask代码
    • 1.2. 接口优化方法
  • 2. 生成openapi json schema
    • 2.1. 测试接口
    • 2.2. 生成openapi schema
  • 3. 在dify中创建自定义工具
    • 3.1. 导入schema
    • 3.2. 设置工具认证信息
    • 3.3. 测试工具
  • 4. 调用工具
    • 4.1. Agent应用中调用工具
      • 4.1.1. 创建agent应用
      • 4.1.2. 添加工具
      • 4.1.3. 测试工具
    • 4.2. 聊天助手工作流中调用工具
      • 4.2.1. 创建工作流应用

在这里插入图片描述

博客详细讲解视频

点击查看高清脑图

我们以一个天气查询工具为例子,介绍如何在dify平台创建自定义工具

1. 搭建天气查询http服务

1.1. flask代码

我们使用flask搭建简单的http服务,代码如下

from flask import Flask, request, jsonify
import randomapp = Flask(__name__)@app.route('/weather', methods=['POST'])
def get_weather():auth_header = request.headers.get('Authorization')if auth_header != 'Bearer hanfangyuan':return {"msg": "Invalid Authorization header"}, 403city = request.json.get('city', None)if city is None:return jsonify({'status': 'error','errorInfo': 'No city provided','data': None})# 随机生成温度,风速和风向temperature = f'{random.randint(10, 20)}℃'windspeed = f'{random.randint(1, 5)}级' winddirect = random.choice(['北风', '南风', '西风', '东风'])  # 随机选择风向# 返回JSON格式的响应# return jsonify({#     'status': 'OK',#     'errorInfo': None,#     'data': {#         'city': city,#         'temp': temperature,#         'windspeed': windspeed,#         'winddirect': winddirect#     }# })# 返回对LLM友好的字符串格式的响应return f"{city}今天是晴天,温度{temperature}, 风速{windspeed}, 风向{winddirect}"if __name__ == '__main__':app.run(host='0.0.0.0',debug=False, port=4397)

1.2. 接口优化方法

在编写工具的http服务时我们有2个优化方向,即LLM调用友好LLM理解友好,我在之前写的文章【LLMOps】如何借助AI实现智能客服有过介绍,下面我重新写一下:

LLM调用友好:多步骤整合
我们知道,调用哪些工具,以及根据工具的返回结果回答客户问题完全是依靠模型实现的。工具越多,工具调用的步骤越复杂,工具返回的结果越复杂,模型可能会出错。为了降低这个错误率,对模型的能力要求就会更高,同时模型的使用成本也会更高。为了避免这种情况,我们可以把多步骤的接口合并成一个,让AI模型直接调用。比如查询天气可能需要调用3个接口:鉴权、订阅、查询天气,如果直接让AI使用这三个工具,AI需要三个步骤才能获取到订单数据,对模型的要求就会升高,问题回答速度也会变慢。我们就可以把这三个接口合并成一个接口,对外提供服务。大多数情况,为了不影响原来的业务,我们可能无法改动这三个接口,所以我们可以专门做一个接口整合的服务,去中转这些复杂的接口,只提供给模型易用的接口。

LLM理解友好:自然语言式的返回结果
另外一个优化的方向是工具返回的结果,还是以天气查询接口为例,如果接口直接返回一个json结构,而且字段中都是英文缩写,AI可能根本无法理解这些字段的含义。一种方法是我们可以在提示词中预先告诉模型每个字段的含义,但是这样不够方便。最直接的方法是我们把接口返回的信息翻译成模型容易理解的文字,这样模型更容易理解这个结果。

2. 生成openapi json schema

2.1. 测试接口

在运行上述代码,搭建好天气查询服务后,我们首先需要测试一下这个接口,保证能够调通这个接口,可以利用ApiFox进行测试。
我首先把代码部署到我的服务器上,地址为https://weather.hanfangyuan.cn/weather,然后测试接口。
首先填写请求方法和地址,然后不要忘记填写认证的Authorization header
image.png
然后填写body,发送请求,确认接口正确返回数据
image.png

2.2. 生成openapi schema

  1. 接口测试无误后,我们按照下图方式导出接口curl命令

image.png

  1. 复制curl请求代码

image.png

  1. 利用gpt4把curl命令转为openapi schema

提示词如下

请把curl请求命令转成openapi 3.1.0 版本的json schema
<curl>
curl --location --request POST 'https://weather.hanfangyuan.cn/weather' \
--header 'Authorization: Bearer hanfangyuan' \
--header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \
--header 'Content-Type: application/json' \
--data-raw '{"city": "上海"
}'
</curl>
json schema请参照下面的例子
<json-schema>
{"openapi": "3.1.0","info": {"title": "Get weather data","description": "Retrieves current weather data for a location.","version": "v1.0.0"},"servers": [{"url": "https://weather.example.com"}],"paths": {"/location": {"get": {"description": "Get temperature for a specific location","operationId": "GetCurrentWeather","parameters": [{"name": "location","in": "query","description": "The city and state to retrieve the weather for","required": true,"schema": {"type": "string"}}],"deprecated": false}}},"components": {"schemas": {}}}
</json-schema>

生成的json结果如下

{"openapi": "3.1.0","info": {"title": "Weather Service API","description": "API for retrieving weather data for a specified city.","version": "1.0.0"},"servers": [{"url": "https://weather.hanfangyuan.cn"}],"paths": {"/weather": {"post": {"description": "Retrieve weather data for a specific city","operationId": "getWeatherData","requestBody": {"description": "City for which to fetch weather","required": true,"content": {"application/json": {"schema": {"type": "object","properties": {"city": {"type": "string","description": "Name of the city"}},"required": ["city"]}}}},"responses": {"200": {"description": "Successful response","content": {"application/json": {"schema": {"type": "object","properties": {"temperature": {"type": "number","description": "Current temperature in Celsius"},"description": {"type": "string","description": "Weather condition description"}}}}}}},"security": [{"bearerAuth": []}]}}},"components": {"securitySchemes": {"bearerAuth": {"type": "http","scheme": "bearer","bearerFormat": "JWT"}}}
}

这个open api schema包含了天气工具的作用、url地址、请求参数、参数的描述等信息,利用这些信息能够正确创建http请求,并且能够提供模型这个工具的作用,指导模型什么时候应该调用这个工具。

3. 在dify中创建自定义工具

3.1. 导入schema

  • 进入dify工具页面
  • 创建自定义工具
  • 填写名称
  • 填写生成的open api json schema

image.png

3.2. 设置工具认证信息

  • 点击设置鉴权方法
  • 鉴权类型 API Key
  • 头部Bearer
  • 键 Authorization
  • 值 hanfangyuan

image.png

配置上面认证方法的依据是,我们在1.1 flask 的代码设置了鉴权,具体代码如下

def get_weather():auth_header = request.headers.get('Authorization')if auth_header != 'Bearer hanfangyuan':return {"msg": "Invalid Authorization header"}, 403

3.3. 测试工具

  • 点击测试

image.png

  • 填写参数值上海
  • 点击测试
  • 确认正常返回

image.png

测试正常后不要忘了点击右下角保存
image.png

4. 调用工具

4.1. Agent应用中调用工具

4.1.1. 创建agent应用

在工作室页面按照如下步骤创建agent类型应用
image.png

4.1.2. 添加工具

创建成功后按照如下步骤添加工具
image.png

4.1.3. 测试工具

工具添加完毕后,发送问题今天上海天气如何,可以看到成功调用工具,并返回结果。
image.png

4.2. 聊天助手工作流中调用工具

4.2.1. 创建工作流应用

  • 工作室页面
  • 创建空白应用
  • 选择聊天助手
  • 选择工作流编排
  • 输入名称,工具调用-工作流

image.png
创建聊天工作流,在聊天工作流中调用工具
image.png

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

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

相关文章

【JavaWeb】Day51.Mybatis动态SQL(一)

什么是动态SQL 在页面原型中&#xff0c;列表上方的条件是动态的&#xff0c;是可以不传递的&#xff0c;也可以只传递其中的1个或者2个或者全部。 而在我们刚才编写的SQL语句中&#xff0c;我们会看到&#xff0c;我们将三个条件直接写死了。 如果页面只传递了参数姓名name 字…

Multitouch 1.27.28 免激活版 mac电脑多点触控手势增强工具

Multitouch 应用程序可让您将自定义操作绑定到特定的魔术触控板或鼠标手势。例如&#xff0c;三指单击可以执行粘贴。通过执行键盘快捷键、控制浏览器的选项卡、单击鼠标中键等来改进您的工作流程。 Multitouch 1.27.28 免激活版下载 强大的手势引擎 精心打造的触控板和 Magic …

iOS 模拟请求 (本地数据调试)

简介 在iOS 的日常开发中经常会遇到一下情况&#xff1a;APP代码已编写完成&#xff0c;但后台的接口还无法使用&#xff0c;这时 APP开发就可能陷入停滞。此时iOS 模拟请求就派上用场了&#xff0c;使用模拟请求来调试代码&#xff0c;如果调试都通过了&#xff0c;等后台接口…

迁移学习基础知识

简介 使用迁移学习的优势&#xff1a; 1、能够快速的训练出一个理想的结果 2、当数据集较小时也能训练出理想的效果。 注意&#xff1a;在使用别人预训练的参数模型时&#xff0c;要注意别人的预处理方式。 原理&#xff1a; 对于浅层的网络结构&#xff0c;他们学习到的…

matplotlib绘图

matplotlib版本&#xff1a;3.7.5 numpy版本&#xff1a;1.24.3 pandas版本&#xff1a;2.0.3 导包构造数据 import matplotlib.pyplot as plt import numpy as np import pandas as pd# %matplotlib inlinea np.linspace(0, 2 * np.pi, 100) asin np.sin(a) acos np.cos(…

c++理论篇(一) ——浅谈tcp缓存与tcp的分包与粘包

介绍 在网络通讯中,Linux系统为每一个socket创建了接收缓冲区与发送缓冲区,对于TCP协议来说,这两个缓冲区是必须的.应用程序在调用send/recv函数时,Linux内核会把数据从应用进程拷贝到socket的发送缓冲区中,应用程序在调用recv/read函数时,内核把接收缓冲区中的数据拷贝到应用…

Bert语言大模型基础

一、Bert整体模型架构 基础架构是transformer的encoder部分&#xff0c;bert使用多个encoder堆叠在一起。 主要分为三个部分&#xff1a;1、输入部分 2、注意力机制 3、前馈神经网络 bertbase使用12层encoder堆叠在一起&#xff0c;6个encoder堆叠在一起组成编码端&#xf…

CSS——前端笔记

CSS 1、选择器1.1、基础选择器1.2、复合选择器1.2.4、伪类选择器 1.3、属性选择器1.4、结构伪类选择器1.5、伪元素选择器 2、CSS的元素显示模式2.1、块元素2.2、行内元素2.3、行内块元素2.4、元素显示模式转换 3、字体属性3.1、font-family 字体3.2、font-size 字体大小3.3、fo…

vue echarts 柱状图 堆叠柱状图

echarts堆叠柱状图&#xff08;效果图在文章末尾&#xff09; 1、默认只显示 月度的 数据&#xff0c;手动点击 legend 季度的 数据才会显示&#xff1b; 2、监听左侧菜单栏的宽度变化&#xff0c;图表宽度自适应展示 <template><div><div id"barChart&q…

Java学习1:java入门

java入门 1.介绍Java java——sun公司——被甲骨文收购 一开始叫Oak&#xff0c;后期改名为java; java之父詹姆斯高斯林 企业级应用开发 JavaSE JavaEE JavaME 高级编程语言 2.搭建开发环境 JDK8&#xff0c;JDK11&#xff0c;JDK17————>LTS长期支持版 ps:在…

【Linux】基础指令

文章目录 基础指令1. pwd 指令2. cd 指令3. ls 指令4. touch 指令5. mkdir 指令6. rmdir 和 rm 指令7. man 指令8. cp 指令9. mv 指令10. cat 指令11. more 和 less 指令12. head 和 tail 指令13. date 指令14. cal 指令15. find 指令16. grep 指令18. zip 和 unzip 指令19. ta…

IPv4 NAT(含Cisco配置)

IPv4 NAT&#xff08;含Cisco配置&#xff09; IPv4私有空间地址 类RFC 1918 内部地址范围前缀A10.0.0.0 - 10.255.255.25510.0.0.0/8B172.16.0.0 - 172.31.255.255172.16.0.0/12C192.168.0.0 - 192.168.255.255192.168.0.0/16 这些私有地址可在企业或站点内使用&#xff0c…

jupyter notebook设置代码自动补全

jupyter notebook设置代码自动补全 Anaconda Prompt窗口执行 pip install jupyter_contrib_nbextensionsjupyter contrib nbextensions install --userpip install jupyter_nbextensions_configuratorjupyter nbextensions_configurator enable --user按如下图片设置 卸载jed…

创建Vue3项目遇到的问题 - TypeError: (0 , import_node_util.parseArgs) is not a function

印象中想要创建vue3项目&#xff0c;需要安装16.0或更高版本的Node.js&#xff0c;于是第一步检查现在所用node版本。 显示 v16.20.0。前置条件符合&#xff0c;开始愉快的创建项目。npm init vuelatest&#xff0c;报错了。 查了一下&#xff0c;发现官网已经改成了需要18.3或…

AI赋能分层模式,解构未来,智领风潮

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f680; 转载自热榜文章&#x1f525;&#xff1a;探索设计模式的魅力&#xff1a;AI赋能分…

Elasticsearch集群部署(Linux)

1. 准备环境 这里准备三台Linux虚拟机&#xff0c;用于配置Elasticsearch集群和部署可视化工具Kibana。 角色IP域名集群名称节点名称版本操作系统ES192.168.243.100linux100cluster-eses-node-1007.12.0CentOS 7192.168.243.101linux101cluster-eses-node-101192.168.243.102…

决策树模型示例

通过5个条件判定一件事情是否会发生&#xff0c;5个条件对这件事情是否发生的影响力不同&#xff0c;计算每个条件对这件事情发生的影响力多大&#xff0c;写一个决策树模型pytorch程序,最后打印5个条件分别的影响力。 一 决策树模型是一种非参数监督学习方法&#xff0c;主要…

数据结构习题--旋转链表

数据结构习题–旋转链表 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。注意这里的k可能超过链表的长度 方法&#xff1a;双指针 分析 旋转K次&#xff0c;我们其实就是相当于找到倒数第K个结点&#xff0c;让其成为头结点…

ArcGIS无法开始编辑TIN!开始编辑TIN显示灰色

ArcGIS无法开始编辑TIN&#xff01;开始编辑TIN显示灰色&#xff1f; 解决方案&#xff01; 1、确认自定义——扩展模块中空间分析、3D分析模块勾选。 2、确认以上后&#xff0c;还是不能编辑的话&#xff0c;我们可以调出 3D分析分析工具条&#xff0c;你就会发现。TIN编辑工…

ANSYS WorkBench基础说明

1引入CAE产品设计流程 2有限元法简介 有限元法的基本概念:把一个原来是连续的物体划分为有限个单元&#xff0c;这些单元通过有限个节点相互连接&#xff0c;承受与实际载荷等效的节点载荷&#xff0c;根据力的平衡条件进行分析&#xff0c;并根据变形协调条件把这些单元重新组…