【Dify】0 基础入门Agent开发

1. 安装Dify

安装Dify的全教程来源于黑马程序员在 https://www.bilibili.com/video/BV116w5zuEbo/ 中的教程文档 “Dify安装教程_Windows.md”

黑马程序员零基础玩转Dify,5小时极速入门Agent开发,从Prompt到企业级项目实战,涵盖RAG+Text2SQL、电商客服+LOL助手全实战https://www.bilibili.com/video/BV116w5zuEbo/

1

图1、安装步骤

Dify 是一款开源的大语言模型(LLM)应用开发平台,使开发者可以快速搭建生产级的生成式 AI 应用。即使你是非技术人员,也能参与到 AI 应用的定义和数据运营过程中。

1.1 下载 Docker Desktop

下载地址:https://docs.docker.com/desktop/setup/install/windows-install/

1

图2、下载Docker Desktop

1.2 系统要求

注意:有两种方式:WSL或者Hyper-V.Hyper-V 和 WSL 各有优缺点,具体取决于您的配置和使用场景。

1.3 基于WSL(默认方式)

1

图3、WSL

1.3.1启用虚拟机管理程序:
  • 打开命令:控制面板➡️程序➡️启用或者关闭windows功能

1

图4、WSL

1.3.2 WSL 验证和设置

请先通过在终端中运行以下命令来验证您安装的版本是否满足系统要求:win+R

wsl --version

如果未显示版本详细信息,则您可能正在使用 WSL 的默认版本。此版本不支持最新功能,必须进行更新。
您可以使用以下方法之一更新或安装 WSL:
通过终端安装或更新 WSL
1. 以管理员身份打开 PowerShell 或 Windows 命令提示符。
2. 运行安装或更新命令。系统可能会提示您重启计算机。更多信息,请参阅

wsl --install
wsl --update

1

图5、下载Ubuntu

1.3.3 安装docker

默认安装即可

1.4 基于Hyper-V(可选方式)

1

图6、基于Hyper-V

1.4.1 开启windows的Hyper-V虚拟化技术
  • 打开控制面板➡️程序➡️启动或关闭window功能
    1

    图7、控制面板


    1

    图8、程序

  • 需要开启Hyper-V虚拟化技术。如果您的计算机不支持Hyper-V或者没有启用Hyper-V,则会出现Windows无法启动Docker的问题。
    1

    图9、Hyper-V虚拟化

1.4.2 安装Docker
  1. 双击运行下载好的安装包
    1

    图10、下载安装包

  2. 注意:有的同学可能会出现以下报错: Docker Desktop requires Windows 10 Pro/Enterprise/Home version 19044 or above.意思是docker只支持 Windows 10 专业版/企业版/家庭版,并且版本要高于19044好吧,到这里我都想升级windows系统或者重装系统了

  3. 大家如果没有出现这种报错就不用管了。操作系统版本修改方式如下:

  4. 输入cmd命令,运行regedit,回车,出现[注册表]编辑器,找到:计算机\HKEY LOCAL MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion。确认EditionId是否为Professional,如果不是对其进行修改。1

    图11、修改操作系统版本

  • 修改CurrentBuild和CurrentBuildNumber,改为提示要求的19044

1

图12、修改CurrentBuild和CurrentBuildNumber


然后重新双击安装,进入到了安装界面,注意,不要勾选第一项,不然会安装失败,因为我们设置了Hyper-v。
1

图13、设置Hyper-v


点击close and log out:会重启电脑,重启后正常打开就可以了
1

图14、点击close and log out

1.5 打开 Docker:

不用登录,直接点击不登录
1

图15、打开 Docker

1.6 进入Desktop Docker

1

图16、进入Desktop Docker

1.7 设置资源下载位置

默认是在C盘,根据自己需求进行修改。
1

图17、设置资源下载位置

1.8 设置镜像

不然无法下载镜像,配置如下

