🏢 Stage 07

企业级AI应用
开发实战

基于真实业务场景,构建BPM报表代码生成器等企业级应用。掌握知识库设计、RAG系统调优、ExtJS前端规范、C#后端开发,以及生产环境部署运维全流程。这是从学习者到实践者的关键跨越。


Project Overview
🎯 BPM报表代码生成器项目

一个基于Dify工作流和知识库的智能化代码生成系统,根据SQL和原型图自动生成符合企业规范的BPM报表前后端代码。

💼
业务场景
BPM费控系统需要大量报表开发,传统手工编码存在以下问题:
  • 字段名容易出错,导致运行时错误
  • 代码风格不统一,维护成本高
  • 重复劳动多,开发效率低
  • 新人上手慢,学习曲线陡峭
解决方案:

通过AI代码生成器,将标准化模板和业务规则沉淀到知识库中,实现"输入SQL+原型图 → 输出完整代码"的自动化流程。

核心价值
效率提升
报表开发时间从2天缩短到30分钟,效率提升80%
质量保障
字段名100%准确,代码结构完全符合规范
知识沉淀
最佳实践固化到知识库,避免经验流失
降低门槛
新人无需深入理解框架细节即可快速产出

Architecture
🏗️ 系统技术架构

完整的端到端解决方案,涵盖从用户输入到代码生成的全流程。

整体架构图
用户层
SQL文件 + 原型图 + 模块名称
Dify工作流层
开始节点 → 条件分支 → 文件读取 → 知识检索 → LLM生成 → 结束
知识库层 (RAG)
9个核心文档:编码规范、前端模板、后端模板、数据库Schema等
输出生成层
MainPanel.js + SearchPanel.js + Services.ashx
前端技术栈
  • ExtJS 6.x - 企业级UI框架
  • JavaScript - 客户端逻辑
  • AJAX - 异步数据交互
后端技术栈
  • C# / ASP.NET - 服务端开发
  • SQL Server - 关系型数据库
  • YZReader - 数据读取封装
AI技术栈
  • Dify - LLMOps平台
  • RAG - 检索增强生成
  • Qwen/GLM - 大语言模型

Knowledge Base
📚 知识库设计与优化

知识库是RAG系统的核心,直接影响代码生成的准确性和可靠性。

📁 文档结构设计(9个核心文件)
BPMReposts/
├── 01_Coding_Standards.md (1156行) - 编码规范完整版
├── 02_Frontend_Templates.md (677行) - 前端标准模板
├── 03_Backend_Templates.md (776行) - 后端标准模板
├── 04_Database_Schema.md (364行) - 数据库Schema
├── 05_Query_Conditions_Guide.md (611行) - 查询条件指南
├── 06_SQL_Examples.md (609行) - SQL查询示例
├── 07_Permission_Filter_Guide.md (524行) - 权限过滤指南
├── 08_Best_Practices.md (706行) - 最佳实践
└── 09_Dify_KnowledgeBase_Guide.md (351行) - Dify使用指南
设计原则:
  • 模块化:每个文件聚焦一个主题,便于检索和维护
  • 完整性:包含正误对比、错误对照表、完整示例
  • 可操作性:代码可直接复制使用,减少二次加工
  • 持续更新:根据实际使用情况不断优化内容
✂️ 切片参数配置
推荐配置:
索引模式 高质量模式(语义匹配更精准)
分段长度 600-800 Token(确保完整模板不被切断)
重叠字符 50-80 Token(保持上下文连贯)
检索模式 混合检索(向量+关键词)
Top K 8-10(确保召回所有相关文档)
Score阈值 0.5-0.6(平衡召回率和准确率)
Rerank 启用(重排提高相关性)
⚠️ 关键要点:
  • Top K=4太小,容易漏掉关键文档(如FYBX_MainPanel.md)
  • Score阈值0.7太严格,可能过滤掉相关但相似度稍低的文档
  • 600 Token足够容纳一个完整的MainPanel模板
