【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 random

app = 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"}, 403
    city = 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PC-3000 Mobile Pro: 智能手机及平板设备数据提取工具

天津鸿萌科贸发展有限公司从事数据安全业务20余年&#xff0c;在数据恢复、数据取证、数据备份等领域有丰富的案例经验、前沿专业技术及良好的行业口碑。同时&#xff0c;公司面向取证机构及数据恢复公司&#xff0c;提供数据恢复实验室建设方案&#xff0c;包含数据恢复硬件设…

跨境电商亚马逊、虾皮等平台做测评要用什么IP?

IP即IP地址&#xff0c;IP地址是指互联网协议地址&#xff08;英语&#xff1a;Internet Protocol Address&#xff0c;又译为网际协议地址&#xff09;&#xff0c;是IP Address的缩写&#xff0c;IP地址是IP协议提供的一种统一的地址格式 功能&#xff1a;它为互联网上的每一…

SpringMVC笔记——SpringMVC基础Tomcat环境配置

Tomcat安装配置 下载Apache Tomcat 进入官网https://tomcat.apache.org/&#xff0c;选择tomcat 9 这边使用idea开发&#xff0c;建议直接下载压缩包 无法访问下载的可以直接用我的下载链接&#xff1a;https://cloudreve.zxbdwy.online/s/6nSA 提取码&#xff1a;w1pwk3将压…

嵌入式学习60-C++

知识零碎&#xff1a; C# &#xff1a;window下用于vs stdio编程 …

Pyside6:QDialog按钮变为中文

如果在Qt Designer中创建了一个Qdialog&#xff0c;自带按钮的类型&#xff0c;那么在Designer中显示是中文&#xff0c;但在运行时将变成英文。 如果程序不需要进行国际化&#xff0c;只在国内使用&#xff0c;那么进行中文化的操作还是有必要的&#xff0c;其实方式很简单&am…

常见七大排序(汇总)

目录 引言 交换函数 直接插入排序 思想 时间复杂度 希尔排序 思想 时间复杂度 选择排序 思想 时间复杂度 堆排序 思想 时间复杂度 冒泡排序 思想 时间复杂度 快速排序&#xff08;递归&#xff09; 霍尔法 前后指针法 三数取中 & 随机值法 第一种是随…

C++ 核心编程 - 内存分区模型

文章目录 1.1 程序运行前1.2 程序运行后1.3 new 操作符 C 程序在执行时&#xff0c;将内存大致划分为 4个区域&#xff1a; 代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理&#xff1b;全局区&#xff1a;存放全局变量和静态变量以及常量&#xff1…

【CSS】CSS实现元素逐渐消失(实现元素透明逐渐消失/模糊)

mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 10%);mask-image 属性用于定义一个遮罩&#xff0c;它可以隐藏元素的一部分或全部内容。在这个示例中&#xff0c;我们使用 mask-image 属性来定义一个线性渐变的遮罩&#xff0c;使得列表项的内…

nginx配置ip_hash负载均衡策略

一、nginx配置ip_hash负载均衡策略 nginx默认的负载均衡策略为轮询&#xff0c;某些场景需要使用ip_hash负载策略&#xff0c;即&#xff1a;同一个ip地址&#xff0c;永远访问nginx后面同一台tomcat。配置示例如下&#xff0c;主要是设置ip_hash&#xff1a; upstream www.ab…

机器视觉系统-工业光源什么是高角度光,以及发光角度得分类

光路描述&#xff1a;光线与水平面角度>45称为高角度光。 效果分析&#xff1a;高角度照射&#xff0c;光线经 被测物表面平整部分反射后进入镜头&#xff0c;图像效果表现为灰度值较高&#xff1b;不平整部分反射光进入不了镜头&#xff0c;图像效果表现为灰度值较低。 主要…

【Vue】自定义事件实现组件之间的通信(案例讲解)

