【天翼AI-星辰智能体平台】| 基于Excel表实现智能问数助手智能体开发实战

目录

  • [一. 🦁 写在前面](#一. 🦁 写在前面)
  • [二. 🦁 搭建流程](#二. 🦁 搭建流程)
    • [2.1 总体工作流展示](#2.1 总体工作流展示)
    • [2.2 外部工作流搭建流程](#2.2 外部工作流搭建流程)
      • [2.2.1 方案一---pandas + 规则解析 + 字段RAG 混合问数](#2.2.1 方案一—pandas + 规则解析 + 字段RAG 混合问数)
      • [2.2.2 方案二---Text2SQL方案](#2.2.2 方案二—Text2SQL方案)
    • [2.3 表格展示构建实现](#2.3 表格展示构建实现)
    • [2.4 图表展示构建实现](#2.4 图表展示构建实现)
    • [2.5 其它环节](#2.5 其它环节)
  • [三. 🦁 写在最后](#三. 🦁 写在最后)

一. 🦁 写在前面

今天,狮子使用中国电信的智能体平台------星辰智能体平台,搭建一个基于Excel表格问数的工作流,给了两张表(一张用户个人画像表(大概120多个字段),一张订单表(大概四个个字段)),一共两万条数据,现在要做根据自然语言问数,需要返回的数据形式有多种:分别是表格、柱状图、饼图、折线图这几种。

看了一下这个平台,因为神态酷似dify,但是确实插件比较少,给的数据源数据量较大,所以决定采用外部实现一个智能体用于处理数据和提供接口,在平台http接口的形式调用,在平台内实现图表和表格生成(尽力了,真不知道在平台怎么处理这个数据源)。

现在狮子来回忆一波捏这个工作流的步骤,并且分享一下在平台上实现图表的教程!!!

二. 🦁 搭建流程

2.1 总体工作流展示

2.2 外部工作流搭建流程

这个外部工作流的作用是查询数据源,并且返回用户需要的数据!数据源格式如下:

实现该流程的方案有两种。

2.2.1 方案一---pandas + 规则解析 + 字段RAG 混合问数

第一种方案就是利用pandas解析Excel表格的便捷性,将问题中的筛选条件提取出来标准化,再去Rag数据库那里检索最相关的字段说明,将检索结果与统计摘要拼成prompt交给大模型生成简短关联分析,同时通过pandas根据字段筛选出相应的数据,通过接口返回。具体流程如下:

ps:

狮子选择该种方法实现问数,因为时间有点急,数据库处理很麻烦。

2.2.2 方案二---Text2SQL方案

方案二则是将Excel的数据导入到数据库(可以选择SQLite)中,然后构建Rag向量库。用户输入问题后,先去知识库筛选对应的表信息,再封装成Prompt提交给大模型,让大模型帮忙生成对应的SQL,具体实现可以参考以下流程图:

ps:

这里后续还会有具体的文章来说明!

2.3 表格展示构建实现

如果用户的问题是返回对应的列表时,则需要展示时使用表格的方式呈现,这个其实很好实现,因为智能体平台一般都支持Markdow语法的数据展示,所以直接将得到的数据通过大模型转化为表格的语法,输出则是表格的形式。这个我们通过规定的提示词给大模型则可以实现,提示词如下:

bash 复制代码
        1. 接收{{output#}}内容并检查其是否为空。
        2. 如果输入内容为空,输出"未查询到结果请调整查询话术"。
        3. 如果输入内容不为空,将提取的{{output#}}整理成表格,同时汇总数量。简洁输出

2.4 图表展示构建实现

ps:

这一步之所以能实现,完全是因为平台支持Echarts的md格式,当平台的前端界面识别到这个由三个反引号包裹、并标记为echarts的代码块时,便会自动将其渲染为交互式图表

图表展示这块,我们肯定使用熟悉的Echarts组件库,官网地址如下:https://echarts.apache.org/examples/zh/index.html,在官网我们可以看到其实每种图都有一个代码模板的,比如折线图:

javascript 复制代码
{
  "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代码。提示词如下:

powershell 复制代码
你是一个专业的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的格式了,但是到这里还不行,我们还需要将大模型生成的代码整理成md格式的代码,这里就直接使用代码来处理了,具体代码示例如下:

python 复制代码
import json

def 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\n" + option_json + "\n```"
        return {"result": output}
    except Exception as e:
        return {"error": str(e)}

效果展示:

ps:

有人会问,为什么不用大模型直接生成md格式的Echarts代码?

这里也是可以这么做的,但是我觉得让大模型专心处理一件事情就好了,怕出错!

另外,其它类型的表也是按上面一样的方法,只是把折线图的模板换成其它类型,这一步可以通过AI完成。

2.5 其它环节

主要环节搭建已经完成,其它环节就是对数据的一些处理,无非就是新增一些节点来处理数据,我这里搭建的很匆忙,有很多节点处理得不好,其实有很多步都是可以优化的,总体还是显得有些冗余。

三. 🦁 写在最后

从Excel数据到最终的交互图表,这个项目完整地实践了如何将一个复杂的业务需求,拆解、封装成一个个可控的技术模块,并通过智能体平台进行高效组装。


🦁 其它优质专栏推荐 🦁

🌟《Java核心系列(修炼内功,无上心法)》: 主要是JDK源码的核心讲解,几乎每篇文章都过万字,让你详细掌握每一个知识点!
🌟 《springBoot 源码剥析核心系列》一些场景的Springboot源码剥析以及常用Springboot相关知识点解读

欢迎加入狮子的社区 :『Lion-编程进阶之路』,日常收录优质好文

更多文章可持续关注上方🦁的博客,2025咱们顶峰相见!

相关推荐
小陈又菜2 小时前
【计算机网络】网络层知识体系全解:从基础概念到路由协议
服务器·人工智能·计算机网络·机器学习·智能路由器
PNP Robotics2 小时前
聚焦具身智能,PNP机器人展出力反馈遥操作,VR动作捕捉等方案,获得中国科研贡献奖
大数据·人工智能·python·学习·机器人
小霖家的混江龙2 小时前
数学不好也能懂:解读 AI 经典论文《Attention is All You Need》与大模型生成原理
人工智能·llm·aigc
njsgcs2 小时前
ai控制鼠标生成刀路系统2 环境搭建 尝试
人工智能
喜欢吃豆2 小时前
大语言模型(LLM)全栈技术深度综述:理论、系统与工程实践
人工智能·语言模型·自然语言处理·大模型
渡我白衣2 小时前
计算机组成原理(8):各种码的作用详解
c++·人工智能·深度学习·神经网络·其他·机器学习
黑客思维者2 小时前
机器学习016:监督学习【分类算法】(支持向量机)-- “分类大师”入门指南
人工智能·学习·机器学习·支持向量机·分类·回归·监督学习
小毅&Nora2 小时前
【AI微服务】【Spring AI Alibaba】 ④ 深度实战:从零构建通义千问聊天服务(2025 最新版)
人工智能·微服务·spring ai
糖葫芦君2 小时前
Lora模型微调
人工智能·算法