{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "experimental": false,
  "features": {
    "buildkit": true
  },
  "registry-mirrors": [
    "https://docker.1panelproxy.com",
    "https://2a6bf1988cb6428c877f723ec7530dbc.mirror.swr.myhuaweicloud.com",
    "https://docker.m.daocloud.io",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com",
    "https://your_preferred_mirror",
    "https://dockerhub.icu",
    "https://docker.registry.cyou",
    "https://docker-cf.registry.cyou",
    "https://dockercf.jsdelivr.fyi",
    "https://docker.jsdelivr.fyi",
    "https://dockertest.jsdelivr.fyi",
    "https://mirror.aliyuncs.com",
    "https://dockerproxy.com",
    "https://mirror.baidubce.com",
    "https://docker.m.daocloud.io",
    "https://docker.nju.edu.cn",
    "https://docker.mirrors.sjtug.sjtu.edu.cn",
    "https://docker.mirrors.ustc.edu.cn",
    "https://mirror.iscas.ac.cn",
    "https://docker.rainbond.cc"
  ]
}

1

图18、设置镜像

1.9 验证docker

  • 打开cmd,执行下面命令
docker --version
  • 拉取镜像操作
 docker pull hello-world

2 克隆 Dify 仓库

  • 输入下面命令
 git clone https://github.com/langgenius/dify.git
  • 如果无法clone,可以直接download原始的zip文件(解压缩):下载地址https://github.com/langgenius/dify.git,访问 GitHub 仓库页面 ➡️ 点击 “Code” ➡️ 选择 “Download ZIP”

注意:如果无法下载,请直接使用配套资料中的"dify"文件夹即可

3 进入 Docker 目录(环境配置)

  • 进入到dify文件夹下docker文件夹,将.env.example文件名改为 .env

    切换到dify/docker文件夹下去操作,可以使用rename .env.example .env

  • 也可以输入下面命令:
cd dify/docker 
cp .env.example.env

4 启动 Dify

先进入dify文件找到docker文件夹,然后进入终端,再去操作下面的命令
输入下面命令:

docker compose up -d

1

图19、启动 Dify

5 访问应用

登陆:http://localhost/signin;设置好邮箱、用户名、密码就可以登陆了
1

图20、访问应用

2. Dify中接入模型

2.1 接入本地大模型

2.1.1 安装 Ollama

前往 Ollama 官方官网下载对应系统版本客户端,完成默认安装。安装完成后 Ollama 会自动后台启动本地服务,默认端口为 11434。

下载地址:https://ollama.com/download
1

图21、安装 Ollama

2.1.2 下载 Ollama 本地模型

打开 Ollama 应用,点击一个模型下载(例如 qwen3:4b )

1

图22、下载 qwen3:4b 模型

2.1.3 接入模型

在Dify界面 http://localhost/signin登录后,点击右上角头像,再点击设置
1

图23、 Dify设置


1

图24、 搜索 Ollama


模型名称自己随便填写一个,基础URL填写“ http://host.docker.internal:11434 ”
1

图25、 配置 Ollama

之后在Dify主页点击“创建空白应用”就可以选择Ollama本地下载好的qwen3:4b模型了。

2.2 接入API大模型

2.2.1 创建阿里云大模型API

前往阿里云百炼https://bailian.console.aliyun.com/cn-beijing?tab=model#/model-market 创建API,保存好API。
1

图26、 创建API

2.2.2 接入模型

进入Dify设置里面的模型供应商,搜索通义,然后填写信息(API填入刚刚创建的那一串字符):
1

图27、 添加API模型

3. Dify中应用Prompt

在理解了 Prompt 编写的基础逻辑和技巧后,接下来我们将这些理论落地到 Dify 平台中。Dify 提供了一个直观且强大的可视化「编排(Studio)」界面,让我们可以非常方便地测试、优化和管理提示词。

以下是在 Dify 中应用 Prompt 的核心步骤与高阶技巧:

3.1 创建应用与定位提示词入口

  1. 登录 Dify 控制台,点击 创建空白应用
  2. 根据业务需求选择应用类型(推荐新手从 聊天助手 (Chatbot) 开始)。
  3. 进入应用的 编排(Studio) 页面。页面的核心区域就是 系统提示词 填写框,这里是我们给 AI 下达指令的“主战场”。
    1

    图28、 系统提示词

3.2 编写系统提示词

在这个区域,你需要定义 AI 的角色(人设)、核心任务、约束条件以及输出格式。
💡 最佳实践:
Dify 的底层模型对结构化文本的理解能力很强。建议将你在上一节学到的 结构化 Prompt(如使用 Markdown 标题、列表分隔信息)直接应用在这里。

3.3 玩转动态变量 (Variables)

