成了!不会前端,花一天时间给公司 BI 系统装上了 AI 智能体!

作为 BI / 数据开发,一直有个痛点:业务人员每次要数都得找我写 SQL、拖报表,简单的销售额、区域销量这种问题,每天要重复回答十几次。一直想给公司的 SmartBI 系统加个自然语言查数的 AI 助手,但一想到要写前端聊天界面、做后端接口、搞服务器部署、处理跨域鉴权,就觉得麻烦,拖了大半年。

直到最近发现了 EdgeOne Makers,从注册账号到本地调通,再到悬浮窗嵌入 SmartBI,总共花了一天时间,没写一行前端代码,就把 AI 智能体给装上了。这篇文章把完整步骤和踩过的所有坑都写出来,你跟着做也能成。


这个案例我想分享出来,是因为我从开始,到自己亲手实操完成,全程我都是复制粘贴,基本都是AI帮我检查纠错。最后成功用上智能体的那一刻,我头皮发麻,EdgeOne Makers也太好用了吧!!!

先看下最终效果吧~

一、从零到一完整实现步骤(跟着做就能成)

准备工作

  • 一台能跑 Python 的电脑(Windows/Mac 都可以)
  • 一个腾讯云账号(免费额度足够用)
  • 能访问你们公司 BI 系统的内网环境

第一步:创建 EdgeOne Makers 项目

  1. 打开 EdgeOne Makers 控制台:edgeone.cloud.tencent.com/makers

2. 新建项目,选择「OpenAI Agents 入门模板(Python 版)」

  1. 选择一个git平台,我这里选的是gitte,然后点击立即创建。
  1. 等待 1 分钟,项目就初始化好了,自带聊天界面、会话记忆、流式输出、工具调用框架,不用自己写前端

第二步:本地开发环境搭建

  1. 先安装 EdgeOne CLI 工具:

    npm install -g edgeone

  2. 把项目拉到本地,进入项目目录

  1. 安装依赖:

    npm install

  2. Windows 用户一定要先设置编码(不然后面 emoji 会报 GBK 编码错误):

ini 复制代码
set PYTHONUTF8=1
  1. 启动本地开发服务:

    edgeone makers dev

  2. 启动成功后,打开 http://localhost:8088 就能看到默认的聊天界面了,自带天气、翻译这些示例工具,启动比较慢,等出现running at xxx就可以了


第三步:配置 SmartBI 环境变量

在项目根目录新建.env文件,配置 SmartBI 连接信息:

ini 复制代码
# AI网关配置(创建项目后自动生成,不用改)
AI_GATEWAY_API_KEY=你的API_KEY
AI_GATEWAY_BASE_URL=你的网关地址
AI_GATEWAY_MODEL=@makers/deepseek-v4-flash
​
# SmartBI配置
SMARTBI_BASE_URL=http://你的SmartBI地址:端口/smartbi
SMARTBI_TOKEN=你的SmartBI个人访问令牌
PYTHONUTF8=1

SmartBI 个人访问令牌在「个人中心 - 个人访问令牌」里生成,给查询权限就行。⬇️⬇️⬇️


在数据模型那里新增一个测试用的数据集,用来后续用智能体测试用。

txt 复制代码
-- 销售测试数据(Oracle 版,UNION ALL 构造临时数据集,字段全中文)
SELECT 
    "订单日期",
    "订单编号",
    "大区",
    "省份",
    "城市",
    "商品分类",
    "商品名称",
    "销售数量",
    "单品单价",
    "销售金额",
    "利润",
    "客户类型",
    "销售渠道",
    "业务员"
