赞
踩
我们以一个天气查询工具为例子,介绍如何在dify平台创建自定义工具
我们使用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)
在编写工具的http服务时我们有2个优化方向,即LLM调用友好和LLM理解友好,我在之前写的文章【LLMOps】如何借助AI实现智能客服有过介绍,下面我重新写一下:
LLM调用友好:多步骤整合
我们知道,调用哪些工具,以及根据工具的返回结果回答客户问题完全是依靠模型实现的。工具越多,工具调用的步骤越复杂,工具返回的结果越复杂,模型可能会出错。为了降低这个错误率,对模型的能力要求就会更高,同时模型的使用成本也会更高。为了避免这种情况,我们可以把多步骤的接口合并成一个,让AI模型直接调用。比如查询天气可能需要调用3个接口:鉴权、订阅、查询天气,如果直接让AI使用这三个工具,AI需要三个步骤才能获取到订单数据,对模型的要求就会升高,问题回答速度也会变慢。我们就可以把这三个接口合并成一个接口,对外提供服务。大多数情况,为了不影响原来的业务,我们可能无法改动这三个接口,所以我们可以专门做一个接口整合的服务,去中转这些复杂的接口,只提供给模型易用的接口。
LLM理解友好:自然语言式的返回结果
另外一个优化的方向是工具返回的结果,还是以天气查询接口为例,如果接口直接返回一个json结构,而且字段中都是英文缩写,AI可能根本无法理解这些字段的含义。一种方法是我们可以在提示词中预先告诉模型每个字段的含义,但是这样不够方便。最直接的方法是我们把接口返回的信息翻译成模型容易理解的文字,这样模型更容易理解这个结果。
在运行上述代码,搭建好天气查询服务后,我们首先需要测试一下这个接口,保证能够调通这个接口,可以利用ApiFox进行测试。
我首先把代码部署到我的服务器上,地址为https://weather.hanfangyuan.cn/weather,然后测试接口。
首先填写请求方法和地址,然后不要忘记填写认证的Authorization header
然后填写body,发送请求,确认接口正确返回数据
提示词如下
请把curl请求命令转成openapi 3.1.0 版本的json schema,不需要包含response信息
<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请求,并且能够提供模型这个工具的作用,指导模型什么时候应该调用这个工具。
配置上面认证方法的依据是,我们在1.1 flask 的代码设置了鉴权,具体代码如下
def get_weather():
auth_header = request.headers.get('Authorization')
if auth_header != 'Bearer hanfangyuan':
return {"msg": "Invalid Authorization header"}, 403
测试正常后不要忘了点击右下角保存
在工作室页面按照如下步骤创建agent类型应用
创建成功后按照如下步骤添加工具
工具添加完毕后,发送问题今天上海天气如何,可以看到成功调用工具,并返回结果。
创建聊天工作流,在聊天工作流中调用工具
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。