Enterprise Data Assistant — 说人话,查数据
企业数据助手
一款面向企业管理者的数据查询助手。通过手机微信样式对话窗口,以自然语言("说人话")的方式,直接查询企业ERP数据库中的业务数据。无需登录后台、无需写SQL、无需找IT人员协助,管理者拿起手机就能获取经营数据。
核心组成:手机微信样式对话窗 + n8n工作流引擎 + SQL Server数据库直连 + AI理解层。
部署服务器:小广(腾讯云,公网IP 114.132.93.176,WireGuard内网 10.0.0.20)
系统采用四层架构,自上而下分别为对话窗层、AI理解层、调度中枢层、数据层。
以下为AI可查询的业务表白名单。AI的system prompt中仅包含这些表的结构信息,确保查询范围限定在白名单内。
| 表名 | 含义 | 关键列 |
|---|---|---|
RS_CustomerInfo |
客户信息表 | Code(客户编码), Name(客户名称), Phone(联系电话) |
Rent_ZLContract |
租赁合同表 | Code(合同号), CustomerId(客户ID), RentMoney(租金), DepositMoney(押金), State(状态) |
FM_ReceivableFee |
应收费用表 | ReceiveAmount(应收金额), ReceivedAmount(已收金额), State(状态), BeginDate(开始日期), EndDate(结束日期), CustomerId(客户ID) |
FM_ReceiptBill |
收款单表 | Code(单据号), Date(收款日期), ReceivedMoney(实收金额), ReceivableMoney(应收金额) |
WM_WarehouseProduct |
库存表 | ProductId(商品ID), Num(数量), UnitPrice(单价) |
WM_ProductInfo |
商品信息表 | Id(商品ID), Code(编码), Name(品名) |
WM_WarehouseProduct 与 WM_ProductInfo 通过 ProductId 关联,获取商品名称。
对话查询工作流共10个节点,完整链路如下:
AI系统提示词包含以下核心规则:
{"type":"analysis","explanation":"..."}/tmp/n8n_memory/{sessionId}.jsonAI返回的SQL在执行前,必须经过三层安全检查:
以下为项目从0到1的完整部署实战记录。
以下为部署过程中遇到的典型问题及解决方案,供后续维护参考。
问题:mcr.microsoft.com 微软镜像国内无法直接拉取。
解决:在 Mac 上安装 skopeo,通过小家 SOCKS5 代理下载镜像为 tar 文件,传输到小广后 docker load 导入。
问题:新版 n8n 中通过 API 创建工作流时,凭据引用写字符串 ID 会报 "Credential not configured"。
解决:凭据必须使用对象格式 {"microsoftSql":{"id":"xxx","name":"xxx"}}。
问题:MSSQL 凭据的 TLS 配置字段是 tls 不是 ssl,字段名写错会导致连接失败。
问题:PATCH 修改 active 字段不生效,工作流无法通过 API 激活。
解决:必须使用 POST /rest/workflows/{id}/activate 接口,并带上 versionId 参数。
问题:在容器内 sed -i 修改配置文件后不生效(inode 变化容器不认。
解决:修改配置后必须 docker restart xiaoguang-nginx 重启容器。
问题:n8n 容器重建后配置丢失。
解决:容器重建三连:数据卷保留映射、重新 docker network connect 接入网络、重新登录账号。
问题:HTTP Request 节点无凭据时报 "Credentials not found"。
解决:使用 Code 节点内置 https 模块直调 API,配置环境变量 NODE_FUNCTION_ALLOW_BUILTIN=fs,path,https。
问题:shell 中传递 jsonBody 经 shell 转义后引号丢失,导致 JSON 格式错误。
解决:使用 Python heredoc 方式写入 JSON,避免 shell 转义问题。
问题:AI 生成 SQL 较慢时,nginx 默认 60s 超时返回 504。
解决:nginx 配置 proxy_read_timeout 改为 120s。
问题:AI 调用失败时 reject,导致 webhook 空响应,前端卡死。
解决:AI 节点失败时 resolve 返回友好提示,绝不 reject,保证 webhook 始终有响应。
问题:n8n webhook 返回单行数据时返回对象而非数组,前端表格渲染报错。
解决:前端兼容处理:判断返回是对象时自动转数组。
上线前检查清单,按顺序逐项验证。
发送:我要应收款明细
预期:返回应收费用表明细数据表格,包含客户、金额、日期等字段。
发送:我4月份赚了多少钱
预期:返回 4 月份实收合计金额(约 14,562,751.8 元)。
第一步发送:我要应收款明细
第二步发送:为什么差距这么大
预期:AI 能理解上下文,给出分析类回复(type: analysis),解释应收与实收的差异原因。
发送:DELETE FROM RS_CustomerInfo
预期:返回"臣不能执行写操作",SQL 不执行。
http://localhost:5678/healthz 返回 okdocker ps 显示 sqlserver 容器状态为 Updocker ps 显示 n8n 容器状态为 Up以下为内部运维参考信息,敏感信息不公开。
| 容器名 | 用途 | 说明 |
|---|---|---|
sqlserver | SQL Server 数据库 | SA 账号,LYz 库 |
n8n | n8n 工作流引擎 | 端口 5678 |
xiaoguang-nginx | Nginx 反向代理 | 站点入口 |
/tmp/n8n_memory//var/www/box/n8n-chat/lyz-mssql# 查看容器状态
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
# 查看 n8n 日志
docker logs n8n --tail 50
# 重启 nginx
docker restart xiaoguang-nginx
# 查看会话记忆
ls /tmp/n8n_memory/
# n8n 健康检查
curl -s http://localhost:5678/healthz