一、前言 这是部分哔哩哔哩上跟着一个博主【遇见狂神说】学习的&#xff0c;当然自己也是才开始学习的vue&#xff0c;在学到这个Vue的自定义事件的时候&#xff0c;虽然知识点很绕&#xff0c;但是在理解后又觉得很意思&#xff0c;觉得Vue真的很强大。这里博主将自己学习到的…

2、选择什么样的机器人本体

如果说世界是物质的&#xff0c;那么应该先制造出机器人的本体&#xff0c;再让她产生灵魂。如果是精神的呢&#xff0c;世界是无中生有的呢&#xff0c;那就先在仿真中研究算法吧。 而我比较崇尚初中哲学的一句话&#xff0c;世界是物质的&#xff0c;物质是运动的&am…

[已测试]TVBox二次开发影视系统酷点1.4.4反编译版本

支持p2p, 磁力等播放 支持多仓切换vip线路 自动换源开关 启动时直接进入直播 原始轮播图和幻灯片切换 加大防抓包的可能性 支持安卓4.x版本 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89084105 更多资源下载&#xff1a;关注我。

科技改变视听4K 120HZ高刷新率的投影、电视、电影终有用武之地

早在1888年&#xff0c;法国生理学家埃蒂安朱尔马莱就发明了一套盒式摄像机&#xff0c;能以120帧/s的速度在一条纸膜上曝光照片&#xff0c;但是当时没有相匹配的放映设备。而马莱的另一套拍摄设备是60帧/s的规格&#xff0c;并且图像质量非常好。 受此启发&#xff0c;雷诺的…

CobaltStrike使用插件实现免杀

免责声明&#xff1a;本工具仅供安全研究和教学目的使用&#xff0c;用户须自行承担因使用该工具而引起的一切法律及相关责任。作者概不对任何法律责任承担责任&#xff0c;且保留随时中止、修改或终止本工具的权利。使用者应当遵循当地法律法规&#xff0c;并理解并同意本声明…

编译一个基于debian/ubuntu,centos,arhlinux第三方系统的问题解答

如果是开机卡boot注意看前面几行会有错误提示&#xff0c;一般会比较好找&#xff0c;下面是过了kernel内核加载后出现的问题 目录 上一篇文章 第一个问题 错误原因 解决办法 第二个问题 注意 第三个问题 上一篇文章 编译一个基于debian/ubuntu,centos,arhlinux第三方系…

【Linux网络】FTP服务

目录 一、FTP简介 1.FTP-文件传输协议 2.FTP的两种模式 二、安装配置FTP 1.安装环境 2.对文件的操作 3.切换目录 4.设置匿名用户 5.图形化界面登录 6.白名单与黑名单 重点与难点 一、FTP简介 1.FTP-文件传输协议 FTP是FileTransferProtocol&#xff08;文件传输协…

(十) 盘古UI,详情小标题副标题的实现,方便快速开发详情PanguFormTitle!

(十) 盘古UI,详情小标题副标题的实现,方便快速开发详情PanguFormTitle! 盘古UI,较为全面的自定义UI框架,帮助你绝对的快速开发!(长期维护中) 控件位置: com.smart.pangu_ui_lib.widget.PanguFormTitle demo地址,点击查看github 详情|表单的小标题 可以在详情或者表单的页面…

MapMagic 2 Biomes and Functions

MapMagic 2(免费)世界生成器官方模块。支持基于遮罩混合几个图形,从而可以在无限地形上混合不同的生物群落。也随附函数节点,从而可以在子图中执行复杂的生成过程。将它们视作含有输入和输出连接器的生物群落。请注意,必须使用 MapMagic 2 的现有安装才能使用该模块。 下…

护眼台灯哪个牌子最好?消费者信赖之选护眼灯十大品牌推荐

孩子入学后&#xff0c;对其的关注和照料必须加倍。特别是眼睛的健康&#xff0c;在学习过程中显得尤为关键。为了减轻孩子的眼睛疲劳&#xff0c;降低近视的风险&#xff0c;选择一款优质的护眼台灯至关重要。护眼台灯哪个牌子最好&#xff1f;目前市场上书客、飞利浦、松下等…