# GEO 分析系统设计文档 **日期:** 2026-04-02 **项目:** geo2 **定位:** 内部工具,团队管理多个客户公司的 GEO(生成式引擎优化)分析 --- ## 1. 系统概述 一个供内部团队使用的 GEO 分析平台。用户可以创建多个公司,为每个公司配置关键字和竞品,创建分析任务(手动触发或定时执行),调用主流大模型 API 进行分析,并通过对比看板查看品牌提及率、情感分布、竞品对比和跨模型差异。 ### 核心能力 - **公司管理**:创建公司,维护关键字列表和竞品列表 - **模型管理**:添加国内外主流 AI 模型,配置 API Key - **任务管理**:创建分析任务,支持手动触发和 Cron 定时执行 - **分析结果**:存储每次分析的原始回答和结构化指标 - **对比看板**:时间趋势、竞品横向对比、跨模型对比、情感分析 --- ## 2. 技术栈 | 层 | 技术 | |---|---| | 前端 | React + Vite + Ant Design + Recharts | | 后端 | NestJS + TypeORM | | 数据库 | PostgreSQL | | 队列 | Redis + Bull | | 容器 | Docker Compose | --- ## 3. 系统架构 ``` ┌─────────────────────────────────────────────────────┐ │ 前端 (React + Vite) │ │ 公司管理 │ 模型管理 │ 任务管理 │ 分析结果 │ 对比看板 │ └────────────────────────┬────────────────────────────┘ │ REST API ┌────────────────────────▼────────────────────────────┐ │ 后端 (NestJS) │ │ ┌──────────┐ ┌──────────┐ ┌──────────────────────┐ │ │ │ 公司模块 │ │ 模型模块 │ │ 任务模块 │ │ │ │ 关键字 │ │ API Key │ │ 手动触发 / Cron 调度 │ │ │ │ 竞品管理 │ │ 适配器层 │ │ Bull 队列 │ │ │ └──────────┘ └──────────┘ └──────────────────────┘ │ │ ┌─────────────────────────────────────────────────┐ │ │ │ 分析引擎 │ │ │ │ 发送 Prompt → 解析回答 → 提取品牌提及/情感/来源 │ │ │ └─────────────────────────────────────────────────┘ │ └──────────┬──────────────────────┬───────────────────┘ │ │ ┌──────▼──────┐ ┌──────▼──────┐ │ PostgreSQL │ │ Redis │ │ 业务数据 │ │ Bull 队列 │ └─────────────┘ └─────────────┘ │ ┌───────────────────▼─────────────────┐ │ 外部 AI 模型 API │ │ OpenAI │ Claude │ DeepSeek │ Kimi … │ └─────────────────────────────────────┘ ``` --- ## 4. 数据模型 ### Company(公司) ``` id UUID, PK name string, 公司名称 industry string, 行业 description string, 描述 createdAt timestamp ``` ### Keyword(关键字) ``` id UUID, PK companyId UUID, FK → Company text string, 关键字内容,如"工业互联网平台" category string, 分类标签(可选) createdAt timestamp ``` ### Competitor(竞品) ``` id UUID, PK companyId UUID, FK → Company name string, 竞品公司名 aliases string[], 别名列表 createdAt timestamp ``` ### AIModel(大模型) ``` id UUID, PK name string, 显示名称,如"DeepSeek V3" provider string, 厂商,如"deepseek" apiKey string, 加密存储 baseUrl string, API 端点 modelId string, 模型 ID isEnabled boolean createdAt timestamp ``` 支持的模型提供商(初始版本): - 国内:DeepSeek、Kimi(月之暗面)、文心一言(百度)、通义千问(阿里) - 国际:OpenAI (GPT-4o)、Anthropic (Claude)、Google (Gemini) ### AnalysisTask(分析任务) ``` id UUID, PK companyId UUID, FK → Company name string, 任务名称 keywordIds UUID[], 本次分析的关键字子集 competitorIds UUID[], 本次分析的竞品子集 modelIds UUID[], 使用的模型列表 schedule string | null, Cron 表达式;null 表示仅手动 status enum: pending | running | done | failed lastRunAt timestamp createdAt timestamp ``` ### AnalysisResult(分析结果) ``` id UUID, PK taskId UUID, FK → AnalysisTask modelId UUID, FK → AIModel keyword string, 本条结果对应的关键字 prompt string, 实际发送的 Prompt rawResponse text, AI 原始回答 brandMentioned boolean, 是否提及目标品牌 mentionCount int, 提及次数 sentiment enum: positive | neutral | negative competitorMentions jsonb, [{name, count}] sources string[], 引用来源 URL 列表 createdAt timestamp ``` --- ## 5. 功能模块详细设计 ### 5.1 公司管理 **页面:公司列表** - 卡片式布局,显示公司名、行业、关键字数量、竞品数量 - 操作:新建、编辑、删除 **页面:公司详情**(三个 Tab) - **关键字**:增删改查,支持批量导入(换行分隔) - **竞品**:增删改查,每个竞品可配置多个别名 - **任务**:该公司下的分析任务列表(快捷入口) ### 5.2 模型管理 **页面:模型列表** - 列表展示所有已配置模型 - 每行显示:名称、提供商、状态(启用/禁用)、最后测试时间 - 操作:新建模型(填写 API Key / Base URL / Model ID)、编辑、删除、测试连通性 **API Key 安全:** - 前端仅显示末尾 4 位(`••••••••abcd`) - 后端对 API Key 使用 AES-256 加密存储 ### 5.3 分析任务 **页面:任务列表** - 按公司筛选 - 每行显示:任务名、公司、状态、上次运行时间、下次运行时间 - 操作:新建、手动触发(立即运行)、暂停/恢复定时、查看结果 **新建任务(表单)** 1. 基本信息:任务名、关联公司 2. 选择关键字(多选,来自公司关键字列表) 3. 选择竞品(多选,来自公司竞品列表) 4. 选择模型(多选,来自已启用的模型) 5. 定时设置:关闭(仅手动)或开启 Cron(选择频率:每天/每周/自定义) **执行流程** ``` 触发(手动 or Cron) → 生成 关键字 × 模型 任务单元 → 批量入队(Bull) → Worker 并发执行(并发度可配置,默认 3) → 构造 Prompt(模板:「在{关键字}场景下,你会推荐哪些解决方案或公司?」) → 调用 AI 模型 API → 解析回答:品牌提及 + 情感 + 竞品出现 + 来源 → 写入 AnalysisResult → 所有单元完成后更新任务状态为 done ``` ### 5.4 分析结果 **页面:结果详情**(某次任务运行的所有结果) - 表格展示:关键字、模型、品牌是否提及、情感、竞品提及情况 - 支持按关键字 / 模型筛选 - 点击某行查看原始 AI 回答 ### 5.5 对比看板 **过滤器:** 公司、关键字(单选)、时间范围、模型(多选) **图表 1:时间趋势折线图** - X 轴:时间,Y 轴:品牌提及率(%) - 多条线:我方品牌 vs 各竞品(来自同一关键字下的结果) **图表 2:竞品横向柱状图** - 当前时间范围内,我方品牌 vs 各竞品的提及率对比 - 水平柱状图,我方品牌高亮 **图表 3:跨模型对比** - 水平柱状图,同一关键字下各模型对我方品牌的提及率 - 颜色按提及率高低(绿/黄/红) **图表 4:情感分析分布** - 水平堆叠条形图:正面 / 中性 / 负面 - 可按模型分组展示 --- ## 6. API 设计(主要端点) ``` # 公司 GET /companies POST /companies GET /companies/:id PATCH /companies/:id DELETE /companies/:id # 关键字 GET /companies/:id/keywords POST /companies/:id/keywords DELETE /companies/:id/keywords/:kid # 竞品 GET /companies/:id/competitors POST /companies/:id/competitors DELETE /companies/:id/competitors/:cid # 模型 GET /ai-models POST /ai-models PATCH /ai-models/:id DELETE /ai-models/:id POST /ai-models/:id/test # 测试连通性 # 任务 GET /tasks?companyId= POST /tasks POST /tasks/:id/run # 手动触发 PATCH /tasks/:id/schedule # 更新 Cron GET /tasks/:id/results # 某次任务的结果列表 # 看板 GET /dashboard/trend?companyId=&keyword=&from=&to=&models= GET /dashboard/competitors?companyId=&keyword=&from=&to= GET /dashboard/models?companyId=&keyword=&from=&to= GET /dashboard/sentiment?companyId=&keyword=&from=&to= ``` --- ## 7. 项目目录结构 ``` geo2/ ├── backend/ │ ├── src/ │ │ ├── companies/ # 公司模块(含关键字、竞品子模块) │ │ ├── ai-models/ # 模型管理模块 │ │ ├── tasks/ # 任务管理模块 │ │ ├── analysis/ # 分析引擎(Prompt 构造、回答解析) │ │ ├── dashboard/ # 看板聚合查询 │ │ ├── queue/ # Bull 队列 Worker │ │ └── common/ # 加密工具、DTO 基类等 │ └── Dockerfile ├── frontend/ │ ├── src/ │ │ ├── pages/ │ │ │ ├── companies/ # 公司列表 + 详情 │ │ │ ├── ai-models/ # 模型管理 │ │ │ ├── tasks/ # 任务管理 │ │ │ └── dashboard/ # 对比看板 │ │ ├── api/ # API 调用层 │ │ └── components/ # 共享组件 │ └── Dockerfile ├── docker-compose.yml └── docs/ └── superpowers/specs/ └── 2026-04-02-geo-analysis-system-design.md ``` --- ## 8. 非功能性要求 - **API Key 安全**:AES-256 加密存储,前端脱敏显示 - **并发控制**:Bull 队列默认并发 3,可在环境变量中配置(`ANALYSIS_CONCURRENCY`) - **错误处理**:单个分析单元失败不影响整个任务,记录错误原因 - **重试**:Bull 队列配置失败自动重试 2 次,指数退避 - **日志**:记录每次 AI 调用的耗时和状态 --- ## 9. 不在本版本范围内 - 用户认证/权限系统(内部工具,暂不需要) - Prompt 模板自定义(固定模板,后续版本再开放) - 数据导出(后续版本) - 移动端适配