智析AgentData-Analysis-Agent 0→1 架构、搭建与联调实战报告

基于 GitHub 主分支 / v1.1.0 LTS 的源码级逆向梳理

1 * 智析* Agent 当前本地运行界面(用户提供截图)

|----------|------------------------------------------------|
| 报告对象 | Zafer-Liu / Data-Analysis-Agent(本地项目名:智析Agent) |
| 分析范围 | 启动入口、前后端架构、Agent 核心、数据工具、图表、技能、MCP、打包发布与联调 |
| 报告日期 | 2026-07-17 |
| 结论性质 | 基于当前公开源码的工程复原;不等同于作者真实开发时间线 |

目录

  1. 执行摘要

  2. 产品目标与完整用户旅程

  3. 技术选型与架构拆解

  4. 源码目录与模块职责

  5. 从 0 到 1 的创建路径

  6. 本地构建与启动手册

  7. 前后端与 Agent 联调方法

  8. 数据链路、NL2SQL 与图表链路

  9. Skills、Commands、知识库与 MCP

  10. 测试、验收与故障排查

  11. 安全、许可与工程风险

  12. 智析Agent 的二次开发路线

  13. 两周 / 四周实施计划

附录 A:常用命令

附录 B:关键源码索引与参考资料

1. 执行摘要

Data-Analysis-Agent 是一个以"自然语言驱动数据分析"为核心的本地 Web Agent。用户上传 Excel/CSV、连接 SQL 数据库或其他数据源后,系统把问题转成受控工具调用:读取结构、生成并执行查询、完成统计分析、选择图表、导出 Excel/Word/PPT,并通过 SSE 将过程事件持续推送到浏览器。其本质不是"让大模型直接碰数据库",而是一个由大模型负责规划、由应用工具负责执行的分析操作系统。R1R4R6

|-----------------------------------------------------------------------------------------------------------------------------------------------------|
| 一句话判断 这是一个"Flask Web 应用 + OpenAI 兼容模型适配层 + ReAct/Function Calling Agent + 数据分析工具箱 + Vite 前端"的组合工程。它先把常规分析闭环做实,再逐步叠加技能、命令、知识库、MCP、工作区、异步任务与桌面打包。 |

1.1 最值得借鉴的设计

  • 模型只输出工具意图,真实数据访问由应用层执行;数据权限、参数校验和错误处理因此可被工程化控制。
  • Agent 主循环与工具定义、工具实现分离:schemas.py 负责"模型能看到什么",DataToolsMixin / ExportToolsMixin 负责"系统真正执行什么"。
  • SSE 把长流程拆成进度、思考、工具调用、工具结果、最终回答等事件,前端无需等待整段任务完成。
  • Skills 采用 SKILL.md 提示词扩展,而不是任意加载 Python 代码,降低了插件扩展的供应链风险。
  • MCP 作为外部能力扩展层,统一转换为 OpenAI function tool schema,并通过独立异步事件循环管理连接。

1.2 复刻时应优先做什么

  1. 先做单数据源的最小闭环:上传 CSV → 查看字段 → 查询 → 图表 → 回答。
  2. 再做多模型与配置管理,不要一开始就同时兼容所有供应商。
  3. 把 SQL 安全校验、只读约束、超时、行数上限放在 Agent 之前完成。
  4. 前端先只实现消息流和工具状态,技能、任务历史、团队协作可后置。
  5. 完成端到端测试后,再加入 Word/PPT、MCP、知识库、桌面安装包。

2. 产品目标与完整用户旅程

2.1 产品定位

该项目把数据分析师常见工作拆成可组合能力:数据接入、语义理解、结构探查、SQL/计算、可视化、结论解释、结果导出。README 给出的核心路径是"连接数据 → 理解意图 → 读取结构 → 生成 SQL → 执行 → 生成图表 → 输出洞察",并支持 Excel/CSV 与 SQLite、MySQL、PostgreSQL、SQL Server 等数据库。R1

2.2 用户可见流程

阶段 用户动作 系统动作 可见反馈
准备 上传文件或连接数据库 保存数据源配置,解析表和字段 左侧显示"已连接"
提问 输入自然语言或 /command 解析激活项、会话、技能和数据上下文 消息进入流式状态
规划 无需额外操作 BusinessAgent 请求模型生成工具调用 显示思考/步骤状态
执行 可确认高风险导出或方案 调用 schema/query/analysis/chart/export 等工具 展示工具卡片、进度和错误
呈现 查看图表和洞察 把工具结果交还模型进行归纳 文本、表格、图表、文件下载
沉淀 保存会话、知识或工作区 写入本地运行目录 历史任务可恢复

2.3 截图与源码的对应关系

  • 截图中的"添加数据源"与模板中的 Excel/CSV、SQL、Google Sheets、自定义 API 入口对应。R11
  • 模型选择、MCP、工作目录、业务知识库、临时 Prompt、保存会话等按钮,都有独立 Flask Blueprint 或前端 feature 模块。
  • 首页建议词中的 /data、/tree、/kmeans、/ppt、/dashboard 并非纯文本:命令和技能系统会把它们解析为受约束的执行路径。
  • 当前前端不是典型 React/Vue SPA;它使用 Vite 构建多个入口,并按顺序加载 legacy 与 feature 模块完成渐进式模块化。R10R11