FROM (
    -- 1月销售数据
    SELECT DATE '2026-01-05' AS "订单日期", 'DD20260105001' AS "订单编号", '华东' AS "大区", '江苏' AS "省份", '南京' AS "城市",
           '鱼类制品' AS "商品分类", '香辣小鱼干' AS "商品名称", 120 AS "销售数量", 3.5 AS "单品单价",
           420.00 AS "销售金额", 126.00 AS "利润", '老客户' AS "客户类型", '经销商' AS "销售渠道", '张三' AS "业务员" from dual 
    UNION ALL
    SELECT DATE '2026-01-08', 'DD20260108001', '华南', '广东', '广州',
           '豆制品', '酱香厚豆干', 200, 2.8, 560.00, 156.80, '新客户', '线上', '李四' from dual 
    UNION ALL
    SELECT DATE '2026-01-12', 'DD20260112001', '华北', '北京', '北京',
           '肉类零食', '麻辣肉干', 80, 5.0, 400.00, 120.00, '老客户', '线下', '王五' from dual 
    UNION ALL
    SELECT DATE '2026-01-15', 'DD20260115001', '西南', '四川', '成都',
           '素食零食', '魔芋爽', 150, 2.5, 375.00, 105.00, '老客户', '经销商', '赵六' from dual 
    UNION ALL
    SELECT DATE '2026-01-20', 'DD20260120001', '华中', '湖南', '长沙',
           '鱼类制品', '卤香小鱼干', 300, 3.5, 1050.00, 315.00, '新客户', '线上', '张三' from dual 

    -- 2月销售数据
    UNION ALL
    SELECT DATE '2026-02-03', 'DD20260203001', '华东', '上海', '上海',
           '肉类零食', '五香味肉干', 100, 5.0, 500.00, 150.00, '老客户', '线下', '李四' from dual 
    UNION ALL
    SELECT DATE '2026-02-07', 'DD20260207001', '华南', '广东', '深圳',
           '鱼类制品', '糖醋小鱼干', 180, 3.5, 630.00, 189.00, '老客户', '线上', '王五' from dual 
    UNION ALL
    SELECT DATE '2026-02-12', 'DD20260212001', '华北', '山东', '济南',
           '豆制品', '麻辣厚豆干', 250, 2.8, 700.00, 196.00, '新客户', '经销商', '赵六' from dual 
    UNION ALL
    SELECT DATE '2026-02-18', 'DD20260218001', '西南', '重庆', '重庆',
           '素食零食', '酸辣海带结', 160, 2.0, 320.00, 89.60, '老客户', '线上', '张三' from dual 
    UNION ALL
    SELECT DATE '2026-02-25', 'DD20260225001', '华中', '湖北', '武汉',
           '鱼类制品', '香辣小鱼干', 220, 3.5, 770.00, 231.00, '老客户', '线下', '李四' from dual 

    -- 3月销售数据
    UNION ALL
    SELECT DATE '2026-03-02', 'DD20260302001', '华东', '浙江', '杭州',
           '素食零食', '香辣魔芋爽', 140, 2.5, 350.00, 98.00, '新客户', '线上', '王五' from dual 
    UNION ALL
    SELECT DATE '2026-03-09', 'DD20260309001', '华南', '福建', '福州',
           '肉类零食', '手撕肉干', 90, 6.0, 540.00, 162.00, '老客户', '经销商', '赵六' from dual 
    UNION ALL
    SELECT DATE '2026-03-15', 'DD20260315001', '华北', '天津', '天津',
           '豆制品', '泡椒味豆干', 170, 2.8, 476.00, 133.28, '老客户', '线下', '张三' from dual 
    UNION ALL
    SELECT DATE '2026-03-20', 'DD20260320001', '西南', '云南', '昆明',
           '鱼类制品', '卤香小鱼干', 110, 3.5, 385.00, 115.50, '新客户', '线上', '李四' from dual 
    UNION ALL
    SELECT DATE '2026-03-28', 'DD20260328001', '华中', '河南', '郑州',
           '素食零食', '脆爽藕片', 200, 2.2, 440.00, 123.20, '老客户', '经销商', '王五' from dual 

    -- 4月销售数据
    UNION ALL
    SELECT DATE '2026-04-04', 'DD20260404001', '华东', '江苏', '苏州',
           '鱼类制品', '麻辣小鱼干', 280, 3.5, 980.00, 294.00, '老客户', '线上', '赵六' from dual 
    UNION ALL
    SELECT DATE '2026-04-10', 'DD20260410001', '华南', '广东', '东莞',
           '肉类零食', '香辣味肉干', 130, 5.0, 650.00, 195.00, '新客户', '线下', '张三' from dual 
    UNION ALL
    SELECT DATE '2026-04-16', 'DD20260416001', '华北', '河北', '石家庄',
           '豆制品', '五香味豆干', 210, 2.8, 588.00, 164.64, '老客户', '经销商', '李四' from dual 
    UNION ALL
    SELECT DATE '2026-04-22', 'DD20260422001', '西南', '四川', '成都',
           '鱼类制品', '糖醋小鱼干', 190, 3.5, 665.00, 199.50, '老客户', '线上', '王五' from dual 
    UNION ALL
    SELECT DATE '2026-04-29', 'DD20260429001', '华中', '湖南', '长沙',
           '素食零食', '魔芋爽', 320, 2.5, 800.00, 224.00, '新客户', '线下', '赵六' from dual 

    -- 5月销售数据
    UNION ALL
    SELECT DATE '2026-05-05', 'DD20260505001', '华东', '上海', '上海',
           '肉类零食', '手撕肉干', 150, 6.0, 900.00, 270.00, '老客户', '线上', '张三' from dual 
    UNION ALL
    SELECT DATE '2026-05-11', 'DD20260511001', '华南', '广西', '南宁',
           '鱼类制品', '香辣小鱼干', 160, 3.5, 560.00, 168.00, '新客户', '经销商', '李四' from dual 
    UNION ALL
    SELECT DATE '2026-05-18', 'DD20260518001', '华北', '北京', '北京',
           '素食零食', '酸辣海带结', 240, 2.0, 480.00, 134.40, '老客户', '线下', '王五' from dual 
    UNION ALL
    SELECT DATE '2026-05-23', 'DD20260523001', '西南', '贵州', '贵阳',
           '豆制品', '酱香厚豆干', 130, 2.8, 364.00, 101.92, '老客户', '线上', '赵六' from dual 
    UNION ALL
    SELECT DATE '2026-05-30', 'DD20260530001', '华中', '江西', '南昌',
           '鱼类制品', '卤香小鱼干', 170, 3.5, 595.00, 178.50, '新客户', '经销商', '张三' from dual 

    -- 6月销售数据
    UNION ALL
    SELECT DATE '2026-06-03', 'DD20260603001', '华东', '浙江', '宁波',
           '鱼类制品', '麻辣小鱼干', 260, 3.5, 910.00, 273.00, '老客户', '线下', '李四' from dual 
    UNION ALL
    SELECT DATE '2026-06-08', 'DD20260608001', '华南', '广东', '广州',
           '肉类零食', '五香味肉干', 140, 5.0, 700.00, 210.00, '老客户', '线上', '王五' from dual 
    UNION ALL
    SELECT DATE '2026-06-15', 'DD20260615001', '华北', '山东', '青岛',
           '素食零食', '脆爽藕片', 200, 2.2, 440.00, 123.20, '新客户', '经销商', '赵六' from dual 
    UNION ALL
    SELECT DATE '2026-06-21', 'DD20260621001', '西南', '重庆', '重庆',
           '豆制品', '麻辣厚豆干', 280, 2.8, 784.00, 219.52, '老客户', '线上', '张三' from dual 
    UNION ALL
    SELECT DATE '2026-06-28', 'DD20260628001', '华中', '湖北', '武汉',
           '鱼类制品', '香辣小鱼干', 350, 3.5, 1225.00, 367.50, '老客户', '线下', '李四' from dual 
) t

