手把手教你用LangChain + MCP 构建带可视化图表功能的ChatBI智能体,全程干货,草履虫也能学会!!

发布时间:2026/8/27 17:38:15

手把手教你用LangChain + MCP 构建带可视化图表功能的ChatBI智能体,全程干货,草履虫也能学会!!
一、实现流程介绍在本专栏的前面文章中介绍过基于LangChain MCP和SpringAI MCP构建ChatBI智能体但未对数据进行可视化图表的分析而可视化图表是数据分析的重要组成部分它能够将复杂的数据转化为直观易懂的图形表示。因此本篇文章基于LangChain MCP实验构建ChatBI 可视化图表综合的智能体。使用数据说明其中分析数据采用数据采用COVID-19测试案例包括美国2021-01-28号各个县county的新冠疫情累计案例信息包括确诊病例和死亡病例数据格式如下所示date日期,county县,state州,fips县编码code,cases累计确诊病例,deaths累计死亡病例2021-01-28,Pike,Alabama,01109,2704,352021-01-28,Randolph,Alabama,01111,1505,372021-01-28,Russell,Alabama,01113,3675,162021-01-28,Shelby,Alabama,01117,19878,1412021-01-28,St.Clair,Alabama,01115,8047,1472021-01-28,Sumter,Alabama,01119,925,282021-01-28,Talladega,Alabama,01121,6711,1142021-01-28,Tallapoosa,Alabama,01123,3258,1122021-01-28,Tuscaloosa,Alabama,01125,22083,2832021-01-28,Walker,Alabama,01127,6105,1852021-01-28,Washington,Alabama,01129,1454,27下载地址如下https://github.com/BIXUECHAO/covid-19-tes-data/blob/main/us-covid19-counties.csv整体实现过程如下所示其中可视化图表能力采用ModelScope上公开的MCP-Server地址为https://modelscope.cn/mcp/servers/antvis/mcp-server-chart连接方式{mcpServers:{mcp-server-chart:{type:sse,url:https://mcp.api-inference.modelscope.net/530c948576c248/sse}}}Covid19 Query MCP Server则是通过FastMCP来自定义实现。大模型端采用OpenAI的GPT-4.1模型你也可以换成其他支持工具调通的模型。实验最终实现的效果如下所示提问找出确诊人数前五名的州按饼图的方式绘制给我提问根据每个县的确诊人数取Top10以柱状图的方式呈现给我本次实验所依赖的版本如下所示mcp1.9.2openai1.75.0langchain0.3.25langchain-openai0.3.18langgraph0.4.7pymysql1.0.3二、搭建 数据查询 MCP Server首先创建数据表并导入上述数据CREATE TABLE us_covid19_counties(date varchar(255)CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT日期,county varchar(255)CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT县,state varchar(255)CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT州,fips varchar(255)CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT县编码code,casesintDEFAULT NULL COMMENT累计确诊病例,deathsintDEFAULT NULL COMMENT累计死亡病例)ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci COMMENTCOVID-19 案例;实现数据库操作这里仅仅做了数据库交互实际使用时应考虑很多性能细节的优化utils_db.pyimportpymysql defget_conn():returnpymysql.connect(host127.0.0.1,port3306,databasetest3,userroot,passwordroot,autocommitTrue)defquery(sql):connget_conn()cursorconn.cursor()cursor.execute(sql)columns[column[0]forcolumnincursor.description]reslist()forrowincursor.fetchall():res.append(dict(zip(columns,row)))cursor.close()conn.close()returnres创建数据查询MCP Server这里实现了两个MCP Tools 分别是获取表Schema和 执行SQL两个操作importjsonfrommcp.server.fastmcpimportFastMCPimportutils_db mcpFastMCP(COVID-19-DB-Query-Mcp-Server)schema_sql SELECT COLUMN_NAME, DATA_TYPE, COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA test3 AND TABLE_NAME {table} effective_tables[us_covid19_counties]mcp.tool()defget_table_schema()-str:获取当前有效表的 MySQL Schema, 生成SQL之前你应该使用该工具获取完整的表结构table_schema[]fortableineffective_tables:schemasutils_db.query(schema_sql.format(tabletable))schemas, .join([f{s[COLUMN_NAME]}{s[DATA_TYPE]}COMMENT{s[COLUMN_COMMENT]}forsinschemas])table_schema.append(fTABLE {table} ({schemas}))return\n\n.join(table_schema)mcp.tool()defrun_sql(sql:str)-str:执行MySQL SQL语句查询数据一次仅能执行一句SQLtry:returnstr(utils_db.query(sql))exceptExceptionase:returnf执行SQL错误{str(e)},请修正后重新发起。if__name____main__:mcp.settings.port6030mcp.run(sse)启动MCP Server三、LangChain MCP Client 智能体构建LangChain官方关于MCP的集成介绍文档如下https://langchain-ai.github.io/langgraph/agents/mcp/关于MCP的连接通过MultiServerMCPClient抽取出所有的MCP Tools然后交给create_react_agent构建智能体。实现过程和本地控制台测试逻辑如下importos,config os.environ[OPENAI_BASE_URL]https://api.openai.com/v1## 支持openai协议的 API BASEos.environ[OPENAI_API_KEY]sk-xxxxx## 你的API KEYfromlanggraph.prebuiltimportcreate_react_agentfromlangchain_mcp_adapters.clientimportMultiServerMCPClientfromcoloramaimportFore,Styleimportasynciofromlanggraph.checkpoint.memoryimportInMemorySaver asyncdefmain():clientMultiServerMCPClient({chart:{url:https://mcp.api-inference.modelscope.net/530c948576c248/sse,transport:sse},covid19-query:{url:http://127.0.0.1:6030/sse,transport:sse}})toolsawaitclient.get_tools()checkpointerInMemorySaver()agentcreate_react_agent(openai:gpt-4.1,tools,checkpointercheckpointer,promptYou are an AI assistant that helps people find information.)config{configurable:{thread_id:1}}whileTrue:questioninput(请输入)ifnot question:continueifquestionq:breakasyncfor chunkinagent.astream({messages:[{role:user,content:question}]},stream_modeupdates,configconfig):ifagentinchunk:contentchunk[agent][messages][0].content tool_callschunk[agent][messages][0].tool_callsiftool_calls:fortoolintool_calls:print(Fore.YELLOW,Style.BRIGHT,f Call MCP Server:{tool[name]}, args:{tool[args]})else:print(Fore.BLACK,Style.BRIGHT,fLLM:{content})eliftoolsinchunk:contentchunk[tools][messages][0].content namechunk[tools][messages][0].nameprint(Fore.GREEN,Style.BRIGHT,f{name}:{content})if__name____main__:asyncio.run(main())运行测试提问统计的确诊数量前十名的州以折线图的方式展示四、封装为 OpenAI 协议接口上述已经通过控制台实现了完整的Agent交互过程下面继续改造逻辑使用FastAPI封装为OpenAI协议接口便于在客户端使用。注意这里主要为实现功能api_key写死在程序中为sk-da4b6cb4a41e4cascascasc9508deb556942随机生成的 后续使用客户端连接时需要填写该api_key。importos os.environ[OPENAI_BASE_URL]https://api.openai.com/v1## 支持openai协议的 API BASEos.environ[OPENAI_API_KEY]sk-xxxxx## 你的API KEYfromfastapiimportFastAPI,HTTPException,Header,Dependsfromfastapi.responsesimportStreamingResponsefrompydanticimportBaseModelfromtyping importList,Dict,Any,Optional,Generatorfromlanggraph.prebuiltimportcreate_react_agentfromlangchain_mcp_adapters.clientimportMultiServerMCPClientfromdatetimeimportdatetimeimporttime,uuid appFastAPI(titleOpenAI Compatible Chat API)api_keysk-da4b6cb4a41e4cascascasc9508deb556942agentNoneclassChatCompletionRequest(BaseModel):model:strmessages:List[Dict[str,Any]]temperature:Optional[float]1.0max_tokens:Optional[int]Nonestream:Optional[bool]FalseclassChatCompletionChoice(BaseModel):index:intmessage:List[Dict[str,Any]]finish_reason:strclassChatCompletionResponse(BaseModel):id:strobject:strchat.completioncreated:intmodel:strchoices:List[ChatCompletionChoice]usage:Dict[str,int]classChatCompletionChunk(BaseModel):id:strobject:strchat.completion.chunkcreated:intmodel:strchoices:List[Dict[str,Any]]asyncdefcreate_agent():创建MCP AgentclientMultiServerMCPClient({chart:{url:https://mcp.api-inference.modelscope.net/530c948576c248/sse,transport:sse},covid19-query:{url:http://127.0.0.1:6030/sse,transport:sse}})toolsawaitclient.get_tools()returncreate_react_agent(openai:gpt-4.1,,tools,promptYou are an AI assistant that helps people find information.\n针对用户的问题你的执行流程是1.获取表结构。2.生成SQL查询数据。3.生成可视化图表。4.总结结果回复用户)asyncdefinvoke_agent(messages:[]):globalagent ifnot agent:agentawaitcreate_agent()asyncfor chunkinagent.astream({messages:messages},stream_modeupdates):ifagentinchunk:contentchunk[agent][messages][0].content tool_callschunk[agent][messages][0].tool_callsiftool_calls:fortoolintool_calls:yieldf Call MCP Server:{tool[name]}\n\nelse:yieldcontent asyncdefhandle_stream_response(messages:[],model:str,request_id:str)-Generator[str,None,None]:# 执行 agentasyncfor msgininvoke_agent(messages):chunk_dataChatCompletionChunk(idrequest_id,createdint(time.time()),modelmodel,choices[{index:0,delta:{content:msg},finish_reason:None}])yieldfdata:{chunk_data.model_dump_json()}\n\nfinal_chunkChatCompletionChunk(idrequest_id,createdint(time.time()),modelmodel,choices[{index:0,delta:{},finish_reason:stop}])yieldfdata:{final_chunk.model_dump_json()}\n\nyielddata: [DONE]\n\nasyncdefverify_auth(authorization:Optional[str]Header(None))-bool:验证tokenifnot authorization:returnFalseifauthorization.startswith(Bearer ):tokenauthorization[7:]else:tokenauthorizationreturntokenapi_keyapp.post(/v1/chat/completions)asyncdefchat_completions(request:ChatCompletionRequest,auth_result:boolDepends(verify_auth)):# 检查身份验证结果ifnot auth_result:raiseHTTPException(status_code401,detail{error:{message:Invalid authentication credentials,type:invalid_request_error,param:None,code:invalid_api_key}},headers{WWW-Authenticate:Bearer})## 暂不支持非流式返回ifnot request.stream:raiseHTTPException(status_code400,detail{error:{message:Streaming responses are not implemented in this mock API,type:invalid_request_error,param:stream,code:invalid_parameter}})try:# 触发 agent 并流式返回request_idfchatcmpl-{uuid.uuid4().hex[:8]}returnStreamingResponse(handle_stream_response(request.messages,request.model,request_id),media_typetext/plain,headers{Cache-Control:no-cache,Connection:keep-alive,Content-Type:text/event-stream})exceptExceptionase:raiseHTTPException(status_code500,detailstr(e))app.get(/v1/models)asyncdeflist_models():列出可用模型return{object:list,data:[{id:agent_model,object:model,created:int(time.time()),owned_by:agent}]}app.get(/health)asyncdefhealth_check():健康检查return{status:healthy,timestamp:datetime.now().isoformat()}if__name____main__:importuvicorn uvicorn.run(app,host0.0.0.0,port8000)启动服务五、使用 OpenAI 协议客户端进行测试这里以Cherry Studio为例你也可以换成OpenWebUI或者其他支持OpenAI协议的客户端配置连接对话测试提问统计的确诊数量前十名的州以折线图的方式展示提问找出确诊人数前五名的州按饼图的方式绘制给我提问根据每个县的确诊人数取Top10以柱状图的方式呈现给我提问统计确诊数量最多的州占整体的百分比以液体展示最后为什么要学AI大模型当下⼈⼯智能市场迎来了爆发期并逐渐进⼊以⼈⼯通⽤智能AGI为主导的新时代。企业纷纷官宣“ AI ”战略为新兴技术⼈才创造丰富的就业机会⼈才缺⼝将达 400 万DeepSeek问世以来生成式AI和大模型技术爆发式增长让很多岗位重新成了炙手可热的新星岗位薪资远超很多后端岗位在程序员中稳居前列。与此同时AI与各行各业深度融合飞速发展成为炙手可热的新风口企业非常需要了解AI、懂AI、会用AI的员工纷纷开出高薪招聘AI大模型相关岗位。最近很多程序员朋友都已经学习或者准备学习 AI 大模型后台也经常会有小伙伴咨询学习路线和学习资料我特别拜托北京清华大学学士和美国加州理工学院博士学位的鲁为民老师给大家这里给大家准备了一份涵盖了AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频全系列的学习资料这些学习资料不仅深入浅出而且非常实用让大家系统而高效地掌握AI大模型的各个知识点。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】AI大模型系统学习路线在面对AI大模型开发领域的复杂与深入精准学习显得尤为重要。一份系统的技术路线图不仅能够帮助开发者清晰地了解从入门到精通所需掌握的知识点还能提供一条高效、有序的学习路径。但知道是一回事做又是另一回事初学者最常遇到的问题主要是理论知识缺乏、资源和工具的限制、模型理解和调试的复杂性在这基础上找到高质量的学习资源不浪费时间、不走弯路又是重中之重。AI大模型入门到实战的视频教程项目包看视频学习是一种高效、直观、灵活且富有吸引力的学习方式可以更直观地展示过程能有效提升学习兴趣和理解力是现在获取知识的重要途径光学理论是没用的要学会跟着一起敲要动手实操才能将自己的所学运用到实际当中去这时候可以搞点实战案例来学习。海量AI大模型必读的经典书籍PDF阅读AI大模型经典书籍可以帮助读者提高技术水平开拓视野掌握核心技术提高解决问题的能力同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说阅读经典书籍是非常有必要的。600AI大模型报告实时更新这套包含640份报告的合集涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师还是对AI大模型感兴趣的爱好者这套报告合集都将为您提供宝贵的信息和启示。AI大模型面试真题答案解析我们学习AI大模型必然是想找到高薪的工作下面这些面试题都是总结当前最新、最热、最高频的面试题并且每道题都有详细的答案面试前刷完这套面试题资料小小offer不在话下这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