这是 Dify 让 Prompt 从“静态文本”变成“动态应用”的关键功能。在实际产品中,Prompt 的主体结构是固定的,但用户的具体需求是变化的。

  • 基础语法:在 Prompt 中使用双大括号 {{变量名}} 来定义动态占位符。
  • 应用示例:假设你要做一个小红书爆款文案生成器,可以这样编写 Prompt:
# Role
你是一个资深的小红书爆款文案操盘手,深谙年轻人的网感表达和流量密码。

# Task
请根据用户提供的商品信息,写一篇高转化率的种草笔记。

# Context
- **核心主题**:{{topic}}
- **核心卖点**:{{selling_points}}
- **目标字数**:{{word_count}} 字左右

# Guidelines
1. 标题必须带有 Emoji,且能瞬间抓住痛点。
2. 正文分段清晰,使用活泼、接地气的词汇(如"宝子们"、"冲"等)。
3. 必须在结尾处加上引导互动的提问,并带上 3-5 个相关的 Hashtag。**

4. 实战1:金融文本信息抽取助手

金融场景提示词对比教学案例

场景:小白用户拿到一份上市公司财报,想快速提取关键数据填入Excel
目标:让大模型从一段财报文字中,精准提取「营收」「净利润」「同比增长率」三项数据

4.1 创建Agent

1

图29、 创建Agent

4.2 编写系统提示词并测试

将下面的提示词填入Agent中:

你是一个数据分析小助手,专注于从金融的财报中提取关键财务数据,当提取信息时请严格按以下规则操作:
1. 只提取三项数据:营业收入、净利润、营业收入同比增长率
2. 输出格式必须为JSON,字段名:revenue, net_profit, growth_rate
3. 金额单位统一为“亿元”,增长率带百分号
4. 不输出任何解释、注释或额外内容

示例:
输入:"2022年营收42.1亿元,净利6.8亿,同比增9.2%"
输出:{"revenue": "42.1", "net_profit": "6.8", "growth_rate": "9.2%"}

当用户的输入是打招呼、问身份、闲聊,或没有提供任何可提取的财务数据时,请用自然语言友好回应,向用户说明你的功能,并引导用户提供包含营业收入、净利润、同比增长率的财报文本。

1

图30、 测试问答


得到结果:
{"revenue": "58.62", "net_profit": "8.94", "growth_rate": "12.3%"}

5. RAG

5.1 什么是 RAG?

RAG(检索增强生成) 是一种通过从外部知识源检索相关信息来增强大型语言模型(LLM)输出的技术。简单来说,RAG 相当于给 LLM 穿戴了一个“外部知识库”,使其在回答问题时可以“翻书查资料”。

  • 核心公式 R A G = 检索 ( R e t r i e v a l ) + 生成 ( G e n e r a t i o n ) RAG = 检索 (Retrieval) + 生成 (Generation) RAG=检索(Retrieval)+生成(Generation)
  • 主要价值:解决模型幻觉、数据时效性不足以及私有数据无法直接训练的问题。

5.2 RAG 的标准工作流

RAG 的实现主要分为两个核心环节:

1. 离线数据处理 (Offline Pipeline)

将非结构化数据转化为机器可搜索的向量索引:

  1. 文档加载 (Loading):读取 PDF、Markdown 或数据库内容。
  2. 文本切分 (Chunking):将长文拆分为固定大小或语义完整的段落。
  3. 向量化 (Embedding):利用模型将文本转换为高维向量。
  4. 向量存储 (Vector Store):存入数据库以便快速检索。
2. 在线检索生成 (Online Pipeline)
  1. 用户查询:接收用户 Prompt。
  2. 向量检索:将查询转化为向量,并在数据库中匹配最相关的 Context。
  3. Prompt 增强:将 Context + User Question 注入提示词模板。
  4. 最终生成:LLM 结合参考资料输出回答。

5.3 RAG vs. 微调 (Fine-tuning)

维度 RAG (检索增强) Fine-tuning (微调)
知识更新 实时更新(更新数据库即可) 滞后(需重新训练)
透明度 高(可追溯引用来源) 低(黑盒,存在幻觉风险)
数据量需求 无需训练数据,只需文档 需要高质量标注数据
实现成本 较低 较高(算力与人力成本)

