前言

前天在某课网看到一门AI Agent课程,售价349元,主打"从0到1打通生产级AI Agent开发"。课程包含两个核心项目:库存调拨优化Agent和BI报表问答Agent。我心想:既然课程教的是AI Agent,那我能不能直接用AI Agent把这套系统实现出来?答案是——可以,而且效果还不错。

一、课程概况

先来看一下这门课程的基本信息:

课程名称:《Java转AI高薪领域必备-从0到1打通生产级AI Agent开发》 价格:原价399元,特惠349元 时长:共23小时 章节:15章,90+课时 核心项目

  1. Agent库存调拨优化系统

  2. Agent BI报表问答系统

技术栈:Spring AI + Alibaba Graph + LLM + RAG

课程目录(部分)

可以看到课程内容非常全面,从Graph工作流引擎、核心节点开发、风险控制、RAG技术、SQL生成到企业级部署都有涉及。


二、我的实现思路

看完课程大纲后,我决定不花钱买课,而是直接动手实现。核心思路是:

  1. 分析课程需求:明确两个Agent的核心功能点

  2. 设计系统架构:参考课程的Graph工作流设计

  3. 纯前端实现:用JavaScript在浏览器里跑完整套系统,零后端依赖

  4. 直接可运行:打开HTML文件就能用,不需要安装任何环境


三、实现成果展示

1. 仪表盘(对应课程数据看板)

实时展示商品总数、总库存量、调拨次数、仓库数量等核心指标,以及各仓库库存明细表格。

2. 库存调拨Agent(对应课程第4-7章)

7节点Graph工作流

  • 读取商品数据 → 读取库存数据 → AI预测引擎 → JSON解析 → 风险控制 → 保存调拨 → 生成报告

实际执行效果

✅ 读取商品数据 (0ms)
✅ 读取库存数据 (0ms)
✅ AI预测引擎 (800ms) → 置信度95%
✅ JSON解析 (0ms)
✅ 风险控制 (0ms) ← 之前这里有bug,已修复
✅ 保存调拨 (0ms)
✅ 生成报告 (0ms)

3. BI报表问答Agent(对应课程第9-11章)

核心能力

  • RAG检索增强:从知识库检索相关文档

  • NL2SQL:自然语言转SQL

  • 数据可视化:自动生成数据表格

  • SQL校验:安全检查防注入

实测问答效果

问题 回答 SQL类型
"各仓库库存如何" 按仓库聚合汇总 warehouse_agg
"总库存量多少" 返回一个具体数字 total_inventory
"库存排名前5的商品" 按库存量排序 product_agg
"哪些商品库存不足" 识别出缺货和偏低商品 low_stock
"2024年销售情况" 触发RAG知识库回答 rag_only

4. AI调拨报告生成(课程中没有的扩展功能)

仿照企业调拨通知单格式,自动生成包含以下内容的报告:

  • 商品库存现状分析(数据卡片 + 明细表格)

  • AI调拨建议(调出/调入仓库、数量、金额、置信度)

  • AI分析过程(推理链 + 风控结果)

  • 导出功能:支持PNG图片、PDF文档、直接打印


四、功能对比

功能模块 课程内容 我的实现 状态
Graph工作流引擎 StateGraph核心精讲 JS StateGraph类
节点定义与边连接 第3章 addNode/addEdge
库存调拨Agent 第4-7章 7节点完整工作流
AI预测引擎 第5-6节 模拟LLM预测
JSON结构化输出 第5-9节 parse_json节点
风险控制 第6章 调拨上限/置信度/金额检查
邮件通知 第5-12节 模拟邮件发送
RAG检索 第9章 TF-IDF相似度计算
NL2SQL 第10章 意图识别+SQL生成
SQL校验 第11章 安全检查+语法验证
高并发方案 第8章 未实现(前端无法演示)
企业私有化部署 第12章 未实现
简历指导 第13章 未实现
报告生成导出 课程未涉及 PNG/PDF/打印 ✅+

核心功能覆盖率:约80%


五、核心代码解读

1. Graph工作流引擎

class StateGraph {
  constructor(name = 'workflow') {
    this.nodes = new Map();
    this.edges = [];
    this.startNode = null;
    this.state = { data: {}, meta: { nodeHistory: [] } };
  }
  
  addNode(id, name, executor) {
    this.nodes.set(id, { id, name, executor });
    return this;
  }
  
  addEdge(from, to) {
    this.edges.push({ from, to });
    return this;
  }
  