相关新闻

为什么选择cleye而非commander和yargs?Node.js CLI库横评对比清单

为什么选择cleye而非commander和yargs?Node.js CLI库横评对比清单

2026/8/27 17:38:15

为什么选择cleye而非commander和yargs?Node.js CLI库横评对比清单 【免费下载链接】cleye 👁‍🗨 Strongly typed CLI development for Node.js 项目地址: https://gitcode.com/gh_mirrors/cl/cleye 👋 正在纠结用 command…

Astro Compiler解析器揭秘:基于Go标准库定制的HTML5解析器是怎么做到的

Astro Compiler解析器揭秘:基于Go标准库定制的HTML5解析器是怎么做到的

2026/8/27 17:28:15

Astro Compiler解析器揭秘:基于Go标准库定制的HTML5解析器是怎么做到的 【免费下载链接】compiler The Astro compiler. Written in Go. Distributed as WASM. 项目地址: https://gitcode.com/gh_mirrors/compiler8/compiler Astro 编译器(Astro …

UBI Reader的边界在哪里?journal回放、ECC与socket文件三大已知限制全解

UBI Reader的边界在哪里?journal回放、ECC与socket文件三大已知限制全解

2026/8/27 17:28:15

UBI Reader的边界在哪里?journal回放、ECC与socket文件三大已知限制全解 【免费下载链接】ubi_reader Collection of Python scripts for reading information about and extracting data from UBI and UBIFS images. 项目地址: https://gitcode.com/gh_mirrors/u…