右键数据集查看属性,可以看到数据集ID,这个后面会用到

第四步:写 SmartBI 查询工具

agents/chat/目录下新建smartbi_tool.py,这是核心的工具文件,只需要两个工具就够了:

python 复制代码
import os
import json
import requests
from agents import function_tool
from typing import Annotated
​
SMARTBI_BASE_URL = os.getenv("SMARTBI_BASE_URL", "")
SMARTBI_TOKEN = os.getenv("SMARTBI_TOKEN", "")
​
def _get_headers():
    return {
        "Authorization": f"Bearer {SMARTBI_TOKEN}",
        "Content-Type": "application/json"
    }
​
# 工具1:获取所有数据集列表
@function_tool
def list_datasets() -> str:
    """获取SmartBI中所有可用的数据集/数据模型列表"""
    if not SMARTBI_TOKEN or not SMARTBI_BASE_URL:
        return "错误:未配置环境变量"
    url = f"{SMARTBI_BASE_URL}/api/catalog/getCatalogElement/DEFAULT_TREENODE"
    try:
        resp = requests.post(url, headers=_get_headers(), timeout=30)
        if resp.status_code != 200:
            return f"获取目录失败,HTTP {resp.status_code}"
        return json.dumps(resp.json(), ensure_ascii=False, indent=2)[:3000]
    except Exception as e:
        return f"获取目录异常:{str(e)}"
