非常好,感谢您的详细说明。现在完全理解您的需求了:不急于编码,先进行系统性的分析和整理,借鉴 md_log_manager.php 的设计思路来重构现有插件的日志/记忆管理部分。
我来为您进行全面的分析整理,按您提出的四个维度展开:
AIVitaaly 插件系统性分析报告
一、数据库分析
1.1 插件专属表(需在Discuz数据库中创建)
| 表名 | 用途 | 关键字段 | 问题/建议 |
|---|---|---|---|
pre_appbuilder_user | 用户知识库映射 | uid, knowledge_id, yid, is_primary | 与中心站同步,结构清晰 |
pre_appbuilder_dialogue | AI对话记录 | parent_id, type, content, session_id | 冗余:与home_blog内容重复 |
pre_appbuilder_dialog_logs | 对话日志索引 | uid, subject, blogid, virtual_blogid | 设计良好:类似您的log_index |
pre_appbuilder_association | 对话关联(源用户↔目标用户) | source_uid, source_blogid, target_uid, target_blogid | 关联关系设计合理 |
pre_appbuilder_tasks | 任务队列表 | task_type, status, retry_count | 功能完整,支持重试 |
pre_appbuilder_home_blog | 日志→知识库上传记录 | blogid, knowledge_id, document_id | 冗余:可与向量表合并 |
pre_appbuilder_versions | 脚本版本记录 | script_name, version | 设计良好 |
pre_appbuilderaly_applycreate | 虚拟人创建申请 | uid, status, audit_remark | 流程完整 |
pre_appbuilder_bind_account | 跨站绑定申请 | from_uid, target_username, status | 设计合理 |
pre_appbuilder_db_map | 站点↔数据库映射 | website, dbname, table_prefix | 跨站核心 |
pre_appbuilder_Related_user | 用户关系网 | uid, related_uid, relation_type, user_type | 类似社交图谱 |
1.2 向量存储表(需动态创建)
| 表名模式 | 用途 | 问题 |
|---|---|---|
vectors_personal_{website}_{uid} | 用户个人向量知识库 | 关键问题:embedding字段存储压缩后的文本向量,但缺乏全文检索能力 |
vectors_shared_*(设计中) | 共享知识库 | 未实现 |
1.3 Discuz原生表(被插件使用)
| 表名 | 用途 | 依赖程度 |
|---|---|---|
pre_home_blog | 存储对话日志 | 高 - 核心存储 |
pre_home_blogfield | 存储对话内容 | 高 - 核心存储 |
pre_common_member | 用户信息 | 高 |
pre_common_member_profile | 用户扩展信息(field1存提示词) | 中 |
pre_home_friend | 好友关系 | 中 |
pre_forum_thread | 论坛主题 | 低 |
pre_forum_post | 论坛回帖 | 低 |
pre_forum_groupuser | 群组成员 | 低 |
pre_plugin_autoreply_member | 虚拟人标识 | 中(历史遗留) |
1.4 数据库设计问题总结
| 问题 | 严重程度 | 建议 |
|---|---|---|
| 对话内容双重存储(dialogue + home_blog) | 高 | 统一使用home_blog,废除dialogue表 |
| 向量表缺乏全文检索能力 | 高 | 引入md_log_manager.php的全文索引方案 |
表前缀硬编码(pre_zhuliao_) | 中 | 动态获取 |
| appbuilder_home_blog与向量表功能重叠 | 中 | 合并为统一的知识库条目表 |
二、模块与函数分析
2.1 目录结构
AIVitaaly/ ├── api/ # API接口层(前端调用入口) ├── models/ # 数据模型层 ├── services/ # 业务服务层 ├── hooks/ # Discuz钩子 ├── utils/ # 工具类 ├── template/ # 前端模板 ├── AIVita.inc.php # 插件主入口 ├── AIreply.php # DeepSeek API调用(独立脚本) ├── ceshi02.php # 路由转发器(重要) └── admin*.inc.php # 后台管理
2.2 核心模块详解
A. 入口与路由层
| 文件 | 职责 | 问题 |
|---|---|---|
AIVita.inc.php | 插件主入口,加载模板 | 包含测试代码残留 |
ceshi02.php | 核心路由器,处理所有AJAX请求 | 命名不规范(应该叫router.php) |
AIVita_mobile.inc.php | 手机版入口 | 功能冗余,可合并 |
B. API层(api/)
| 文件 | 核心方法 | 职责 |
|---|---|---|
ChatApi.php | askQuestion() | 核心:流式对话、保存对话、向量检索 |
KnowledgeApi.php | getList(), search() | 虚拟人列表、知识库搜索 |
UserApi.php | applyCreate(), getDocumentTitles() | 用户申请、日志管理 |
BindApi.php | bindAccount(), handleRequest() | 跨站账号绑定 |
ChatApi.php 关键流程分析:
用户提问 → 向量检索(可选)→ 调用AIreply.php → 流式输出 → 保存到home_blog → 存入向量库
问题:
向量检索被注释掉(
$searchResults = [])对话保存逻辑复杂(区分首问/续问、源用户/目标用户)
C. 服务层(services/)
| 文件 | 职责 | 与md_log_manager对比 |
|---|---|---|
VectorService.php | 向量生成(阿里云Embedding)、向量检索 | 差距:缺乏全文检索混合策略 |
VectorServiceOptimized.php | 混合检索(向量+关键词) | 方向正确:实现了混合检索 |
TaskService.php | 任务队列处理 | 功能完整 |
BlogService.php | 日志上传/更新/删除 | 与向量服务耦合 |
DatabaseService.php | 数据库路由(跨站) | 设计合理 |
D. 模型层(models/)
| 文件 | 核心方法 | 问题 |
|---|---|---|
BaseModel.php | insert/update/delete | 表前缀硬编码 |
UserModel.php | findByUid, createOrUpdate | 读写分离(读走API,写走API) |
DialogueModel.php | associaTion, createDialogLog | 表名处理混乱 |
TaskModel.php | createUploadTask | 功能完整 |
E. 工具类(utils/)
| 文件 | 功能 | 评价 |
|---|---|---|
Config.php | 配置管理、API调用 | 核心:有中心站API调用功能 |
Logger.php | 日志记录 | 功能完整 |
Helper.php | 通用辅助函数 | 功能完整 |
F. 独立脚本
| 文件 | 职责 | 调用方式 |
|---|---|---|
AIreply.php | DeepSeek API调用(流式) | 命令行:php AIreply.php <question_file> ... |
admin.php | 用户关系表管理 | Web访问 |
build_relations.php | 构建关系网 | 命令行 |
2.3 前端模板分析
| 文件 | 行数 | 复杂度 | 问题 |
|---|---|---|---|
chat_computer.htm | 5338行 | 极高 | 前端逻辑臃肿,HTML/JS/CSS混写 |
chat_handset.php | 4385行 | 极高 | 与PC版大量重复代码 |
建议:将前端JS逻辑抽离为独立.js文件,PC/手机版共用。
三、运行环境要求
3.1 必需组件
| 组件 | 版本要求 | 用途 | 检查方法 |
|---|---|---|---|
| PHP | ≥7.4 | 运行环境 | php -v |
| Discuz! | X3.5 | 插件框架 | 系统版本 |
| MySQL | ≥5.7 | 数据存储 | 需支持InnoDB、JSON字段 |
| cURL | 启用 | API调用 | php -m | grep curl |
| OpenSSL | 启用 | HTTPS请求 | php -m | grep openssl |
3.2 可选但推荐
| 组件 | 用途 | 说明 |
|---|---|---|
| proc_open | 调用AIreply.php | PHP函数,需确保未被禁用 |
| exec | 执行外部命令 | 部分功能依赖 |
| 阿里云DashScope API Key | 向量Embedding | 需购买/申请 |
| DeepSeek API Key | AI对话 | 已硬编码,建议改为配置 |
3.3 目录权限要求
| 路径 | 权限 | 用途 |
|---|---|---|
source/plugin/AIVitaaly/logs/ | 755/可写 | 日志存储 |
source/plugin/AIVitaaly/template/ | 755 | 模板文件 |
data/attachment/ | 755 | 附件上传(如需要) |
3.4 PHP配置要求
max_execution_time = 300 # AIreply.php需要长时间运行 memory_limit = 512M # 向量处理需要内存 allow_url_fopen = On # API调用 disable_functions = '' # 不能禁用proc_open, exec
四、辅助性程序/脚本
4.1 已存在的辅助脚本
| 脚本 | 功能 | 执行方式 | 必要性 |
|---|---|---|---|
build_relations.php | 构建用户关系网 | 命令行 | 初始化时必须 |
admin.php?action=init | 初始化关系表 | Web访问 | 安装时必须 |
| 向量表创建(动态) | 为用户创建向量表 | 首次对话时自动 | 自动 |
4.2 缺失的辅助脚本
根据md_log_manager.php的设计思路,以下脚本应当存在但未实现:
| 缺失脚本 | 功能 | 优先级 |
|---|---|---|
build_fulltext_index.php | 为home_blogfield建立全文索引 | 高 |
sync_dialogue_to_blog.php | 将dialogue表数据迁移到home_blog | 高 |
rebuild_vector_cache.php | 重建向量缓存 | 中 |
cleanup_orphan_records.php | 清理孤儿记录 | 中 |
export_knowledge_base.php | 导出用户知识库 | 低 |
4.3 建议添加的辅助脚本
// 1. build_fulltext_index.php - 建立全文索引 // 功能:为 pre_home_blogfield.message 字段添加 FULLTEXT 索引 // 执行时机:插件安装后、定期维护 // 2. migrate_dialogue_to_blog.php - 数据迁移 // 功能:将 pre_appbuilder_dialogue 中的数据合并到 home_blog/blogfield // 执行时机:插件升级时 // 3. rebuild_search_cache.php - 重建搜索缓存 // 功能:为每条对话生成关键词索引表 // 执行时机:数据变更后、定期
五、与 md_log_manager.php 的设计对比
| 特性 | md_log_manager.php | AIVitaaly现状 | 改进建议 |
|---|---|---|---|
| 日志存储 | 直接使用home_blog | ✅ 使用home_blog | 保持一致 |
| 全文检索 | MySQL FULLTEXT | ❌ 仅向量检索 | 引入混合检索 |
| 关键词提取 | 自动提取并存储 | ❌ 无 | 添加关键词表 |
| 搜索排序 | 相关性+时间 | 仅相似度 | 添加综合排序 |
| 增量更新 | 触发器/钩子 | 任务队列 | 可结合 |
| 索引维护 | 独立脚本 | 无 | 添加维护脚本 |
推荐借鉴的设计模式
-- 借鉴 md_log_manager 的关键词索引表 CREATE TABLE `pre_appbuilder_keywords` ( `id` INT UNSIGNED AUTO_INCREMENT, `blogid` INT UNSIGNED NOT NULL, `keyword` VARCHAR(100) NOT NULL, `weight` TINYINT DEFAULT 1, INDEX `idx_keyword` (`keyword`), INDEX `idx_blogid` (`blogid`), PRIMARY KEY (`id`) ); -- 借鉴 md_log_manager 的搜索日志表 CREATE TABLE `pre_appbuilder_search_log` ( `id` INT UNSIGNED AUTO_INCREMENT, `uid` INT UNSIGNED NOT NULL, `query` VARCHAR(500) NOT NULL, `result_count` INT DEFAULT 0, `search_time` INT UNSIGNED NOT NULL, PRIMARY KEY (`id`), INDEX `idx_uid_time` (`uid`, `search_time`) );
六、建议补充的分析维度
6.1 安全性分析
| 项目 | 现状 | 风险 |
|---|---|---|
| API密钥存储 | 硬编码在Config.php | 高危 |
| SQL注入防护 | 部分使用addslashes | 中危(应用户参数转义) |
| XSS防护 | 有escapeHTML | 良好 |
| CSRF防护 | 依赖Discuz登录态 | 一般 |
| 权限校验 | 检查$_G['uid'] | 良好 |
6.2 性能分析
| 瓶颈点 | 现状 | 建议 |
|---|---|---|
| 向量检索 | 全表扫描+余弦计算 | 改用FAISS或pgvector |
| 对话保存 | 多次数据库操作 | 合并为事务 |
| 前端加载 | 5338行单文件 | 拆分为模块 |
| API调用 | 同步等待AI响应 | 已使用流式,良好 |
6.3 可维护性分析
| 问题 | 影响 | 建议 |
|---|---|---|
| 代码注释不足 | 新开发者难上手 | 补充核心流程注释 |
| 测试代码残留 | 可能误触发 | 清理1.php等测试文件 |
| 重复代码 | PC/手机版逻辑重复 | 抽取公共JS |
| 命名不规范 | ceshi02.php | 重命名为router.php |
6.4 缺失的文档
安装指南(步骤、权限、依赖)
API接口文档(供前端/其他插件调用)
数据库ER图
故障排查手册
升级迁移指南
七、下一步行动建议
第一阶段:整理(当前)
✅ 完成本分析报告
⬜ 确认是否还有其他需要补充的代码文件
⬜ 检查
1.php等测试文件的具体内容
第二阶段:设计(借鉴md_log_manager)
设计新的日志/记忆管理模块(参考您的设计)
规划数据库表结构的重构方案
设计混合检索(全文索引+向量)的实现方案
第三阶段:实现
编写辅助脚本(build_fulltext_index等)
重构ChatApi.php中的检索逻辑
优化前端代码结构
八、请您确认/补充
是否有遗漏的代码文件? 例如:
1.php(被引用但未在汇编中)、user_relation_tree_enhanced.php(关系树页面)是否还有其他辅助脚本? 例如:定时任务脚本、数据迁移脚本
向量Embedding服务:目前使用阿里云DashScope,是否有其他备选方案?
是否需要在分析报告中增加以下内容?
API调用流程图
数据流转图
错误处理机制分析
日志规范分析
请告知,我将根据您的反馈继续完善分析。