2 Data-Analysis-Agent 分层架构(依据源码整理)

3. 技术选型与架构拆解

3.1 关键选型总表

层级 选型 主要用途 为什么适合 代价 / 注意事项
运行入口 Python + app.py 依赖检查、路径、日志、启动 WSGI 上手快,适合桌面和本地部署 启动逻辑较重,需控制副作用
Web 后端 Flask + Blueprints + CORS API、静态页、会话、文件与任务 模块轻、可逐步拆分 大型项目需严控全局状态
生产服务 Waitress / Gunicorn Windows / Linux WSGI 兼顾跨平台 SSE 需正确配置超时与缓冲
模型接口 OpenAI Python SDK 兼容协议 DeepSeek、OpenAI、AtlasCloud、自定义端点 一套 client 适配多家模型 各供应商 tool calling 细节仍可能不同
Agent ReAct + Function Calling 规划、调用工具、读取结果、继续推理 可审计、可插拔 需限制循环次数与 token
数据计算 Pandas + DuckDB + SQLAlchemy 文件分析、SQL 查询、数据库适配 生态成熟,覆盖本地和远程 大数据需异步或下推数据库
SQL 安全 sqlglot 解析、规范化、检查 SQL 比字符串规则可靠 仍需数据库只读账号兜底
统计建模 SciPy / statsmodels / pmdarima 统计检验、时序、回归 常见分析覆盖充分 依赖体积较大
图表 Plotly / Pyecharts / Matplotlib 交互图、网页图、静态图 覆盖多输出格式 三套体系会增加一致性成本
前端 HTML + Vite + 模块化 JS 聊天、面板、流式事件、预览 保留旧代码同时支持构建优化 缺少统一状态框架时维护难度上升
流式传输 Server-Sent Events 单向推送 Agent 事件 实现简单,适合聊天式任务 反向交互仍需普通 HTTP
文档导出 python-docx / python-pptx / openpyxl Word、PPT、Excel 完全本地生成 复杂排版需额外模板与校验
扩展协议 MCP stdio / SSE 接入外部工具服务 工具协议统一 必须管理信任边界和进程生命周期
桌面发布 Inno Setup / macOS DMG Windows 安装包、macOS 镜像 面向非技术用户 CI、签名、依赖打包更复杂

3.2 为什么用 Flask,而不是一开始上微服务

此类 Agent 的早期瓶颈不是 HTTP 吞吐,而是模型延迟、数据查询与分析执行。Flask 足以承载路由、会话和 SSE,同时便于与 Pandas、数据库驱动、文档生成库直接共进程。项目通过 application factory 注册 models、datasource、chat、saved_sessions、system、output、mcp、dashboard、knowledge、workspace、jobs、skills 等 Blueprint,已经形成"模块化单体"结构。R3

3.3 为什么用 OpenAI 兼容协议

LLMConfigManager 为不同供应商创建统一 OpenAI client,通过 base_url、api_key 和 model 组合接入;模型连通性测试也统一调用 chat.completions.create。这样能最大化复用消息格式、流式响应和 tool calling 逻辑。R8

|-----------------------------------------------------------------------------------------------------------------------------------------|
| 源码与 README 存在模型名称差异 README 当前列出的默认模型与 LLMConfigManager 内置模型并不完全一致。工程上应以实际运行代码为准,同时固定版本或 commit,并在发布前做一次"文档---配置---UI"一致性校验。 |

4. 源码目录与模块职责

4.1 建议先读的目录树

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Data-Analysis-Agent/ ├─ app.py # 启动入口、路径/日志/依赖/WSGI ├─ api/ # Flask Blueprints 与应用工厂 │ ├─ init.py # create_app(), 注册路由 │ ├─ chat.py # SSE 会话主入口 │ ├─ datasource.py # 文件、数据库、Sheets、HTTP API │ ├─ models.py # 模型配置 │ ├─ output.py # 输出文件 │ ├─ mcp.py / knowledge.py # MCP 与知识库 │ ├─ jobs.py / saved_sessions.py # 异步任务、历史会话 │ └─ workspace.py / teams.py # 工作区与团队 ├─ agent/ │ ├─ agent.py # BusinessAgent 主循环 │ ├─ prompts.py # 系统提示词 │ ├─ tools/ │ │ ├─ schemas.py # 暴露给模型的工具定义 │ │ └─ business/ # 数据与导出工具实现 │ ├─ commands/ # /data、/status、/compact 等命令 │ ├─ skills.py # SKILL.md 加载器 │ ├─ mcp_manager.py # MCP 连接与工具转换 │ └─ compaction.py / retry.py # 上下文压缩与重试 ├─ Function/ │ ├─ Analyze/ # 分析算法注册 │ ├─ Charts_generation/ # 图表生成 │ ├─ Clean/ # 数据清洗 │ ├─ Knowledge/ # 知识能力 │ └─ Output/ # Excel/Word/PPT 输出 ├─ LLM/llm_config_manager.py # 模型配置与 OpenAI 兼容客户端 ├─ data/ # 数据源、会话、工作区、任务持久化 ├─ skills/ # Prompt-only 技能目录 ├─ frontend/ # Vite 入口、features、legacy ├─ templates/agent_chat.html # 主页面模板 ├─ static/dist/ # 前端构建产物 ├─ packaging/ # Windows/macOS 打包 ├─ requirements.txt ├─ package.json └─ .github/workflows/build-release.yml |

