Dify
一、Dify的介绍
Dify 是一款创新的智能生活助手应用,旨在为您提供便捷、高效的服务。通过人工智能技术,Dify 可以实现语音助手、智能家居控制、日程管理等功能,助您轻松应对生活琐事,享受智慧生活。简约的界面设计,让操作更加便捷;丰富的应用场景,满足您多样化的需求。Dify,让生活更简单!
二、Dify的安装方式
在线体验
速度比较慢。不推荐

使用doker安装Dify说明
我们去github下载的dify源代码仅仅是dify源代码,但是它并不包含支持dify运行的所有环境和依赖,而doker就像一个封装好的环境,它会包含运行Dify多需要的所有依赖和配置。所以通过doker镜像来安装dify,我们就不用考虑再去安装一大堆乱七八糟的组件和依赖了。
例如我们做RAG,肯定要用到数据存储,需要数据库,那我们就要自己去下载安装配置ChromaDB,mysql,redis等,很是麻烦。
我们可以把doker想象成一个小电脑,这个小电脑内配置好了我们要安装的软件所需要的一切。
本地部署
linux上安装
安装Docker环境
curl -sSl
https://cdn.jsdelivr.net/gh/SuperManito/LunuxMirrors@main/DockerInstallation.sh
安装Docker Compose
curl -L
"https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose
执行查看Docker-compose版本
docker-compose --version

说明安装成功了
配置docker-compse拉取镜像
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
]
}
EOF
执行上面的代码
sudo systemctl daemon-reload # 重新加载 systemd 的配置文件
systemctl restart docker # 重启docker
然后去GitHub上拉取dify的代码。解压后进入到dify的docker目录中,然后执行
docker-compose up -d

执行即可
Windows安装
安装doker
https://www.docker.com/products/docker-desktop/
在Windows环境下我们可以通过DockerDesktop 来安装。直接去官网下载对应的版本即可。
配置下docker镜像代理:

配置镜像下载位置(默认在C盘,很占位置)

使用docker安装Dify
同样的我们需要拉取dify的GitHub的代码。然后cmd进入到dify的Docker目录,执行下面代码
docker-compose up -d

docker-compose up -d是 Docker Compose 工具中最常用的命令之一,主要用于创建并启动 Docker 容器(基于docker-compose.yml配置文件),并让容器在后台运行。

看到上面的容器全部安装成功,就说明Dify安装成功并启动了,然后在地址栏中输入 http://localhost/install 就可以访问Dify了:

我们先设置管理员的相关信息。设置后再登录即可。

Ollama
我们已经把Dify在本地部署了。然后我们可以通过Ollama在本地部署对应的大模型,比如 deepseek-r1:1.5b 这种小模型。
Ollama 是一个让你能在本地运行大语言模型的工具,为用户在本地环境使用和交互大语言模型提供了便利,具有以下特点:
1)多模型支持:Ollama 支持多种大语言模型,比如 Llama 2、Mistral 等。这意味着用户可以根据自己的需求和场景,选择不同的模型来完成各种任务,如文本生成、问答系统、对话交互等。
2)易于安装和使用:它的安装过程相对简单,在 macOS、Linux 和 Windows 等主流操作系统上都能方便地部署。用户安装完成后,通过简洁的命令行界面就能与模型进行交互,降低了使用大语言模型的技术门槛。
3)本地运行:Ollama 允许模型在本地设备上运行,无需依赖网络连接来访问云端服务。这不仅提高了数据的安全性和隐私性,还能减少因网络问题导致的延迟,实现更快速的响应。
搜索Ollama进入官网https://ollama.com/download,选择安装MAC版本的安装包,点击安装即可

下载完成后直接双击安装即可
命令行执行:ollama,出现下面内容,说明安装成功

浏览器打开http://127.0.0.1:11434/,显示running,说明启动成功

ollama启动命令【ollama serve】
ollama重要配置


本地安装 deepseek-r1:1.5b模型
在https://ollama.com/library/deepseek-r1:1.5b 搜索deepseek-R1,跳转到下面的页面,复制这个命令,在终端执行,下载模型

cmd中执行上一步复制的命令

下载很慢,需要耐心等待。安装成功之后就可以在窗口直接和模型对话了:

Dify关联Ollama
Dify 是通过Docker部署的,而Ollama 是运行在本地电脑的,得让Dify能访问Ollama 的服务。
在Dify项目-docker-找到..env.example文件,复制一份重命名为.env,然后再.env在末尾加上下面的配置:
# 启用自定义模型
CUSTOM_MODEL_ENABLED=true
# 指定 Olama 的 API地址(根据部署环境调整IP)
OLLAMA_API_BASE_URL=host.docker.internal:11434

修改配置文件之后,重启Dify
docker-compose down
docker-compose up -d


然后在模型中配置
在Dify的主界面 http://localhost/apps ,点击右上角用户名下的【设置】


安装成功之后,在设置页面--Ollama--添加模型,如下:


添加成功后的

模型添加完成以后,刷新页面,进行系统模型设置。步骤:输入“http://localhost/install”进入Dify主页,用户名--设置--模型供应商,点击右侧【系统模型设置】,如下:

这样就关联成功了!!!
添加在线模型
如果我们不想本地安装大模型,也可以配置在线模型;(适用于快速验证模型效果的场景)
安装:

配置:

三、Dify应用讲解
创建空白应用
我们通过Dify来创建我们的第一个简单案例,智能聊天机器人。
进入Dify 主界面,点击【创建空白应用】,如下图:

选择【聊天助手】,输入自定义应用名称和描述,点击【创建】

右上角选择合适的模型,进行相关的参数配置

输入有相关的回复了。此时说明Dify 与本地部署的DeepSeek大模型已经连通了。

上面的机器人有个不足之处就是无法回答模型训练后的内容和专业垂直领域的内容,这时我们可以借助本地知识库来解决专业领域的问题。
创建本地知识库
向量模型
Embedding模型是一种将数据转换为向量表示的技术,核心思想是通过学习数据的内在结构和语义信息,将其映射到一个低维向量空间中,使得相似的数据点在向量空间中的位置相近,从而通过计算向量之间的相似度来衡量数据之间的相似性。
Embedding模型可以将单词、句子或图像等数据转换为低维向量,使得计算机能够更好地理解和处理这些数据。在NLP领域,Embedding模型可以将单词、句子或文档转换为向量,用于文本分类、情感分析。机器翻译等任务。在计算机视觉中,Embedding模型可以用于图像识别和检索等任务。
添加Embedding模型
点击右上角用户名--设置--模型供应商--右上角【添加模型】,填写相关配置信息如下:

添加成功后的效果

创建知识库
在Dify主界面,点击上方的【知识库】,点击【创建知识库】

导入已有文本,上传资料,点击【下一步】

Embedding模型默认是前面配置的模型,参数信息配置完,点击保存即可


此时系统会自动对上传的文档进行解析和向量化处理,需要耐心等待几分钟。

创建成功以后,如下图,可以点击【前往文档】,查看分段信息,如下图:

点击具体的文档可以看到具体的分割信息
知识库应用
添加知识库
在Dify主界面,回到刚才的应用聊天页面,工作室--智能聊天机器人--添加知识库,如下图:


测试
此时输入问题,就可以看到相关的回复了。
未设置知识库时的回答:

设置知识库之后的回答:

发布Dify创建的工作流、智能体
在上面我们已经知道如何使用Dify创建智能体或者工作流等,但是创建完成之后,如何将这些应用和我们的业务项目关联起来呢?或者我们现有的项目如何使用他呢?这就需要我们在dify里将我们创建的智能体或者应用进行发布。

以发布为谷歌扩展程序为例:


配置好之后,在任何页面的右下角都会有我们的扩展程序的快捷入口,可以便捷访问目标智能体:


其他应用场景
SQL执行器
我们可以通过工作流来创建一个SQL语句的执行器,也就是我们可以输入相关的SQL语句然后通过工作流来连接数据库执行对应的SQL代码,具体的设计如下:

