你是否经常遇到这样的场景?

“小李,帮我查一下上个月各区域的销售额,做成柱状图发群里。”
“能不能把最近一周的用户注册数据导出来?”
“哪个产品退货率最高?”

这些本应由系统自动完成的任务,却因为“不会写 SQL”、“找不到报表入口”而变成人工沟通负担。

现在,借助 Dify + Agent 模式 + 工具链,你可以打造一个 能听懂人话、会跑脚本、能画图表的“AI 数据分析师”

本文将带你:
✅ 让 Agent 理解自然语言指令(如“导出上月销售报表”)
✅ 调用 Python 脚本或数据库查询真实数据
✅ 自动生成可视化图表并返回结果

实现 “说一句,跑一套” 的智能数据处理流程。


一、从自然语言指令解析任务

真正的智能不是“回答问题”,而是“理解意图 + 执行动作”。

🎯 核心能力:语义到任务的映射

用户提问 解析出的任务
“导出上月销售报表” 查询 sales 表,时间范围为上个月
“哪个产品退货最多?” 统计 returns 表中 product_id 的频次
“生成本周用户增长趋势图” 查询每日新增用户数,绘制成折线图

🛠️ 实现方式:Prompt + Agent 意图识别

在 Dify 中创建一个 Agent 应用,设置系统提示词如下:

你是一个专业的数据分析师助手,能理解用户的自然语言查询需求,并将其转化为具体的数据任务。

请根据用户问题判断其意图,仅返回以下类型之一:
- sales_report(销售报表)
- user_growth(用户增长)
- product_analysis(商品分析)
- return_rate(退货率分析)
- unknown(无法识别)

问题:{{query}}

输出保存为变量 {{intent}},供后续流程使用。

✅ 可结合知识库,加入公司术语解释(如“GMV”、“DAU”),提升识别准确率。


二、调用 Python 脚本或数据库查询工具

识别出意图后,Agent 需要“动手”获取数据。Dify 提供了两种主流方式:

✅ 方式 1:调用自定义工具(HTTP API)

将数据查询封装为 RESTful 接口,由 Agent 调用。

示例:创建“获取上月销售额”API
# Flask 示例
from flask import Flask, request, jsonify
import pandas as pd
from sqlalchemy import create_engine

app = Flask(__name__)
engine = create_engine("sqlite:///sales.db")

@app.route("/api/reports/monthly-sales", methods=["POST"])
def monthly_sales():
    data = request.json
    month = data.get("month", "2025-03")  # 支持动态传参

    query = f"""
    SELECT region, SUM(amount) as total 
    FROM sales 
    WHERE strftime('%Y-%m', sale_date) = '{month}'
    GROUP BY region
    """
    df = pd.read_sql(query, engine)
    return jsonify(df.to_dict(orient='records'))

部署后,在 Dify 中添加为 自定义工具

  • 名称:查询月度销售数据
  • URL:https://your-api.com/api/reports/monthly-sales
  • 参数:{"month": "{{target_month}}"}

✅ 方式 2:使用代码执行节点(Code Executor)

对于轻量级任务,可直接在 Dify 内运行 Python 脚本(沙箱环境)。

示例:计算退货率最高的产品
def main(inputs):
    import pandas as pd
    
    # 模拟数据(实际可从数据库加载)
    data = [
        {"product": "A", "returns": 15, "total_sold": 100},
        {"product": "B", "returns": 8, "total_sold": 60},
        {"product": "C", "returns": 20, "total_sold": 180}
    ]
    
    df = pd.DataFrame(data)
    df["return_rate"] = df["returns"] / df["total_sold"]
    top_product = df.loc[df["return_rate"].idxmax()]
    
    return {
        "product": top_product["product"],
        "return_rate": round(top_product["return_rate"], 4),
        "details": data
    }

⚠️ 注意:生产环境建议通过 API 调用,避免敏感数据暴露。


三、生成可视化图表并返回结果

数据查出来还不够,用户更想看“图”。

🎨 方案一:返回 Markdown 图表(简单高效)

在 Prompt 中要求 AI 用 Markdown 生成图表描述或 ASCII 图:

请将以下数据绘制成柱状图描述:

{{query_result}}

输出格式:
![柱状图](https://quickchart.io/chart?c={...})

利用 QuickChart.io 等服务生成图表 URL:

![上月销售额](https://quickchart.io/chart?c={type:'bar',data:{labels:['华东','华南','华北'], datasets:[{data:[8500,7200,6800]}]}})

Dify 支持渲染 Markdown,前端可直接显示图表。


🎨 方案二:调用绘图 API 并返回图片链接

使用后端服务生成 PNG/JPG 图片:

# Python 绘图示例
import matplotlib.pyplot as plt
import io
import base64

def generate_bar_chart(data):
    plt.bar(data['labels'], data['values'])
    plt.title("月度销售额")
    
    buf = io.BytesIO()
    plt.savefig(buf, format='png')
    buf.seek(0)
    img_str = base64.b64encode(buf.read()).decode()
    return f"data:image/png;base64,{img_str}"

Agent 调用该接口后,将图片嵌入回复:

这是上月各区域销售额的柱状图:

{{chart_image}}

总销售额:{{total}} 元

🎯 完整流程示例

用户输入:“导出上月销售报表”

[Agent] → 识别 intent = sales_report
   ↓
[HTTP 工具] → 调用 /api/reports/monthly-sales?month=2025-03
   ↓
[Code 节点] → 使用 QuickChart 生成图表 URL
   ↓
[LLM 节点] → 汇总文字说明 + 插入图表
   ↓
返回结果:
  “上月总销售额为 22,500 元,详情如下:
   ![柱状图](https://...)”

📈 用户无需登录 BI 系统,一句话获取完整报表。


四、实战建议与安全控制

✅ 最佳实践

建议 说明
分步引导 先确认时间范围、再选择维度,避免歧义
缓存机制 对高频查询结果缓存 5~30 分钟,提升响应速度
权限控制 根据用户角色限制可查数据范围(如区域经理只能看本区)
审计日志 记录每次查询请求,便于追溯

🔐 安全策略

  • 数据库连接使用只读账号
  • API 接口启用 JWT 认证
  • 敏感字段脱敏处理(如客户手机号)
  • 代码沙箱禁止 os.systemsubprocess 等危险操作

✅ 总结:你刚刚构建了一个“AI 数据分析师”

通过本文,你已经实现了:

能力 技术实现
✅ 理解自然语言 Agent + Prompt 意图识别
✅ 获取真实数据 自定义工具 + 数据库查询
✅ 生成可视化图表 Markdown + QuickChart + 图片嵌入
✅ 端到端自动化 Workflow 编排全流程

这个 Agent 不仅能回答问题,更能执行任务、产出结果、驱动决策

它适用于:

  • 运营日报自动化
  • 客服自助查数据
  • 管理层临时数据需求响应
  • 低代码 BI 前端入口
Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