作为 BI / 数据开发,一直有个痛点:业务人员每次要数都得找我写 SQL、拖报表,简单的销售额、区域销量这种问题,每天要重复回答十几次。一直想给公司的 SmartBI 系统加个自然语言查数的 AI 助手,但一想到要写前端聊天界面、做后端接口、搞服务器部署、处理跨域鉴权,就觉得麻烦,拖了大半年。
直到最近发现了 EdgeOne Makers,从注册账号到本地调通,再到悬浮窗嵌入 SmartBI,总共花了一天时间,没写一行前端代码,就把 AI 智能体给装上了。这篇文章把完整步骤和踩过的所有坑都写出来,你跟着做也能成。
这个案例我想分享出来,是因为我从开始,到自己亲手实操完成,全程我都是复制粘贴,基本都是AI帮我检查纠错。最后成功用上智能体的那一刻,我头皮发麻,EdgeOne Makers也太好用了吧!!!
先看下最终效果吧~

一、从零到一完整实现步骤(跟着做就能成)
准备工作
- 一台能跑 Python 的电脑(Windows/Mac 都可以)
- 一个腾讯云账号(免费额度足够用)
- 能访问你们公司 BI 系统的内网环境
第一步:创建 EdgeOne Makers 项目
- 打开 EdgeOne Makers 控制台:edgeone.cloud.tencent.com/makers
2. 新建项目,选择「OpenAI Agents 入门模板(Python 版)」

- 选择一个git平台,我这里选的是gitte,然后点击立即创建。

- 等待 1 分钟,项目就初始化好了,自带聊天界面、会话记忆、流式输出、工具调用框架,不用自己写前端

第二步:本地开发环境搭建
-
先安装 EdgeOne CLI 工具:
npm install -g edgeone
-
把项目拉到本地,进入项目目录


-
安装依赖:
npm install
-
Windows 用户一定要先设置编码(不然后面 emoji 会报 GBK 编码错误):
ini
set PYTHONUTF8=1
-
启动本地开发服务:
edgeone makers dev
-
启动成功后,打开 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页面里去。)
- 浏览器书签栏右键 → 添加网页

- 名称:
AI 数据助手 - 网址粘贴下面的完整代码(支持左上角拖拽调整大小):
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助手前界面是这样的

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

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





-
本地测试没问题后,一键部署上线:
edgeone makers deploy
-
等 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 复杂类型支持不好
- 解决:参数用简单类型,多个字段用逗号分隔的字符串传,不要传数组
三、后续优化规划
工具已经跑通,但现在只是最小可用版本,后续还可以继续优化,我目前能想到的有:
- 全动态数据集支持:优化 list_datasets 的递归逻辑,自动识别所有几十个数据集,AI 自动匹配用户问题对应的数据集,不用硬编码
- 高级查询能力:支持 filters 过滤条件、分组聚合、时间筛选、同比环比计算,能回答更复杂的业务问题
- 自动图表生成:查询完数据自动生成柱状图、折线图、饼图,不用自己做报表
- 用户权限透传:获取当前登录 SmartBI 的用户身份,用对应权限查数据,做数据权限隔离
- 正式集成:开发成 SmartBI 扩展包,登录自动加载,不用手动点书签
- 智能问答优化:支持多轮对话、上下文记忆、追问,比如问完好的区域再问「那这个区域哪个产品卖的最好」,不用重复说条件
四、一点思考
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... 欢迎大家评论转发!