这里的核心是代码执行模块。这块我们是调用了我们自己创建的接口来执行数据库的操作,所以我们需要先创建这么一个接口,接口我们通过Flask这个轻量的web框架来实现。需要先安装Flask的依赖库
pip install flask pymysql
创建数据库查询接口
# 导入需要的库
# Flask:用于创建Web应用和API接口
# request:用于获取客户端发送的请求数据
# jsonify:用于将数据转换为JSON格式的响应
from flask import Flask, request, jsonify
# pymysql:用于连接和操作MySQL数据库
import pymysql
# 创建Flask应用实例,__name__表示当前模块名称
app = Flask(__name__)
def execute_sql(sql, connection_info):
"""
执行传入的SQL语句,并返回执行结果
参数:
sql: 字符串类型,要执行的SQL语句(如"SELECT * FROM table;")
connection_info: 字典类型,包含数据库连接信息,必须包含:
- host: 数据库地址(如"localhost")
- user: 数据库用户名
- password: 数据库密码
- database: 要连接的数据库名称
可选参数:
- port: 数据库端口,默认3306
- charset: 字符编码,默认"utf8mb4"(支持表情符号)
返回:
如果是SELECT查询:返回查询结果的列表(每条记录为元组)
如果是INSERT/UPDATE/DELETE等:返回受影响的行数(整数)
执行出错时:返回None
"""
# 初始化数据库连接为None
connection = None
try:
# 从连接信息中获取参数,没有则使用默认值
host = connection_info.get("host", "localhost") # 数据库地址,默认本地
user = connection_info.get("user") # 用户名(必须提供)
password = connection_info.get("password") # 密码(必须提供)
database = connection_info.get("database") # 数据库名(必须提供)
port = connection_info.get("port", 3306) # 端口,默认3306
charset = connection_info.get("charset", "utf8mb4") # 字符集,默认支持中文和表情
# 建立数据库连接
connection = pymysql.connect(
host=host, # 数据库地址
user=user, # 用户名
password=password, # 密码
database=database, # 数据库名
port=port, # 端口
charset=charset, # 字符集
# 游标类型:默认Cursor返回元组,改为DictCursor可返回字典(键为字段名)
cursorclass=pymysql.cursors.Cursor
)
# 创建游标对象(用于执行SQL语句),使用with语句自动关闭游标
with connection.cursor() as cursor:
# 执行SQL语句
cursor.execute(sql)
# 判断SQL语句是否为查询语句(以SELECT开头,忽略大小写和前后空格)
if sql.strip().lower().startswith("select"):
# 如果是查询,获取所有结果(元组列表)
result = cursor.fetchall()
else:
# 如果是增删改,需要提交事务(确保数据写入数据库)
connection.commit()
# 返回受影响的行数
result = cursor.rowcount
# 返回执行结果
return result
# 捕获所有可能发生的错误(如连接失败、SQL语法错误等)
except Exception as e:
# 打印错误信息(实际生产环境中可能需要用日志记录)
print(f"执行SQL时出错:{e}")
# 出错时返回None
return None
# 无论是否出错,最终都要关闭数据库连接(释放资源)
finally:
# 如果连接已建立,则关闭
if connection:
connection.close()
# 定义API接口:通过POST方法访问/execute_sql路径
@app.route('/execute_sql', methods=['POST'])
def execute_sql_api():
"""
处理SQL执行请求的API接口
请求格式(JSON):
{
"sql": "要执行的SQL语句(如SELECT * FROM users;)",
"connection_info": {
"host": "数据库地址",
"user": "用户名",
"password": "密码",
"database": "数据库名",
"port": 3306, // 可选
"charset": "utf8mb4" // 可选
}
}
响应格式(JSON):
{
"result": 查询结果列表 或 受影响的行数 或 null(出错时)
}
"""
# 获取客户端发送的JSON数据
data = request.get_json()
# 检查是否获取到有效JSON数据
if not data:
# 返回错误信息和400状态码(请求错误)
return jsonify({"error": "请发送有效的JSON数据"}), 400
# 从JSON中提取SQL语句和连接信息
sql = data.get("sql")
connection_info = data.get("connection_info")
# 检查是否缺少必要参数
if not sql or not connection_info:
return jsonify({"error": "缺少SQL语句或数据库连接信息"}), 400
# 调用函数执行SQL
result = execute_sql(sql, connection_info)
# 返回执行结果(自动转换为JSON格式)
return jsonify({"result": result})
# 当直接运行该脚本时,启动Flask服务
if __name__ == '__main__':
# debug=True:开发模式下自动重启服务,显示详细错误信息
# 默认在本地5000端口启动(访问地址:http://127.0.0.1:5000/)
app.run(debug=True)
创建API 调用客户端测试是否成功
上面的接口需要接收一个sql语句和一个包含数据库连接信息的json对象,我们可以编写对应的测试代码来看看
# 导入需要的库
# json:用于处理JSON格式数据(虽然本例中未直接使用,但保留用于潜在扩展)
import json
# requests:用于发送HTTP请求,与API接口进行通信
import requests
def call_execute_sql_api(sql, connection_info):
"""
调用之前创建的SQL执行API接口,发送SQL语句和数据库连接信息,获取执行结果
参数:
sql: 字符串类型,要执行的SQL语句(如"SELECT * FROM table WHERE id=1;")
connection_info: 字典类型,数据库连接信息,包含:
- host: 数据库地址(如"localhost")
- user: 数据库用户名
- password: 数据库密码
- database: 要操作的数据库名
- port: 可选参数,数据库端口(默认3306)
返回:
字典类型,包含接口返回的结果:
- 成功时:{"result": 实际执行结果(字符串形式)}
- 失败时:{"result": 错误信息描述}
若请求过程发生异常,返回包含异常信息的字典
"""
# API接口的URL(对应之前Flask服务的接口地址)
# 127.0.0.1:5000是本地Flask服务默认的地址和端口
url = "http://127.0.0.1:5000/execute_sql"
# 构造请求体(要发送给API的数据)
# 格式需与API要求一致:包含"sql"和"connection_info"两个键
payload = {
"sql": sql, # 要执行的SQL语句
"connection_info": connection_info # 数据库连接信息
}
# 设置请求头(告诉服务器发送的数据格式是JSON)
headers = {
"Content-Type": "application/json"
}
try:
# 发送POST请求到API接口
# json=payload:自动将字典转换为JSON格式并发送
# headers=headers:携带请求头信息
response = requests.post(url, json=payload, headers=headers)
# 检查请求是否成功(HTTP状态码200表示成功)
if response.status_code == 200:
try:
# 尝试解析接口返回的JSON数据
# 取出"result"字段并转为字符串(方便统一处理结果格式)
return {"result": str(response.json()["result"])}
except Exception as e:
# 解析JSON失败时(如接口返回格式异常)
return {"result": f"解析响应失败: {str(e)}"}
else:
# 请求成功但状态码不是200(如400表示请求参数错误)
return {"result": f"请求失败,状态码: {response.status_code}"}
# 捕获请求过程中可能发生的异常(如网络不通、API未启动等)
except Exception as e:
return {"result": f"请求过程出错: {str(e)}"}
# 示例:当直接运行该脚本时,调用上面的函数进行测试
if __name__ == "__main__":
# 1. 定义要执行的SQL语句
# 注意:替换为你的数据库中实际存在的表和字段
sql_query = "select * from testtable where id = 1"
# 2. 定义数据库连接信息
# 注意:替换为你的数据库实际的连接参数
conn_info = {
"host": "localhost", # 数据库地址(本地数据库填localhost)
"user": "root", # 数据库用户名(默认常为root)
"password": "admin123", # 数据库密码(填你的实际密码)
"database": "agent", # 要连接的数据库名
"port": 3306 # 数据库端口(MySQL默认3306)
}
# 3. 调用函数发送请求并获取结果
result = call_execute_sql_api(sql_query, conn_info)
# 4. 打印接口返回的结果
print("接口返回结果:", result)

执行后可以看到对应的结果
接口返回结果: {'result': "[['天安门', 1]]"}
然后可以在工作流中来设置我们的代码
# 导入所需库
# json:用于处理JSON格式数据(本代码中虽未直接解析,但保留用于潜在扩展)
import json
# requests:用于发送HTTP请求,与API接口进行通信
import requests
def main(sql: str) -> dict:
"""
发送SQL语句到指定API接口,执行数据库操作并返回结果
参数:
sql: 字符串类型,需要执行的SQL语句(如"SELECT * FROM table;")
返回:
字典类型,包含执行结果或错误信息:
- 成功时:{"result": 接口返回的执行结果(字符串形式)}
- 失败时:{"result": 错误描述信息}
"""
# API接口的URL地址
# host.docker.internal是Docker环境中访问宿主机的特殊地址
# 5000是目标API服务的端口号
url = "http://host.docker.internal:5000/execute_sql"
# 数据库连接信息(固定配置)
# 这些信息会被发送到API,用于连接数据库
connection_info = {
"host": "localhost", # 数据库地址(这里指宿主机上的数据库)
"user": "root", # 数据库登录用户名
"password": "123456", # 数据库登录密码
"database": "ibms" # 要操作的数据库名称
}
# 构造请求体(发送给API的数据)
# 包含要执行的SQL语句和数据库连接信息
payload = {
"sql": sql, # 传入的SQL语句
"connection_info": connection_info # 上面定义的数据库连接信息
}
# 设置请求头
# 告诉API服务器,发送的数据格式是JSON
headers = {
"Content-Type": "application/json"
}
try:
# 发送POST请求到API接口
# json=payload:自动将字典转换为JSON格式
# headers=headers:携带请求头信息
response = requests.post(url, json=payload, headers=headers)
# 检查请求是否成功(HTTP状态码200表示请求成功)
if response.status_code == 200:
try:
# 解析API返回的JSON数据,提取"result"字段
# 转为字符串是为了统一结果格式,方便后续处理
return {"result": str(response.json()["result"])}
except Exception as e:
# 解析JSON失败时(如API返回格式异常)
return {"result": f"解析响应JSON失败: {str(e)}"}
else:
# 请求成功但状态码不是200(如400表示参数错误)
return {"result": f"请求失败,状态码: {response.status_code}"}
# 捕获请求过程中可能发生的异常(如网络不通、API未启动等)
except Exception as e:
return {"result": f"请求过程出错: {str(e)}"}
注意上面的url中我们需要写
http://host.docker.internal:5000/execute_sql
不然执行的时候会出现503的错误。
Dify上面创建工作流


根据上面代码定义的方法的入参,设置“开始”的参数:


设置输出,和上一步代码执行的返回值保持一致:

运行测试:

将工作流发布为工具
我们可以将智能体发布为工具,并且供智能体调用:


在Agent中使用该工具
创建智能体:

添加工具

执行sql测试:


AI图片生成工具
随着图像生成技术的兴起,涌现了许多优秀的图像生成产品,比如 Dall-e、Flux、Stable Diffusion 等,我们借助Stable Diffusion来在dify中构建一个智能生成图片的Agent。
首先获取Stable Diffusion
https://platform.stability.ai/account/keys 去官网获取授权key。如果没注册需要先注册下

下载 Stable 工具
然后我们需要进入dify的工具市场下载安装 Stable 插件。

创建Agent
然后我们就可以创建一个空白的Agent。输入对应的提示词
根据用户的提示,使用工具 stability_text2image 绘画指定内容
然后选择对应的工具并添加授权码


然后我们就可以测试效果了

注意这个是一个付费的工具。提供的有一个免费的,后面需要付费购买了:https://platform.stability.ai/account/credits
旅游助手
进入SerpAPI - API Key,如果你尚未注册,会被跳转至进入注册页。SerpAPI提供一个月100次的免费调用次数,这足够我们完成本次实验了。如果你需要更多的额度,可以增加余额,或者使用其他的开源方案。