​
# 工具2:查询数据
@function_tool
def query_dataset(
    dataset_id: Annotated[str, "数据集ID"],
    fields: Annotated[str, "要查询的字段,多个用英文逗号分隔,使用中文名称,例如:订单日期,区域,销售额"],
    limit: Annotated[int, "返回行数,默认20"] = 20
) -> str:
    """查询指定数据集的数据,字段名使用中文"""
    if not SMARTBI_TOKEN or not SMARTBI_BASE_URL:
        return "错误:未配置环境变量"
    safe_limit = min(limit, 100)
    field_list = [f.strip() for f in fields.split(",") if f.strip()]
    url = f"{SMARTBI_BASE_URL}/smartbix/api/augmentedQuery/data/"
    payload = {
        "dataSetId": dataset_id,
        "rows": field_list,
        "columns": [],
        "filters": []
    }
    try:
        resp = requests.post(url, json=payload, headers=_get_headers(), timeout=30)
        if resp.status_code != 200:
            return f"查询失败,HTTP {resp.status_code}: {resp.text[:500]}"
        data = resp.json()
        iterator = data.get("iterator", [])
        result = []
        for row in iterator[:safe_limit]:
            obj = {}
            for idx, cell in enumerate(row):
                field_name = field_list[idx] if idx < len(field_list) else f"field_{idx}"
                obj[field_name] = cell.get("displayValue") or cell.get("value")
            result.append(obj)
        return json.dumps({
            "success": True,
            "total": len(iterator),
            "returned": len(result),
            "data": result
        }, ensure_ascii=False, indent=2)
    except Exception as e:
        return f"查询异常:{str(e)}"
​
TOOLS = [list_datasets, query_dataset]

第五步:配置 Agent

修改agents/chat/index.py,注册我们写的工具,配置提示词:

ini 复制代码
# 其他导入不变,加上工具导入
from .smartbi_tool import TOOLS as smartbi_tools
​
agent = Agent(
    name="SmartBI数据助手",
    instructions="""
你是SmartBI数据查询助手,帮助用户查询SmartBI系统中的数据。
​
工作流程:
1. 用户问数据相关问题,先调用list_datasets查看所有可用数据集
2. 找到对应的数据集后,直接调用query_dataset查询数据
3. 字段名使用中文,常见字段包括:订单日期、订单编号、区域、省份、城市、类别、产品名称、数量、单价、销售额、利润、客户类型、渠道、销售员
4. 查询成功后,对数据做简单汇总统计,用自然语言返回结果
​
注意:
- 不需要调用get_dataset_schema,直接用中文字段名查询即可
- 如果查询失败,换几个常见字段再试一次
- 关键数字加粗显示
""",
    # 把我们的工具加进去
    tools=[get_weather, get_clothing_advice, translate_text, text_statistics] + smartbi_tools,
    model=llm_model,
)

其他 SSE 流式输出的代码不用改,模板已经写好了。


第六步:配置 iframe 跨域

因为要把聊天界面用 iframe 嵌入到 SmartBI 里,需要修改vite.config.ts允许跨域和 iframe 嵌入:

php 复制代码
import { defineConfig } from 'vite'
​
export default defineConfig({
  server: {
    port: 8088,
    host: '0.0.0.0',
    headers: {
      'X-Frame-Options': 'ALLOWALL',
      'Content-Security-Policy': "frame-ancestors 'self' http://你的SmartBI地址:* http://localhost:*"
    },
    cors: true
  }
})

同时修改index.html,在 head 最开头加 crypto polyfill,兼容 HTTP 内网环境:

xml 复制代码
<script>
if (!window.crypto) window.crypto = {};
if (!window.crypto.randomUUID) {
  window.crypto.randomUUID = function() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
      var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
      return v.toString(16);
    });
  };
}
</script>

第七步:写悬浮窗注入脚本(不用改 SmartBI 源码)

最方便的嵌入方式是书签小工具,不用改 SmartBI 任何代码,不用装油猴,点一下书签就出悬浮窗:(后面会讲为什么采用这个方式,其实最好的方式就是把项目代码写到smartbi的index页面里去。)

  1. 浏览器书签栏右键 → 添加网页
  1. 名称:AI 数据助手
  2. 网址粘贴下面的完整代码(支持左上角拖拽调整大小):