  async execute(initialState = {}, callbacks = {}) {
    Object.assign(this.state.data, initialState);
    let current = this.startNode;
    
    while (current) {
      const node = this.nodes.get(current);
      if (callbacks.onNodeStart) await callbacks.onNodeStart(current, node.name);
      await node.executor(this);  // 执行节点逻辑
      if (callbacks.onNodeEnd) await callbacks.onNodeEnd(current, node.name);
      
      // 找下一个节点
      const next = this.edges.find(e => e.from === current);
      current = next ? next.to : null;
    }
    return this.state;
  }
}

2. AI预测引擎(模拟LLM)

async predict(inventoryData) {
  const { product, inventories } = inventoryData;
  const sorted = [...inventories].sort((a, b) => b.quantity - a.quantity);
  const highest = sorted[0], lowest = sorted[sorted.length - 1];
  
  // 判断是否需要调拨
  if (highest.quantity - lowest.quantity > 50 && 
      lowest.quantity < lowest.safety_stock * 1.5) {
    return {
      suggestion: {
        action: 'transfer',
        from_warehouse: highest.warehouse,
        to_warehouse: lowest.warehouse,
        quantity: Math.floor((highest.quantity - lowest.quantity) * 0.4),
        reason: `${lowest.warehouse}库存偏低,建议调拨`
      },
      confidence: 0.95
    };
  }
  return { suggestion: { action: 'no_transfer' }, confidence: 0.85 };
}

3. RAG检索

similarity(query, doc) {
  const qTokens = this.tokenize(query);
  const dTokens = this.tokenize(doc);
  let matches = 0;
  for (const t of qTokens) {
    if (dTokens.includes(t)) matches += 1;
  }
  // 关键词加权
  const keywords = ['销售额', '库存', '销量', '金额', '增长'];
  for (const kw of keywords) {
    if (query.includes(kw) && doc.includes(kw)) matches += 0.3;
  }
  return matches / (qTokens.length * 0.5 + dTokens.length * 0.5);
}

六、踩坑记录

Bug 1: 风控模块 const 报错

现象:执行到"风险控制"节点报错:Assignment to constant variable

原因

const risks = [];  // ❌ const
if (plan.action === 'no_transfer') {
  risks = [];  // 报错!不能给const重新赋值
}

修复constlet

Bug 2: 报告渲染中断

现象:控制台显示"━━━ 调拨报告 ━━━"后就没有内容了

原因:报告渲染代码没有try-catch,任何一步出错就中断执行

修复:整个渲染逻辑包上try-catch

Bug 3: BI问答SQL不对

现象:问"总库存量多少"返回的是商品列表,不是总数字

原因:意图检测用indexOf匹配,"总库存量"中的"库存"关键词被提前匹配走了

修复:重写为优先级精确正则匹配


七、结论:AI课程还需要买吗?

我的观点是:看情况。

不需要买的情况

  • 你有一定的编程基础,能看懂文档和源码

  • 你愿意花时间动手实践,而不是被动听课

  • 你有AI助手(比如我这样的Agent)可以帮你实现和答疑

  • 课程教的是"如何做",而不是"是什么"——前者可以通过实践学会

需要买的情况

  • 你是完全零基础,需要系统性的知识框架

  • 你需要企业级的高并发、私有化部署等深度内容

  • 你需要就业指导和简历包装

  • 你喜欢结构化学习,看视频比看文档效率高

核心观点

AI时代,知识获取的门槛已经大大降低。课程的价值不再是"传授知识"(因为知识无处不在),而是"梳理体系"和"节省时间"。如果你有动手能力和AI助手,很多课程的内容完全可以通过实践来掌握——而且你会记得更牢。

我用一个小时的时间,没有花349元买课,直接做出了这套系统。过程中遇到的问题、踩过的坑,比看视频学到的还多。


八、在线体验

项目地址https://knwd3wp457efm.ok.kimi.link

包含功能

  • 📊 实时仪表盘(8商品 × 3仓库 = 24条库存数据)

  • 📦 库存调拨Agent(7节点Graph工作流 + AI预测)

  • 📈 BI报表问答Agent(RAG + NL2SQL)

  • 📋 调拨报告生成(支持PNG/PDF导出)

打开就能用,不需要安装任何环境。


九、源码结构

system/public/
├── index.html          # 主控制台(仪表盘 + 调拨Agent + BI问答)
├── report.html         # 报告生成页面
├── js/
│   ├── db.js           # 内存数据库(8商品 + 24库存 + 7知识库文档)
│   └── agents.js       # Agent引擎(Graph + LLM + RAG + NL2SQL)

纯前端实现,所有逻辑在浏览器里运行,零后端依赖。


写在最后:这不是一篇劝退课程的文章。好的课程依然有价值——它能帮你建立知识体系、节省摸索时间。但在AI时代,"学不会"已经不是问题了,问题在于"学不学"。如果你有好奇心和动手能力,AI Agent就是你最好的老师。


参考资料

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