README.md 15 KB

AI智能瞭望与智能问数系统

1. 项目概述

本项目是一个基于 B/S 架构的 Web 应用程序,采用 Tornado MVC 组织代码,目标是构建“AI智能瞭望与智能问数系统”。当前已具备较完整的后台管理能力(RBAC 权限、模型引擎、瞭望采集与数据仓库等),并提供若干独立业务页面用于采集与测试。

2. 技术栈

  • 后端语言: Python 3.11
  • Web 框架: Tornado 6.5.5
  • 数据库: SQLite3
  • 前端技术: HTML5 + CSS3 + JavaScript
  • 前端UI库与组件 (已本地化部署于 app/static/dist/ 目录):
    • Layui 2.13.6
    • Bootstrap 5.3.8
    • FontAwesome 5.15.4
    • ECharts(app/static/dist/echarts/echarts.min.js

3. 架构设计 (MVC 架构)

本项目采用了经典的 MVC(Model-View-Controller)设计模式:

  • Model (模型层): 负责数据访问与业务逻辑。使用 sqlite3 与数据库交互,通过实体类(如 UserRepository)封装数据操作。
  • View (视图层): 负责用户界面的呈现。使用 Tornado 原生的模板引擎,结合 HTML/CSS/JS 渲染页面(如 base.html, login.html, index.html)。
  • Controller (控制层): 负责接收 HTTP 请求、处理业务流程,并协调 Model 和 View。在 Tornado 中,以 RequestHandler 的形式存在(如 LoginHandler, IndexHandler)。

4. 目录结构说明

cnAgentOS/
├── app.md                  # 原有目录结构说明文档
├── app.py                  # 项目主入口,Tornado Web 容器及路由配置
├── test.py                 # 单元测试与临时测试脚本,包含数据库初始化和用户测试
├── app/                    # 核心应用程序包
│   ├── __init__.py         # 标识 app 为 Python 包
│   ├── controllers/        # 控制层 (Controller)
│   │   ├── __init__.py     # 标识 controllers 为 Python 包
│   │   ├── auth.py         # 认证相关路由 (登录、退出)
│   │   ├── base.py         # 基础 RequestHandler,提供公共方法(如 get_current_user)
│   │   ├── home.py         # 后台首页/控制台(动态菜单渲染)
│   │   ├── portal.py       # 用户侧(登录/注册/问数/历史对话/流式对话)
│   │   ├── user.py         # 用户管理(CRUD/分页/角色绑定)
│   │   ├── role.py         # 角色管理(CRUD/超管保护)
│   │   ├── menu.py         # 功能菜单管理(树形CRUD)
│   │   ├── model_engine.py # 模型引擎(CRUD/默认模型/Token统计/测试对话SSE)
│   │   ├── api_manage.py   # 接口管理(CRUD/分页/对内代理服务/QPS限制)
│   │   ├── digital_employee.py # 数字员工(CRUD/分页/@别名解析/SSE对话/普通类接口调用/记忆管理/技能路由)
│   │   ├── skill_manage.py # 技能管理(全局技能库 CRUD/zip 导入/与数字员工联动)
│   │   ├── chat_admin.py # 会话/对话管理(后台查看/搜索/删除)
│   │   ├── spy_source.py   # 瞭望采集源管理(CRUD/启用列表)
│   │   ├── spy.py          # 瞭望采集(SSE日志+候选数据推送+手动入库)
│   │   └── data_warehouse.py # 数据仓库(列表/删除/批删/AI深度采集/详情查看)
│   ├── models/             # 模型层 (Model)
│   │   ├── __init__.py     # 标识 models 为 Python 包
│   │   ├── db.py           # 数据库连接池与初始化建表脚本
│   │   ├── user.py         # 用户与用户-角色映射
│   │   ├── role.py         # 角色与角色-菜单映射
│   │   ├── menu.py         # 菜单树构建与按角色过滤
│   │   ├── model_engine.py # 模型服务与Token统计
│   │   ├── api_manage.py   # 接口管理数据访问(api_endpoints)
│   │   ├── digital_employee.py # 数字员工数据访问(digital_employees + 全局 skills/links + 记忆管理)
│   │   ├── skill_manage.py # 技能管理数据访问(全局技能库 + 导入解析)
│   │   ├── chat.py # 会话/对话管理(CRUD/搜索/导出/后台管理)
│   │   ├── spy_source.py   # 采集源管理
│   │   └── data_warehouse.py # 数据仓库(含 upsert_batch / 深采详情查询 / 会话存储)
│   ├── static/             # 静态资源 (View 辅助)
│   │   ├── css/base.css    # 基础样式表
│   │   └── js/base.js      # 基础脚本
│   └── templates/          # 模板文件 (View)
│       ├── base.html       # 基础母版页面
│       ├── index.html      # 后台首页模板
│       ├── login.html      # 登录页面模板
│       ├── dashboard.html  # 控制台(ECharts 报表 + 懒加载 + 历史回放)
│       ├── user/list.html  # 用户管理页
│       ├── role/list.html  # 角色管理页
│       ├── menu/list.html  # 功能菜单管理页
│       ├── model_engine/list.html # 模型引擎页
│       ├── api_manage/list.html   # 接口管理页
│       ├── digital_employee/list.html # 数字员工管理页
│       ├── skill_manage/list.html # 技能管理页(全局技能库 + zip 导入)
│       ├── chat_admin/sessions.html # 会话管理页(后台查看/搜索/删除)
│       ├── chat_admin/messages.html # 对话管理页(消息查看/检索)
│       ├── spy/source_list.html   # 瞭望数据源管理页
│       ├── spy/spy.html           # 瞭望采集页(独立搜索风格)
│       ├── data_warehouse/list.html # 数据仓库列表页
│       └── portal/               # 用户侧页面
│           ├── login.html        # 用户登录
│           ├── register.html     # 用户注册
│           └── chat.html         # 智能问数(历史会话 + 流式对话 + 模型切换 + @数字员工)
├── database/               # 数据库文件存放目录
│   └── app.db              # SQLite 数据库文件 (由程序自动生成)
└── venv/                   # Python 虚拟环境目录

5. 已实现功能

当前系统已完成以下核心功能:

  1. 服务启动与配置: 通过 app.py 启动 Tornado 服务,配置模板/静态资源路径、安全 Cookie(cookie_secret)以及 CSRF 防护(xsrf_cookies)。
  2. 数据库初始化与轻量迁移: 启动时调用 init_db() 自动建表,并对历史库做兼容(例如为 spy_data 补列、建立唯一索引)。
  3. 登录态与认证:
    • 安全 Cookie 会话管理(set_secure_cookie)。
    • BaseHandler.get_current_user() 提供统一登录态获取;@tornado.web.authenticated 保护页面与接口。
    • 密码存储采用 PBKDF2-HMAC-SHA256 加盐哈希。
  4. RBAC 权限体系(管理侧):
    • 用户/角色/菜单功能管理(CRUD + 分页/树形)。
    • 角色与菜单授权(二级联动映射)。
    • 根据用户角色动态过滤并渲染后台左侧菜单树(超级管理员默认全量菜单)。
  5. 模型引擎(管理侧):
    • 模型服务配置 CRUD(OpenAI 范式:model_name/api_key/base_url)。
    • 设置默认模型、Token 统计展示。
    • 测试对话支持 SSE 流式响应。
  6. 智能瞭望与数据仓库(管理侧 + 独立采集页):
    • 瞭望数据源管理(动态配置 URL 模板与请求 headers,启用/停用)。
    • 采集过程 SSE 日志输出;采集结果以橱窗列表展示(不自动入库)。
    • 支持批量勾选后手动入库到数据仓库(upsert:存在则更新,不存在则新增)。
    • 数据仓库列表分页、单删/批删。
    • AI 深度采集:对数据仓库条目进行深度抓取与 AI 解析,入库到详情表并标注深采状态;支持单条/多条,SSE 日志与统计,支持详情查看。
  7. 接口管理(管理侧):
    • 接口 URL 管理(新增/修改/删除/分页)。
    • 对系统其他模块提供统一代理服务接口:/api/interface_proxy?id=<endpoint_id>
    • QPS 默认限制(可配置):窗口期内超过上限返回 429;携带 Token 可绕过限制。
  8. 数字员工(管理侧 + 对话接口):
    • 数字员工管理(新增/修改/删除/分页),支持 AI/普通 两类。
    • AI 类:默认模型 + Prompt,通过 SSE 流式输出对话内容与 Token 统计。
    • 普通类:绑定接口管理 API,支持将用户输入作为指定参数名透传到外部接口。
    • 增强能力:
      • 记忆:按用户隔离(employee_id + user_id 唯一),后台支持查看/清空;支持 LLM 自动摘要/压缩。
      • 技能:AI 员工可绑定多个全局技能(SKILL.md 规范),用户侧自动识别并渲染卡片(天气/音乐等)。
      • 多模型:AI 员工支持绑定多个模型,按任务/模态/推理需求选择最优模型。
  9. 技能管理(独立模块):
    • 全局技能库 CRUD(skill_key 唯一约束,支持绑定接口服务)。
    • 支持导入 zip 技能包,自动扫描并识别 SKILL.md(YAML frontmatter)入库。
    • 与数字员工技能联动(同一套 skills 表 + digital_employee_skill_links 绑定关系表)。
    • 数字员工支持从技能库选择并绑定技能;解绑不删除全局技能。
  10. 会话/对话管理(管理侧):
    • 会话管理:列表分页/按用户筛选/按标题搜索/删除会话。
    • 对话管理:查看会话内所有消息/按角色筛选/关键词检索/删除单条消息。
  11. 控制台(管理侧):

    • ECharts 本地化加载(/static/dist/echarts/echarts.min.js)。
    • 系统运行状态、模块概览、数据概览与图形报表。
    • 懒加载:图表进入可视区域后初始化(IntersectionObserver + fallback)。
    • 历史回放:指标快照存储 + 时间点回放。
  12. 用户侧卡片与对话增强:

    • 天气卡片:横向布局(max-width 520px),动态呼吸特效图标,展示温度/天气/湿度/风力/AQI/气压/能见度,无预报数据时自动隐藏预报容器。
    • 音乐卡片:后端自动跟踪音乐 URL 跳转获取真实 MP3 地址;新增 /api/audio_proxy 音频代理接口(Base64 编码 URL),解决跨域和 Referer 限制,点击播放按钮可正常播放。
    • Markdown 表格渲染:增加表格检测与解析(识别 | 列1 | 列2 | 格式),生成 <table>/<thead>/<tbody> 结构,样式支持圆角边框/表头高亮/行悬停/横向滚动。
    • 意图识别优化:增强模板(详细表结构说明、分类规则、SQL 示例),上下文窗口从 12 条增加到 20 条,System Prompt 动态调整(根据意图类型调整语气),LRU 缓存(200 条,5 分钟过期)。
    • 记忆压缩:使用 LLM 结构化摘要(用户偏好/重要事实/最近交互),按主题聚类保留关键信息。

6. 主要路由

  • 用户侧://login/register/chat/logout
  • 用户侧 API:/api/models/api/employees/api/sessions/api/messages/api/chat/stream/api/audio_proxy
  • 管理侧:/admin(后台框架)、/admin/login/admin/logout/admin/dashboard
  • 管理侧控制台 API:/api/dashboard(current/history_list/history_get)
  • 管理侧兼容:/auth/login/auth/logout/dashboard
  • 用户/角色/菜单:/user/list/role/list/menu/list(对应 API:/api/user/api/role/api/menu
  • 模型引擎:/model_engine/list(API:/api/model_engine/api/model_engine/test
  • 接口管理:/api_manage/list(API:/api/api_manage/api/interface_proxy
  • 数字员工:/digital_employee/list(API:/api/digital_employee/api/digital_employee/chat
  • 技能管理:/skill_manage/list(API:/api/skill_manage
  • 会话管理:/chat_admin/sessions(API:/api/chat_admin/sessions
  • 对话管理:/chat_admin/messages(API:/api/chat_admin/messages
  • 瞭望管理:/spy_source/list(API:/api/spy_source)、/spy(API:/api/spy/run/api/spy/commit
  • 数据仓库:/data_warehouse/list(API:/api/data_warehouse

7. 数据库设计(SQLite)

核心表(由 app/models/db.py:init_db() 创建/维护):

  • users:用户基础信息
  • roles:角色
  • menus:菜单/功能
  • user_roles:用户-角色映射
  • role_menus:角色-菜单映射
  • ai_models:模型服务配置(含 is_defaulttotal_tokens
  • api_endpoints:接口管理(URL/Method/限流参数/绕过 Token/示例请求等)
  • digital_employees:数字员工(alias 唯一;AI Prompt 或绑定 api_endpoint_id)
  • digital_employee_memories:数字员工记忆(employee_id + user_id 唯一,存储结构化摘要)
  • skills:全局技能库(skill_key 唯一;spec_markdown/YAML frontmatter;绑定接口服务)
  • digital_employee_skill_links:数字员工与技能的绑定关系(employee_id + skill_id 联合主键)
  • spy_sources:瞭望采集源
  • spy_data:数据仓库(包含 update_at;并对 (source_id,url) 建立唯一索引用于去重与 upsert;包含深采状态字段)
  • spy_data_details:深采详情(与 spy_data.id 关联,保存正文/摘要/关键词/要点/统计等)
  • chat_sessions:用户侧历史会话
  • chat_messages:用户侧历史消息(流式结果最终落库)
  • dashboard_snapshots:控制台指标快照(用于历史回放)

8. 后续开发指南

在后续开发“AI智能瞭望与智能问数系统”时,请遵循以下规范:

  1. 新增业务路由:
    • app/controllers/ 目录下创建新的 .py 文件,继承 app.controllers.base.BaseHandler
    • 如果接口需要登录权限,请在请求方法(如 get, post)上添加 @tornado.web.authenticated 装饰器。
    • 编写完成后,务必在根目录的 app.py 中的 make_app() 路由列表里注册新路由。
  2. 新增数据模型:
    • app/models/ 目录下创建新的业务模型文件。
    • 涉及建表操作的,请在 app/models/db.pyinit_db() 方法中追加相应的 CREATE TABLE IF NOT EXISTS 语句。
    • 尽量将数据库的 CRUD 操作封装在 XxxRepository 静态方法中。
  3. 前端页面开发:
    • HTML 文件放在 app/templates/ 下,建议继承 base.html 保持页面结构统一。
    • 表单提交时,务必在 <form> 标签内包含 {% module xsrf_form_html() %} 以通过 CSRF 校验。
    • 静态资源(CSS, JS, 图片等)存放在 app/static/ 目录下,在模板中通过 {{ static_url('...') }} 引用。
    • 页面自定义样式请放在 {% block style %} 中(由 base.html 在 head 内输出),避免样式丢失。
  4. 测试规范:
    • 可以继续在 test.py 中编写临时的功能测试代码。