5.4 关键技术栈推荐

  • 开发框架LangChain, LlamaIndex
  • 向量存储:Pinecone, Milvus, Chroma, Weaviate
  • 重排序 (Rerank):Cohere Rerank, BGE-Reranker
  • Embedding 模型:OpenAI text-embedding-3, HuggingFace BGE 系列

5.5 进阶优化策略 (Advanced RAG)

为了提升 RAG 的准确性,常见的优化手段包括:

  • Hybrid Search:结合关键词搜索(BM25)与向量搜索。
  • Query Transformation:对用户问题进行改写或多路拆解。
  • Reranking:对检索回来的初步结果进行二次精排,过滤无关噪声。
  • Context Compression:只保留 Context 中最关键的句子以节省 Token。

6. 实战2:英雄联盟游戏助手

分为两个环节执行:
1

图31、 创建LOL攻略知识库


1

图32、 让Agent应用知识库

6.1. 创建知识库

首先在Dify首页点击“知识库”,然后点击“创建知识库”:
1

图33、 创建知识库


然后在点击“选择文件”,选择实现准备好的“英雄联盟《芸阿娜》介绍.md”文档上传:
1

图34、 导入.md文档


没有“英雄联盟《芸阿娜》介绍.md”文档的可以自己新建一个.md文件(命名为“英雄联盟《芸阿娜》介绍.md”),然后将下面的文字粘贴进去:
## 英雄联盟《芸阿娜》介绍

“不破之誓・阿云娜”是英雄联盟在2025年最新V25.14版本上线的英雄,她来⾃艾欧尼亚,定位是依靠平A持续输出的ADC,在对线端她可以通过技能溅射效果⽆伤消耗,团战端也可以依靠⼤招带来的强化效果⼤杀四⽅,⾮常强⼒

## 1.基础技能介绍

被动技能“初⽣之誓”。芸阿娜在暴击时造成额外的魔法伤害,可与⽆尽之刃联动。Q技能“灵蕴拳”。被动获得魔法伤害加成,平A英雄获得2层“灵蕴”,其他单位获得1层,达到满层8层可主动释放技能,平A获得额外攻击速度并造成额外魔法伤害,并对平A⽬标周围散播额外伤害(可触发特效、暴击、⽣命偷取)。W技能“善恶轮”。扔出念珠,减速敌⼈并造成伤害,到达终点后炸开造成额外伤害。E技能“明踪步”。进⼊幽灵状态并获得移速加成,当靠近敌⽅英雄时移速还会进⼀步增加。R技能“定圣诀”。进⼊超凡形态,15秒内所有技能强化,Q技能常驻激活,W技能冷却减半且变为直线穿透伤害,E技能升级为位移并且冷却重置。

## 2.连招教学

对线消耗连招:通过平A⼩兵叠加“灵蕴”层数,利⽤Q的溅射效果和W减速技能拉扯敌⽅。团战连招:开启⼤招后,利⽤W减速敌⽅,同时使⽤E技能保持身位,持续平A输出。

## 3.芸阿娜装备搭配

出⻔装选择多兰剑和⾎瓶;第⼀件选择荒野剑,第⼆件选择迅刃,第三件选择⽆尽之刃;后续根据敌⽅阵容可选择重伤⼸和⼤穿⼸,敌⽅爆发多可选择盾⼸,敌⽅消耗技能多可选择饮⾎剑。

## 4.芸阿娜技能加点

优先升级R技能,然后主升级Q技能,副升级E技能,最后升级W技能。

## 5.芸阿娜适合搭配什么样的辅助

芸阿娜是典型的依靠普通攻击来输出的ADC,⾃身输出在中后期较强,适合搭配软辅⾛下路。⽐如露露、悠⽶、⻛⼥、卡尔玛、娜美都是⾮常好的选择。

## 6.芸阿娜符⽂选择

1.发育打团流。主系:致命节奏+⽓定神闲+⾎统+致命⼀击;副系:神奇鞋⼦+饼⼲;⼩符⽂:攻速+适应之⼒+固定⽣命值。2.对线爆发流。主系:强攻+⽓定神闲+⾎统+致命⼀击;副系:⾎之滋味+寻宝猎⼈;⼩符⽂:攻速+适应之⼒+固定⽣命值。

6.2. 知识库配置

依次按照下面的步骤执行:
1

图35、 分段设置和选择Embedding模型


在这里插入图片描述

图36、 选择混合检索并设置Top K数量为1


然后点击“保存并处理”:
1

