【人工智能-agent】--Dify+Mysql+Echarts搭建了一个能“听懂”人话的数据可视化助手!

Echarts官网:https://echarts.apache.org/zh/index.html

ECharts 是一个由百度团队开发的、基于 JavaScript 的开源可视化图表库,它提供了丰富的图表类型和强大的交互功能,能够帮助开发者轻松创建专业级的数据可视化应用。

核心特点

  1. 丰富的图表类型
    • 支持30+种图表类型,包括折线图、柱状图、饼图、散点图、雷达图、地图、热力图、树图、旭日图等
    • 支持多维数据分析展示
  2. 强大的交互功能
    • 提供数据缩放、拖拽重计算、数据区域选择等交互功能
    • 支持图例、工具箱、数据区域缩放、视觉映射等组件

import csv
import json

def main(csv_string):
    # 将CSV字符串分割成行
    lines = csv_string.strip().split('\n')
    
    # 使用csv模块读取数据
    reader = csv.reader(lines)
    
    # 将所有行转换为列表
    data = [row for row in reader]
    
    # 将数字字符串转换为浮点数
    for row in data[1:]:  # 跳过标题行
        for i in range(1, len(row)):
            try:
                row[i] = float(row[i])
            except ValueError:
                pass
    
    # 创建完整的ECharts配置
    echarts_config = {
        "legend": {},
        "tooltip": {},
        "dataset": {
            "source": data
        },
        "xAxis": [
            {"type": "category", "gridIndex": 0},
            {"type": "category", "gridIndex": 1}
        ],
        "yAxis": [
            {"gridIndex": 0},
            {"gridIndex": 1}
        ],
        "grid": [
            {"bottom": "55%"},
            {"top": "55%"}
        ],
        "series": [
            # 第一个网格中的折线图系列
            {"type": "bar", "seriesLayoutBy": "row"},
            {"type": "bar", "seriesLayoutBy": "row"},
            {"type": "bar", "seriesLayoutBy": "row"},
            {"type": "bar", "seriesLayoutBy": "row"},
            # 第二个网格中的柱状图系列
            {"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}
        ]
    }

    # 生成输出文件
    output = "```echarts\n" + json.dumps(echarts_config, indent=2, ensure_ascii=False) + "\n```"

    return {"output":output}

import * as echarts from 'echarts';

var chartDom = document.getElementById('main');
var myChart = echarts.init(chartDom);
var option;

option = {
  xAxis: {
    type: 'category',
    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
  },
  yAxis: {
    type: 'value'
  },
  series: [
    {
      data: [150, 230, 224, 218, 135, 147, 260],
      type: 'line'
    }
  ]
};

option && myChart.setOption(option);

完整工作流:

目录

1.安装插件

2.问题判断

3.自然语言转SQL

4.执行SQL语句

5.条件分支-是否需要图表

6.处理图表数据

7.参数提取

8.条件分支--图形判断

9.画图

10.不画图

11.测试效果


1.安装插件

2.问题判断

它负责分析用户的原始问题,判断是否需要图表,并初步确定合适的图表类型(柱状图、折线图、饼图,或不需要图表)。

模型选择: deepseek-ai/DeepSeek-V3

提示词如下: 

你是一个智能助手,需要根据用户的问题判断是否需要用图表展示数据,并判断适合的图表类型。  

请严格按照如下JSON格式输出,不要输出多余内容:
{
  "need_chart": true/false,  // 是否需要图表
  "chart_type": "bar/line/pie/none"  // 推荐的图表类型,bar=柱状图,line=折线图,pie=饼图,none=不需要图表
}

判断标准:
1.如果用户问题中包含“趋势”、“变化”、“对比”、“分布”、“比例”、“占比”、“增长”等词,通常需要图表。
2.如果用户问题中有“每年”、“历年”、“随时间”、“随年份”等,推荐折线图(line)。
3. 如果用户问题中有“对比”、“排行”、“最多”、“最少”等,推荐柱状图(bar)。
4. 如果用户问题中有“占比”、“比例”、“分布”等,推荐饼图(pie)。
5. 如果用户只是问具体数值、详情、描述,不需要图表,chart_type 填 none。

示例:
用户问题:“请用图表展示历年票房变化”  
输出:{"need_chart": true, "chart_type": "line"}

用户问题:“各导演的票房占比是多少?”  
输出:{"need_chart": true, "chart_type": "pie"}

用户问题:“哪吒之魔童降世的票房是多少?”  
输出:{"need_chart": false, "chart_type": "none"}

现在请判断下面这个问题:
{{#1746791066048.input#}}

3.自然语言转SQL

这个节点是实现“自然语言对话数据库”的核心。它会将用户的原始问题(sys.query)和我们预设的数据库表结构信息结合,智能地生成可执行的SQL语句。

输入变量:

  • 数据表名称: ****
  • 查询语句: {{sys.query}} (引用开始节点的用户输入)

数据库配置: 正确填写数据库类型、IP、端口、库名、用户名、密码。

可以根据实际情况自定义提示词:

你是一位精通SQL语言的数据库专家,熟悉MySQL数据库。你的的任务是检查该Sql语句是否有错。如果有错请更正,没有错则输出Sql语句。

回答要求:
1.不能包含任何多余的信息。
2.必须是可以执行的SQL语句。
3.删除掉Sql中的\n,用空格替换。
4.只需要查询本日价格,不需要多余信息.

注意:实体为‘类型’,需要在大类和小类中间加上‘-’

4.执行SQL语句

此节点负责连接数据库,并执行上一步生成的SQL语句。

  • 输入变量:
    • 待执行的SQL语句: {{rookie_text2data.text}} (引用上一个节点的输出,即生成的SQL语句)
  • 数据库配置: 正确填写数据库类型、IP、端口、库名、用户名、密码。
  • 返回数据格式: TEXT。

5.条件分支-是否需要图表

这是一个逻辑判断节点,它会根据第一个LLM节点【判断用户问题】的输出,决定工作流是走向“生成图表”的分支,还是走向“无需图表,直接文字回答”的分支。

6.处理图表数据

上一个条件分支走到需要图表,工作流会进入这个LLM节点。

它的核心任务是将SQL查询结果(目前是TEXT格式)和第一个LLM判断出的图表类型(target_chart_type),转换为后续代码节点或图表插件所需的格式化数据。

SYSTEM
你是一个数据格式化专家。你的核心任务是根据已执行的SQL查询结果和用户指定的图表类型,将数据转换为特定图表工具所需的输入格式。

## 输出变量说明:
1.根据{{#1746791092689.text#}}的数据,进行抽取,我要2个数据,data是y轴的数据,x-axis是x轴的数据,以便我后续生成柱状图、折线图、条形图等图形;
2.根据用户最原始的自然语言查询{{#1746791066048.input#}},生成表的标题title

标准输出格式:
'''
title:
data:
x-axis:
'''
其中每个“data与x-axis”,每个文本之间用 ";" 分隔


示例输出:
title:"产品销售额柱状图",
data: "5500;7200",
x-axis: "产品A;产品B",

7.参数提取

因为数据是一个文本格式text,需要具体提取出参数,大家可以也去试试大模型结构化输出

这里使用简单的参数提取节点

title:
data:
x-axis:

8.条件分支--图形判断

判断代码节点的chart_type类型,给到不同的图表插件。

9.画图

这些是你预设的、能够接收格式化数据并(理想情况下)输出可渲染Echarts图表的工具。

  • 输入变量 (以饼图为例):
    • 标题: {{转换数据节点输出.unpacked_title}}
    • 数据: {{转换数据节点输出.unpacked_data}}
    • 分类: {{转换数据节点输出.unpacked_labels}}
  • 输出: 这些插件的输出应该是Dify可以直接渲染的图表格式(例如,包含 ```echarts ... ``` 的文本)。

10.不画图

如果最初判断用户问题不需要图表,工作流会进入这个分支。

这里我们用一个LLM节点,根据用户的问题和“执行SQL”节点返回的(TEXT格式)查询结果,用自然语言生成一段简洁的文字回答。

你是数据分析专家,分析并输出sql查询结果.


数据是:{{#1746791092689.text#}}
问题是:{{#1746791066048.input#}}
Sql语句:{{#1747016584129.text#}}

回答要求:
1.列出详细数据,优先以表格方式列出数据。
2.如果数据超过10行,就只列出前十行和最后3行,中间可以使用省略号.

11.测试效果

"请查询普钢综合指数,时间范围是2025.1.1-5.6,并把指数信息按照折线图绘制",

<think>好的,用户想了解如何纯本地化搭建Dify+DeepSeek-R1,并利用本地数仓数据进行快速搜索和整理。首先,我需要明确这两个工具的基本情况。Dify应该是一个开源的低代码开发平台,用于构建AI应用,而DeepSeek-R1可能是一个大语言模型,特别是深度求索公司开发的模型。用户的需求是纯本地化部署,所以需要确保所有组件都能在本地运行,不依赖外部服务。 接下来,本地化搭建的步骤可能包括硬件准备、环境配置、模型部署、数据集成等。需要考虑到硬件要求,比如GPU是否必要,以及内存和存储的需求。然后,安装必要的依赖,比如Docker、Python环境等。Dify的部署可能需要通过Docker-Compose来启动服务,同时需要下载DeepSeek-R1的模型文件,并配置本地推理服务,比如使用vLLM或TGI等框架。 然后是数据整合部分,用户提到本地数仓数据,可能需要将数据导入到向量数据库中,比如Milvus或Chroma,以便进行语义搜索。需要处理数据的预处理,比如文本分割、向量化,并建立索引。之后,在Dify中创建应用,配置工作流,将用户查询路由到向量数据库检索相关数据,再调用DeepSeek-R1生成回答。 还需要考虑权限管理和数据安全,确保本地数据不被泄露。可能遇到的问题包括模型与Dify的兼容性、硬件资源不足、数据预处理复杂等,需要提供相应的解决方案,比如调整模型量化、优化数据分块策略。 最后,整理使用场景,比如企业内部知识库、数据分析辅助等,帮助用户理解如何应用这套系统。需要确保整个流程的每一步都详细且可行,用户能够按照步骤操作,同时给出优化建议和注意事项,比如定期更新模型、监控系统性能等。</think>以下是Dify+DeepSeek-R1纯本地化搭建及数据应用的完整方案: 一、本地化部署架构 1. 硬件要求 - GPU服务器(推荐NVIDIA A100/A10 24G显存以上) - 64G内存+1TB SSD存储 - 千兆局域网环境 2. 组件清单 - Dify Community Edition(开源版) - DeepSeek-R1-7B/67B 本地模型文件 - Milvus/Chroma 向量数据库 - PostgreSQL 元数据存储 - Redis 缓存服务 二、部署步骤 1. 基础环境搭建 ```bash # 安装NVIDIA驱动+CUDA Toolkit sudo apt install nvidia-driver-535 cuda-12-2 # 部署Docker环境 curl -fsSL https://get.docker.com | bash systemctl enable docker # 安装NVIDIA Container Toolkit distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit ``` 2. Dify服务部署 ```bash git clone https://github.com/langgenius/dify.git cd dify/docker vim .env # 修改MODEL_SERVER=local docker-compose up -d ``` 3. 模型服务部署(以vLLM为例) ```bash # 启动API服务 docker run --gpus all -p 8000:8000 \ -v /data/models:/models \ -vollm/vllm:latest \ --model /models/deepseek-r1-7b \ --tensor-parallel-size 2 \ --trust-remote-code ``` 4. 向量数据库配置 ```yaml # milvus-standalone.yml version: '3.5' services: standalone: image: milvusdb/milvus:v2.3.3 ports: - "19530:19530" volumes: - ./volumes/milvus:/var/lib/milvus ``` 三、数据整合流程 1. 数仓接入 ```python from dify_client import DataSource # 创建JDBC连接 ds = DataSource.create( type="mysql", config={ "host": "localhost", "port": 3306, "database": "data_warehouse", "username": "user", "password": "pass" } ) # 定时同步配置 ds.schedule_sync( tables=["sales_fact", "customer_dim"], interval="0 3 * * *" # 每天凌晨3点同步 ) ``` 2. 数据向量化处理 ```python from langchain.text_splitter import RecursiveCharacterTextSplitter from dify_client.embeddings import LocalEmbedding splitter = RecursiveCharacterTextSplitter( chunk_size=512, chunk_overlap=50 ) embedder = LocalEmbedding(model="bge-large-zh") def process_document(text): chunks = splitter.split_text(text) vectors = embedder.embed_documents(chunks) return [ {"text": chunk, "vector": vec} for chunk, vec in zip(chunks, vectors) ] ``` 3. 混合检索配置 ```yaml # retrieval_chain.yml steps: - name: keyword_search type: elasticsearch params: index: business_data top_k: 5 - name: vector_search type: milvus params: collection: doc_vectors top_k: 10 - name: rerank type: cross_encoder model: bge-reranker-large top_k: 8 ``` 四、权限与安全 1. 访问控制矩阵 ```mermaid graph TD A[用户角色] -->|读取| B(公开数据) A -->|读写| C(部门数据) A -->|管理| D(系统配置) B --> E[向量库访问策略] C --> F[行级数据权限] D --> G[模型管理权限] ``` 2. 数据加密方案 - 静态加密:LUKS磁盘加密 - 传输加密:mTLS双向认证 - 向量混淆:非对称向量偏移算法 $$v' = v \oplus (H(user\_id) \cdot S_{priv})$$ 五、性能优化建议 1. 混合检索加速 $$\text{相关性得分} = \alpha \cdot S_{keyword} + (1-\alpha) \cdot S_{vector}$$ 通过动态调整α值(0.3~0.7)平衡检索效果 2. 模型推理优化 ```python # 使用FlashAttention优化 from deepseek_r1 import AutoModelForCausalLM model = AutoModelForCausalLM.from_pretrained( "deepseek-r1-7b", torch_dtype=torch.bfloat16, use_flash_attention_2=True ) # 量化部署(4-bit) model = quantize_model(model, bits=4, threshold=6.0) ``` 六、典型应用场景 1. 数据智能问答 ``` 用户:Q3季度华东区销售额Top5产品是? 系统: 1. 解析SQL模式:SELECT product, SUM(sales) FROM fact_table WHERE quarter='Q3' AND region='east' GROUP BY product ORDER BY SUM(sales) DESC LIMIT 5 2. 执行查询返回表格+自然语言解读 ``` 2. 文档智能关联 ```python def document_linkage(query): related_data = hybrid_retrieve(query) context = format_context(related_data) prompt = f"""基于以下业务数据: {context} 请用结构化方式回答:{query}""" return model.generate(prompt) ``` 部署建议:建议使用Proxmox VE搭建虚拟化环境,通过PCIe Passthrough将GPU直通给模型推理容器,同时为向量数据库单独分配NVMe存储资源池。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西柚小萌新吖(●ˇ∀ˇ●)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值