手把手教你用AntV MCP Server Chart!从零打造可视化智能体,图表生成效率翻倍,收藏这篇就够了!
在大模型驱动的智能数据时代,**图表生成**(Chart Generation)的准确性严重依赖对数据结构和可视化意图的深度理解。传统方法往往依赖**复杂的 Prompt 工程或繁琐的手动编码**,**不仅效率低下,还难以适配多样化的数据格式与图表需求**。
在大模型驱动的智能数据时代,图表生成(Chart Generation)的准确性严重依赖对数据结构和可视化意图的深度理解。传统方法往往依赖复杂的 Prompt 工程或繁琐的手动编码,不仅效率低下,还难以适配多样化的数据格式与图表需求。
本文将带你基于 AntV MCP Server Chart 构建一个“可视化智能体”——让大模型不仅能“读懂数据”,还能“画出专业图表”,显著提升图表生成的准确性与自动化水平!
🎬 运行效果
🎯 核心价值
- 无需前端知识:开发者无需掌握 D3、ECharts 或 AntV 前端语法。
- 25+ 图表类型开箱即用:覆盖柱状图、折线图、桑基图、词云、组织架构图等主流可视化场景。
- 支持私有化部署:保障数据安全,适配企业内网环境。
- MCP 协议标准化调用:通过 Model Context Protocol 实现大模型与可视化服务的无缝集成。
🧭 本文结构概览
- 环境准备:搭建 MCP-Hub 与图表渲染服务
- 私有化部署:配置 AntV MCP Server Chart + GPT-VIS-API + MinIO
- 核心逻辑:大模型如何生成 SQL 与推荐图表类型
- 智能渲染:通过 React Agent 调用 MCP 工具生成图表
- 总结与推荐:总结&完整代码获取
1️⃣ 环境准备:搭建 MCP 工具中枢
1.1 安装 MCP-Hub
MCP-Hub 是一个开源的 MCP(Model Context Protocol)工具聚合平台,用于统一管理、注册和调用各类 MCP 服务。
docker run -d \
--name mcphub \
-p 3300:3000 \
--add-host host.docker.internal:host-gateway \
samanhappy/mcphub
访问地址:http://localhost:3300
默认账号:admin / admin123
国内加速配置(推荐)
- Python 包源:https://mirrors.aliyun.com/pypi/simple
- NPM 源:https://registry.npmmirror.com
2️⃣ 服务部署:构建私有化图表生成引擎
2.1 部署 MinIO 对象存储(用于图表持久化)
MinIO 作为轻量级 S3 兼容对象存储,用于保存生成的图表图片。
docker run -d \
--name minio \
-p 19000:9000 \
-p 19001:9001 \
-v "$(pwd)/volume/minio/data:/data" \
-e MINIO_ROOT_USER=admin \
-e MINIO_ROOT_PASSWORD=12345678 \
minio/minio:RELEASE.2025-04-22T22-12-26Z \
server /data --console-address ":9001"
配置步骤:
- 访问控制台:http://localhost:19001
- 创建 Bucket:chart-images
- 设置 Bucket 为 public 可读
- 生成 Access Key 与 Secret Key(用于后续服务认证)
2.2 部署 GPT-VIS-API(图表渲染服务)
我开源的项目: https://github.com/apconw/gpt-vis-api
GPT-VIS-API 是专为私有化场景设计的轻量级图表生成服务,接收结构化数据,调用 AntV 渲染图表,并将结果上传至 MinIO,返回带签名的图片 URL。
docker run -d \
--name gpt-vis-api \
-p 3100:3000 \
--add-host host.docker.internal:host-gateway \
-e MINIO_ENDPOINT=host.docker.internal \
-e MINIO_PORT=19000 \
-e MINIO_USE_SSL=false \
-e MINIO_ACCESS_KEY=your-access-key \
-e MINIO_SECRET_KEY=your-secret-key \
-e MINIO_BUCKET=chart-images \
-e MINIO_PUBLIC_DOMAIN="http://localhost:19000" \
crpi-7xkxsdc0iki61l0q.cn-hangzhou.personal.cr.aliyuncs.com/apconw/gpt-vis-api:0.0.1
注意:生产环境中需将 host.docker.internal 替换为实际服务器 IP。
验证服务是否正常
curl -X POST http://localhost:3100/generate \
-H "Content-Type: application/json" \
-d '{
"type": "line",
"data": [
{"time": "2025-05", "value": 512},
{"time": "2025-06", "value": 1024}
]
}'
✅ 成功响应应包含类似:
{
"url": "http://localhost:19000/chart-images/chart-abc123.png?Expires=..."
}
2.3 安装 AntV MCP Server Chart
通过 MCP-Hub 注册 AntV 图表工具:
npx -y @antv/mcp-server-chart
并在 MCP-Hub 中配置环境变量:
VIS_REQUEST_SERVER=http://host.docker.internal:3100/generate
此配置使 AntV MCP 工具将图表渲染请求转发至 GPT-VIS-API。⚠️官方工具图片渲染默认使用公网服务.这里配置解决了私有化部署问题!!
配置
3️⃣ 核心逻辑:大模型生成 SQL 与推荐图表类型
通过结构化 Prompt 引导大模型完成两项关键任务:
- 生成可执行的 SQL 查询
- 根据查询结果语义推荐最合适的图表类型
3.1 Prompt 设计要点
- 明确角色:专业 DBA + BI 分析师
- 提供上下文:表结构、表关系、当前时间
- 约束输出:仅返回 JSON,包含 sql_query 和 chart_type
- 内置 25+ 图表类型定义(如 generate_line_chart, generate_sankey_chart 等)
3.2 输出示例
{
"sql_query": "SELECT DATE(created_at) AS day, COUNT(*) AS orders FROM orders GROUP BY day ORDER BY day;",
"chart_type": "generate_line_chart"
}
3.3 核心代码片段(SQL 与图表推荐)
import json
import traceback
from langchain.prompts import ChatPromptTemplate
from datetime import datetime
import logging
from agent.text2sql.analysis.llm_util import get_llm
logger = logging.getLogger(__name__)
def sql_generate(state):
llm = get_llm()
prompt = ChatPromptTemplate.from_template(
"""
你是一位专业的数据库管理员(DBA),任务是根据提供的数据库结构、表关系以及用户需求,生成优化的MYSQL SQL查询语句,并推荐合适的可视化图表。
## 任务
- 根据用户问题生成一条优化的SQL语句。
- 根据查询生成逻辑从**图表定义**中选择最合适的图表类型。
## 约束条件
1. 你必须仅生成一条合法、可执行的SQL查询语句 —— 不得包含解释、Markdown、注释或额外文本。
2. **必须直接且完整地使用所提供的表结构和表关系来生成SQL语句**。
3. 你必须严格遵守数据类型、外键关系及表结构中定义的约束。
4. 使用适当的SQL子句(JOIN、WHERE、GROUP BY、HAVING、ORDER BY、LIMIT等)以确保准确性和性能。
5. 若问题涉及时序,请合理使用提供的“当前时间”上下文(例如用于相对日期计算)。
6. 不得假设表结构中未明确定义的列或表。
7. 如果用户问题模糊或者缺乏足够的信息以生成正确的查询,请返回:`NULL`
## 提供的信息
- 表结构:{db_schema}
- 表关系:{table_relationship}
- 用户提问:{user_query}
- 当前时间:{current_time}
## 图表定义
- generate_area_chart: used to display the trend of data under a continuous independent variable, allowing observation of overall data trends.
- generate_bar_chart: used to compare values across different categories, suitable for horizontal comparisons.
- generate_boxplot_chart: used to display the distribution of data, including the median, quartiles, and outliers.
- generate_column_chart: used to compare values across different categories, suitable for vertical comparisons.
- generate_district_map: Generate a district-map, used to show administrative divisions and data distribution.
- generate_dual_axes_chart: Generate a dual-axes chart, used to display the relationship between two variables with different units or ranges.
- generate_fishbone_diagram: Generate a fishbone diagram, also known as an Ishikawa diagram, used to identify and display the root causes of a problem.
- generate_flow_diagram: Generate a flowchart, used to display the steps and sequence of a process.
- generate_funnel_chart: Generate a funnel chart, used to display data loss at different stages.
- generate_histogram_chart: Generate a histogram, used to display the distribution of data by dividing it into intervals and counting the number of data points in each interval.
- generate_line_chart: Generate a line chart, used to display the trend of data over time or another continuous variable.
- generate_liquid_chart: Generate a liquid chart, used to display the proportion of data, visually representing percentages in the form of water-filled spheres.
- generate_mind_map: Generate a mind-map, used to display thought processes and hierarchical information.
- generate_network_graph: Generate a network graph, used to display relationships and connections between nodes.
- generate_organization_chart: Generate an organizational chart, used to display the structure of an organization and personnel relationships.
- generate_path_map: Generate a path-map, used to display route planning results for POIs.
- generate_pie_chart: Generate a pie chart, used to display the proportion of data, dividing it into parts represented by sectors showing the percentage of each part.
- generate_pin_map: Generate a pin-map, used to show the distribution of POIs.
- generate_radar_chart: Generate a radar chart, used to display multi-dimensional data comprehensively, showing multiple dimensions in a radar-like format.
- generate_sankey_chart: Generate a sankey chart, used to display data flow and volume, representing the movement of data between different nodes in a Sankey-style format.
- generate_scatter_chart: Generate a scatter plot, used to display the relationship between two variables, showing data points as scattered dots on a coordinate system.
- generate_treemap_chart: Generate a treemap, used to display hierarchical data, showing data in rectangular forms where the size of rectangles represents the value of the data.
- generate_venn_chart: Generate a venn diagram, used to display relationships between sets, including intersections, unions, and differences.
- generate_violin_chart: Generate a violin plot, used to display the distribution of data, combining features of boxplots and density plots to provide a more detailed view of the data distribution.
- generate_word_cloud_chart: Generate a word-cloud, used to display the frequency of words in textual data, with font sizes indicating the frequency of each word.
- generate_table: Generate a structured table, used to organize and present data in rows and columns, facilitating clear and concise information display for easy reading and analysis.
## 输出格式
- 你**必须且只能**输出一个符合以下结构的 **纯 JSON 对象**,不得包含任何额外文本、注释、换行或 Markdown 格式:
```json
{{
"sql_query": "生成的SQL语句字符串",
"chart_type": "推荐的图表类型字符串,如 \"generate_area_chart\""
}}
"""
)
chain = prompt | llm
try:
response = chain.invoke(
{
"db_schema": state["db_info"],
"user_query": state["user_query"],
"table_relationship": state.get("table_relationship", []),
"current_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
}
)
state["attempts"] += 1
clean_json_str = response.content.strip().removeprefix("```json").strip().removesuffix("```").strip()
state["generated_sql"] = json.loads(clean_json_str)["sql_query"]
# mcp-hub 服务默认添加前缀防止重复问题
state["chart_type"] = "mcp-server-chart-" + json.loads(clean_json_str)["chart_type"]
except Exception as e:
traceback.print_exception(e)
logger.error(f"Error in generating: {e}")
state["generated_sql"] = "No SQL query generated"
return state
4️⃣ 智能渲染:调用 MCP 工具生成图表
4.1 构建 React Agent
使用 LangGraph 的 create_react_agent 构建一个轻量级智能体,专门负责图表渲染:
- 动态过滤工具:仅加载当前所需的图表工具(如 mcp-server-chart-generate_line_chart),减少 Token 消耗与幻觉风险。
- 自动填充参数:根据数据结构推断 X/Y 轴、标题、图例等配置。
- 强制中文标签:确保图表可读性。
4.2 渲染流程
- 执行 SQL 获取结果数据
- 将数据与图表类型传入 Agent
- Agent 调用对应 MCP 工具
- 工具调用 GPT-VIS-API 生成图片并返回 URL 最终输出:图表
4.3 核心代码片段(图表渲染)
import os
from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent
async def data_render_ant(state: AgentState):
client = MultiServerMCPClient({
"mcphub-sse": {
"url": os.getenv("MCP_HUB_DATABASE_QA_GROUP_URL"),
"transport": "streamable_http",
}
})
chart_type = state["chart_type"]
tools = await client.get_tools()
tools = [tool for tool in tools if tool.name == chart_type]
llm = ChatOpenAI(
model=os.getenv("MODEL_NAME", "qwen-plus"),
temperature=float(os.getenv("MODEL_TEMPERATURE", 0.75)),
base_url=os.getenv("MODEL_BASE_URL"),
api_key=os.getenv("MODEL_API_KEY"),
streaming=True,
)
result_data = state["execution_result"]
chart_agent = create_react_agent(
model=llm,
tools=tools,
prompt=f"""
你是一位经验丰富的BI专家,擅长根据数据特征自动选择最合适的MCP图表工具,并完成图表渲染。
### 任务步骤
1. **分析数据特征**:理解输入的原始数据结构(如维度、指标、数据类型、数据量等)。
2. **选择最优图表类型**:基于数据特征,从MCP图表库中选择最适合的图表工具。
3. **读取工具Schema**:获取所选MCP图表工具的参数配置规范(JSON Schema)。
4. **填充参数**:根据原始数据和可视化目标,按Schema要求填充图表参数。
5. **生成图表**:调用MCP工具渲染图表,并返回图表链接。
### 输入数据
{result_data}
### 要求
- 不要解释图表内容或生成文字说明。
- 必须返回符合格式的图表链接。
- 图表需清晰表达数据关系,符合可视化最佳实践。
- x轴和y轴的标签必须使用中文显示。
### 返回格式
[图表](https://example.com/chart.png)
""",
)
result = await chart_agent.ainvoke(
{"messages": [("user", "根据输入数据选择合适的MCP图表工具进行渲染")]},
config={"configurable": {"thread_id": "chart-render"}},
)
state["chart_url"] = result["messages"][-1].content
return state
5️⃣ 总结
✅ 本文成果
- 成功构建端到端的 “自然语言 → SQL → 图表” 自动化流水线
- 实现大模型与专业可视化能力的 标准化对接
- 支持完全私有化部署,满足企业级安全合规要求
如何学习大模型 AI ?
我国在AI大模型领域面临人才短缺,数量与质量均落后于发达国家。2023年,人才缺口已超百万,凸显培养不足。随着Al技术飞速发展,预计到2025年,这一缺口将急剧扩大至400万,严重制约我国Al产业的创新步伐。加强人才培养,优化教育体系,国际合作并进,是破解困局、推动AI发展的关键。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
2025最新大模型学习路线
明确的学习路线至关重要。它能指引新人起点、规划学习顺序、明确核心知识点。大模型领域涉及的知识点非常广泛,没有明确的学习路线可能会导致新人感到迷茫,不知道应该专注于哪些内容。
对于从来没有接触过AI大模型的同学,我帮大家准备了从零基础到精通学习成长路线图以及学习规划。可以说是最科学最系统的学习路线。
针对以上大模型的学习路线我们也整理了对应的学习视频教程,和配套的学习资料。
大模型经典PDF书籍
新手必备的大模型学习PDF书单来了!全是硬核知识,帮你少走弯路!
配套大模型项目实战
所有视频教程所涉及的实战项目和项目源码等
博主介绍+AI项目案例集锦
MoPaaS专注于Al技术能力建设与应用场景开发,与智学优课联合孵化,培养适合未来发展需求的技术性人才和应用型领袖。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
为什么要学习大模型?
2025人工智能大模型的技术岗位与能力培养随着人工智能技术的迅速发展和应用 , 大模型作为其中的重要组成部分 , 正逐渐成为推动人工智能发展的重要引擎 。大模型以其强大的数据处理和模式识别能力, 广泛应用于自然语言处理 、计算机视觉 、 智能推荐等领域 ,为各行各业带来了革命性的改变和机遇 。
适合人群
- 在校学生:包括专科、本科、硕士和博士研究生。学生应具备扎实的编程基础和一定的数学基础,有志于深入AGI大模型行业,希望开展相关的研究和开发工作。
- IT行业从业人员:包括在职或失业者,涵盖开发、测试、运维、产品经理等职务。拥有一定的IT从业经验,至少1年以上的编程工作经验,对大模型技术感兴趣或有业务需求,希望通过课程提升自身在IT领域的竞争力。
- IT管理及技术研究领域人员:包括技术经理、技术负责人、CTO、架构师、研究员等角色。这些人员需要跟随技术发展趋势,主导技术创新,推动大模型技术在企业业务中的应用与改造。
- 传统AI从业人员:包括算法工程师、机器视觉工程师、深度学习工程师等。这些AI技术人才原先从事机器视觉、自然语言处理、推荐系统等领域工作,现需要快速补充大模型技术能力,获得大模型训练微调的实操技能,以适应新的技术发展趋势。
课程精彩瞬间
大模型核心原理与Prompt:掌握大语言模型的核心知识,了解行业应用与趋势;熟练Python编程,提升提示工程技能,为Al应用开发打下坚实基础。
RAG应用开发工程:掌握RAG应用开发全流程,理解前沿技术,提升商业化分析与优化能力,通过实战项目加深理解与应用。
Agent应用架构进阶实践:掌握大模型Agent技术的核心原理与实践应用,能够独立完成Agent系统的设计与开发,提升多智能体协同与复杂任务处理的能力,为AI产品的创新与优化提供有力支持。
模型微调与私有化大模型:掌握大模型微调与私有化部署技能,提升模型优化与部署能力,为大模型项目落地打下坚实基础。
顶尖师资,深耕AI大模型前沿技术
实战专家亲授,让你少走弯路
一对一学习规划,职业生涯指导
- 真实商业项目实训
- 大厂绿色直通车
人才库优秀学员参与真实商业项目实训
以商业交付标准作为学习标准,具备真实大模型项目实践操作经验可写入简历,支持项目背调
大厂绿色直通车,冲击行业高薪岗位
文中涉及到的完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
更多推荐
所有评论(0)