图37、 创建知识库成功

6.3. 让Agent应用知识库

1、首先是在系统提示词中写入:

你是一个LOL游戏助手,专注于给玩家解释各种英雄的玩法攻略

2、然后添加知识库:
1

图38、 添加知识库


3、测试:
1

图39、 测试结果1


1

图40、 测试结果2


可以看到Agent通过检索知识库正确回答了问题!

7. Function Call

7.1 什么是 Function Calling?

Function Calling 是 LLM 连接外部世界的“桥梁”。它允许开发者向模型描述自定义的函数(工具),模型会根据用户的提问,智能地决定是否需要调用这些函数,并输出符合函数签名的 JSON 格式参数

核心逻辑:模型本身并不执行代码,它只是充当“决策大脑”,告诉程序:“为了回答这个问题,你应该用这些参数去运行这个函数。”


7.2 工作流程 (Workflow)

一个完整的 Function Calling 交互通常包含以下四个步骤:

  1. 定义函数:在 API 请求中,用 JSON Schema 描述你的函数(功能、参数名、参数类型)。
  2. 模型决策:LLM 分析用户需求。如果需要外部工具,它将返回一个 tool_calls 对象,包含函数名和提取的参数。
  3. 本地执行:你的应用程序解析 JSON,执行实际的代码逻辑(如查询数据库、调用天气 API)。
  4. 结果反馈:将函数的执行结果发回给 LLM,由它总结并生成最终的人类语言回答。

7.3 应用场景

  • 实时数据获取:例如查询股票走势、实时天气、新闻搜索。
  • 动作执行:例如“帮我发送一封邮件”、“把这个任务添加到我的日程表”。
  • 知识库交互:将结构化查询语句(SQL)的生成自动化。
  • 多工具协作:模型根据复杂任务序列化调用多个不同的函数。

7.4 代码示例 (JSON Schema)

在定义函数时,我们需要提供清晰的描述,以便模型理解何时使用它:

{
  "name": "get_current_weather",
  "description": "获取指定城市的实时天气",
  "parameters": {
    "type": "object",
    "properties": {
      "location": {
        "type": "string",
        "description": "城市名称,例如:北京"
      },
      "unit": {
        "type": "string", 
        "enum": ["celsius", "fahrenheit"]
      }
    },
    "required": ["location"]
  }
}

8. 实战3:天气查询助手

1

图41、 自定义插件基本流程

适用场景:个人开发者快速搭建天气查询插件,无需服务器,30分钟内完成
技术栈:FastAPI + localtunnel + Dify
最终效果:在Dify中通过自然语言查询天气,如"北京今天天气如何?"


8.1. FastAPI 服务搭建

8.1.1. 安装依赖

# 创建虚拟环境(推荐)
python -m venv weather-env
source weather-env/bin/activate  # Linux/Mac
# weather-env\Scripts\activate   # Windows

# 安装依赖
pip install fastapi uvicorn requests

8.1.2. 完整代码实现 (main.py)

from fastapi import FastAPI, Request, HTTPException
from pydantic import BaseModel
import requests

app = FastAPI()

# 身份验证令牌(个人使用,简单安全)
VALID_TOKEN = "itcast"

# 城市编码数据(直接硬编码,无需外部文件)
CITY_CODES = {
    "北京": "101010100",
    "上海": "101020100",
    "广州": "101280101",
    "深圳": "101280601",
    "杭州": "101210101",
    "成都": "101270101",
    "武汉": "101200101",
    "西安": "101110101",
    "南京": "101190101",
    "重庆": "101040100",
    "天津": "101030100",
    "苏州": "101190401",
    "郑州": "101180101",
    "长沙": "101250101",
    "青岛": "101120201",
    "大连": "101070201",
    "宁波": "101210401",
    "厦门": "101230201",
    "福州": "101230101",
    "济南": "101120101",
    "合肥": "101220101",
    "南昌": "101240101",
    "昆明": "101290101",
    "南宁": "101300101",
    "贵阳": "101260101",
    "哈尔滨": "101050101",
    "长春": "101060101",
    "沈阳": "101070101",
    "石家庄": "101090101",
    "太原": "101100101",
    "呼和浩特": "101080101",
    "乌鲁木齐": "101130101",
    "拉萨": "101140101",
    "兰州": "101110501",
    "西宁": "101150101",
    "银川": "101170101",
    "海口": "101310101",
    "三亚": "101310201"
}

