摘要:本文是 Dify 学习系列的第五篇,聚焦于工具(Tools)的开发与使用。你将学习 Function Call 的核心原理,理解插件在 Dify 中的定位,掌握内置工具的使用方法。重点是通过 natapp 内网穿透工具将本地服务暴露到公网,并结合 FastAPI 开发天气查询接口,最终在 Dify 中创建自定义工具并在 Agent 中调用,让智能体具备实时获取外部信息的能力。

1. 什么是 Function Call

2023 年 6 月 13 日,OpenAI 公布了 Function Call(函数调用)功能。该功能指的是在语言模型中集成外部功能或 API 的调用能力,这意味着模型可以在生成文本的过程中调用外部函数或服务,获取额外的数据或执行特定的任务。

1.1 Function Call 的流程

用户请求 → 大模型判断是否调用函数 → 函数结果返回大模型 → 给出答案

没有 Function Call 时的模式

  1. 用户(Client)发请求给我们的服务(Chat Server)
  2. 我们的服务(Chat Server)给 GPT 提示词
  3. 重复执行

有 Function Call 时的模式

  1. 用户(Client)发请求 prompt 以及 functions 给我们的服务(Chat Server)
  2. GPT 模型根据用户的 prompt,判断是用普通文本还是函数调用的格式响应我们的服务(Chat Server)
  3. 如果是函数调用格式,那么 Chat Server 就会执行这个函数,并将结果返回给 GPT
  4. 模型使用提供的数据,用连贯的文本响应

注意:大模型的 Function Call 不会调用函数,仅返回函数的参数。开发者利用模型输出的参数在应用中调用函数。

2. Dify 中应用 Function Call

在 Dify 中,Function Call 相当于插件。插件是一个工具集,包含一个或多个工具,每个工具对应一个可调用的 API。

核心机制不变:模型通过阅读【插件描述】来决定是否调用该插件

在 Dify 中,插件分为两类:

  • 第三方插件:由 Dify 官方或社区提供的现成工具
  • 自定义插件:开发者自己开发的 API 接口

3. 在 Dify 中使用免费插件

3.1 查看工具

在 Dify 主页中打开工具页面:

在这里插入图片描述

在 Dify 市场中,可以查找需要的插件工具。需要注意的是,插件分为免费插件和需要申请 API Key 的收费插件。

3.2 使用时间工具

新建空白应用,选择 Agent 类型,然后创建。

在这里插入图片描述

点击添加工具,在全部工具下选择时间插件中的“获取当前时间”。

在这里插入图片描述

添加成功后,需要设置地区:

在这里插入图片描述
在这里插入图片描述

3.3 验证结果

现在可以与 Agent 对话,测试时间查询功能:

在这里插入图片描述

4. 使用 natapp 暴露本地服务

接下来,我们开发一个自定义的天气查询工具,并通过 natapp 将本地服务暴露到公网。

4.1 天气查询接口

访问 http://tianqiapi.com/index/doc?version=day,该网站提供实况天气接口。需要注册账号,获取自己的 appid 和 appsecret。
在这里插入图片描述

4.2 脚本开发

使用 FastAPI 编写后端接口:

import requests
from fastapi import FastAPI

# 内置服务器
import uvicorn
from starlette.middleware.cors import CORSMiddleware

app = FastAPI(
    title="天气查询 API",
    version="1.0.0",
    description="用于 Dify 调用的天气接口",
    servers=[
        {"url": "你的公网服务", "description": "natapp 公网服务"}
    ]
)

# 添加 CORS 支持(重要!Dify 调用时需要)
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_methods=["*"],
    allow_headers=["*"],
)

# 查询所有数据
@app.get("/get_all")
def get_all(city: str):
    return requests.get(f"http://v1.yiketianqi.com/free/day?appid=你的appid&appsecret=你的appsecret&unescape=1&city={city}").json()

if __name__ == "__main__":
    uvicorn.run(app, host="127.0.0.1", port=8080)

注意:请将代码中的 你的appid你的appsecret 替换为实际注册获取的值。

4.3 使用 natapp 暴露本地服务

步骤 1:注册 natapp 账号

访问 natapp.cn 注册账号(手机号注册和实名认证)。

步骤 2:获取 authtoken

登录后,在后台找到 我的隧道 → 购买免费隧道 → 记录 authtoken

在这里插入图片描述

购买免费隧道时,需要按照脚本中的端口号填写(本例为 8080):

在这里插入图片描述

记录 authtoken:
在这里插入图片描述

步骤 3:下载 natapp 客户端

访问 下载页面

在这里插入图片描述

下载 Windows 版本(natapp_windows_amd64_xxx.zip),解压到文件夹,如 C:\natapp\

步骤 4:启动 natapp

打开命令行,进入 natapp 目录,运行:

cd C:\natapp
natapp -authtoken=你的authtoken

成功后会显示:

在这里插入图片描述

步骤 5:公网测试

在浏览器访问:

http://你的natapp域名/get_all?city=北京

应该返回与本地测试相同的 JSON 数据:

在这里插入图片描述

5. 在 Dify 中创建自定义工具

5.1 获取 OpenAPI Schema

FastAPI 会自动生成 OpenAPI 文档,访问:

http://你的natapp域名/openapi.json

确保服务器运行的情况下,打开网站,复制完整的 JSON 结构:

在这里插入图片描述

5.2 在 Dify 中创建自定义工具

步骤 1:进入工具管理页面

步骤 2:创建新工具

在这里插入图片描述

填写以下信息:

字段 填写内容
名称 天气查询
Schema 粘贴上面完整的 OpenAPI JSON(确保包含 servers 字段)
鉴权方法 选择 (接口代码中没有进行鉴权)

步骤 3:保存并验证

点击保存后,下方 可用工具 表格应显示:
在这里插入图片描述

如果看到这个列表,说明工具创建成功!

6. 在 Dify Agent 中使用自定义工具

6.1 创建 Agent 应用

进入 Dify 工作室,创建一个新的 Agent 类型应用:

在这里插入图片描述

6.2 添加工具和配置提示词

在 Agent 配置页面,找到 工具 区域,点击 添加工具,在列表中找到 天气查询 工具,勾选启用。

在系统提示词中说明工具的使用方式,例如:

你是一个智能天气助手。当用户询问天气时,请使用 get_all 工具查询。
工具参数 city 需要传入城市名称。
查询到结果后,用友好的语气告诉用户天气情况。

在这里插入图片描述

6.3 测试

现在可以测试自定义天气工具的效果:

在这里插入图片描述

可以看到,当用户询问天气时,Agent 自动调用了我们自定义的天气查询工具,并返回了准确的天气信息。

小结

下一篇将进入 工作流与 Agent 的学习,深入讲解工作流与 Agent 的区别、可视化编排的实现方式,以及如何通过工作流构建复杂的业务逻辑。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