javascript 复制代码
javascript:(function(){if(window.__aiAssistantLoaded)return;window.__aiAssistantLoaded=true;const AGENT_URL="http://你的本机IP:8088";let isOpen=false;let isResizing=false;let startX,startY,startW,startH;const btn=document.createElement('div');btn.innerHTML='💬 AI 数据助手';btn.style.cssText='position:fixed;right:20px;bottom:20px;width:120px;height:44px;background:linear-gradient(135deg,#1677ff 0%,#722ed1 100%);color:white;border-radius:22px;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 4px 16px rgba(22,119,255,0.4);z-index:999999;font-size:14px;font-weight:500;transition:all 0.3s;user-select:none;';const chatWindow=document.createElement('div');chatWindow.style.cssText='position:fixed;right:20px;bottom:76px;width:480px;height:680px;min-width:360px;min-height:480px;max-width:90vw;max-height:90vh;background:white;border-radius:12px;box-shadow:0 8px 32px rgba(0,0,0,0.18);display:none;flex-direction:column;z-index:999998;overflow:hidden;';const resizeHandle=document.createElement('div');resizeHandle.style.cssText='position:absolute;left:0;top:0;width:20px;height:20px;cursor:nesw-resize;z-index:999999;background:linear-gradient(225deg,rgba(114,46,209,0.4) 0%,transparent 60%);border-radius:12px 0 0 0;';const header=document.createElement('div');header.style.cssText='padding:14px 16px;background:linear-gradient(135deg,#1677ff 0%,#722ed1 100%);display:flex;justify-content:space-between;align-items:center;flex-shrink:0;position:relative;z-index:5;padding-left:28px;';header.innerHTML='<span style="font-weight:600;color:white;font-size:15px;">💬 AI 数据助手</span><span class="ai-close-btn" style="cursor:pointer;color:rgba(255,255,255,0.8);font-size:18px;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:6px;transition:background 0.2s;">✕</span>';const iframeWrap=document.createElement('div');iframeWrap.style.cssText='flex:1;position:relative;overflow:hidden;';const iframe=document.createElement('iframe');iframe.src=AGENT_URL;iframe.style.cssText='width:100%;height:100%;border:none;';iframe.allow='clipboard-write';const dragMask=document.createElement('div');dragMask.style.cssText='position:absolute;top:0;left:0;width:100%;height:100%;background:transparent;z-index:10;display:none;';iframeWrap.appendChild(iframe);iframeWrap.appendChild(dragMask);chatWindow.appendChild(resizeHandle);chatWindow.appendChild(header);chatWindow.appendChild(iframeWrap);document.body.appendChild(btn);document.body.appendChild(chatWindow);btn.onclick=()=>{isOpen=!isOpen;chatWindow.style.display=isOpen?'flex':'none';};const closeBtn=header.querySelector('.ai-close-btn');closeBtn.onmouseenter=()=>closeBtn.style.background='rgba(255,255,255,0.2)';closeBtn.onmouseleave=()=>closeBtn.style.background='transparent';closeBtn.onclick=(e)=>{e.stopPropagation();isOpen=false;chatWindow.style.display='none';};btn.onmouseenter=()=>{btn.style.transform='scale(1.05)';btn.style.boxShadow='0 6px 20px rgba(22,119,255,0.5)';};btn.onmouseleave=()=>{btn.style.transform='scale(1)';btn.style.boxShadow='0 4px 16px rgba(22,119,255,0.4)';};resizeHandle.addEventListener('mousedown',(e)=>{e.preventDefault();e.stopPropagation();isResizing=true;startX=e.clientX;startY=e.clientY;startW=chatWindow.offsetWidth;startH=chatWindow.offsetHeight;dragMask.style.display='block';document.body.style.cursor='nesw-resize';document.body.style.userSelect='none';});document.addEventListener('mousemove',(e)=>{if(!isResizing)return;const dx=e.clientX-startX;const dy=e.clientY-startY;let newW=startW-dx;let newH=startH-dy;newW=Math.max(360,Math.min(newW,window.innerWidth*0.9));newH=Math.max(480,Math.min(newH,window.innerHeight*0.9));chatWindow.style.width=newW+'px';chatWindow.style.height=newH+'px';});document.addEventListener('mouseup',()=>{if(isResizing){isResizing=false;dragMask.style.display='none';document.body.style.cursor='';document.body.style.userSelect='';}});})();