class WeatherRequest(BaseModel):
    location: str

@app.post("/weather")
def get_current_weather(request: Request, body: WeatherRequest):
    """
    天气查询接口
    - 需要Authorization头认证
    - 返回自然语言格式的天气信息
    """
    # 1. 验证身份
    auth_header = request.headers.get("Authorization")
    if auth_header != f"Bearer {VALID_TOKEN}":
        raise HTTPException(status_code=403, detail="Invalid Authorization header")
    
    location = body.location
    
    # 2. 查找城市编码
    city_code = CITY_CODES.get(location)
    if not city_code:
        return {
            "status": "error",
            "message": f"请提供{location}对应的编码方可查询,目前支持的城市:{','.join(CITY_CODES.keys())}"
        }
    
    # 3. 调用天气API
    url = f"http://t.weather.itboy.net/api/weather/city/{city_code}"
    try:
        response = requests.get(url, timeout=10)
        response.raise_for_status()
        data = response.json()
    except Exception as e:
        return {"status": "error", "message": f"天气服务请求失败: {str(e)}"}
    
    # 4. 解析天气数据
    try:
        forecast = data["data"]["forecast"][0]
        weather_type = forecast["type"]
        high = forecast["high"].replace("高温 ", "")
        low = forecast["low"].replace("低温 ", "")
        temperature = f"{high}/{low}"
        
        # 5. 返回自然语言格式
        return f"{location}今天是{weather_type},温度{temperature}"
    except (KeyError, IndexError) as e:
        return {"status": "error", "message": f"天气数据解析失败: {str(e)}"}

# 启动入口
if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8081)

8.1.3. 启动服务

python main.py

✅ 预期输出:

INFO:     Uvicorn running on http://0.0.0.0:8081 (Press CTRL+C to quit)

8.2. 公网穿透配置

8.2.1. 安装 localtunnel

# 全局安装
npm install -g localtunnel

8.2.2. 启动穿透服务

# 新开一个终端窗口
lt --port 8081

✅ 预期输出:

your url is: https://random-name-123.loca.lt

