# Attribution_Analysis **Repository Path**: dddsm122/attribution-analysis ## Basic Information - **Project Name**: Attribution_Analysis - **Description**: 基于业务数据的实时分析平台 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-25 - **Last Updated**: 2026-09-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 经营归因分析系统(Attribution Analysis System) 围绕经营业务问题的**多轮对话式归因分析系统**:用户在一个会话里持续追问、补充资料,系统每一轮执行查询与计算并实时展示分析过程,逐轮产出结构化的归因结论,最终沉淀为可导出的分析报告。 它要解决的是传统 BI 报表"单问单答"的问题——不保留上下文、无法延续上一轮结论、也无法把每轮查到的证据串成一份完整分析。 创建日期:2026-09-25 需求来源:《大模型项目实战》2.1 经营归因分析系统(2.1.1 – 2.1.13) ## 目录 1. [项目简介](#1-项目简介) 2. [当前状态](#2-当前状态) 3. [文档索引](#3-文档索引) 4. [交付范围与用户角色](#4-交付范围与用户角色) 5. [演示场景](#5-演示场景) 6. [系统架构](#6-系统架构) 7. [技术栈与端口](#7-技术栈与端口) 8. [领域模型与数据表](#8-领域模型与数据表) 9. [接口清单](#9-接口清单) 10. [实时消息协议](#10-实时消息协议) 11. [关键规则与约束](#11-关键规则与约束) 12. [目录结构](#12-目录结构) 13. [开发路线图](#13-开发路线图) 14. [环境准备与启动](#14-环境准备与启动) 15. [配置说明](#15-配置说明) 16. [验收标准](#16-验收标准) 17. [协作约定](#17-协作约定) 18. [交付物清单](#18-交付物清单) ## 1. 项目简介 | 维度 | 说明 | | --- | --- | | 系统形态 | 前端 SPA + FastAPI 单体后端 + 独立认证中心 + MySQL + 本地文件存储 | | 核心交互 | 会话内多轮追问 → 每轮触发一次分析任务 → 实时推送分析过程 → 产出六部分结构化结果 | | 核心复杂度 | 分析任务编排与实时推送,而非高并发水平扩展 | | 项目定位 | 单人 / 小团队开发的教学实战项目,优先开发效率与可演示性 | **明确不做的部分**:不面向公众注册(用户来自企业认证中心)、不做实时数据大屏、不做多人协同编辑。 ## 2. 当前状态 | 项 | 状态 | | --- | --- | | 需求文档 / 设计文档 / 开发计划 | 已完成(2026-08-26) | | OpenSpec 目录骨架 | 已初始化,`openspec/changes`、`openspec/specs` 尚为空 | | 后端(阶段 0–8) | 已完成:骨架、十张表与迁移、认证接入、会话与消息、附件管理、WebSocket 实时通道、任务编排、模拟分析引擎、结果与导出、配置热更新、任务日志 | | 认证中心(阶段 2) | 已完成:OAuth2 授权码流程 + 内置演示账号 | | 前端(阶段 9) | 已完成:登录入口与回调过渡/失败重试、会话列表、对话流式渲染、实时任务区、附件侧栏、结果展示与历史轮回看、配置与日志入口、断线重连与重发 | | 示例业务数据(阶段 6) | 已完成:六场景建表脚本 + 商品目录优化与退款模式分析两个场景的校准数据 | | 端到端验收(阶段 11) | 已完成:见 `acceptance/README.md` 与 `acceptance/acceptance-report.md` | | 真实大模型引擎(阶段 10) | 未开始(提案已备:`openspec/changes/add-real-llm-engine/`,等指令开工) | > 后端与认证中心可直接启动,前端可在浏览器跑通"登录 → 会话 → 提问 → 实时分析 → 六部分结果 → 导出"的完整链路;启动方式见第 14 节。 ## 3. 文档索引 三份文档构成一条完整链路:**做什么 → 怎么建 → 按什么顺序建**。 | 文档 | 定位 | 回答的问题 | 何时读 | | --- | --- | --- | --- | | [经营归因分析系统-需求文档.md](docs/经营归因分析系统-需求文档.md) | PRD | 做什么:背景、目标、角色、页面功能、结果格式、验收标准 | 想了解产品全貌时 | | [经营归因分析系统-设计文档.md](docs/经营归因分析系统-设计文档.md) | 技术设计 | 怎么建:架构、模块边界、数据库、接口契约、实时协议、关键流程、部署 | 动手实现前 | | [经营归因分析系统-开发计划.md](docs/经营归因分析系统-开发计划.md) | 执行计划 | 按什么顺序建:12 个阶段,每阶段以可执行的验证动作收尾 | 每个阶段开工前 | ### 引用约定 阅读文档时注意三条约定,否则容易找错章节: - 开发计划中的 `§编号` 指**设计文档**的章节(如 `§7.2` = 设计文档第 7.2 节) - 开发计划中的"验收条目编号"指 **PRD 第 9 节**的验收标准 - 设计文档第 1.2 节的"需求追溯"表把每个设计章节映射回源需求条目 2.1.x ## 4. 交付范围与用户角色 ### 交付范围 | 能力类 | 内容 | | --- | --- | | 基础能力 | 认证中心登录、会话管理、附件管理、配置热更新、运行日志 | | 分析能力 | 实时分析、数据库查询、文件读写、文本检索、命令执行、结果文件生成 | | 交付能力 | 聊天工作台、结果保存、结果导出、至少两个业务分析场景的示例数据与完整演示链路 | ### 用户角色 | 角色 | 典型画像 | 核心操作 | 权限边界 | | --- | --- | --- | --- | | 分析用户(`analyst`) | 业务分析师 / 运营人员,熟悉业务指标但不写 SQL | 创建会话、提问、上传资料、查看历史、查看与下载结果 | 只能操作自己的会话、附件与结果 | | 系统管理员(`admin`) | 负责运行维护的工程师 | 维护认证与系统配置、查看运行日志、管理数据源、启停功能开关 | 管理系统级配置与日志,不代用户执行分析 | 角色由认证中心返回的用户身份判定,本系统内不再单独维护注册流程。 ## 5. 演示场景 系统需提供**六个场景**的建表脚本与演示数据,交付时**至少任选两个**完成全链路演示(提问 → 分析过程 → 结构化结果 → 导出报告)。 | 场景 | 数据表要求 | 演示 | | --- | --- | --- | | 商品目录优化 | 商品表、类目表、搜索曝光表、点击表、转化表 | **必做演示场景**(3C 类目转化率环比下降约 17.5%) | | 退款模式分析 | 退款申请表、退款原因表、订单表、用户表 | **必做演示场景**(母婴类目退款率 5.7% → 9.5%) | | 客户行为分析 | 用户表、访问事件表、加购事件表、下单事件表 | 候选 | | 库存异常分析 | 库存表、入库表、出库表、销量表 | 候选 | | 评论反馈分析 | 评论表、评分表、商品表、退款表 | 候选 | | 市场表现分析 | 渠道表、投放表、订单表、销售汇总表 | 候选 | 演示数据要求:时间跨度覆盖至少两个统计周期(支撑环比 / 同比类问题);数值可下钻(分价格段、分渠道、分退款原因存在明显差异),使结论有数据支撑而非叙事堆砌。 ## 6. 系统架构 采用**单体分层架构**:前端 SPA + FastAPI 单体后端 + 独立认证中心 + MySQL + 本地文件存储,外部依赖 LLM 服务。 ```mermaid graph TB subgraph Client["浏览器"] FE["前端 SPA
认证回调 / 会话 / 聊天 / 附件 / 结果 / 配置 / 日志"] end subgraph Server["FastAPI 单体服务(:8000)"] AUTH["认证接入模块"] CHAT["会话 / 消息模块"] ATT["附件模块"] WS["长连接模块(WebSocket)"] TASK["任务模块"] ANA["分析模块
上下文拼装 + 工具执行"] RES["结果模块"] CFG["配置模块"] end subgraph Ext["外部依赖"] SSO["认证中心(:8100)"] LLM["LLM 服务
或内置模拟引擎"] BIZDB[("业务示例库 MySQL")] end subgraph Storage["本地存储"] APPDB[("系统库 MySQL")] FS[("uploads / exports / workspace")] end FE -->|"REST"| AUTH FE -->|"REST"| CHAT FE -->|"REST"| ATT FE -->|"WSS"| WS AUTH --> SSO CHAT --> APPDB ATT --> FS TASK --> APPDB ANA --> LLM ANA -->|"数据库查询工具"| BIZDB ANA -->|"文件读写 / 检索 / 命令"| FS RES --> APPDB RES --> FS CFG --> APPDB ``` 前端与后端之间有两条通道:**REST** 承担会话、附件、结果等常规操作;**WebSocket** 承担分析过程的实时推送。分析模块是唯一同时触达 LLM、业务示例库和文件存储的模块,也是系统边界最宽的组件。 后端九个模块的职责与边界、前端七个模块到后端的映射,见设计文档第 3 节。 ## 7. 技术栈与端口 | 选项 | 决策 | 理由 | | --- | --- | --- | | Web 框架 | FastAPI | 原生 async 与 WebSocket 支持,一套框架同时覆盖 REST 与长连接,自动生成 OpenAPI 文档 | | ORM / 迁移 | SQLAlchemy 2.x + Alembic | 管理十张表,初始化脚本可重复执行 | | 数据库 | MySQL 8 | 既有技术栈约定;JSON 字段类型可直接承载结构化输出 | | 环境管理 | uv | 依赖解析快、锁文件确定性好,配合 PyCharm 直接启动 | | 前端 | Vue 3 + Vite | 与流式渲染、组件化工作台形态匹配 | | 认证 | 独立认证中心 + OAuth2 授权码模式 | 对应"授权登录入口页 + 登录回调页"需求,认证能力可复用 | | LLM | 内置模拟引擎 + 外部 API 双模式 | 未配置 `OPENAI_API_KEY` 时离线可演示;配置后切换真实模型,经适配层隔离 | | 服务 | 端口 | 说明 | | --- | --- | --- | | 业务后端(FastAPI) | 8000 | REST + WebSocket,交互式接口文档见 `/docs` | | 认证中心 | 8100 | OAuth2 授权码流程:授权页、授权码签发、令牌端点 | | 前端(Vite 开发服务器) | 5173 | 开发模式;生产构建后为静态产物 | 三个服务独立进程启动,前端通过代理或环境变量指向后端与认证中心地址。 ## 8. 领域模型与数据表 ### 术语表 | 术语 | 定义 | | --- | --- | | 会话(conversation) | 围绕一个业务问题的多轮对话容器,聚合消息、附件、任务、结果与摘要 | | 分析任务(task) | 由一条用户消息触发的一次分析执行,具有完整状态机 | | 轮 | 一次"用户消息 → 分析任务 → 结构化结果"的完整循环 | | 工具(tool) | 分析过程中可被调用的能力:数据库查询、文件读写、文本检索、命令执行、结果文件生成 | | 上下文摘要(context summary) | 对会话早期消息的压缩文本,用于控制发送给模型的上下文长度 | | 临时令牌(websocket token) | 一次性短时效令牌,用于 WebSocket 连接鉴权 | ### 十张系统表 | 分组 | 表 | 作用 | 关键约束 | | --- | --- | --- | --- | | 身份 | `users` | 认证中心用户的本地映射 | `external_user_id` 唯一,按此幂等同步 | | 会话 | `conversations` | 会话元数据 | 状态 `active` / `archived` / `deleted`;删除为状态流转后再级联清理 | | 会话 | `messages` | 消息流(用户 / AI / 工具) | `(conversation_id, seq_no)` 唯一,会话内 `seq_no` 单调递增 | | 会话 | `attachments` | 附件元数据 | `parse_status`:`pending` / `parsing` / `success` / `failed` | | 会话 | `context_summaries` | 早期消息的压缩摘要 | 记录覆盖区间 `start_seq_no` / `end_seq_no` | | 任务 | `analysis_tasks` | 一次分析执行 | 状态 `queued` / `running` / `success` / `failed` / `cancelled` | | 任务 | `task_logs` | 任务、工具、LLM 调用日志 | `log_level` + `log_type` 区分来源 | | 任务 | `websocket_tokens` | 一次性连接令牌 | `token` 唯一;`expires_at` 短时效,建议 60 秒;`consumed_at` 标记一次性消费 | | 结果 | `analysis_results` | 六部分结构化结果 | `task_id` 唯一(一任务一结果);含 `key_metrics_json`、`evidence_list_json`、`result_markdown`、`result_file_path` | | 配置 | `system_configs` | 系统配置键值 | `config_key` 唯一,按 `config_group` 分组;不含密钥类配置 | 字段级定义见设计文档第 4.2 节;索引策略见 4.3 节;ER 图见 4.1 节。 ### 级联删除规则 删除会话在单个数据库事务内完成:清空该会话的 `messages`、`attachments`、`analysis_tasks`、`analysis_results`、`context_summaries`、`websocket_tokens` 记录,随后删除 `uploads` / `exports` / `workspace` 下该会话的三个目录。 - 若存在运行中任务,先置为 `cancelled` 再删除 - 文件删除失败只记录日志告警,不阻断库内删除(库记录是唯一事实源,孤儿文件可后台回收) ## 9. 接口清单 ### 通用约定 - 基础路径:REST 接口统一前缀 `/api`,认证接口在 `/auth` 下 - 认证方式:授权回调后签发 HttpOnly 会话 Cookie,REST 与 WebSocket 均需登录态 - 响应包络:`{ "code": 0, "message": "ok", "data": { ... } }`,`code` 为 0 表示成功 ### 错误码 | HTTP | code | 含义 | | --- | --- | --- | | 400 | 40001 | 参数缺失或格式错误 | | 401 | 40101 | 未登录或登录态失效 | | 403 | 40301 | 无权限访问该资源(如访问他人会话) | | 404 | 40401 | 会话 / 附件 / 任务 / 结果不存在 | | 409 | 40901 | 会话已有运行中的分析任务 | | 409 | 40902 | WebSocket 令牌无效、已使用或已过期 | | 413 | 41301 | 附件超过大小限制(限额可配置) | | 500 | 50001 | 服务器内部错误 | | 502 | 50201 | 上游服务(认证中心 / LLM)不可用 | ### 接口总表(十五个) | 分组 | 方法与路径 | 说明 | | --- | --- | --- | | 认证 | `GET /auth/login` | 发起授权登录,302 跳转认证中心授权页 | | 认证 | `GET /auth/callback` | 授权回调:换令牌 → 幂等同步用户 → 签发 Cookie → 跳工作台 | | 会话 | `POST /api/chat/create` | 创建会话 | | 会话 | `POST /api/chat/delete` | 批量删除会话(含级联删除) | | 会话 | `POST /api/chat/update` | 重命名会话 | | 会话 | `GET /api/chat/ls` | 会话列表,按最后消息时间倒序,过滤已删除 | | 会话 | `GET /api/chat/ls/{conversation_id}` | 会话历史消息,按 `seq_no` 升序,携带关联附件 | | 附件 | `POST /api/attachment/upload` | 上传附件(multipart),落盘后异步解析 | | 附件 | `POST /api/attachment/delete` | 删除附件记录与文件 | | 附件 | `GET /api/attachment/get` | 下载附件,文件流携带原始文件名 | | 长连接 | `POST /api/chat/ws-token` | 签发一次性短时效 WebSocket 令牌 | | 长连接 | `WS /api/chat/ws/chat` | 会话实时通道,见第 10 节 | | 管理 | `POST /api/admin/reload` | 配置热更新,仅管理员 | | 任务 | `GET /api/tasks/{task_id}` | 查询任务状态,用于断线兜底 | | 结果 | `GET /api/results/{task_id}` | 查询六部分结构化结果 | 逐接口的请求体、响应字段与错误码见设计文档第 6.2 节;后端跑起来后 `/docs` 提供在线版。 > **设计要点**:发送分析问题走 WebSocket 上行消息(`send_message`),而不是独立 REST 接口。这样消息受理、任务创建与实时推送在同一条连接内闭环,避免 REST 受理后 WebSocket 错过 `message_start`。 ## 10. 实时消息协议 ### 连接建立 1. 前端 `POST /api/chat/ws-token` 申请一次性令牌(写入 `websocket_tokens`,建议 60 秒有效) 2. 携带 `websocket_token` + `conversation_id` 建立 `WS /api/chat/ws/chat` 3. 服务端校验令牌存在、未消费、未过期、归属匹配,通过后写入 `consumed_at` 令牌"一次性 + 短时效"双重限制,避免被复制后长期复用。 ### 服务端下行消息(八种) 公共信封:`type`、`conversation_id`、`task_id`(连接级消息除外)、`ts`(毫秒时间戳)。 | type | 触发时机 | 专有字段 | | --- | --- | --- | | `message_start` | 本轮分析开始 | `message_id` | | `message_delta` | 模型增量文本 | `delta_text` | | `tool_start` | 某个工具开始执行 | `tool_name`、`tool_call_id` | | `tool_finish` | 某个工具执行完成 | `tool_name`、`tool_call_id`、`tool_result_summary`、`tool_status` | | `task_status` | 任务状态变化 | `task_status`、`current_step` | | `result_ready` | 结构化结果已生成并落库 | `result_id` | | `error` | 本轮分析失败 | `error_message` | | `done` | 本轮分析结束 | `finished_at` | ### 客户端上行消息(三种) | type | 字段 | 用途 | | --- | --- | --- | | `send_message` | `text` | 发送分析问题,触发一轮任务 | | `cancel` | `task_id` | 取消当前运行中任务 | | `ping` | — | 心跳,服务端回 `pong` | ### 连接管理 - 心跳:客户端每 30 秒 `ping`,服务端 60 秒未收到即关闭连接 - 断线重连:前端指数退避重连,重连需重新走令牌流程;重连后先调 `GET /api/tasks/{task_id}` 拉取当前状态再继续接收推送,避免状态空洞 - 会话删除时,服务端主动关闭该会话的全部连接 完整的一轮分析时序图(含工具循环与异常路径)见设计文档第 7.4 节。 ## 11. 关键规则与约束 ### 会话与任务一致性 - 一条用户消息对应一次分析任务 - **同一时间一个会话只允许存在一个运行中的分析任务**,冲突时返回 40901 - 取消分析后,本轮用户消息与已完成的部分输出保留,任务状态置 `cancelled` ### 上下文拼装与摘要压缩 发送给模型的上下文按固定顺序拼装:系统提示词 → 会话早期消息摘要 → 近期 N 条原始消息 → 附件解析摘要 → 本轮问题。 当消息总数超过阈值 M 时,把"已出摘要区间之外、仍在近期窗口之外"的最早一批消息压缩为一条新摘要写入 `context_summaries`,压缩动作在任务开始前的"拼装上下文"步骤完成。 ### 结果输出格式 每轮分析产出六部分,前三部分为结构化数据,供前端分区渲染与二次利用: | 部分 | 形式 | 字段要求 | | --- | --- | --- | | 问题定义 | 文本 | 当前分析要回答的业务问题 | | 关键指标 | 数组 | `metric_name`、`metric_value`、`metric_unit`、`metric_period` | | 证据列表 | 数组 | `source_type`、`source_name`、`evidence_text`、`related_metric`、`confidence` | | 归因结论 | 文本 | 主要原因与影响范围 | | 待补充数据 | 列表 | 当前分析仍缺失的数据项 | | 下一步建议 | 列表 | 至少 2 条 | ### 文件存储 ``` storage_root/ ├── uploads/{user_id}/{conversation_id}/ # 用户上传的附件 ├── exports/{user_id}/{conversation_id}/ # 导出的结果文件 └── workspace/{user_id}/{conversation_id}/ # 分析过程临时中间文件 ``` - 存储文件名由服务端生成并保留原始扩展名,原始名记录在 `attachments.file_name` - 结果导出写入 `exports/{user_id}/{conversation_id}/result_{task_id}.md`,保留至会话删除,支持随时重新下载 ### 安全底线 | 项 | 约束 | | --- | --- | | 路径校验 | 所有文件读写、检索、下载先做规范化前缀校验,绝对路径必须落在该会话目录内,拒绝 `..` 与符号链接逃逸 | | 命令执行 | 白名单命令 + 限定在 workspace 目录内 + 超时上限 + 禁止网络类命令,可通过功能开关整体关闭 | | 数据库查询 | 仅访问业务示例库,使用只读账号,查询超时由配置控制 | | 越权防护 | 所有按 ID 的访问校验资源归属当前用户,否则 40301 | | WebSocket | 一次性 + 短时效令牌 | | 密钥管理 | 密钥类配置一律走环境变量,不进入 `system_configs` 表 | ### 错误处理 | 故障点 | 策略 | | --- | --- | | LLM 调用超时 / 失败 | 按配置重试 N 次;仍失败则任务置 `failed`,推送 `error` | | 工具执行失败 | 单工具失败不终止任务,结果中如实计入失败信息,由模型决定换路径或收敛结论 | | 认证中心不可达 | 登录入口返回 50201 并提示重试 | | WebSocket 推送失败 | 消息不丢:任务状态与结果均可通过任务 / 结果接口拉取兜底 | ## 12. 目录结构 ``` analysis/ ├── README.md # 本文件 ├── docs/ # 需求 / 设计 / 开发计划(已存在) ├── openspec/ # OpenSpec 工作区(已初始化) │ ├── config.yaml │ ├── changes/archive/ # 变更提案与归档 │ └── specs/ # 能力规格 ├── .agents/skills/ # OpenSpec 相关技能定义(已存在) ├── backend/ # 规划:FastAPI 后端(阶段 0 起) │ ├── app/ # 模块:认证接入 / 会话 / 消息 / 附件 / 长连接 / 任务 / 分析 / 结果 / 配置 │ ├── alembic/ # 数据库迁移 │ └── pyproject.toml # uv 依赖与锁文件 ├── frontend/ # 规划:Vue 3 + Vite 工作台(阶段 9 起) ├── auth-center/ # 规划:OAuth2 认证中心(阶段 2 起) ├── scripts/ # 规划:建表脚本、种子数据(阶段 1 / 6 起) └── storage_root/ # 规划:uploads / exports / workspace ``` 标注"规划"的目录在当前提交中尚不存在,目录名以阶段 0 实际落地为准。 ## 13. 开发路线图 单线顺序推进,一个阶段完成后才启动下一个;进度以**验证点**度量,不使用工期估算。 | 阶段 | 名称 | 关键产出 | 验证点 | | --- | --- | --- | --- | | 0 | 工程骨架与运行环境 | uv 虚拟环境、FastAPI 入口、数据库连接、存储目录 | `/docs` 可访问,数据库连通 | | 1 | 系统数据库 | 十张表模型与迁移、基础配置种子 | 迁移可重复执行,表结构与设计一致 | | 2 | 认证中心与登录链路 | :8100 认证服务、`/auth/*` 接口、演示账号 | 浏览器完成授权登录,`users` 落库 | | 3 | 会话与消息 | 会话 / 消息五个 REST 接口、级联删除 | Swagger 走通 CRUD 与越权用例 | | 4 | 附件管理 | 上传 / 删除 / 下载、路径校验、异步解析 | 落盘路径正确,目录穿越被拒 | | 5 | WebSocket 实时通道 | 一次性令牌、连接鉴权、心跳 | 脚本客户端连接成功,令牌重用被拒 | | 6 | 示例业务数据 | 六场景建表脚本、两个演示场景种子数据 | SQL 聚合结果与设计口径一致 | | 7 | 任务与分析引擎(模拟) | 任务状态机、模拟引擎、八种下行消息 | 脚本客户端收齐一轮完整消息序列 | | 8 | 结果、配置与日志 | 结果落库与导出、摘要压缩、热更新 | 六部分结果可查,导出文件可下载 | | 9 | 前端聊天工作台 | 登录页、工作台四区、附件侧栏 | 浏览器演示账号全链路操作 | | 10 | 真实 LLM 接入(增强) | 适配层、环境变量切换 | 配置 key 走真实模型,去掉 key 回落模拟 | | 11 | 端到端验收与交付 | 验收截图、交付包 | PRD 八条验收逐条通过 | 阶段 0–8 为后端与数据线,阶段 9 为前端线,阶段 10–11 为增强与收尾线。阶段 10 不在前置依赖链上(验收不依赖真实模型),但建议交付前完成,使演示既可离线又可在线。 每阶段的详细工作内容见开发计划第 3 节。已识别的顺序风险:协议字段需在前端开工前用脚本客户端验证;种子数据口径需先用 SQL 复核;级联删除尽早实现并冻结语义;真实模型特有逻辑不得泄漏进模拟路径。 ## 14. 环境准备与启动 ### 依赖 | 依赖 | 版本要求 | 用途 | | --- | --- | --- | | Python | 3.11+(以阶段 0 锁定为准) | 后端与认证中心 | | uv | 最新稳定版 | Python 依赖与虚拟环境管理 | | MySQL | 8.x | 系统库 + 业务示例库 | | Node.js | 18+(以阶段 9 锁定为准) | 前端构建与开发服务器 | ### 启动顺序 ``` MySQL → 认证中心(:8100)→ 后端(:8000)→ 前端(:5173) ``` **1. 准备数据库与配置**(只需一次) ```powershell # 建库与账号(口令自定,随后填入 backend/.env 的 DB_PASSWORD) & 'D:\commonApp\Developing\SDKs\msql\mysql-8.0.45-winx64\bin\mysql.exe' --host=127.0.0.1 --port=3307 --user=root --password -e "SET @app_password='<应用账号口令>'; SET @reader_password='<只读账号口令>'; SOURCE scripts/init_databases.sql;" cd backend uv sync # 安装后端依赖 uv run alembic upgrade head # 建系统库十张表 uv run python ../scripts/seed_system_configs.py # 写入四组配置种子 ``` `backend/.env` 需要 `DB_*`、`STORAGE_ROOT`、`AUTH_CENTER_BASE_URL`、`APP_SECRET`(随机串)等,字段说明见 `backend/.env.example`。 **2. 启动三个服务**(三个终端) ```powershell cd auth-center; uv run uvicorn app.main:app --port 8100 # 认证中心 cd backend; uv run uvicorn app.main:app --port 8000 # 后端(接口文档 http://127.0.0.1:8000/docs) cd frontend; npm install; npm run dev # 前端(浏览器打开 http://localhost:5173/) ``` **3. 使用** - 打开 `http://localhost:5173/` → 点「授权登录」→ 演示账号 `analyst / analyst123`(管理员 `admin / admin123`) - 新建会话 → 输入问题(如"上月 3C 类目转化率为什么下降")→ 观察实时分析过程与六部分结果 → 复制或导出 **4. 自动化验证** ```powershell cd backend; uv run pytest -q # 后端全量测试 uv run python ../scripts/login_smoke.py # 登录链路(需先启动 8000/8100) uv run python ../scripts/ws_smoke.py # 完整分析链路 + 结果查询 + 导出 cd ../auth-center; uv run pytest -q # 认证中心测试 cd ../frontend; npm run test # 前端单元测试 ``` ## 15. 配置说明 ### 环境变量 | 变量 | 说明 | | --- | --- | | 数据库连接 | 系统库与业务示例库连接串,配置化以便后续 Docker 化 | | 存储根目录 | `storage_root` 的绝对路径 | | 认证中心地址 | 后端与前端对接认证中心(:8100)的基地址 | | `OPENAI_API_KEY` | 存在则走真实大模型,不存在回落内置模拟引擎 | ### 系统配置(`system_configs` 表) 按四组管理,支持通过 `POST /api/admin/reload` 热更新(校验失败保留旧缓存并返回失败原因): | 分组 | 典型配置 | | --- | --- | | `auth` | 认证中心对接参数、会话有效期 | | `llm` | 模型与超时、重试次数 | | `analysis` | 近期消息条数 N、摘要阈值 M、心跳间隔、附件大小限额、工具超时 | | `feature` | 功能开关,如命令执行工具的启停 | ## 16. 验收标准 对照 PRD 第 9 节,逐条通过即视为交付: - [ ] 1. 能通过授权登录进入聊天工作台 - [ ] 2. 能创建会话、上传附件、发送消息并查看历史记录 - [ ] 3. 能通过实时连接看到分析过程中的状态变化、工具执行和最终结果 - [ ] 4. 能查询历史消息、切换旧会话并继续追问 - [ ] 5. 能在结果区看到六部分结构化输出 - [ ] 6. 能导出分析结果文件并重新下载 - [ ] 7. 能通过配置重载接口更新配置并即时生效 - [ ] 8. 能完成至少两个业务场景的完整演示 ## 17. 协作约定 ### 文档与代码同源 `docs/` 下的三份文档是设计与需求的**唯一事实源**,与代码放在同一仓库、同一批提交中维护。文档变更与代码变更应一起 review,避免文档滞后于实现。 文档之间的引用依赖章节号(如 `§7.2`、`§4.4`),调整章节结构时需同步更新引用它的其他文档。 ### OpenSpec 工作流 仓库已初始化 OpenSpec(`schema: spec-driven`),用于管理变更提案与能力规格: | 目录 | 用途 | | --- | --- | | `openspec/specs/` | 系统能力规格(当前为空,随实现逐步沉淀) | | `openspec/changes/` | 变更提案(当前为空) | | `openspec/changes/archive/` | 已完成变更的归档 | `.agents/skills/` 下提供配套技能:`openspec-propose`(提出变更)、`openspec-apply-change`(实施)、`openspec-explore`(探索)、`openspec-update-change`(修订)、`openspec-sync-specs`(同步规格)、`openspec-archive-change`(归档)。 ### 尚待约定 分支模型与提交信息格式尚未在文档中定义,建议在阶段 0 一并确定并补充到本节。 ## 18. 交付物清单 | 交付物 | 来源阶段 | | --- | --- | | 可运行前端 | 阶段 9 | | 可运行后端 | 阶段 0–8(接口全集) | | 认证服务 | 阶段 2 | | 数据库初始化脚本 | 阶段 1(系统库)+ 阶段 6(业务示例库) | | 示例数据 | 阶段 6 | | 接口说明 | 阶段 0 起的 OpenAPI 自动生成(`/docs`),可另存导出 | | 至少两组完整分析示例 | 阶段 6(数据)+ 阶段 11(演示记录) | | 验收截图与交付包 | 阶段 11 | 按源要求,交付文件夹按 `组名_姓名_项目_行业` 组织(如 `X组_姓名_经营归因_电商`)。