4.2 Agent 核心拆分

文件 / 模块 职责 读源码时关注点
agent/agent.py BusinessAgent 主循环与上下文编排 消息裁剪、阶段控制、重试、工具结果回填
agent/tools/schemas.py OpenAI function tool schema 工具名、参数、前置调用规则、确认机制
agent/tools/business/data.py 数据、图表、清洗、分析执行 行数阈值、异步任务、知识检索
agent/tools/business/export.py Excel/Word/PPT 导出 方案确认、文件路径和异常处理
agent/prompts.py 系统 Prompt 与业务规则 SQL、知识库、图表、输出要求
agent/skills.py 加载 SKILL.md YAML frontmatter、热加载、启用条件
agent/commands/* 斜杠命令注册和分发 解析、可用性、命令契约
agent/mcp_manager.py 外部 MCP 工具接入 stdio/SSE、进程白名单、异步桥接

4.3 前端结构

package.json 使用 Vite 7,要求 Node 20.19+、pnpm 11.7.0。构建命令先生成 dashboard bundle,再用独立配置生成 chat-app.js。聊天入口按固定顺序 side-effect import legacy/core、消息、命令、数据源、预览、流处理、设置、任务、会话、自动保存、更新、检查点、面板等模块。R10

5. 从 0 到 1 的创建路径

下面不是对作者真实提交历史的断言,而是依据当前结构复原出的"最合理工程演进顺序"。照此顺序重建,可以在每一阶段都得到可演示、可验证的增量。

阶段 0:定义边界与成功标准

  • 只做分析助手,不让模型直接获得数据库凭据。
  • MVP 仅支持 CSV/Excel + 一个模型供应商 + 5 种常用图表。
  • 所有查询只读、有限行数、有限执行时间;导出文件保存在专用工作目录。
  • 验收标准:10 个自然语言问题中,至少 8 个可得到正确字段、查询和图表。

阶段 1:搭起 Flask 骨架与静态聊天页

  • 创建 create_app() 工厂、/api/health、/api/chat/stream、/api/datasource/upload。
  • 页面先只有消息列表、输入框、上传按钮和模型设置。
  • 本地开发用 Flask,生产入口预留 Waitress/Gunicorn。
  • 此时模型可以先返回回声;目标是打通请求、日志和错误显示。

阶段 2:建立数据源抽象

  • 设计 DataSource 接口:list_tables、get_schema、sample_rows、query、close。
  • 文件数据源用 Pandas/DuckDB;数据库用 SQLAlchemy 或原生驱动。
  • 建立 session_id → active datasource 映射,避免所有用户共享全局连接。
  • 把数据源元信息与上传文件分开保存,便于清理和迁移。

阶段 3:接入统一 LLM 配置

  • 采用 OpenAI SDK 兼容接口,配置 provider、base_url、model、api_key。
  • 实现模型列表、保存、删除、测试连接与默认模型。
  • 严格避免 API key 进入前端日志和错误栈;生产环境优先从密钥服务或环境变量读取。
  • 先验证普通对话,再验证 streaming,最后验证 tool calling。

阶段 4:定义工具协议与 Agent 循环

  • 为 get_schema、query_data、run_analysis、select_chart、generate_chart 定义 JSON Schema。
  • 模型返回 tool_calls 后,应用校验参数、执行函数、把结果作为 tool message 回填。
  • 设置最大回合、最大 token、重复工具检测与总耗时。
  • 建立事件模型:status、reasoning、tool_start、tool_result、artifact、error、final。

阶段 5:实现 NL2SQL 安全链路

  • 强制先 get_schema,再允许 query_data。
  • 用 sqlglot 解析 SQL,只允许 SELECT/CTE,禁止 DDL/DML、多语句和危险函数。
  • 数据库使用只读账号;设置超时、最大扫描/返回行数。
  • 错误反馈给模型时去除敏感连接信息,只返回可修复的结构性错误。

阶段 6:图表选择与渲染

  • 用图表注册表描述每种图的字段角色、最少字段、数据类型和最大类别数。
  • 先 select_chart 决定图形和字段映射,再 generate_chart。
  • 交互图可用 Plotly/Pyecharts,导出文档时补充 Matplotlib 或截图。
  • 给所有图表生成可追溯 metadata:来源查询、字段、过滤条件、生成时间。

阶段 7:加入 SSE 流式联调

  • 后端以 generator 持续 yield data: JSON\n\n。
  • 前端 EventSource 不适合携带 POST body 时,可用 fetch + ReadableStream 解析 SSE。
  • 代理层关闭响应缓冲并延长读超时;每隔一定时间发送心跳。
  • 断开连接时取消任务或标记为可恢复。

阶段 8:扩展 Skills 与 Commands

  • Skills 用 SKILL.md 提供领域方法和工作流,不执行任意 Python。
  • Commands 用注册表管理 /data、/status、/compact、/jobs 等确定性动作。
  • 命令与技能必须声明可用条件,例如是否已连接数据源、是否启用工作区。
  • 每回合热加载便于本地开发,但生产环境应增加缓存与签名/审核流程。

阶段 9:知识库、MCP 与工作区

  • 知识库先做本地文档检索,再把 query_knowledge 暴露给 Agent。
  • MCP 工具统一转成 mcp__server__tool 命名,限制可启动进程和参数。
  • 工作区提供文件读写、项目说明和输出归档;团队/Hook 作为后续协作能力。
  • 外部工具默认低权限、显式启用、记录调用审计。

阶段 10:异步任务、导出与发布

  • 大于阈值的分析、清洗、图表、查询进入 jobs 队列,前端轮询或接收事件。
  • Excel/Word/PPT 采用"方案 → 用户确认 → 生成"两阶段,避免误产出。
  • 补齐单元测试、接口测试、端到端 smoke test。
  • 最后做 Windows 安装包、macOS DMG、CI Release,而不是在 MVP 阶段投入。

3 * 一次自然语言分析请求的端到端执行序列*

6. 本地构建与启动手册

6.1 环境要求

组件 建议版本 何时需要
Python 3.11(项目 lint 目标为 3.10) 始终需要
pip / venv 随 Python 隔离依赖
Node.js ≥ 20.19 仅重建前端时需要
pnpm 11.7.0 仅重建前端时需要
浏览器 Chrome / Edge 最新稳定版 调试 SSE 与前端
数据库驱动 requirements.txt 已含常用驱动 连接 MySQL/PostgreSQL 等时

6.2 Windows 从已下载目录启动

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| cd D:\path\to\Data-Analysis-Agent py -3.11 -m venv .venv .venv\Scripts\activate python -m pip install --upgrade pip pip install -r requirements.txt python app.py # 浏览器打开:http://127.0.0.1:5001 |

6.3 macOS / Linux

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| cd /path/to/Data-Analysis-Agent python3.11 -m venv .venv source .venv/bin/activate python -m pip install --upgrade pip pip install -r requirements.txt python app.py # 浏览器打开:http://127.0.0.1:5001 |

6.4 何时需要重建前端

仓库已包含 static/dist 时,只修改 Python 或模板通常可直接运行;修改 frontend/ 下源码、Vite 入口或资源打包逻辑时,再执行前端安装与构建。package.json 的 build 会连续构建 dashboard 与 chat-app 两个入口。R10

|-------------------------------------------------------------------------------------------------------|
| corepack enable corepack prepare pnpm@11.7.0 --activate pnpm install --frozen-lockfile pnpm run build |

6.5 启动参数

变量 作用 建议
PORT / AGENT_PORT 监听端口,默认 5001 端口冲突时修改
BAA_HOST 监听地址 本机使用 127.0.0.1;不要无鉴权暴露公网
BAA_WSGI 选择 waitress 或 gunicorn Windows 用 waitress,Linux 可用 gunicorn
BAA_WORKERS Gunicorn worker 数 SSE 场景从小值压测
BAA_SKIP_DEPENDENCY_CHECK 跳过启动依赖检查 容器/受管运行环境可开启

6.6 第一次启动后的最小验收

  1. 打开模型设置,填写 API Key,点击连接测试。
  2. 上传一个不超过 10 MB、字段清晰的 CSV。
  3. 先问"列出表结构和每列类型",确认 schema 工具工作。
  4. 再问"按月份汇总销售额",确认查询结果。
  5. 最后问"生成月度销售趋势折线图",确认图表选择和生成。
  6. 导出一次 Excel 或报告,确认输出目录和下载路由。

|----------------------------------------------------------------------------------------------------|
| 建议先固定一个小样本数据集 联调不要直接用真实生产库。准备 1,000~10,000 行、字段类型明确、包含日期/类别/数值的样本,并维护 10 个标准问题及期望答案,能大幅缩短排查时间。 |

7. 前后端与 Agent 联调方法

7.1 分层联调,不要一次性全链路猜错

独立验证 通过标准 失败时先查
启动层 python app.py 5001 可访问、无依赖报错 venv、端口、日志目录
模型层 模型连接测试 能返回短消息 base_url、key、model 名称
数据源层 上传 / 连接 / schema 表名、字段、样例正确 文件编码、驱动、权限
工具层 直接调用 get_schema/query_data 结构化结果可序列化 参数校验、SQL、行数限制
Agent 层 最小工具调用问题 工具顺序正确 prompt、tool schema、模型兼容
流式层 查看 Network 流 持续收到事件且不缓冲 SSE 格式、代理超时、心跳
渲染层 图表/文件预览 资源可加载、下载可用 静态路径、CSP、文件 URL

7.2 浏览器侧检查

  • 打开 DevTools → Network,过滤 chat/stream 或 EventStream 请求。
  • 确认响应 Content-Type 为 text/event-stream,并且数据不是任务完成后一次性出现。
  • Console 中检查 JSON 解析、模块加载、静态资源 404、CORS 与未捕获异常。
  • Application 中检查本地配置和会话缓存,但不要把 API Key 输出到截图或日志。

7.3 后端侧检查

  • 为每次请求生成 request_id / session_id,日志按一次对话串联。
  • 记录工具名、耗时、输入摘要、返回行数,不记录完整密钥或整表数据。
  • 对 LLM、数据库、MCP、文件导出分别设置超时,并区分可重试与不可重试错误。
  • SSE 生成器捕获 GeneratorExit,浏览器断开时停止后续昂贵任务。

7.4 Agent 工具调用调试

BusinessAgent 引入 compaction、retry、validation、reasoning tag parsing、prompt cache、workflow stage 与 MCP discovery,说明主循环不只是"发一次请求"。调试时必须把每一轮 messages、tool_calls、tool result size 和 stop reason 记录成可读 trace。R5

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| trace_id = new_id() emit("status", {"trace_id": trace_id, "stage": "planning"}) response = llm.chat(messages=messages, tools=tool_schemas) for call in response.tool_calls: validated = validate_tool_call(call) emit("tool_start", {"name": call.name}) result = execute_tool(validated) emit("tool_result", {"name": call.name, "summary": summarize(result)}) messages.append(as_tool_message(call, result)) # Continue until final answer, max rounds, timeout, or cancellation. |

7.5 推荐的事件协议

事件 字段示例 前端行为
status stage, text, progress 更新顶部状态
reasoning summary 显示可公开的步骤摘要
tool_start name, args_summary 显示工具卡片加载态
tool_result name, preview, row_count 更新工具卡片
artifact type, url, title 显示图表/文件
warning code, message 非阻断提示
error code, message, retryable 显示错误和重试按钮
final markdown, citations 结束消息并保存会话

8. 数据链路、NL2SQL 与图表链路

8.1 数据源接入

datasource API 支持 Excel/CSV、SQL 数据库、Google Sheets 和 HTTP API;文件扩展名至少覆盖 xlsx、xls、csv。数据与配置通过 data/ 下的 source、connector、session、workspace 等模块管理。R9R16

8.2 NL2SQL 的正确控制面

  1. 模型先读取 get_schema;必要时再 get_table_detail 或 sample rows。
  2. 模型生成 SQL,但应用层用 sqlglot 解析,不接受无法解析或多语句输入。
  3. 白名单只允许 SELECT / WITH;限制表、函数、时间、返回行数和参数。
  4. 数据库账号本身设为只读;应用层校验不是最后一道防线。
  5. 查询结果转为紧凑 JSON/Markdown,超大结果写入临时表或异步任务。
  6. 模型根据结果解释,而不是根据自己猜测的 SQL 结果解释。

8.3 大数据任务阈值

数据工具实现中已经给出异步化阈值示例:分析大于约 1,000 行、图表或 profile 大于约 50,000 行、清洗大于约 50,000 行、查询大于约 100,000 行时转入任务系统。阈值应视机器配置和算法复杂度压测后调整。R7

8.4 图表选择器

chart selector 维护图表注册表,每种图包含字段角色、约束、数据格式与描述,并使用评分逻辑选图。工具 schema 还明确要求先 select_chart 再 generate_chart,避免模型直接凭名称生成不适配图形。R6

问题类型 推荐图表 必须检查
时间趋势 Line / Area 日期排序、粒度、缺失期
类别比较 Bar / Column 类别数量、长标签、排序
构成占比 Stacked Bar / Pie(类别少) 总和、类别数、零值
分布 Histogram / Box 样本量、异常值、分箱
相关关系 Scatter / Bubble 数值类型、离群点、尺度
转化路径 Funnel 阶段顺序、口径一致
地理 Map 地名/经纬度、地图资源

8.5 文档导出为什么采用"两阶段"

工具定义中包含 proposal / confirmation 类工具,再进入 generate_ppt、export_report 等生成动作。这种"先给大纲和内容计划,再确认生成"的方式可减少耗时、避免用户误触,并让文件结构在执行前可审阅。R6

9. Skills、Commands、知识库与 MCP

9.1 Skills:提示词化的领域工作流

skills/ 包含 arima、chart、dashboard、data、decile、funnel-analysis、gru、kmeans、logistic、ppt、prophet、regression、report、sarima、screening、sql、tree、trimming、var、winsorize 等目录。加载器读取 SKILL.md 的 YAML frontmatter 和正文,将其作为提示词能力注入;它不会从技能目录动态 import 任意 Python。R13

|-------------------------------------------------------------------------------------------------------------------------------|
| 这是一项重要安全取舍 Skill 作者可以指导模型如何组合已审计工具,但不能仅靠放入一个 Python 文件获得任意代码执行。如需新增真实计算能力,应在 Function/ 或 agent/tools/ 中实现并审查,再由 Skill 编排。 |

9.2 Commands:确定性控制面

commands 目录提供 checkpoint、clear、compact、data、help、instruction、jobs、knowledge、mcp、new、sessions、skills、status、stop、teams 等命令。命令由注册表、解析器和 dispatcher 管理,适合"无需模型推理即可确定执行"的操作。R14

9.3 知识库:业务口径优先于猜测

工具 schema 明确要求在涉及业务指标、口径、规则时先 query_knowledge,再进行 SQL 或分析。这是数据 Agent 从"会算"走向"算对业务口径"的关键:同名指标可能有财务、销售、运营等不同定义。R6

9.4 MCP:外部工具的标准化扩展

MCP manager 同时支持 stdio 和 SSE transport,通过后台异步事件循环为同步 Flask 代码提供桥接;允许启动的本地命令限制在 uvx、uv、npx、node、python、python3、deno,并把外部工具映射为 mcp__server__tool 形式的 function schema。R12

MCP 联调项 验证方法 风险控制
连接 单独启动 server,验证 initialize/list_tools 固定版本、限制网络
工具发现 检查 schema 是否完整、参数是否可序列化 命名冲突隔离
调用 用最小参数执行一次 超时、输出大小、脱敏
断开重连 停止 server 后恢复 指数退避、最大重试
审计 记录 server/tool/耗时/结果摘要 不记录密钥和完整敏感数据

10. 测试、验收与故障排查

10.1 最小自动化测试矩阵

类别 用例 预期
启动 缺少可选依赖 / 端口占用 给出可操作错误,不静默退出
模型 错误 key、错误 model、超时 分类错误、允许重试
上传 CSV 编码、空文件、超大文件、重复列 明确提示并清理临时文件
Schema 多表、中文列名、日期/数值混合 字段与类型稳定
SQL SELECT、CTE、注入、DELETE、多语句 只读通过,危险语句拒绝
工具 参数缺失、类型错误、工具不存在 校验失败不执行
图表 类别过多、空数据、单点时间序列 降级或解释原因
SSE 长任务、浏览器断开、代理缓冲 连续事件、可取消
导出 路径非法、文件占用、中文字体 安全文件名、可重试
会话 保存、恢复、清空、压缩 状态一致
MCP server 离线、慢响应、坏 schema 隔离错误,不拖垮主会话

10.2 标准验收问题

  • "有哪些表?每张表多少行?"------验证 schema 与元数据。
  • "按月汇总销售额,并计算环比。"------验证日期处理、聚合和窗口计算。
  • "贡献收入最高的 10 个客户是谁?"------验证排序与 Top-N。
  • "各地区销售额和毛利率对比,生成柱线组合图。"------验证多指标图表。
  • "对客户做 K=3 聚类并解释每一类。"------验证 Skill + 分析工具。
  • "生成一份管理层销售复盘 PPT。"------验证方案确认与文件生成。

10.3 高频故障

现象 可能原因 排查 / 修复
页面打不开 端口占用、依赖失败 查看启动日志;换 PORT;确认 venv
模型测试失败 base_url/model/key 不匹配 用供应商最小请求验证;检查代理
上传后无表 编码、文件格式、解析器 用 Pandas 单独读取;检查临时目录
模型不调用工具 模型不支持 tool calling 或 prompt 冲突 换兼容模型;缩短工具列表;检查 schema
重复调用同一工具 结果过大、模型未理解、缺少循环保护 压缩结果;加入重复调用检测和最大回合
SQL 报字段不存在 schema 过期、大小写/中文名 强制刷新 schema;引用字段名
图表空白 静态资源/数据映射/浏览器错误 检查 Console、图表 payload 和容器尺寸
SSE 最后一次性出现 代理或服务器缓冲 关闭 buffering;设置正确 MIME;发送心跳
PPT/Word 中文乱码 字体缺失 安装/嵌入企业字体;模板指定东亚字体
MCP 卡住 子进程死锁或服务超时 独立启动调试;设置调用超时和 kill

11. 安全、许可与工程风险

11.1 风险清单

风险 当前信号 建议
API Key 本地保存 配置管理器使用本地 JSON 持久化 生产改为系统钥匙串/Secret Manager;文件权限最小化
数据库误写 应用有 SQL 解析依赖但不能替代账号权限 只读账号 + sqlglot AST 校验 + 超时/限行
公网暴露 Flask/WSGI 可监听外部地址 默认 127.0.0.1;外网必须鉴权、TLS、反向代理
Prompt Injection 知识库、文件、MCP 输出会进入上下文 标记不可信内容;工具参数二次校验;最小权限
MCP 供应链 可启动本地命令并访问外部服务 只启用可信 server;固定版本;审计网络与文件权限
文件隐私 上传、缓存、输出、会话落盘 明确保留周期;一键清理;目录隔离和加密
依赖可复现性 requirements 注释提到 lock,当前安装常回退到 requirements 发布前生成并校验 lock/SBOM,做漏洞扫描
文档与代码漂移 默认模型表与代码内置项存在差异 CI 加配置一致性测试;发布说明绑定 tag
许可证 CC BY-NC 4.0 商用、SaaS、内部收费场景先获得授权

11.2 许可特别提醒

仓库当前声明采用 Creative Commons Attribution-NonCommercial 4.0 International,未经授权不得用于商业目的。即使只是在企业内部部署,也应由法务根据使用方式、收费关系和衍生分发判断,不能把"代码公开"自动理解为"可自由商用"。R1R15

11.3 发布前必须补齐的工程控制

  • 固定 Python/Node/pnpm 版本与依赖锁;生成 SBOM。
  • 对 SQL、文件路径、MCP 参数做结构化校验,拒绝字符串拼接。
  • 所有密钥使用脱敏日志;错误页面不回传堆栈。
  • 输出目录采用随机不可猜文件名和过期清理。
  • 建立数据分级:公开、内部、敏感、禁止进入外部模型。
  • 对模型供应商的日志保留与数据使用政策做供应商评估。

12. 智析Agent 的二次开发路线

12.1 品牌与界面

  • 修改 templates/agent_chat.html 的产品名、Logo、启动文案和建议词。
  • 统一 static 资源与安装包名称;保留项目版本、许可证与第三方声明。
  • 把"模型、MCP、工作目录、只读"等专业设置放入高级面板,降低业务用户认知负担。

12.2 业务能力

目标 优先修改位置 实现方式
企业指标口径 知识库 + prompts 录入指标定义、维度、过滤与例外
行业分析流程 skills/<skill>/SKILL.md 写标准步骤、输入要求、验收条件
新算法 Function/Analyze + tool schema 注册算法,限制参数,补单测
新数据源 api/datasource.py + data/connector 实现连接、schema、query、关闭
新图表 Charts_generation + chart selector 增加字段角色、约束和渲染器
新导出模板 Function/Output 企业 Word/PPT 模板、页眉页脚、主题
外部系统 MCP server 用标准协议接 CRM、工单、搜索等

12.3 推荐的改造顺序

  1. 固定可运行版本,建立自己的 fork、分支策略和 CI。
  2. 先改品牌,不改核心逻辑;做一次完整回归。
  3. 接入一个企业模型网关和一个脱敏测试数据源。
  4. 沉淀 20~50 个业务指标到知识库。
  5. 为三个高频场景写 Skill,并建立标准答案集。
  6. 再接企业数据库、MCP 和报告模板。
  7. 最后做 SSO、权限、审计、多租户与部署高可用。

|--------------------------------------------------------------------------------------------------------------------|
| 不要直接在 BusinessAgent 主循环里堆业务 if/else 行业逻辑优先放知识库、Skill、Command 或独立 Tool;主循环只负责通用编排。这样才能在升级上游代码时降低冲突。 |

13. 两周 / 四周实施计划

13.1 两周:完成可演示的企业内测版

时间 目标 产出
第 1--2 天 环境与基线 固定版本、启动成功、依赖锁、样本数据
第 3--4 天 模型和数据源 企业模型网关、CSV + 测试数据库
第 5--6 天 核心闭环 schema、查询、图表、SSE 可观测
第 7--8 天 业务口径 20 个指标知识、2 个 Skill
第 9--10 天 导出和回归 Excel/Word/PPT 冒烟测试、10 个标准问题

13.2 四周:完成可受控试运行版

重点 验收
第 1 周 基线、环境、核心链路 开发机和测试机一致运行
第 2 周 业务知识、Skill、报告模板 核心场景准确率达标
第 3 周 权限、安全、审计、MCP 风险评审和渗透测试问题闭环
第 4 周 性能、部署、运维、培训 试运行、监控、回滚与用户手册

13.3 建议指标

指标 目标参考
模型工具调用成功率 ≥ 95%
标准问题结果正确率 ≥ 85%,关键财务口径 ≥ 95%
小数据集首个事件时间 ≤ 2 秒
常规问题总响应时间 ≤ 20 秒(视模型与数据库)
危险 SQL 拦截率 100%
敏感信息日志泄漏 0
导出文件成功率 ≥ 98%
断线/失败可恢复率 ≥ 95%

附录 A:常用命令

A.1 Python

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # 进入环境 .venv\Scripts\activate # Windows source .venv/bin/activate # macOS/Linux # 安装与运行 pip install -r requirements.txt python app.py # 代码质量(以仓库配置为准) ruff check . python -m unittest discover |

A.2 Frontend

|-------------------------------------------------------------------------------------------------------------------------------------------|
| corepack enable corepack prepare pnpm@11.7.0 --activate pnpm install --frozen-lockfile pnpm run build pnpm run lint pnpm run format:check |

A.3 生产运行思路

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # Windows / cross-platform set BAA_WSGI=waitress set BAA_HOST=127.0.0.1 set PORT=5001 python app.py # Linux(示例;worker 数需压测) export BAA_WSGI=gunicorn export BAA_WORKERS=2 export BAA_HOST=127.0.0.1 export PORT=5001 python app.py |

A.4 联调记录模板

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Trace ID: Session ID: Model provider / model: Data source: User question: Expected tool sequence: Actual tool sequence: SQL / analysis summary: SSE events: Final answer: Artifacts: Latency: Error and root cause: Fix / regression case: |

附录 B:关键源码索引与参考资料

以下引用均为本报告撰写时检查的 GitHub 主分支页面。主分支会变化,正式实施时应记录 tag 或 commit hash。

编号 内容 地址
R1 仓库主页与 README:定位、功能、安装、模型、数据源、图表、许可证 https://github.com/Zafer-Liu/Data-Analysis-Agent
R2 app.py:依赖检查、路径、日志、Flask 工厂、Waitress/Gunicorn、端口 https://github.com/Zafer-Liu/Data-Analysis-Agent/blob/main/app.py
R3 api/init.py:Flask application factory 与 Blueprint 注册 https://github.com/Zafer-Liu/Data-Analysis-Agent/blob/main/api/__init__.py
R4 api/chat.py:SSE 对话入口、激活项、数据上下文与 BusinessAgent 构建 https://github.com/Zafer-Liu/Data-Analysis-Agent/blob/main/api/chat.py
R5 agent/agent.py:BusinessAgent、重试、压缩、阶段、工具循环 https://github.com/Zafer-Liu/Data-Analysis-Agent/blob/main/agent/agent.py
R6 agent/tools/schemas.py:工具 JSON Schema、调用顺序与导出确认 https://github.com/Zafer-Liu/Data-Analysis-Agent/blob/main/agent/tools/schemas.py
R7 agent/tools/business/data.py:数据工具、分析、图表与异步阈值 https://github.com/Zafer-Liu/Data-Analysis-Agent/blob/main/agent/tools/business/data.py
R8 LLM/llm_config_manager.py:OpenAI SDK 兼容模型配置与连通性测试 https://github.com/Zafer-Liu/Data-Analysis-Agent/blob/main/LLM/llm_config_manager.py
R9 requirements.txt:Python 依赖栈 https://github.com/Zafer-Liu/Data-Analysis-Agent/blob/main/requirements.txt
R10 package.json 与 Vite 配置:Node/pnpm 版本与多入口构建 https://github.com/Zafer-Liu/Data-Analysis-Agent/blob/main/package.json
R11 templates/agent_chat.html:截图所示主页面与数据源/设置入口 https://github.com/Zafer-Liu/Data-Analysis-Agent/blob/main/templates/agent_chat.html
R12 agent/mcp_manager.py:stdio/SSE、异步桥接、命令允许列表 https://github.com/Zafer-Liu/Data-Analysis-Agent/blob/main/agent/mcp_manager.py
R13 agent/skills.py 与 skills/:Prompt-only SKILL.md 加载 https://github.com/Zafer-Liu/Data-Analysis-Agent/blob/main/agent/skills.py
R14 agent/commands/:斜杠命令注册与分发 https://github.com/Zafer-Liu/Data-Analysis-Agent/tree/main/agent/commands
R15 LICENSE:CC BY-NC 4.0 https://github.com/Zafer-Liu/Data-Analysis-Agent/blob/main/LICENSE
R16 api/datasource.py 与 data/:文件、数据库、Sheets、HTTP 数据源 https://github.com/Zafer-Liu/Data-Analysis-Agent/blob/main/api/datasource.py
R17 .github/workflows/build-release.yml:Windows/macOS 构建发布 https://github.com/Zafer-Liu/Data-Analysis-Agent/blob/main/.github/workflows/build-release.yml

结语

智析Agent 已经具备较完整的数据 Agent 工程骨架。真正决定能否进入生产的,不是再增加多少模型或图表,而是能否把业务口径、数据权限、SQL 安全、工具可观测性、测试样本和部署治理做成稳定体系。建议以本报告的"分层联调 + 标准问题集 + 最小权限"作为二次开发主线。

相关推荐
XUHUOJUN2 小时前
Azure Stack Hub 套餐、计划与订阅模型深度解析(上篇)
架构·azure stack
Sam_Deep_Thinking2 小时前
DDD里的领域服务,到底什么时候该用?
程序员·架构·系统架构·ddd
JouYY3 小时前
大模型底层学习(一)-Transformer 架构总览
架构·llm·agent
行者全栈架构师3 小时前
【码动四季】Spring Boot 可观测性体系:Micrometer + OpenTelemetry + Grafana 全链路搭建
java·算法·架构
wasp5204 小时前
Vibe-Trading 深度解析(一):用 LLM 驱动的完整股票研究智能体架构总览
人工智能·架构·交易·ai coding·vibe trading
国科安芯4 小时前
抗辐射微控制器在卫星电源管理分系统中的控制架构与可靠性研究——基于AS32S601型MCU的星载能源系统智能化管理技术分析
网络·单片机·嵌入式硬件·安全·架构·系统架构·能源
微三云云仔5 小时前
GEO系统技术架构拆解:微三云双引擎产品的模块化设计逻辑
架构
智码看视界6 小时前
Tomcat架构深度拆解:Connector和Container到底怎么配合的?
java·servlet·架构·tomcat·web服务器
没落英雄6 小时前
7. 从零开始搭建一个 AI Agent —— UI 卡片渲染系统
前端·人工智能·架构