没打开AI助手前界面是这样的

点击书签打开之后是这样的

第八步:测试 & 上线

  1. 重启本地服务,打开 SmartBI 页面
  2. 点一下书签栏的「AI 数据助手」,右下角就会出现悬浮按钮
  3. 点开就能聊天,问「总销售额是多少」「哪个区域卖的最好」,AI 会自动调用工具查数据

  1. 本地测试没问题后,一键部署上线:

    edgeone makers deploy

  2. 等 1 分钟部署完成,会给你一个公网地址,把书签里的本地 IP 换成公网地址,全公司都能用了。


二、踩坑记录(我踩过的你就别踩了)

1. Windows GBK 编码错误

  • 现象:启动服务就报错,UnicodeEncodeError
  • 原因:Windows 默认 GBK 编码,代码里的 emoji 和中文输出报错
  • 解决 :启动前先执行set PYTHONUTF8=1

2. 模块导入路径错误

  • 现象:启动报 503,cannot import name 'TOOLS'
  • 原因:相对导入路径不对,EdgeOne 运行时目录结构和本地不一样
  • 解决 :把 smartbi_tool.py(_tool.py) 放到和 index.py 同目录,用from .smartbi_tool import一个点导入

3. 数据集 ID 坑

  • 现象:查询报数据集不存在
  • 原因:一开始以为所有 ID 都要加前缀 I,后来发现增强数据集 ID 不需要,直接从资源属性里复制最准确
  • 解决:在 SmartBI 数据集上右键→属性,复制节点 ID,不要自己加前缀

4. 字段名坑

  • 现象:接口返回字段不存在
  • 原因:以为字段名就是 SQL数据集里面的字段名,其实是度量字段里的名称,默认都是加_m。
  • 解决:度量字段全部加_m后缀,这样agent就不会报错,会准确识别。

5. metadata 接口 404

  • 现象:获取字段接口一直 404
  • 原因:这个接口只给特定版本用,普通增强数据集不需要
  • 解决:直接删掉 get_dataset_schema 工具,不用获取字段,直接用中文字段名查就行

6. iframe 被 X-Frame-Options 拦截

  • 现象:iframe 显示拒绝连接
  • 原因:Vite 默认不允许 iframe 嵌入
  • 解决:在 vite.config.ts 里配置 X-Frame-Options 和 CSP,允许 SmartBI 域名嵌入

7. HTTP 环境 crypto.randomUUID 报错

  • 现象:打开聊天界面报错,crypto.randomUUID is not a function
  • 原因:crypto API 只有 HTTPS 环境才有,内网 HTTP 环境没有
  • 解决:在 index.html 里加个 polyfill 就行,代码上面已经给了

8. 油猴脚本被 CSP 拦截

  • 现象:油猴脚本注入不生效,控制台报 CSP 错误
  • 原因:SmartBI 有严格的内容安全策略,拦截油猴脚本
  • 解决:不用油猴,用书签小工具方式注入,简单可靠,不会被拦截

9. CSS resize 不生效

  • 现象:加了 resize:both,鼠标放边框没反应
  • 原因:跨域 iframe 会拦截鼠标事件,CSS resize 在有 iframe 的容器上不生效
  • 解决:用 JS 实现拖拽,拖拽时加个透明遮罩盖住 iframe,防止事件被拦截

10. 工具参数类型坑

  • 现象:工具调用报错,additionalProperties not allowed
  • 原因:OpenAI Agents SDK 对 list/dict 复杂类型支持不好
  • 解决:参数用简单类型,多个字段用逗号分隔的字符串传,不要传数组

三、后续优化规划

工具已经跑通,但现在只是最小可用版本,后续还可以继续优化,我目前能想到的有:

  1. 全动态数据集支持:优化 list_datasets 的递归逻辑,自动识别所有几十个数据集,AI 自动匹配用户问题对应的数据集,不用硬编码
  2. 高级查询能力:支持 filters 过滤条件、分组聚合、时间筛选、同比环比计算,能回答更复杂的业务问题
  3. 自动图表生成:查询完数据自动生成柱状图、折线图、饼图,不用自己做报表
  4. 用户权限透传:获取当前登录 SmartBI 的用户身份,用对应权限查数据,做数据权限隔离
  5. 正式集成:开发成 SmartBI 扩展包,登录自动加载,不用手动点书签
  6. 智能问答优化:支持多轮对话、上下文记忆、追问,比如问完好的区域再问「那这个区域哪个产品卖的最好」,不用重复说条件