复制这个URL(如 https://weather-api-abc123.loca.lt

⚠️ 重要:保持这个终端窗口开启,关闭后链接失效


8.3. 服务测试验证

Postman 测试

  1. 创建 POST 请求
  2. URL: https://your-url.loca.lt/weather
  3. Headers:
    • Authorization: Bearer itcast
    • Content-Type: application/json
  4. Body (raw, JSON):
    {"location": "广州"}
    

8.4. Dify 插件配置

8.4.1. OpenAPI 3.1.0 Schema

{
  "openapi": "3.1.0",
  "info": {
    "title": "天气查询API",
    "description": "查询中国城市当前天气信息",
    "version": "v1.0.0"
  },
  "servers": [
    {
      "url": "https://weather-api-abc123.loca.lt"
    }
  ],
  "paths": {
    "/weather": {
      "post": {
        "summary": "查询城市天气",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "location": {
                    "type": "string",
                    "description": "城市名称",
                    "example": "北京"
                  }
                },
                "required": ["location"]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "成功获取天气信息"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {},
    "securitySchemes": {
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer"
      }
    }
  }
}

8.4.2. Dify 插件创建步骤

  1. 登录 Dify 控制台
    • 访问 https://cloud.dify.ai
    • 选择你的工作空间
  2. 创建插件
    • 导航到 「插件」「创建插件」
    • 选择 「OpenAPI」 类型
    • 点击 「下一步」
  3. 配置 OpenAPI Schema
    • 将上面的 JSON Schema 完整复制到编辑器中
    • 关键步骤:替换 servers.url 为你的 localtunnel URL
      "servers": [
        {
          "url": "https://weather-api-abc123.loca.lt",  // ← 替换这里!
        }
      ]
      
  4. 配置认证
    • 在插件配置页面,找到 「Authentication」 部分
    • 选择 「Bearer Token」 类型
    • 「Value」 字段输入:itcast
    • 点击 「保存」
  5. 测试插件
    • 在测试区域输入:
      {
        "location": "深圳"
      }
      
    • 点击 「测试」 按钮
    • 预期结果:
      深圳今天是晴,温度33℃/27℃
      
  6. 启用插件
    • 点击 「发布」 按钮
    • 选择要启用该插件的 「应用」
    • 在应用中就可以使用天气查询功能了

8.5. 在 Dify 应用中使用

8.5.1. 创建支持天气查询的Agent

  1. 创建新应用或编辑现有应用
  2. 「上下文」 部分添加插件:
    你可以使用天气查询工具帮助用户获取天气信息。当用户询问天气时,调用天气插件。
    
  3. 「工具」 部分启用刚创建的天气插件

8.5.2. 测试对话

用户输入

北京今天天气怎么样?

Agent 回复

让我帮您查询北京的天气...
北京今天是多云,温度32℃/22℃

用户输入

上海明天会下雨吗?

Agent 回复

我只能查询当前天气,无法预测明天。当前上海的天气是:上海今天是晴,温度35℃/28℃

8.6. 故障排除指南

8.6.1. 常见问题及解决方案

问题现象 原因分析 解决方案
Reached maximum retries Dify无法访问localhost 必须使用公网URL,不能用localhost
{"detail":"Not Found"} 路由路径错误 检查代码中是@app.post("/weather")
403 Forbidden token不匹配 确认VALID_TOKEN = "itcast"和Dify配置一致
连接超时 localtunnel断开 重启lt --port 8081,更新Dify中的URL
城市未找到 城市不在CITY_CODES中 在代码中添加该城市编码

8.6.2. 快速诊断命令

# 1. 检查服务是否运行
lsof -i :8081  # Mac/Linux
netstat -ano \| findstr 8081  # Windows

# 2. 检查公网可达性
curl -I https://your-url.loca.lt

# 3. 完整测试命令
curl -X POST https://your-url.loca.lt/weather \
  -H "Authorization: Bearer itcast" \
  -H "Content-Type: application/json" \
  -d '{"location": "杭州"}'

8.7. 维护与优化建议

8.7.1. 临时方案(日常使用)

  • 保持终端开启:两个终端(FastAPI + localtunnel)需要一直运行
  • 每日重启:local tunnel 链接24小时后可能失效,每天重启一次
  • 快速更新URL:创建一个脚本自动更新Dify配置

8.7.2. 永久方案(推荐升级)

# 部署到免费云服务(Render.com示例)
# 1. 创建render.com账号
# 2. 创建Web Service
# 3. 连接GitHub仓库
# 4. 设置环境变量(如果需要)
# 5. 部署完成,获取永久URL

8.7.3. 功能扩展

  • 添加更多城市:在CITY_CODES字典中添加新城市
  • 丰富天气信息:返回湿度、风力等更多字段
  • 错误重试机制:添加请求重试逻辑
  • 缓存机制:避免频繁请求天气API

9. 实战4:跨境电商小助手

9.1. 创建知识库

跨境电商数据我放在了百度网盘中:https://pan.baidu.com/s/1Ok5BM9vyouMb4M8KNV1Lxw?pwd=ngy5
然后按照下面的方式配置数据库:
1

图42、 创建知识库

9.2. 搭建工作流

首先创建工作流:
1

图43、 创建工作流


然后完整流程查看黑马的.md文档(跨境电商小助手.md),我放在了百度网盘中:https://pan.baidu.com/s/1HqvIUK-i5POTCzZ9M06E4Q?pwd=7mzj
搭建好的工作流如下方所示:
1

图44、 完整工作流

10. 实战5:nlp2sql数据库查询助手(对话工作流)

10.1. 创建学生成绩表

在MYSQL中创建学生成绩表的流程(Mysql数据库操作.md)我放在了百度网盘中:https://pan.baidu.com/s/1pa4UiPt0cky-1vlcuSNzzQ?pwd=ydvn
创建完成后验证前10条记录:
1

图45、 验证数据库

10.2. NLP2SQL数据库查询图表工作流

NLP2SQL数据库查询图表工作流(学生成绩查询ChatFlow.md)我放在了百度网盘中:https://pan.baidu.com/s/1RkV2U9RGmwbMjAuLgrBuuQ?pwd=kxt6
按照这个markdown文档操作后得到的工作流如下图所示:
1

图46、 工作流前半部分


1

图47、 工作流后半部分

10.3. 测试

1

图48、 用户问题:查询全校各班级平均分情况


1

图49、 用户问题:查询高一(3)班学生成绩的占比

11. 总结

1

图50、 Dify-Agent总结

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