成了!不会前端,花一天时间给公司 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... 欢迎大家评论转发!

相关推荐
夏天拐跑了西瓜6 小时前
一文入门LangChain:从框架认知到构建你的第一个AI Agent
python·langchain·conda·agent
派小心.8 小时前
A/B测试工具免费版够用吗?
前端·数据分析
阿华田51210 小时前
Agent Skill 原理解析与使用:从 Prompt 到可复用的 Agent 能力
人工智能·agent·skill
泯泷13 小时前
为什么 AI 会"失忆"?——读懂 Agent 的记忆系统(一)
人工智能·算法·agent
泯泷13 小时前
AI 该怎样"记笔记"?——四种记忆格式与认知科学(二)
人工智能·agent·ai编程
data analyse 45613 小时前
埋点工具的私有化部署成本高吗?
前端·数据分析·github
hpoenixf14 小时前
AI 的回答有很多引用,回答就真的可靠吗?
agent
DeepAgent14 小时前
AI Agent 面试篇(05):AI 面试——对着摄像头怎么答
面试·agent
data analyse 45614 小时前
埋点工具的埋点查询语言难学吗?
前端·数据分析