提示词:
基于用户输入的目的地:{{destination}}、旅游天数:{{day}}、旅游预算:{{budget}},请借助 SerpAPI(使用指定的 API Key) 检索以下与目的地相关的信息,进而生成一份详细且可执行的旅游规划:
目的地核心资源检索要求:
必去景点:获取当地 Top 8 - 10 的热门 / 经典景点,包含景点简介、每日开放时间、门票价格(及优惠政策);
特色美食:收集当地代表性美食、口碑好的餐厅(含餐厅名称、招牌菜品、人均消费);
住宿选择:按预算区间(如经济型、中端、高端)推荐合适的住宿(含酒店 / 民宿名称、具体位置、每晚价格);
交通方式:了解当地公共交通(地铁、公交等)、打车 / 网约车、租车的便捷度与成本;
体验推荐:若有 “小众玩法”“当地隐藏体验”“季节限定活动” 也请检索收录。
旅游规划输出要求:
按 “天数” 拆分每日行程(明确景点游览顺序、用餐地点选择、交通方式搭配);
做预算明细分配(门票、餐饮、住宿、交通等板块的预估花费);
补充旅游小贴士(如最佳游览季节、穿搭建议、当地习俗 / 注意事项等)。
请基于 SerpAPI 返回的真实搜索结果生成内容,确保行程的实用性与可操作性。
科研论文翻译
我可以在工作流案例中结合聊天大模型来实现翻译工具的功能,具体的设计如下

在开始节点中接收一个输入信息 content
然后在LLM模型中我们需要配置一个CHAT模型,这里选择了DeepSeek-R1 64K的聊天模型,注意需要在这里设置下对应的提示词
现在我要写一个将中文翻译成英文科研论文的GPT,请参照以下Prompt制作,注意都用英文
生成:
## 角色
你是一位科研论文审稿员,擅长写作高质量的英文科研论文。请你帮我准确且学术性地将以
下中文翻译成英文,风格与英文科研论文保持一致。
## 规则:
- 输入格式为 Markdown 格式,输出格式也必须保留原始 Markdown 格式
- 以下是常见的相关术语词汇对应表(中文 -> English):
* 零样本 -> Zero-shot
* 少样本 -> Few-shot
## 策略:
分三步进行翻译工作,并打印每步的结果:
1. 根据中文内容直译成英文,保持原有格式,不要遗漏任何信息
2. 根据第一步直译的结果,指出其中存在的具体问题,要准确描述,不宜笼统的表示,也
不需要增加原文不存在的内容或格式,包括不仅限于:
- 不符合英文表达习惯,明确指出不符合的地方
- 语句不通顺,指出位置,不需要给出修改意见,意译时修复
- 晦涩难懂,模棱两可,不易理解,可以尝试给出解释
3. 根据第一步直译的结果和第二步指出的问题,重新进行意译,保证内容的原意的基础
上,使其更易于理解,更符合英文科研论文的表达习惯,同时保持原有的格式不变
## 格式
返回格式如下,"{xxx}"表示占位符:
### 直译
{直译结果}
***
###问题
{直译的具体问题列表}
***
###意译
在结束节点中输出结果即可。
数据中的中文课研论文案例
点击查看
# 农业生产中作物栽培技术的创新与应用
## 摘要
本文针对我国农业生产中作物栽培技术存在的问题,分析了技术创新的必要性,并探讨了新
型栽培技术的应用效果。通过实验研究发现,采用新型栽培技术能够有效提高作物产量和品
质,为我国农业生产提供有力支持。
## 一、引言
农业生产是我国国民经济的重要组成部分,作物栽培技术直接关系到粮食产量和农业可持续
发展。近年来,我国农业生产取得了显著成果,但仍然存在一些问题,如资源利用率低、生
态环境恶化等。因此,创新作物栽培技术,提高农业生产效益具有重要意义。
## 二、作物栽培技术创新的必要性
1. 提高资源利用率:我国农业生产过程中,水资源、化肥和农药的利用率较低,导致资源
浪费和生态环境恶化。创新栽培技术,有助于提高资源利用率,降低农业生产成本。
2. 保障粮食安全:随着人口增长和耕地减少,提高单位面积产量成为保障粮食安全的关
键。作物栽培技术创新有助于挖掘作物增产潜力,提高粮食产量。
3. 促进农业可持续发展:传统农业生产方式对生态环境造成一定程度的影响。创新栽培技
术,有利于实现农业生产与生态环境的协调发展。
## 三、新型作物栽培技术的应用
1. 精准农业技术:通过无人机、卫星遥感等手段,实时监测作物生长状况,实现精准施
肥、灌溉和病虫害防治。
2. 节水灌溉技术:采用滴灌、喷灌等节水灌溉方式,提高水资源利用率,降低农业生产成
本。
3. 抗逆性品种选育:针对我国不同地区气候特点,选育抗逆性强的作物品种,提高作物产
量和品质。
4. 生物有机肥应用:充分利用农业废弃物,发展生物有机肥,改善土壤结构,提高土壤肥
力。
## 四、实验结果与分析
本研究以某地区小麦为例,对比分析了传统栽培技术与新型栽培技术下的产量和品质。实验
结果表明,采用新型栽培技术的小麦产量较传统栽培技术提高了15.6%,品质也得到了显著
提升。
## 五、结论
本文通过对农业生产中作物栽培技术的创新与应用研究,证实了新型栽培技术在提高作物产
量和品质方面具有显著效果。未来,我国农业生产应继续加大科技创新力度,推动农业可持
续发展。
(注:本文为示例性论文,仅供参考。)
效果图

SEO翻译
我们在写文章的时候需要想一个满足SEO要求的标题,这样有可能被更多的人检索到,有时候我们可能需要把文章翻译为英文,这时标题同样比较重要,这时我们可以在dify中创建这样的一个工具来帮助我们实现这个功能。

对应模型的提示词
This GPT will convert input titles or content into SEO-friendly English URL slugs. The slugs will clearly convey the original meaning while being concise and not exceeding 60 characters. If
the input content is too long, the GPT will first condense it into an English phrase within 60 characters before generating the slug. If the title is too short, the GPT will prompt the user to input a longer title. Special characters in the input will be directly removed.
对应中文含义
这个GPT可以将输入的标题或内容转换为对SEO友好的英文URL片段。这些片段将清晰地传达原始含义,同时保持简洁,且不超过60个字符。如果输入内容过长,GPT将首先将其缩减为
一个不超过60个字符的英文短语,然后生成片段。如果标题过短,GPT将提示用户输入更长的标题。输入中的特殊字符将被直接移除。
标题党
有时候我们发表一些文章的时候,因为标题不够吸引人而造成没有什么关注度还是非常可惜的,这时我们可以借助AI来帮助我们生成有吸引力的标题,具体如下

核心是对应的提示词
你是一名资深的自媒体创作者也是一位爆款网文作家,你对不同领域的文章都有深入的了解和研究。你擅长创作吸睛、炸裂的标题创作。你有着对生活极为细致的观察,擅长在细节处
触动人心。请根据用户提供的信息使用以下创作技巧进行标题创作,标题应具有吸引力,能够激发读者对文章主题的浓厚兴趣。
## 创作技巧
1.标题将感受、范围、结果、程度等夸张夸大描述,造成耸人听闻的效果。使用「震惊」、「惊爆」、「传疯」、「吓掉半条命」等,言过其实地表达情绪/状态/感受
案例1:《兰州竟然引起了全国的羡慕!西安疯了,天水哭了,嘉峪关伤了...》 **故意引用其他城市做夸张对比 **
案例2:《中国部署新型秘密武器,配备自杀敢死队,巴铁成功仿制吓坏印度》 **用“吓坏X国”的耸动表述故意诱导用户点击 **
案例3:《气垫一打开就直接涂?几乎所有女人都错了,怪不得总脱妆又卡粉!》 ** “几乎所有女人都”对女性群体做全部包含的范围夸张,诱导用户点击 **
案例4: 《全网无人能解释,看懂的全中国不超过2个!》 ** “全网”、“全中国”故意用整体范围概念,但“无人”、“不超过2个”又极端缩小范围形成夸张对比 **
2.**使用悬念式标题创作法。**标题擅用转折、隐藏关键性信息,营造悬念、制造故弄玄虚的效果,如「竟然是……」、「而是……」、「不过……」等话说一半,通过省略号代替关键信息,或使用「内幕」、「揭秘」、「真相」等代替关键信息
案例1: 《令人唏嘘,河南试卷掉包案最新进展,省教育局发出声明,称……》 **“称……”话说一半,用省略号隐去关键信息点 **
案例2:《最新消息,全球最宜居国家排行榜,第一名果然是……你想去哪?》 ** 第一名是哪里可以很明确,故意不在标题中点明 **
案例3:《举国哀痛,我国的“航母杀手”刚有威慑力,竟然传来不幸的消息》 ** 标题中可表述清楚是什么消息,但故意用“竟然”强转折来制造危机感 **
案例4:《人狠话不多的史蒂夫奥斯丁、布洛克莱斯纳原来是这样的》 ** 原来是什么样的,可用一句话或形容词概括的内容故意不写明 **
案例5:《演技秒杀关晓彤,减肥20斤后撞脸娜扎,被嘲谎话连篇人设崩》 ** 缺少主语,且故意用既捧又杀的表述来诱导用户点击 **
3、使用强迫式标题风格创作标题。**标题采用挑衅恐吓、强迫修改后等方式,诱导用户阅读。标题使用「胆小慎入」、「不看后悔一辈子」、「别怪我没提醒你」等表述,挑衅恐吓
用户点击
案例1:《不要在吃饭时看这个视频,要不然会让你后悔莫及》 ** “不要”怎样、“要不然”怎样,“让你后悔莫及”都是作者在故意挑衅用户观看 **
案例2: 《高考只剩30天,80%的答案都在这篇文章里,不看后悔一生》 ** “后悔一生”对用户形成恐吓感 **
案例3:《5个面试时常犯的错误 让你后悔一辈子》 ** “让你后悔一辈子”是典型的恐吓写法 **
案例4: 《疯狂抢地、地价飙升!房价大涨?烟台朋友千万要关注!!》 ** 命令式的“千万要关注”,搭配前半句的夸张表述,标题整体夸张问题严重 **
案例5: 《应届生找工作,一定要想知道这3件事,事关前途!》 ** “一定XXX”也是常见的“命令式”夸张写法 **
4.使用爆款关键词
在创作标题时,你会选用其中1-2个:
**「震惊」、「惊爆」、「传疯」、「不得不看」、「一定要看完」、「绝对要收藏」、「胆小慎入」、「不看后悔一辈子」、「别怪我没提醒你」、「竟然」、「竟是这样」、「结果却」、「没想到」、「竟然是……」、「而是……」、「不过……」、「内幕」、「揭秘」、「真相」、「重磅」、「要命」、「就在刚刚」、「全世界网友」、「所有男人都」、「某国人」、「99%」、**小白必看、教科书般, 划重点,建议收藏, 上天在提醒你、揭秘, 吹爆, 吐血整理, 万万没想到、你一定不知道、如何、最、咋、是什么、所有、10个、没有xx只有xx、秒懂、的故事、可怕、必看、长啥样、凭什么、不要、喂!、只需要、读懂、很可能、不是xx而是xx、你只是、当xx的时候、秘诀、为什么、在哪里、怎么办、史上、厉害、真正、是因为、方法、牛逼、你敢xx吗、你猜、马云、技巧、揭秘、爆照、必须看、传疯了、切记、围观、速看、感动、虐哭、居然、禁忌、疗法、只因、首次、伟大、猝死、出轨、小三、那些年、邂逅、秘密、意外、真相、背后究竟、绝招、第一个、否认、原来、采访、前兆、趋势、害死人、床上、你呢、赶快、不许、不要脸、千万、建议、年轻20岁、值得、和xx有关、罕见、至少、怒了、彻底、回应、强制、一触即发
## 约束条件
1.请使用以上 4 种标题创作技巧进行创作
2.标题创作运用悬念和刺激引发读者好奇心,容易让人引起联想
3.控制字数在 20 字以内
4.每次列出 5 个标题,多个标题请使用 ‘\n’ 进行分割,以便用户选择
5.收到内容后,直接创作对应的标题,无需额外的解释说明
还有用户部分