四、一点思考

EdgeOne Makers 真的把开发门槛打下来了

放在以前,做这么一个 AI 助手,我需要:

  • 写前端聊天界面(至少 1 天)
  • 写后端接口,处理 SSE 流式输出(半天)
  • 买服务器、配环境、搞 HTTPS 域名(半天)
  • 处理跨域、部署、运维(半天)
  • 写工具逻辑、调 Prompt(半天) 前前后后至少 3 天,还不算各种环境问题。

但用 EdgeOne Makers,前端聊天界面、会话记忆、流式输出、工具调用框架、部署上线、HTTPS 域名全给你做好了,我只需要写核心的 SmartBI 查询工具,调调 Prompt,一天就搞定了,而且免费额度足够小团队用。真的是把开发者从重复的基础设施工作里解放出来了。

AI 正在改变我们的工作方式

以前做功能,我们要花 80% 的时间在「搭架子」上:写界面、搞接口、部署、调环境,只有 20% 的时间在真正解决业务问题。现在有了 AI Agent 框架 + 低代码平台,80% 的架子都给你搭好了,我们只需要专注在那 20% 的核心业务逻辑上。

未来每个系统都会有自己的 AI 助手,不用学复杂的操作,不用记功能菜单,自然语言就是界面。业务人员有问题直接问,不用再等数据开发排期做报表,数据开发也能从重复的取数工作里解放出来,去做更有价值的数据建设工作。

以前总觉得 AI 会取代程序员,现在发现不是取代,是倍增 ------ 会用 AI 工具的程序员,一个人就能顶以前一个小团队的产出。这次做这个 BI 助手,我一个后端开发,没写一行前端代码,一天就做出来了放在以前想都不敢想。现在业务同事要简单数据不用再钉钉找我排期了,打开BI点一下书签,问一句「6月华东区鱼类制品总销售额是多少」,几秒钟就出结果还自动算好汇总,昨天运营同事用了之后追着我问怎么弄的,说要给他们的后台也整一个😂


如果你也想给自己公司的系统加个 AI 助手,真的可以试试 EdgeOne Makers,零成本就能做自己的 AI 应用,门槛真的比你想象的低太多了。

毕竟对于数据同学来说,少写点重复取数的SQL,多留点时间摸鱼才是正经事😎 这篇文章把我踩过的所有坑、能跑通的完整代码都贴出来了,你跟着步骤走肯定也能给自己公司的系统装上AI助手。

如果觉得有用的话,别忘了点赞👍、收藏⭐、转发 ,有什么问题或者踩了新坑,评论区留言我都会回~ 也欢迎大家去试试EdgeOne Makers,现在还有现成案例,零成本做个自己的AI小工具,真的很香。

🎊 完结撒花,感谢看到这里的你~ 🎊

首发链接: cloud.tencent.com/developer/a... 欢迎大家评论转发!

相关推荐
阿里云云原生1 小时前
智能体构建与进化——Agent 开源开发者沙龙·深圳站精彩回顾 & PPT 下载
agent
OpenTiny社区2 小时前
Coding Agent 到底是怎么工作的,它又为什么会在复杂代码库里失真?
前端·github·agent
七牛开发者2 小时前
Loop 最佳实践:从 goal 到 loop,让 Agent 工作流循环起来
openai·agent·ai编程
七牛开发者2 小时前
Agent 小知识|为什么大家都在聊 Agent?
openai·agent·ai编程
旧曲重听14 小时前
为什么现在 RAG 越少越少提及了
数据库·程序人生·职场和发展·agent
nuIl4 小时前
我把 5 个编码 Agent 塞进了一个 npm 包
前端·agent·claude
Darling噜啦啦4 小时前
手写 mini-cursor 完整版:从 Promise 子进程到 ReAct 循环,30 轮迭代完成 TodoList 全流程
langchain·agent
ATA88884 小时前
数据库管理工具的数据安全机制对比:权限管控与审计
数据库·人工智能·数据分析·数据库管理
shujudang5 小时前
深入数据架构选型:开源埋点系统 vs 企业级增长分析平台的工程与业务考量
架构·数据分析·开源