天翼AI星辰平台:Excel智能问数助手开发实战
目录
- 一. ???? 序言与核心判断
- 二. ???? 环境搭建全流程拆解
- 2.1 整体工作流概览
- 2.2 外部智能体构建流程
- 2.2.1 方案一:Pandas + 规则解析 + 字段RAG混合查询
- 2.2.2 方案二:Text2SQL 自然语言转SQL
- 2.3 表格渲染实现详解
- 2.4 图表渲染实现详解
- 2.5 其他环节与优化空间
- 三. ???? 总结与经验沉淀
先亮出几个关键结论:中国电信的星辰智能体平台,界面和交互逻辑与Dify高度相似,但上手实测后会发现,它的插件生态尚处早期阶段,尤其对本地数据的原生处理能力非常有限。狮子最近在这个平台上搭建了一个基于Excel的自然语言问数工作流,完整复现了从零到可交互图表的全过程,下面把踩过的坑和落地方案逐一拆解。
数据源为两张表:一张用户个人画像表(120+字段),一张订单表(4个字段),合计约2万条记录。目标是用户通过自然语言提问,系统自动返回表格、柱状图、饼图或折线图等形式的数据结果。由于平台对这类复杂数据处理的支持不够理想,最终采用“外部独立智能体处理数据查询与接口服务,星辰平台通过HTTP调用,内部完成图表与表格渲染”的混合架构。
二. ???? 搭建流程
2.1 整体工作流展示
2.2 外部工作流搭建流程
外部工作流的核心逻辑很纯粹:接收用户输入的问题,从数据源中定位目标数据并返回结果。数据源格式大致如下:
实现这一目标,行业内主流的路径通常有两种。
2.2.1 方案一:Pandas + 规则解析 + 字段RAG混合查询
第一种方案充分利用Pandas对Excel表格的高效处理能力。思路是:自动从用户问题中提取筛选条件并做标准化处理,然后到构建好的RAG向量库中检索最匹配的字段描述,将检索结果与统计摘要拼成提示词送大模型生成简短分析结论;与此同时,通过Pandas依据筛选条件从数据源直接提取原始数据,最终通过统一接口返回。具体流程参考下图:
2.2.2 方案二:Text2SQL 自然语言转SQL
另一条路线更经典——先将Excel数据导入轻量级数据库(如SQLite),并构建RAG向量库存储表结构与字段信息。用户提问时,先去知识库检索相关的表结构和字段属性,再将检索结果封装到prompt中,让大模型直接生成可执行的SQL语句完成查询。实现流程如下:
2.3 表格渲染实现详解
当用户需要返回列表类数据时,表格是最直观的呈现载体。实现门槛很低——绝大多数智能体平台都支持Markdown语法渲染表格。只需将接口返回的数据,交由大模型按照预设的提示词整理成Markdown表格格式输出即可。狮子实际使用的提示词如下:
1. 接收{{output#}}内容并检查其是否为空。2. 如果输入内容为空,输出“未查询到结果请调整查询话术”。3. 如果输入内容不为空,将提取的{{output#}}整理成表格,同时汇总数量。简洁输出
2.4 图表渲染实现详解
图表部分是整个项目中最折腾的环节。第一时间想到Echarts——这个几乎已成为数据可视化标配的开源库,官方提供了丰富的模板代码。以折线图为例,其标准配置大致如下:
{"title": {"text": "{{ CHART_TITLE | default('Chart') }}","left": "center"},"tooltip": {"trigger": "axis","axisPointer": {"type": "cross"},"formatter": "{b} : {c}"},"xAxis": {"type": "category","data": {{ data.labels | tojson }},"boundaryGap": false},"yAxis": {"type": "value","name": "{{ Y_AXIS_NAME | default('Y') }}"},"series": [{"name": "{{ SERIES_NAME | default('Series') }}","type": "line","data": {{ data.values | tojson }},"smooth": true,"lineStyle": {"color": "rgba(54, 162, 235, 1)","width": 2},"itemStyle": {"color": "rgba(54, 162, 235, 0.8)"},"areaStyle": {"color": "rgba(54, 162, 235, 0.1)"}}]}
理论上,只要替换模板中的占位数据即可适配不同图表。但问题在于——接口返回的是JSON字符串,如何将其动态填充进Echarts模板?
答案依然是“交给大模型”。需要设计一段极其具体的提示词,让大模型根据给定的JSON数据对象,自动填入Echarts模板并生成可直接运行的配置代码。这段提示词虽然篇幅较长,但核心逻辑非常清晰:明确告知模型使用哪个模板、数据字段如何映射、输出格式严格遵循Echarts规范。提示词内容如下:
你是一个专业的ECharts数据可视化专家。根据用户提供的数据,使用提供给您的模板,生成标准的折线图ECharts配置。用户数据:{{#1765639035525.chart_data#}}提供给您的模板:"# 折线图模板适用场景:展示数据随时间的变化趋势模板代码:```json{"title": {"text": "{{ CHART_TITLE | default('Chart') }}","left": "center"},"tooltip": {"trigger": "axis","axisPointer": {"type": "cross"},"formatter": "{b} : {c}"},"xAxis": {"type": "category","data": {{ data.labels | tojson }},"boundaryGap": false},"yAxis": {"type": "value","name": "{{ Y_AXIS_NAME | default('Y') }}"},"series": [{"name": "{{ SERIES_NAME | default('Series') }}","type": "line","data": {{ data.values | tojson }},"smooth": true,"lineStyle": {"color": "rgba(54, 162, 235, 1)","width": 2},"itemStyle": {"color": "rgba(54, 162, 235, 0.8)"},"areaStyle": {"color": "rgba(54, 162, 235, 0.1)"}}]}## 关键点说明:- 数据输入结构- 使用 data.labels 和 data.values 两组数据来驱动 X 轴时间数据和折线的数值。- data.labels 与 data.values 的长度应一致,确保一一对应。- 默认值与容错- 默认值与容错- CHART_TITLE 使用 default('Chart'),如果未提供就显示“Chart”。- Y_AXIS_NAME 使用 default('Y'),SERIES_NAME 使用 default('Series')。- 数据通过 tojson 安全渲染,避免 JSON 转义问题。- 单/多线扩展- 该模板当前设计为单系列折线图;若未来需要多系列,可以在 series 中添加更多对象,并把数据结构调整为多组 data.values(或提供一个 series_list)。- 显示与样式- smooth 设置为 true,呈现平滑曲线。- areaStyle 提供区域填充,颜色为浅蓝色调,便于对比趋势。- xAxis 的 boundaryGap 设置为 false,便于时间序列数据紧贴边界显示。- 语言一致性- 演示中的占位符名为英文,默认文本也尽量使用英文;实际显示文本可按需要由数据源提供英文或翻译后文本。"请严格按以下步骤操作:1. 从检索结果中选择最匹配的图表模板2. 将用户数据按ECharts标准格式填入占位符3. 输出完整且可直接使用的ECharts option配置输出要求:- 必须输出标准的ECharts option JSON格式- 所有占位符{{}}必须被实际数据替换- 确保JSON语法完全正确,可直接用于echarts.setOption()- 数据格式严格遵循ECharts规范:* 字符串用双引号包围* 数组格式正确:["item1", "item2"]* 数值不加引号:[100, 200, 300]- 图表标题简洁明了,符合数据内容输出格式示例:echarts{"title": {"text": "Monthly Sales Data","left": "center"},"tooltip": {"trigger": "axis","axisPointer": {"type": "cross"},"formatter": "{b} : {c}"},"xAxis": {"type": "category","data": ["January", "February", "March", "April", "May", "June"],"boundaryGap": false},"yAxis": {"type": "value","name": "Sales Amount"},"series": [{"name": "Sales","type": "line","data": [120, 200, 150, 300, 250, 400],"smooth": true,"lineStyle": {"color": "rgba(54, 162, 235, 1)","width": 2},"itemStyle": {"color": "rgba(54, 162, 235, 0.8)"},"areaStyle": {"color": "rgba(54, 162, 235, 0.1)"}}]}注意:输出的JSON必须能够直接复制粘贴到ECharts中使用,不允许有任何语法错误。
借助大模型,原始数据被成功转化为标准ECharts配置。但距离平台最终展示还差一步——平台需要的是Markdown格式的代码块。因此额外增加了一个后处理环节,将大模型生成的ECharts配置包装成Markdown代码格式。狮子直接用代码实现:
import jsondef main(option=None):# 如果没有传入 option,给一个默认版本(中文文本示例)if option is None:option = {"title": {"text": "BMI Distribution","left": "center"},"grid": {"left": "8%","right": "4%","bottom": "6%","containLabel": True},"tooltip": {"trigger": "axis","axisPointer": {"type": "line"},"formatter": "{b} : {c}"},"xAxis": {"type": "category","data": ["BMI>=24", "BMI<=20"]},"yAxis": {"type": "value","name": "Count"},"series": [{"name": "Population","type": "bar","data": [3294, 1985],"barWidth": "20%","barMaxWidth": 40,"itemStyle": {"color": "rgba(255, 99, 132, 0.8)"}}]}# 如果 option 是字符串,尝试解析为字典if isinstance(option, str):try:option = json.loads(option)except Exception as e:return {"error": f"Invalid JSON string: {e}"}# 现在 option 应该是一个字典try:option_json = json.dumps(option, indent=2, ensure_ascii=False)output = "```echarts" + option_json + "```"return {"result": output}except Exception as e:return {"error": str(e)}
最终实现效果如下:
当然,折线图只是其中一种示例。柱状图、饼图等其他图表类型的实现逻辑完全一致——只需替换对应的Echarts模板即可,这些模板填充工作完全可以交给AI自动化处理。
2.5 其他环节与优化空间
核心环节搭建完成后,剩下的就是数据处理细节与节点间的协调优化。坦诚讲,狮子这次搭建比较仓促,不少节点设计得较为粗糙,中间许多步骤其实可以合并或简化,整体来看仍显冗余。如果时间允许,这块值得花精力精打细磨。
三. ???? 总结与经验沉淀
从一个Excel原生文件到最终交互式可视化图表,这个项目完整展示了如何将一个复杂的业务需求拆解、封装成多个可控的技术模块,再通过智能体平台高效组装。过程中虽然踩了不少坑——平台的插件能力短板、数据格式转换细节、模板填充的兼容性问题,但整条链路走下来,对“如何利用低代码平台处理复杂数据”这件事,思路清晰了很多。