ABAP:Visual Studio Code->ABAP FS開發ABAP教程

ABAP:Visual Studio Code->ABAP FS開發ABAP教程

2026/8/27 18:28:17

和GUI相比其實沒有很大的好處,我覺得還是GUI寫代碼更方便一些,但是這裡多了可以編輯那些需要使用ECLIPSE開發的元素:CDS視圖 教程如下: 1.下載Visual Studio Code,官方連接如下: Download Visual Studio …

基于SpringCloud的分布式演唱会抢票系统(毕业设计项目源码+文档)

基于SpringCloud的分布式演唱会抢票系统(毕业设计项目源码+文档)

2026/8/27 18:28:17

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

EV 驱动电机零转速满转矩起步(Align→OpenLoop→FOC)Simulink 建模

EV 驱动电机零转速满转矩起步(Align→OpenLoop→FOC)Simulink 建模

2026/8/27 18:28:17

目录 一、为什么“零转速满转矩起步”要单独做 二、起步控制原理简述 2.1 预定位(Align / Pre‑Excite) 2.2 开环旋转(Open‑Loop Voltage‑Oriented) 2.3 切闭环 FOC 三、关键参数 四、Simulink 建模(手把手) 4.1 Step 1️⃣ —— PMSM + Inverter + 坐标变换(同…

为什么滤波器电容必须做真空注胶滤波器电容是变频器、新能源逆变器、车载充电机(OBC)、UPS、光伏储能、通信电源等高压设备的关键元件

为什么滤波器电容必须做真空注胶滤波器电容是变频器、新能源逆变器、车载充电机(OBC)、UPS、光伏储能、通信电源等高压设备的关键元件

2026/8/27 18:28:17

一、为什么滤波器电容必须做真空注胶滤波器电容是变频器、新能源逆变器、车载充电机(OBC)、UPS、光伏储能、通信电源等高压设备的关键元件。它长期工作在高电压、高频率、高温升环境下,对内部绝缘性、抗振性、散热性能、防潮等级有极高要求。…

Level 4自动驾驶系统设计46——L2/L3 级软硬件架构 2

Level 4自动驾驶系统设计46——L2/L3 级软硬件架构 2

2026/8/27 18:28:17

8.3 片外高刚性独立安全 MCU(如英飞凌 TC 系列)的接口分配与底软窗口看门狗(WWD)硬核防御 8.3.1 跨芯片级故障蔓延与 MCU “最后一道防线”的物理刚性 在 8.2 节关于 Level 3 级单芯片方案性能瓶颈的白盒解耦中,我们证实了在单片大算力 SoC 挂载 32G/64G 内存的商业包络…

分布式共识实现的分层测试

分布式共识实现的分层测试

2026/8/27 18:18:17

分布式共识实现的分层测试共识测试要验证安全性和活性,单节点通过不能说明选主和日志复制正确。 针对协议分层 单元测试覆盖任期与日志规则,集成测试模拟网络分区,场景测试检查成员加入和恢复后的状态。 记录可重放条件 保存消息顺序、随机种…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/27 11:10:02

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/27 7:25:23

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/26 17:50:58

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

2026/8/27 0:07:12

1. 项目概述:从零构建一个企业级的AI服务网关 最近在帮一个做内容审核的团队做技术架构升级,他们原来的业务里,每天有几十万张图片和短视频需要过审,最初是接了几个开源的AI模型自己部署,但效果和性能一直不太稳定。后…

LeetCode Hot100(51-60)算法精解与面试技巧

LeetCode Hot100(51-60)算法精解与面试技巧

2026/8/27 0:07:12

1. 题目背景与核心价值"hot100(51-60)"这个标题看起来像是某个编程题库或算法练习集中的一组题目编号。在技术社区中,类似命名通常指向LeetCode、牛客网等平台的热门题目集合。作为刷过300题的算法老手,我理解这类题目的核心价值在于&#xff…

CRC校验实战:从模2除法到HJ212协议排错

CRC校验实战:从模2除法到HJ212协议排错

2026/8/27 0:07:12

1. 为什么一个“校验码”能扛住工业现场90%的数据 corruption? 你有没有遇到过这样的场景:嵌入式设备通过RS-485上传温湿度数据,上位机偶尔收到一帧乱码——温度显示成-273℃,湿度跳到999%,但串口波形看起来完全正常&a…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/26 18:07:30

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/26 17:57:52

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…