💬 提示词设计要点
提示词结构:
  1. 角色定义 - 明确AI身份(BPM报表开发工程师)
  2. 输入信息 - 用户问题、检索内容、上传文件
  3. 强制规则 - 🔴 必须100%遵守的规则放最前面
  4. 错误对照表 - ❌ 错误写法 vs ✅ 正确写法
  5. 输出格式 - 明确的代码结构和文件组织
关键技巧:
  • 使用醒目标记(🔴、✅、❌)强调重点
  • 提供完整的正误对比示例
  • 明确禁止的行为(编造方法、改字段名等)
  • 要求输出前自检(字段名是否一致、结构是否正确)

Coding Standards
⚠️ 强制编码规范

这些规范是代码能否正常运行的关键,任何偏离都将导致错误。

❌ 绝对禁止的写法
前端禁止项:
  • 使用 alias: 'widget.myreport'
  • 使用 initComponent 而非 constructor
  • 硬编码URL:url: '/Services.ashx'
  • rootProperty用 'data'(应为 'children'
  • extraParams用 action/module(应为 method
  • 在store中定义fields
后端禁止项:
  • 编造YZReader方法:ReadInt32Null()
  • 使用 LogHelper.WriteRecord()
  • 数据库连接带 _read 后缀
  • 字段名与SQL不一致
✅ 正确的标准写法
前端标准:
  • 必须用 constructor 而非 initComponent
  • Store必须在constructor中立即 reload()
  • 使用 YZSoft.$url(me, 'Services.ashx')
  • rootProperty必须是 'children'
  • border布局items顺序:[SearchPanel(north), Grid(center)]
  • Grid必须有 columnLines: true
后端标准:
  • 只允许5个YZReader方法:ReadInt32、ReadString、ReadDecimal、ReadDateTime、ReadBoolean
  • 使用 Logger.WriteRecord() 或 TODO注释
  • 数据库连接不带 _read 后缀
  • 字段名100%照抄SQL,一个字都不能改
🔴 最高优先级提醒:字段名必须100%照抄SQL,一个字符都不能改!这是最常见的错误来源,也是导致代码无法运行的主要原因。

Workflow
🔄 Dify工作流设计

完整的工作流编排,实现从用户输入到代码生成的自动化流程。

工作流节点详解
1. 开始节点
├── sys.query: 用户输入(模块名称、SQL语句)
├── sys.files: 用户上传文件(SQL文件、原型图)
└── sys.reportsDemo: 原型图参考

2. 条件分支节点
├── 分支1: "sys.files is not empty" → 文件读取
└── 分支2: "sys.files is empty" → 直接知识检索

3. 文件读取节点
├── 读取SQL文件,提取字段列表
├── 读取原型图,提取Grid列和查询条件
└── 建立字段白名单

4. 知识检索节点
├── 知识库: BPM报表知识库
├── Top K: 10
├── Score阈值: 0.5
└── 检索模式: 混合检索

5. LLM节点
├── 模型: Qwen-3.6-plus / Qwen-vl-max
├── 提示词: dify-prompt-final.md(强制执行版)
└── 输入变量: {{#sys.query#}}、{{#sys.files#}}、{{#context#}}

6. 结束节点
└── 输出: MainPanel.js + SearchPanel.js + Services.ashx
✅ 工作流优势
  • 可视化编排,易于理解和维护
  • 条件分支处理不同场景
  • 知识检索确保输出准确性
  • 支持文件上传,灵活性强
⚠️ 注意事项
  • {{#sys.files#}}不会自动传递文件内容给LLM
  • 需要在提示词中明确说明文件内容的获取方式
  • 或在Dify工作流中添加文本提取节点
  • 合理设置超时时间,避免长时间等待

Deployment
🚀 生产环境部署

从开发环境到生产环境的完整部署流程和运维要点。

🐳 Docker容器化部署
Dify部署要点:
  • 修改镜像源为国内加速(清华、阿里云等)
  • 配置pip镜像源,解决插件安装慢的问题
  • 替换uv.lock中的PyPI URL为国内镜像
  • localhost改为127.0.0.1或host.docker.internal
  • 设置目录权限为everyone可读写
常用命令:
# 启动服务
docker compose up -d

# 查看日志
docker compose logs -f

# 重启特定服务
docker compose restart plugin_daemon sandbox

# 替换uv.lock中的URL
docker exec docker-plugin_daemon-1 sh -c \
  "find /app/storage/cwd -name 'uv.lock' -exec sed -i \
  's|https://files.pythonhosted.org/packages|https://pypi.tuna.tsinghua.edu.cn/packages|g' {} +"
性能优化策略
RAG系统优化:
  • 调整Top K和Score阈值,平衡召回率和准确率
  • 启用Rerank模型,提高检索结果相关性
  • 优化文档切片策略,保持语义完整性
  • 定期清理无用文档,减小知识库体积
模型选择:
  • 代码生成任务:优先使用Qwen系列(中文代码能力强)
  • 复杂推理任务:使用Claude或GPT-4
  • 简单问答:使用轻量级模型降低成本
  • 根据实际效果A/B测试,选择最优模型
📊 监控与运维
关键监控指标:
  • API响应时间(P95 < 3秒)
  • Token消耗量(控制成本)
  • 代码生成成功率(目标 > 95%)
  • 用户满意度评分
运维最佳实践:
  • 定期备份知识库和配置文件
  • 建立版本管理机制,记录每次变更
  • 收集用户反馈,持续优化提示词和知识库
  • 建立回滚机制,出现问题快速恢复
  • 文档化常见问题和解决方案

FAQ
❓ 常见问题与解决
问题1:字段名不一致
现象:生成的代码字段名与SQL不一致
原因:AI自己改了字段名
解决:
  • 提示词强调"字段名100%照抄SQL"
  • 知识库添加错误对照表
  • 输出前自检:所有dataIndex是否与SQL一致
问题2:编造YZReader方法
现象:生成ReadInt32Null等不存在的方法
原因:AI看到字段可能为NULL,自己编造方法
解决:
  • 提示词明确列出5个标准方法
  • 知识库强调"禁止编造方法"
  • 提供正确代码示例
问题3:border布局顺序错误
现象:items顺序写反,运行报错"c is not a constructor"
原因:AI不理解ExtJS的border布局规则
解决:
  • 提示词强调"north必须在前"
  • 知识库提供完整模板
  • 错误对照表列出
问题4:Alert组件不存在
现象:使用YZSoft.Ext.alert(),运行404错误
原因:AI不知道这个类不存在
解决:
  • 提示词明确"唯一正确:Ext.Msg.alert()"
  • 列出所有禁止的写法
  • 知识库编码规范中强调

Summary
🎓 完整学习路径回顾

从工具入门到企业级应用开发的7个阶段,构建完整的AI工程能力体系。

七阶段学习路线图
Stage 01: 🧱 工具入门与环境搭建
API Key、Token计费、Docker部署、Dify平台

Stage 02: ✍️ 提示词工程
CoT、Few-shot、RTCFC框架、结构化输出

Stage 03: 🔍 RAG检索增强与幻觉消减
向量数据库、分块策略、Rerank、幻觉消减

Stage 04: 🤖 Agent设计与进阶工程化
ReAct、MCP、Fine-tuning、LLMOps

Stage 05: 🎯 AI技能训练与工作提效
刻意练习、效率工具、工作流、提效技巧

Stage 06: 🔌 MCP协议与工具链集成
MCP协议、Hermes、Dify适配器、工具集成

Stage 07: 🏢 企业级AI应用开发实战
RAG实战、代码生成器、ExtJS规范、生产部署
🎯 下一步行动建议:
  1. 选择一个真实的业务场景,尝试构建自己的AI应用
  2. 将学到的知识应用到实际工作中,解决具体问题
  3. 参与开源项目或社区,与其他开发者交流经验
  4. 持续关注AI领域最新发展,保持学习热情
  5. 分享你的实践经验,帮助更多人成长

My Notes
📝 我的学习笔记

暂无笔记内容
你可以在这里添加自己在实践中总结的经验、遇到的问题和解决方案