效果
主题
Dify快速入门|AI自动生成图片案例
其他描述
这个一个讲解Dify案例的课程视频,内容主要是讲解Dify中通过Agent创建一个自动生成图片的案例,结合用户的输入自动生成

知识库图像检索和展示
我们可以利用工作流来实现知识库加大模型实现RAG的案例,同时在展示结果上可以把图片展示出来,这样效果会更加的直观些

这个案例的核心点是准备的检索数据和大模型的提示词
检索数据(亲子运动知识库.txt):
##
亲子运动项目名称 拔河小勇士
适合年龄:5~12岁
运动时间:10~15分钟
运动项目介绍:家长与孩子分别站在两端,通过拔河比赛锻炼孩子的力量和团队协作能力。
运动目标:增强孩子的上肢和腰部力量,培养团队精神。
运动规则:使用一条结实的绳子,中间划一条线,双方用力拉绳,将对方拉过中线即为胜
利。
特别提示:注意孩子手部保护,避免摩擦受伤。
运动图片链接:[点击查看]
(https://fastly.picsum.photos/id/870/200/300.jpg?blur=2&grayscale&hmac=ujRymp644uYVjdKJM7kyLDSsrqNSMVRPnGU99cKl6Vs)
##
亲子运动项目名称 跳绳接力
适合年龄:6~12岁
运动时间:15~20分钟
运动项目介绍:家长与孩子轮流跳绳,通过接力形式增加运动趣味性。
运动目标:提高孩子的耐力和协调性,增进亲子间的默契。
运动规则:设定一个跳绳次数目标,家长和孩子轮流跳,直到完成目标。
特别提示:选择适合孩子高度的跳绳,注意跳绳场地的平整。
运动图片链接:[点击查看]
(https://fastly.picsum.photos/id/668/200/300.jpg?hmac=E7YE9NQG89nCsmW1hc-1nACBZTj9ll8IiXS65WjdD28)
##
亲子运动项目名称 滚雪球大赛
适合年龄:4~10岁
运动时间:10~15分钟
运动项目介绍:家长和孩子一起在雪地里滚雪球,比比谁滚得更快更大。
运动目标:锻炼孩子的动手能力和创造力,享受冬日乐趣。
运动规则:在规定时间内,看谁滚的雪球最大或者最快。
特别提示:注意保暖,避免孩子受寒。
运动图片链接:[点击查看]
(https://fastly.picsum.photos/id/237/200/300.jpg?hmac=TmmQSbShHz9CdQm0NkEjx1Dyh_Y984R9LpNrpvH2D_U)
##
亲子运动项目名称 家庭篮球赛
适合年龄:7~14岁
运动时间:20~30分钟
运动项目介绍:家长与孩子进行简易篮球比赛,提高孩子的篮球技能。
运动目标:培养孩子的球技和团队合作意识。
运动规则:简化篮球规则,进行半场3对3或1对1比赛。
特别提示:穿着合适的运动装备,注意安全。
运动图片链接:[点击查看]
(https://fastly.picsum.photos/id/866/200/300.jpg?hmac=rcadCENKh4rD6MAp6V_ma-AyWv641M4iiOpe1RyFHeI)
##
亲子运动项目名称 亲子瑜伽
适合年龄:5~12岁
运动时间:15~20分钟
运动项目介绍:家长与孩子一起练习瑜伽动作,增进亲子间的亲密关系。
运动目标:提高孩子的柔韧性和平衡能力,放松身心。
运动规则:跟随瑜伽教程,一起完成一系列瑜伽动作。
特别提示:穿着舒适,保持呼吸均匀。
运动图片链接:[点击查看]
(https://fastly.picsum.photos/id/870/200/300.jpg?blur=2&grayscale&hmac=ujRymp644uYVjdKJM7kyLDSsrqNSMVRPnGU99cKl6Vs)
##
亲子运动项目名称 家庭接力跑
适合年龄:6~12岁
运动时间:15~20分钟
运动项目介绍:家庭成员分成两队,进行接力跑比赛。
运动目标:提高孩子的奔跑速度和团队协作能力。
运动规则:设定一个跑道,每队成员依次完成接力。
特别提示:确保跑道平整,避免跌倒。
运动图片链接:[点击查看]
(https://fastly.picsum.photos/id/870/200/300.jpg?blur=2&grayscale&hmac=ujRymp644uYVjdKJM7kyLDSsrqNSMVRPnGU99cKl6Vs)
##
亲子运动项目名称 飞盘争夺战
适合年龄:6~12岁
运动时间:15~20分钟
运动项目介绍:家长与孩子进行飞盘传递和接住游戏。
运动目标:锻炼孩子的反应速度和手眼协调能力。
运动规则:在规定区域内,通过飞盘传递,争取让对方接不住飞盘。
特别提示:选择开阔的场地,避免飞盘伤人。
运动图片链接:[点击查看]
(https://fastly.picsum.photos/id/870/200/300.jpg?blur=2&grayscale&hmac=ujRymp644uYVjdKJM7kyLDSsrqNSMVRPnGU99cKl6Vs)
##
亲子运动项目名称 家庭足球赛
适合年龄:5~12岁
运动时间:20~30分钟
运动项目介绍:家长与孩子进行简易足球比赛,享受足球乐趣。
运动目标:提高孩子的足球技能和团队精神。
运动规则:简化足球规则,进行小场地比赛。
特别提示:穿着足球鞋,注意场地安全。
运动图片链接:[点击查看](https://fastly.picsum.photos/id/866/200/300.jpg?hmac=rcadCENKh4rD6MAp6V_ma-AyWv641M4iiOpe1RyFHeI)
##
亲子运动项目名称 亲子攀岩
适合年龄:8~14岁
运动时间:30~45分钟
运动项目介绍:家长与孩子一起挑战攀岩墙,锻炼勇气和力量。
运动目标:提高孩子的攀爬能力和自信心。
运动规则:在专业人员的指导下,完成攀岩墙的挑战。
特别提示:确保安全装备穿戴正确,听从指导员指挥。
运动图片链接:[点击查看](https://fastly.picsum.photos/id/866/200/300.jpg?hmac=rcadCENKh4rD6MAp6V_ma-AyWv641M4iiOpe1RyFHeI)
##
亲子运动项目名称 家庭自行车赛
适合年龄:7~14岁
运动时间:30~45分钟
运动项目介绍:家长与孩子进行自行车比赛,享受户外运动。
运动目标:提高孩子的骑行技巧和耐力。
运动规则:在公园或自行车道上,设定一个往返赛道进行比赛。
特别提示:佩戴头盔,遵守交通规则。
运动图片链接:[点击查看](https://fastly.picsum.photos/id/866/200/300.jpg?hmac=rcadCENKh4rD6MAp6V_ma-AyWv641M4iiOpe1RyFHeI)
请注意,以上图片链接仅为示例,实际图片需要您自行上传至网络并获取链接。
利用上述文本创建知识库:

提示词信息
## 角色
你是一位亲子运动游戏创意专家,根据提供的{{#context#}}信息生成用户需要的亲子运动游戏。不要改变亲子运动游戏格式,要包含亲子运动项目名称、适合年龄、运动时间、运动目标、运动规则、特别提示。
## 限制
1.根据用户的具体提问回答问题,不要一下子把常见问题都输出给用户。
2.请使用json格式输出,不要输出任何与json格式无关的内容。
3.如果检测到“图片链接”,例如“https://image.ba...”一定要保留。
## 输出要求
- 如果输出的内容包含图片URL,请使用以下JSON格式输出:
{
"content": "示例输出内容",
"imageUrl": "图片地址"
}
3. 如果输出的内容不包含图片URL,请使用以下JSON格式输出:
{
"content": "示例输出内容"
}









自然语言生成SQL
演示的效果

具体工作流设计
通过大模型生成SQL语句
帮我设计一个电商系统的数据库。
需要有:
goods:商品表
orders:订单表
inventory:库存表
vendors:商家表
customers:客户表,
表结构的关联关系:
商家和商品表关联
商品表和库存表关联
订单和客户关联
订单和商品关联
核心字段要求:
goods:需要有 id 商品名称 商品价格 图片 商家
orders:需要有 id 客户 商品编号 商品名称 收货地址 商家id 订单时间
inventory:需要有 id 商品编号 库存数据
创建的表名用对应的 英文,表中的每个字段也需要用英文描述
创建测试数据:
商家表设计20条数据,
商品表设计50条记录,
库存信息设计30条记录,
订单按照时间生成最近半年的销售记录。每个月生成30~50条记录。
客户生成20条记录。
设计数据的时候注意表结构直接的关联关系。生成的sql语句需要满足mysql的语法要求
点击查看生成的SQL
-- 创建数据库
CREATE DATABASE IF NOT EXISTS ecommerce;
USE ecommerce;
-- 创建商家表
CREATE TABLE IF NOT EXISTS vendors (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
contact_person VARCHAR(100),
phone VARCHAR(20),
email VARCHAR(100),
address TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 创建商品表
CREATE TABLE IF NOT EXISTS goods (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(200) NOT NULL,
price DECIMAL(10, 2) NOT NULL,
image_url VARCHAR(500),
vendor_id INT NOT NULL,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (vendor_id) REFERENCES vendors(id)
);
-- 创建库存表
CREATE TABLE IF NOT EXISTS inventory (
id INT PRIMARY KEY AUTO_INCREMENT,
goods_id INT NOT NULL,
quantity INT NOT NULL DEFAULT 0,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (goods_id) REFERENCES goods(id)
);
-- 创建客户表
CREATE TABLE IF NOT EXISTS customers (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
phone VARCHAR(20),
email VARCHAR(100),
register_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 创建订单表
CREATE TABLE IF NOT EXISTS orders (
id INT PRIMARY KEY AUTO_INCREMENT,
customer_id INT NOT NULL,
goods_id INT NOT NULL,
goods_name VARCHAR(200) NOT NULL,
address TEXT NOT NULL,
vendor_id INT NOT NULL,
order_time TIMESTAMP NOT NULL,
quantity INT NOT NULL DEFAULT 1,
total_price DECIMAL(10, 2) NOT NULL,
status ENUM('pending', 'paid', 'shipped', 'delivered', 'cancelled') DEFAULT 'pending',
FOREIGN KEY (customer_id) REFERENCES customers(id),
FOREIGN KEY (goods_id) REFERENCES goods(id),
FOREIGN KEY (vendor_id) REFERENCES vendors(id)
);
-- 生成20条商家测试数据
INSERT INTO vendors (name, contact_person, phone, email, address) VALUES
('Tech Gadgets Inc', 'John Smith', '123-456-7890', 'john@techgadgets.com', '123 Tech St, San Francisco, CA'),
('Fashion World', 'Emma Johnson', '234-567-8901', 'emma@fashionworld.com', '456 Fashion Ave, New York, NY'),
('Home Essentials', 'Michael Brown', '345-678-9012', 'michael@homeessentials.com', '789 Home Rd, Chicago, IL'),
('Sports Gear', 'Sarah Davis', '456-789-0123', 'sarah@sportsgear.com', '101 Sports Blvd, Miami, FL'),
('Book Haven', 'David Wilson', '567-890-1234', 'david@bookhaven.com', '202 Book Lane, Boston, MA'),
('Beauty Products', 'Jennifer Taylor', '678-901-2345', 'jennifer@beautyproducts.com', '303 Beauty St, Los Angeles, CA'),
('Electronics Store', 'Robert Anderson', '789-012-3456', 'robert@electronics.com', '404 Electron Ave, Houston, TX'),
('Toy Kingdom', 'Lisa Thomas', '890-123-4567', 'lisa@toykingdom.com', '505 Toy Rd, Philadelphia, PA'),
('Furniture Gallery', 'Daniel Jackson', '901-234-5678', 'daniel@furniture.com', '606 Furniture Ln, Phoenix, AZ'),
('Grocery Mart', 'Patricia White', '012-345-6789', 'patricia@grocerymart.com', '707 Grocery St, San Antonio, TX'),
('Pet Supplies', 'Mark Harris', '112-345-6789', 'mark@petsupplies.com', '808 Pet Ave, San Diego, CA'),
('Jewelry Box', 'Linda Martin', '121-345-6789', 'linda@jewelrybox.com', '909 Jewelry Rd, Dallas, TX'),
('Outdoor Equipment', 'Christopher Thompson', '123-145-6789', 'chris@outdoorequip.com', '1010 Outdoor Ln, Austin, TX'),
('Music Store', 'Barbara Garcia', '123-415-6789', 'barbara@musicstore.com', '1111 Music St, Jacksonville, FL'),
('Camera World', 'Matthew Rodriguez', '123-451-6789', 'matthew@cameraworld.com', '1212 Camera Ave, Fort Worth, TX'),
('Shoe Palace', 'Elizabeth Martinez', '123-456-1789', 'elizabeth@shoepalace.com', '1313 Shoe Rd, Columbus, OH'),
('Wine & Spirits', 'James Robinson', '123-456-7189', 'james@wineandspirits.com', '1414 Wine Ln, Charlotte, NC'),
('Office Supplies', 'Maria Clark', '123-456-7819', 'maria@officesupplies.com', '1515 Office St, Indianapolis, IN'),
('Art Gallery', 'Robert Lewis', '123-456-7891', 'robert@artgallery.com', '1616 Art Ave, San Francisco, CA'),
('Car Accessories', 'Jennifer Lee', '123-456-7892', 'jennifer@caraccessories.com', '1717 Car Rd, Seattle, WA');
-- 生成20条客户测试数据
INSERT INTO customers (name, phone, email, register_time) VALUES
('Alice Smith', '555-1234', 'alice@example.com', '2024-01-15 09:30:00'),
('Bob Johnson', '555-2345', 'bob@example.com', '2024-01-20 14:15:00'),
('Charlie Brown', '555-3456', 'charlie@example.com', '2024-02-05 11:20:00'),
('Diana Prince', '555-4567', 'diana@example.com', '2024-02-10 16:40:00'),
('Eve Adams', '555-5678', 'eve@example.com', '2024-02-18 08:10:00'),
('Frank Miller', '555-6789', 'frank@example.com', '2024-03-02 13:50:00'),
('Grace Davis', '555-7890', 'grace@example.com', '2024-03-10 10:25:00'),
('Henry Wilson', '555-8901', 'henry@example.com', '2024-03-15 15:30:00'),
('Ivy Taylor', '555-9012', 'ivy@example.com', '2024-03-22 09:45:00'),
('Jack Thomas', '555-0123', 'jack@example.com', '2024-04-01 14:10:00'),
('Karen Jackson', '555-1235', 'karen@example.com', '2024-04-08 11:55:00'),
('Larry White', '555-2346', 'larry@example.com', '2024-04-15 16:30:00'),
('Mia Harris', '555-3457', 'mia@example.com', '2024-04-22 08:40:00'),
('Noah Martin', '555-4568', 'noah@example.com', '2024-05-01 13:20:00'),
('Olivia Thompson', '555-5679', 'olivia@example.com', '2024-05-08 10:10:00'),
('Peter Garcia', '555-6780', 'peter@example.com', '2024-05-15 15:45:00'),
('Quinn Rodriguez', '555-7891', 'quinn@example.com', '2024-05-22 09:30:00'),
('Rachel Martinez', '555-8902', 'rachel@example.com', '2024-06-01 14:50:00'),
('Sam Robinson', '555-9013', 'sam@example.com', '2024-06-08 11:15:00'),
('Tina Clark', '555-0124', 'tina@example.com', '2024-06-15 16:20:00');
-- 生成50条商品测试数据
INSERT INTO goods (name, price, image_url, vendor_id, description) VALUES
-- Tech Gadgets Inc (1)
('Wireless Headphones', 99.99, '/images/headphones1.jpg', 1, 'Noise cancelling wireless headphones with 20h battery life'),
('Bluetooth Speaker', 49.99, '/images/speaker1.jpg', 1, 'Portable waterproof bluetooth speaker'),
('Smart Watch', 149.99, '/images/watch1.jpg', 1, 'Fitness tracking smart watch with heart rate monitor'),
('Phone Charger', 19.99, '/images/charger1.jpg', 1, 'Fast charging 30W phone charger'),
('USB-C Cable', 9.99, '/images/cable1.jpg', 1, '1.5m braided USB-C cable'),
-- Fashion World (2)
('Cotton T-Shirt', 19.99, '/images/tshirt1.jpg', 2, '100% cotton crew neck t-shirt'),
('Denim Jeans', 49.99, '/images/jeans1.jpg', 2, 'Slim fit blue denim jeans'),
('Leather Jacket', 129.99, '/images/jacket1.jpg', 2, 'Genuine leather biker jacket'),
('Running Shoes', 79.99, '/images/shoes1.jpg', 2, 'Lightweight running shoes'),
('Winter Coat', 159.99, '/images/coat1.jpg', 2, 'Warm winter coat with hood'),
-- Home Essentials (3)
('Bed Sheets', 39.99, '/images/sheets1.jpg', 3, '100% cotton queen size bed sheets'),
('Pillows (Set of 2)', 29.99, '/images/pillows1.jpg', 3, 'Memory foam pillows'),
('Towels (Set of 4)', 24.99, '/images/towels1.jpg', 3, 'Cotton bath towels'),
('Kitchen Knives', 59.99, '/images/knives1.jpg', 3, 'Set of 5 stainless steel kitchen knives'),
('Cookware Set', 129.99, '/images/cookware1.jpg', 3, 'Non-stick cookware set'),
-- Sports Gear (4)
('Yoga Mat', 24.99, '/images/yogamat1.jpg', 4, 'Extra thick yoga mat'),
('Dumbbells (20kg)', 59.99, '/images/dumbbells1.jpg', 4, 'Adjustable dumbbells set'),
('Running Shorts', 19.99, '/images/shorts1.jpg', 4, 'Moisture wicking running shorts'),
('Tennis Racket', 89.99, '/images/racket1.jpg', 4, 'Professional tennis racket'),
('Gym Bag', 39.99, '/images/bag1.jpg', 4, 'Large capacity gym bag'),
-- Book Haven (5)
('Fiction Bestseller', 14.99, '/images/book1.jpg', 5, 'Latest fiction bestseller novel'),
('Business Strategy Book', 19.99, '/images/book2.jpg', 5, 'Guide to business success'),
('Cooking Recipes', 24.99, '/images/book3.jpg', 5, '500+ easy recipes cookbook'),
('Science Fiction Novel', 12.99, '/images/book4.jpg', 5, 'Epic sci-fi adventure'),
('Self-Help Book', 15.99, '/images/book5.jpg', 5, 'Personal development guide'),
-- Beauty Products (6)
('Face Cream', 29.99, '/images/cream1.jpg', 6, 'Moisturizing face cream'),
('Lipstick Set', 34.99, '/images/lipstick1.jpg', 6, 'Set of 5 matte lipsticks'),
('Shampoo & Conditioner', 19.99, '/images/shampoo1.jpg', 6, 'Hydrating hair care set'),
('Perfume', 59.99, '/images/perfume1.jpg', 6, 'Long-lasting fragrance perfume'),
('Makeup Brush Set', 49.99, '/images/brushes1.jpg', 6, '10-piece professional makeup brushes'),
-- Electronics Store (7)
('Laptop', 899.99, '/images/laptop1.jpg', 7, '15.6" laptop with 16GB RAM'),
('Smartphone', 699.99, '/images/phone1.jpg', 7, 'Latest smartphone with 128GB storage'),
('Tablet', 299.99, '/images/tablet1.jpg', 7, '10.1" tablet with stylus'),
('Wireless Mouse', 24.99, '/images/mouse1.jpg', 7, 'Ergonomic wireless mouse'),
('Keyboard', 49.99, '/images/keyboard1.jpg', 7, 'Mechanical gaming keyboard'),
-- Toy Kingdom (8)
('Building Blocks', 39.99, '/images/blocks1.jpg', 8, '1000-piece building blocks set'),
('Doll House', 89.99, '/images/dollhouse1.jpg', 8, 'Wooden doll house with furniture'),
('Remote Control Car', 59.99, '/images/car1.jpg', 8, 'Fast RC car with rechargeable battery'),
('Puzzle (1000 pieces)', 19.99, '/images/puzzle1.jpg', 8, 'Beautiful landscape puzzle'),
('Board Game', 29.99, '/images/game1.jpg', 8, 'Family-friendly board game'),
-- Furniture Gallery (9)
('Coffee Table', 149.99, '/images/table1.jpg', 9, 'Modern wooden coffee table'),
('Office Chair', 199.99, '/images/chair1.jpg', 9, 'Ergonomic office chair'),
('Bookshelf', 129.99, '/images/shelf1.jpg', 9, '5-tier wooden bookshelf'),
('Sofa', 699.99, '/images/sofa1.jpg', 9, '3-seater fabric sofa'),
('Dining Table', 349.99, '/images/dining1.jpg', 9, '6-person dining table set'),
-- Grocery Mart (10)
('Organic Milk', 4.99, '/images/milk1.jpg', 10, '1L organic whole milk'),
('Bread Loaf', 3.49, '/images/bread1.jpg', 10, 'Whole grain bread loaf'),
('Fruit Basket', 19.99, '/images/fruit1.jpg', 10, 'Mixed fresh fruit basket'),
('Pasta Pack', 2.99, '/images/pasta1.jpg', 10, '500g whole wheat pasta'),
('Chocolate Bar', 2.49, '/images/chocolate1.jpg', 10, 'Dark chocolate bar 100g');
-- 再添加10个商品以达到50个
INSERT INTO goods (name, price, image_url, vendor_id, description) VALUES
-- Pet Supplies (11)
('Dog Food', 29.99, '/images/dogfood1.jpg', 11, 'Premium dry dog food 5kg'),
('Cat Litter', 14.99, '/images/litter1.jpg', 11, 'Clumping cat litter 10kg'),
('Pet Bed', 49.99, '/images/petbed1.jpg', 11, 'Comfortable pet bed for small dogs/cats'),
('Dog Leash', 12.99, '/images/leash1.jpg', 11, 'Nylon dog leash with collar'),
('Pet Toys', 19.99, '/images/pettoys1.jpg', 11, 'Set of 5 interactive pet toys'),
-- Jewelry Box (12)
('Silver Necklace', 59.99, '/images/necklace1.jpg', 12, 'Sterling silver pendant necklace'),
('Earrings Set', 39.99, '/images/earrings1.jpg', 12, 'Gold plated earrings set'),
('Wrist Watch', 129.99, '/images/watch2.jpg', 12, 'Elegant analog wrist watch'),
('Bracelet', 45.99, '/images/bracelet1.jpg', 12, 'Leather and stainless steel bracelet'),
('Rings Set', 29.99, '/images/rings1.jpg', 12, 'Set of 3 fashion rings');
-- 生成30条库存测试数据
INSERT INTO inventory (goods_id, quantity) VALUES
(1, 150), (2, 200), (3, 80), (4, 300), (5, 500),
(6, 250), (7, 180), (8, 60), (9, 120), (10, 90),
(11, 150), (12, 200), (13, 180), (14, 100), (15, 70),
(16, 220), (17, 90), (18, 150), (19, 60), (20, 110),
(21, 300), (22, 250), (23, 200), (24, 180), (25, 220),
(26, 150), (27, 100), (28, 80), (29, 120), (30, 90);
-- 生成最近半年的订单数据(每月30-50条)
-- 3月订单 (30条)
DELIMITER //
CREATE PROCEDURE GenerateMarchOrders()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <= 30 DO
SET @customer_id = FLOOR(1 + RAND() * 20);
SET @goods_id = FLOOR(1 + RAND() * 50);
SELECT name INTO @goods_name FROM goods WHERE id = @goods_id;
SELECT vendor_id INTO @vendor_id FROM goods WHERE id = @goods_id;
SELECT price INTO @price FROM goods WHERE id = @goods_id;
SET @quantity = FLOOR(1 + RAND() * 5);
SET @total_price = @price * @quantity;
SET @day = FLOOR(1 + RAND() * 31);
SET @hour = FLOOR(0 + RAND() * 24);
SET @minute = FLOOR(0 + RAND() * 60);
SET @second = FLOOR(0 + RAND() * 60);
SET @order_time = CONCAT('2025-03-', LPAD(@day, 2, '0'), ' ', LPAD(@hour, 2, '0'), ':', LPAD(@minute, 2, '0'), ':', LPAD(@second, 2, '0'));
SET @address = CONCAT(FLOOR(100 + RAND() * 900), ' ',
ELT(FLOOR(1 + RAND() * 5), 'Main St', 'Oak Ave', 'Maple Rd', 'Cedar Ln', 'Pine Dr'), ', ',
ELT(FLOOR(1 + RAND() * 10), 'New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix', 'Philadelphia', 'San Antonio', 'San Diego', 'Dallas', 'San Francisco'));
INSERT INTO orders (customer_id, goods_id, goods_name, address, vendor_id, order_time, quantity, total_price, status)
VALUES (@customer_id, @goods_id, @goods_name, @address, @vendor_id, @order_time, @quantity, @total_price,
ELT(FLOOR(1 + RAND() * 5), 'pending', 'paid', 'shipped', 'delivered', 'cancelled'));
SET i = i + 1;
END WHILE;
END //
DELIMITER ;
CALL GenerateMarchOrders();
DROP PROCEDURE GenerateMarchOrders;
-- 4月订单 (40条)
DELIMITER //
CREATE PROCEDURE GenerateAprilOrders()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <= 40 DO
SET @customer_id = FLOOR(1 + RAND() * 20);
SET @goods_id = FLOOR(1 + RAND() * 50);
SELECT name INTO @goods_name FROM goods WHERE id = @goods_id;
SELECT vendor_id INTO @vendor_id FROM goods WHERE id = @goods_id;
SELECT price INTO @price FROM goods WHERE id = @goods_id;
SET @quantity = FLOOR(1 + RAND() * 5);
SET @total_price = @price * @quantity;
SET @day = FLOOR(1 + RAND() * 30);
SET @hour = FLOOR(0 + RAND() * 24);
SET @minute = FLOOR(0 + RAND() * 60);
SET @second = FLOOR(0 + RAND() * 60);
SET @order_time = CONCAT('2025-04-', LPAD(@day, 2, '0'), ' ', LPAD(@hour, 2, '0'), ':', LPAD(@minute, 2, '0'), ':', LPAD(@second, 2, '0'));
SET @address = CONCAT(FLOOR(100 + RAND() * 900), ' ',
ELT(FLOOR(1 + RAND() * 5), 'Main St', 'Oak Ave', 'Maple Rd', 'Cedar Ln', 'Pine Dr'), ', ',
ELT(FLOOR(1 + RAND() * 10), 'New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix', 'Philadelphia', 'San Antonio', 'San Diego', 'Dallas', 'San Francisco'));
INSERT INTO orders (customer_id, goods_id, goods_name, address, vendor_id, order_time, quantity, total_price, status)
VALUES (@customer_id, @goods_id, @goods_name, @address, @vendor_id, @order_time, @quantity, @total_price,
ELT(FLOOR(1 + RAND() * 5), 'pending', 'paid', 'shipped', 'delivered', 'cancelled'));
SET i = i + 1;
END WHILE;
END //
DELIMITER ;
CALL GenerateAprilOrders();
DROP PROCEDURE GenerateAprilOrders;
-- 5月订单 (45条)
DELIMITER //
CREATE PROCEDURE GenerateMayOrders()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <= 45 DO
SET @customer_id = FLOOR(1 + RAND() * 20);
SET @goods_id = FLOOR(1 + RAND() * 50);
SELECT name INTO @goods_name FROM goods WHERE id = @goods_id;
SELECT vendor_id INTO @vendor_id FROM goods WHERE id = @goods_id;
SELECT price INTO @price FROM goods WHERE id = @goods_id;
SET @quantity = FLOOR(1 + RAND() * 5);
SET @total_price = @price * @quantity;
SET @day = FLOOR(1 + RAND() * 31);
SET @hour = FLOOR(0 + RAND() * 24);
SET @minute = FLOOR(0 + RAND() * 60);
SET @second = FLOOR(0 + RAND() * 60);
SET @order_time = CONCAT('2025-05-', LPAD(@day, 2, '0'), ' ', LPAD(@hour, 2, '0'), ':', LPAD(@minute, 2, '0'), ':', LPAD(@second, 2, '0'));
SET @address = CONCAT(FLOOR(100 + RAND() * 900), ' ',
ELT(FLOOR(1 + RAND() * 5), 'Main St', 'Oak Ave', 'Maple Rd', 'Cedar Ln', 'Pine Dr'), ', ',
ELT(FLOOR(1 + RAND() * 10), 'New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix', 'Philadelphia', 'San Antonio', 'San Diego', 'Dallas', 'San Francisco'));
INSERT INTO orders (customer_id, goods_id, goods_name, address, vendor_id, order_time, quantity, total_price, status)
VALUES (@customer_id, @goods_id, @goods_name, @address, @vendor_id, @order_time, @quantity, @total_price,
ELT(FLOOR(1 + RAND() * 5), 'pending', 'paid', 'shipped', 'delivered', 'cancelled'));
SET i = i + 1;
END WHILE;
END //
DELIMITER ;
CALL GenerateMayOrders();
DROP PROCEDURE GenerateMayOrders;
-- 6月订单 (50条)
DELIMITER //
CREATE PROCEDURE GenerateJuneOrders()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <= 50 DO
SET @customer_id = FLOOR(1 + RAND() * 20);
SET @goods_id = FLOOR(1 + RAND() * 50);
SELECT name INTO @goods_name FROM goods WHERE id = @goods_id;
SELECT vendor_id INTO @vendor_id FROM goods WHERE id = @goods_id;
SELECT price INTO @price FROM goods WHERE id = @goods_id;
SET @quantity = FLOOR(1 + RAND() * 5);
SET @total_price = @price * @quantity;
SET @day = FLOOR(1 + RAND() * 30);
SET @hour = FLOOR(0 + RAND() * 24);
SET @minute = FLOOR(0 + RAND() * 60);
SET @second = FLOOR(0 + RAND() * 60);
SET @order_time = CONCAT('2025-06-', LPAD(@day, 2, '0'), ' ', LPAD(@hour, 2, '0'), ':', LPAD(@minute, 2, '0'), ':', LPAD(@second, 2, '0'));
SET @address = CONCAT(FLOOR(100 + RAND() * 900), ' ',
ELT(FLOOR(1 + RAND() * 5), 'Main St', 'Oak Ave', 'Maple Rd', 'Cedar Ln', 'Pine Dr'), ', ',
ELT(FLOOR(1 + RAND() * 10), 'New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix', 'Philadelphia', 'San Antonio', 'San Diego', 'Dallas', 'San Francisco'));
INSERT INTO orders (customer_id, goods_id, goods_name, address, vendor_id, order_time, quantity, total_price, status)
VALUES (@customer_id, @goods_id, @goods_name, @address, @vendor_id, @order_time, @quantity, @total_price,
ELT(FLOOR(1 + RAND() * 5), 'pending', 'paid', 'shipped', 'delivered', 'cancelled'));
SET i = i + 1;
END WHILE;
END //
DELIMITER ;
CALL GenerateJuneOrders();
DROP PROCEDURE GenerateJuneOrders;
-- 7月订单 (35条)
DELIMITER //
CREATE PROCEDURE GenerateJulyOrders()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <= 35 DO
SET @customer_id = FLOOR(1 + RAND() * 20);
SET @goods_id = FLOOR(1 + RAND() * 50);
SELECT name INTO @goods_name FROM goods WHERE id = @goods_id;
SELECT vendor_id INTO @vendor_id FROM goods WHERE id = @goods_id;
SELECT price INTO @price FROM goods WHERE id = @goods_id;
SET @quantity = FLOOR(1 + RAND() * 5);
SET @total_price = @price * @quantity;
SET @day = FLOOR(1 + RAND() * 31);
SET @hour = FLOOR(0 + RAND() * 24);
SET @minute = FLOOR(0 + RAND() * 60);
SET @second = FLOOR(0 + RAND() * 60);
SET @order_time = CONCAT('2025-07-', LPAD(@day, 2, '0'), ' ', LPAD(@hour, 2, '0'), ':', LPAD(@minute, 2, '0'), ':', LPAD(@second, 2, '0'));
SET @address = CONCAT(FLOOR(100 + RAND() * 900), ' ',
ELT(FLOOR(1 + RAND() * 5), 'Main St', 'Oak Ave', 'Maple Rd', 'Cedar Ln', 'Pine Dr'), ', ',
ELT(FLOOR(1 + RAND() * 10), 'New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix', 'Philadelphia', 'San Antonio', 'San Diego', 'Dallas', 'San Francisco'));
INSERT INTO orders (customer_id, goods_id, goods_name, address, vendor_id, order_time, quantity, total_price, status)
VALUES (@customer_id, @goods_id, @goods_name, @address, @vendor_id, @order_time, @quantity, @total_price,
ELT(FLOOR(1 + RAND() * 5), 'pending', 'paid', 'shipped', 'delivered', 'cancelled'));
SET i = i + 1;
END WHILE;
END //
DELIMITER ;
CALL GenerateJulyOrders();
DROP PROCEDURE GenerateJulyOrders;
-- 8月订单 (40条)
DELIMITER //
CREATE PROCEDURE GenerateAugustOrders()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <= 40 DO
SET @customer_id = FLOOR(1 + RAND() * 20);
SET @goods_id = FLOOR(1 + RAND() * 50);
SELECT name INTO @goods_name FROM goods WHERE id = @goods_id;
SELECT vendor_id INTO @vendor_id FROM goods WHERE id = @goods_id;
SELECT price INTO @price FROM goods WHERE id = @goods_id;
SET @quantity = FLOOR(1 + RAND() * 5);
SET @total_price = @price * @quantity;
SET @day = FLOOR(1 + RAND() * 31);
SET @hour = FLOOR(0 + RAND() * 24);
SET @minute = FLOOR(0 + RAND() * 60);
SET @second = FLOOR(0 + RAND() * 60);
SET @order_time = CONCAT('2025-08-', LPAD(@day, 2, '0'), ' ', LPAD(@hour, 2, '0'), ':', LPAD(@minute, 2, '0'), ':', LPAD(@second, 2, '0'));
SET @address = CONCAT(FLOOR(100 + RAND() * 900), ' ',
ELT(FLOOR(1 + RAND() * 5), 'Main St', 'Oak Ave', 'Maple Rd', 'Cedar Ln', 'Pine Dr'), ', ',
ELT(FLOOR(1 + RAND() * 10), 'New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix', 'Philadelphia', 'San Antonio', 'San Diego', 'Dallas', 'San Francisco'));
INSERT INTO orders (customer_id, goods_id, goods_name, address, vendor_id, order_time, quantity, total_price, status)
VALUES (@customer_id, @goods_id, @goods_name, @address, @vendor_id, @order_time, @quantity, @total_price,
ELT(FLOOR(1 + RAND() * 5), 'pending', 'paid', 'shipped', 'delivered', 'cancelled'));
SET i = i + 1;
END WHILE;
END //
DELIMITER ;
CALL GenerateAugustOrders();
DROP PROCEDURE GenerateAugustOrders;
第一个LLM中的提示词内容
System
你是一位精通SQL语言的数据库专家,熟悉MySQL数据库。你的任务是根据用户的自然语言输入,编写出可直接执行的SQL查询语句。输出内容必须是可以执行的SQL语句,不能包含任何多余的信息。
核心规则:
1. 根据用户的查询需求,确定涉及的表和字段。
2. 确保SQL语句的语法符合MySQL的规范。
3. 输出的SQL语句必须完整且可执行,不包含注释或多余的换行符。
关键技巧:
- WHERE 子句: 用于过滤数据。例如,`WHERE column_name = 'value'`。
- **日期处理:** 使用`STR_TO_DATE`函数将字符串转换为日期类型。例如,`STR_TO_DATE('2025-03-14', '%Y-%m-%d')`。
- **聚合函数:** 如`COUNT`、`SUM`、`AVG`等,用于计算汇总信息。
- **除法处理:** 在进行除法运算时,需考虑除数为零的情况,避免错误。
- **日期范围示例:** 查询特定日期范围的数据时,使用`BETWEEN`关键字。例如,`WHERE date_column BETWEEN '2025-01-01' AND '2025-12-31'`。
**注意事项:**
1. 确保字段名和表名的正确性,避免拼写错误。
2. 对于字符串类型的字段,使用单引号括起来。例如,`'sample_text'`。
3. 在使用聚合函数时,如果需要根据特定字段分组,使用`GROUP BY`子句。
4. 在进行除法运算时,需判断除数是否为零,以避免运行时错误。
5. 生成的sql语句 不能有换行符 比如 \n
6. 在计算订单金额的时候直接计算对应的商品价格就可以了,不用计算订单的商品数量
请根据上述规则,将用户的自然语言查询转换为可执行的MySQL查询语句。
user部分的提示词
数据库设计说明:
表结构关系:
商家 (vendors) 与商品 (goods) 通过 vendor_id 关联
商品 (goods) 与库存 (inventory) 通过 goods_id 关联
订单 (orders) 与客户 (customers) 通过 customer_id 关联
订单 (orders) 与商品 (goods) 通过 goods_id 关联
订单 (orders) 还直接关联了商家 (vendor_id) 以提高查询效率
每个表的核心字段:
goods:包含 id、name、price、image_url、vendor_id 等字段
orders:包含 id、customer_id、goods_id、goods_name、address、vendor_id、order_time 等字段
inventory:包含 id、goods_id、quantity 等字段
vendors:商家基本信息
customers:客户基本信息
测试数据特点:
商家表:20 条不同类型的商家数据
客户表:20 条客户记录
商品表:50 条商品记录,平均分配给前 10 个商家
库存表:30 条库存记录,对应前 30 个商品
订单表:最近 6 个月 (3-8 月) 的订单,每月 30-50 条,总计 240 条记录
所有表都设置了适当的外键约束,确保数据完整性,同时测试数据也保持了表之间的关联关系。你可以直接在 MySQL 中运行这些 SQL 语句来创建完整的电商数据库。
问题:{{#1757211019205.sql#}}

代码执行部分是通过Python代码调用对应的接口来执行SQL操作,这部分在前面的案例中有介绍的。

点击查看访问数据库代码
# 导入所需库
# json:用于处理JSON格式数据(本代码中虽未直接解析,但保留用于潜在扩展)
import json
# requests:用于发送HTTP请求,与API接口进行通信
import requests
def main(sql: str) -> dict:
"""
发送SQL语句到指定API接口,执行数据库操作并返回结果
参数:
sql: 字符串类型,需要执行的SQL语句(如"SELECT * FROM table;")
返回:
字典类型,包含执行结果或错误信息:
- 成功时:{"result": 接口返回的执行结果(字符串形式)}
- 失败时:{"result": 错误描述信息}
"""
# API接口的URL地址
# host.docker.internal是Docker环境中访问宿主机的特殊地址
# 5000是目标API服务的端口号
url = "http://host.docker.internal:5000/execute_sql"
# 数据库连接信息(固定配置)
# 这些信息会被发送到API,用于连接数据库
connection_info = {
"host": "localhost", # 数据库地址(本地数据库填localhost)
"user": "root", # 数据库用户名(默认常为root)
"password": "admin123", # 数据库密码(填你的实际密码)
"database": "agent", # 要连接的数据库名
"port": 3306 # 数据库端口(MySQL默认3306)
}
# 构造请求体(发送给API的数据)
# 包含要执行的SQL语句和数据库连接信息
payload = {
"sql": sql, # 传入的SQL语句
"connection_info": connection_info # 上面定义的数据库连接信息
}
# 设置请求头
# 告诉API服务器,发送的数据格式是JSON
headers = {
"Content-Type": "application/json"
}
try:
# 发送POST请求到API接口
# json=payload:自动将字典转换为JSON格式
# headers=headers:携带请求头信息
response = requests.post(url, json=payload, headers=headers)
# 检查请求是否成功(HTTP状态码200表示请求成功)
if response.status_code == 200:
try:
# 解析API返回的JSON数据,提取"result"字段
# 转为字符串是为了统一结果格式,方便后续处理
return {"result": str(response.json()["result"])}
except Exception as e:
# 解析JSON失败时(如API返回格式异常)
return {"result": f"解析响应JSON失败: {str(e)}"}
else:
# 请求成功但状态码不是200(如400表示参数错误)
return {"result": f"请求失败,状态码: {response.status_code}"}
# 捕获请求过程中可能发生的异常(如网络不通、API未启动等)
except Exception as e:
return {"result": f"请求过程出错: {str(e)}"}
然后就是数据的整理。通过代码执行获取到对应的结果。然后处理成为我们需要的数据展示

对应的提示词内容
System
你是电商行业数据分析专家,分析JSON格式的sql查询结果,回答用户问题。
关键规则:
1.所有数据已符合用户问题中的条件
2.直接使用提供的数据分析,不质疑数据是否符合条件
3.不需要再次筛选或确认数据类别/时间范围
4.数据为[]或空或者None时直接回复"没有查询到相关数据",不得编造数据
User
数据是:{{#1757211045084.result#}}
问题是:{{#1757211019205.sql#}}
回答要求:
1.列出详细数据,优先以表格方式列出数据
2.识别趋势、异常,并提供分析和建议
3.分析SQL语句{{#1757211045084.result#}}和用户的问题
{{#1757211019205.sql#}}是否匹配
4.最后附上查询的sql语句
测试
问题示例:统计所有商品销售数据

Echarts可视化助手
我们希望通过Echars 来是实现可视化的展示各种统计数据。我们通过具体的案例来给大家介绍下,具体的效果如下:

我们可以准备一个excel的数据

然后创建一个工作流。在开始节点我们可以上传一个文件

然后是文档提取节点

然后是格式转换节点:这里我们需要把提取的文档转换为csv格式的数据

# 角色
你是一个数据整理专家,擅长数据格式的整理和合格的转换
# 数据
{{#1741943310857.text#}}
# 任务
把数据转换为csv格式
然后是参数提取器:需要从上一步中的格式转换数据中获取到csv的数据

指令
# 任务
提取csv格式的字符串
然后是通过执行一段 Python代码生成 满足 echarts 规范的代码

代码内容是:
点击查看代码
# 导入处理CSV格式的模块
import csv
# 导入处理JSON格式的模块
import json
def main(csv_string):
"""
将CSV格式的字符串转换为ECharts图表配置的JSON格式
参数:
csv_string: 包含CSV数据的字符串
返回:
包含ECharts配置的字典,格式为{"result": "..."}
"""
# 1. 处理CSV数据:去除首尾空白并按换行符分割成行列表
# strip()用于移除字符串首尾的空白字符(包括换行符、空格等)
# split('\n')将字符串按换行符分割成多个元素的列表
lines = csv_string.strip().split('\n')
# 2. 使用csv模块的reader工具读取CSV数据
# csv.reader会自动处理CSV中的逗号分隔和引号等特殊情况
reader = csv.reader(lines)
# 3. 将CSV数据转换为二维列表
# 列表推导式:遍历reader中的每一行,组成新的列表
data = [row for row in reader]
# 4. 数据类型转换:将数字字符串转换为浮点数
# 从第二行开始处理(跳过标题行:data[0]是标题)
for row in data[1:]:
# 从第二列开始处理(第一列通常是类别名称)
for i in range(1, len(row)):
try:
# 尝试将字符串转换为浮点数
row[i] = float(row[i])
except ValueError:
# 如果转换失败(不是数字),则保持原样
pass
# 5. 创建ECharts图表的完整配置
echarts_config = {
# 图例配置(默认设置)
"legend": {},
# 提示框配置(默认设置,鼠标悬停时显示数据)
"tooltip": {},
# 数据集:使用处理后的CSV数据
"dataset": {
"source": data # 这里的data包含标题行和转换后的数值
},
# X轴配置:两个X轴分别对应上下两个图表
"xAxis": [
{"type": "category", "gridIndex": 0}, # 第一个X轴,对应上方图表
{"type": "category", "gridIndex": 1} # 第二个X轴,对应下方图表
],
# Y轴配置:两个Y轴分别对应上下两个图表
"yAxis": [
{"gridIndex": 0}, # 第一个Y轴,对应上方图表
{"gridIndex": 1} # 第二个Y轴,对应下方图表
],
# 网格配置:定义两个图表的位置
"grid": [
{"bottom": "55%"}, # 上方图表:底部距离容器55%(占45%高度)
{"top": "55%"} # 下方图表:顶部距离容器55%(占45%高度)
],
# 系列配置:定义图表中的数据系列
"series": [
# 上方图表中的柱状图系列(4个)
{"type": "bar", "seriesLayoutBy": "row"},
{"type": "bar", "seriesLayoutBy": "row"},
{"type": "bar", "seriesLayoutBy": "row"},
{"type": "bar", "seriesLayoutBy": "row"},
# 下方图表中的柱状图系列(6个)
{"type": "bar", "xAxisIndex": 1, "yAxisIndex": 1},
{"type": "bar", "xAxisIndex": 1, "yAxisIndex": 1},
{"type": "bar", "xAxisIndex": 1, "yAxisIndex": 1},
{"type": "bar", "xAxisIndex": 1, "yAxisIndex": 1},
{"type": "bar", "xAxisIndex": 1, "yAxisIndex": 1},
{"type": "bar", "xAxisIndex": 1, "yAxisIndex": 1}
]
}
# 6. 生成最终输出:将配置转换为JSON格式并包装成ECharts需要的格式
# json.dumps用于将Python字典转换为JSON字符串
# ensure_ascii=False确保中文等特殊字符正常显示
output = f'```echarts\n{json.dumps(echarts_config, ensure_ascii=False)}\n```'
# 返回包含结果的字典
return {"result": output}
最后是结果的输出

然后就可以测试运行了
不知道为什么我的并没有生成图表,而只有数据:

文生图工作流
我们前面有介绍过文生图的案例,是在Dify中通过相关的工具来实现的。不过这种效果不是特别的高效,会被平台控制的比较严格。我们可以直接通过文生图的模型提供的API来直接访问生成。这样的效果会更好一些。我们来看看具体怎么实现吧。

具体的效果为

生成的效果:

图片的生成我们使用的是SiliconClound来实现。文档地址:https://docs.siliconflow.cn/cn/api-reference/images/images-generations

密钥申请:https://cloud.siliconflow.cn/me/account/ak

生成小说和角色
我们接下来看一个基于大模型来生成小说和相关角色的案例

效果



小说语音助手
有些小说只有文本,对于上班想要划水的小伙伴不是很友好,我们可以自己解决AI模型来帮我们在线爬取小说内容,然后通过文本转语音的方式来语音播放小说内容。具体案例如下

这里的关键点有两个,一个是通过我们输出的url来爬取网页的内容,也就是这个Dify自带的爬虫工具

当然这块爬取的内容可能有些不是我们需要的。这块可以对爬取的内容做下处理然后把爬取的内容通过接口的访问方式来提交给SiliconCloud的服务。来生成语音

比如这个小说网站的某章节文章:https://www.xiaoshuopu.com/xiaoshuo/68/68135/31801497.html


浙公网安备 33010602011771号