Files
gangyan/docs/project-deployment-audit-report.md

44 KiB
Raw Permalink Blame History

说明:以下表格中的公网 IP 多为历史迁移前审计记录。当前仓库内 Spring / Langchain 默认已改为本机 127.0.0.1 与 Docker镜像目录 /opt/docker-images),请以实际 application-*.ymlconfigs/kb_config.py 为准。

项目交接部署审计报告

审计日期: 2026-02-26 项目名称: LLM Chat 大模型智能问答系统 (冶金行业版) 原开发公司: 浪潮 (com.inspur) 我方服务器: 10.200.3.10


一、项目概述

本项目是一个基于大语言模型(LLM)的智能问答系统,主要面向冶金行业,提供政策查询、报告分析、期刊论文检索、智能写作辅助等功能。项目由三个主要服务组成:

服务 技术栈 端口 说明
chat_web_front Vue 3 + TypeScript + Vite 3000 前端界面
chat_web_backend Java Spring Boot 2.3.7 8099 业务后端 API
langchain-chat Python FastAPI + LangChain 7861 LLM 推理 + 知识库

辅助基础设施:

组件 版本 端口 说明
MySQL 8.4.4 (Docker) 33306 主数据库
Milvus 2.6.4 (Docker) 19530 向量数据库
MinIO 2024-12-18 (Docker) 9002/9003 对象存储 (Milvus 依赖)
etcd v3.5.18 (Docker) 2379 分布式配置 (Milvus 依赖)
Redis - 6379 缓存/Session

二、交接时存在的主要问题

2.1 数据库仍连接原公司远程服务器 [严重]

交接时Java 后端 (application-yj.yml, application-test.yml) 直接连接原公司的远程 MySQL 和 Redis,没有提供本地数据库的数据导出或迁移方案。

服务 原公司地址 说明
MySQL 123.57.146.97:3306 (阿里云) 数据库名: chat_LLM,密码: MYSQL!@#89765
Redis 123.57.146.97:6379 (阿里云) 密码: Redis_897653database: 13

文件位置:

  • chat_web_backend/src/main/resources/application-yj.yml:29-36
  • chat_web_backend/src/main/resources/application-test.yml:18-36
  • chat_web_backend/src/main/resources/application-dev.yml:29-31 (Redis 仍指向远程)

风险: 一旦原公司关闭这些服务器或修改密码,系统将立即不可用。

2.2 无完整数据库 Schema 和数据迁移方案 [严重]

虽然 chat_web_backend/doc/sql/ 目录下有 SQL 脚本:

  • sys.sql, chat_gpt.sql, knowledge_base.sql, gpt_folder.sql, writter_docs.sql, quartz.sql

但这些脚本只有表结构,没有包含业务数据。原公司远程数据库 chat_LLM 中的用户数据、对话历史、知识库配置等数据没有导出交接。

2.3 Milvus 向量数据库数据未交接 [严重]

Python 后端依赖的 Milvus 向量知识库包含大量预处理好的行业数据集合:

  • t_policy_total_bge_new_v2 (政策库)
  • gydemo_report_v2 (报告库)
  • t_journal_article_bge_v1 (期刊论文库)
  • 以及多个冶金行业专用知识库

这些向量数据需要重新入库或从原公司导出,否则知识库问答功能完全不可用。

文件位置: langchain-chat/configs/kb_config.py:8-41, langchain-chat/configs/model_config.py:28-31

2.4 多处硬编码原公司服务器 IP [严重]

代码中存在大量原公司基础设施的硬编码 IP无法通过配置文件覆盖

IP 地址 用途 文件位置
123.57.146.97 MySQL + Redis (阿里云) 多个 application-*.yml
123.56.15.82:10326 生产环境前端/搜索服务 application-prod.yml:2, kb_config.py:97
39.97.197.219:10326 测试环境 application-test.yml:2
192.168.56.123 内部 LLM 服务/画图服务 application-prod.yml:71, kb_config.py:101-102,121
192.168.56.188:8081 内部图片服务 DocController.java:314
106.3.149.154:8081 旧图片/文件下载服务 DocController.java:313, kb_config.py:117,165
172.17.119.151:8327 专业搜索服务 kb_config.py:98

特别注意: DocController.java:313-314 中硬编码了 IP 替换逻辑,说明原公司在迁移过程中就存在 IP 硬编码问题。

2.5 第三方 API Key 硬编码在源码中 [中等]

以下 API Key 直接写死在代码和配置文件中:

服务 Key 文件位置
阿里云 OSS Access Key LTAI5tKV3JEn6EX6eVeQjrYN AliyunOSSUtil.java:48, oss_config.py:3, 多个 yml
阿里云 OSS Secret CtMmajeabIVU6xjCVt6KCcWp9IcgD1 AliyunOSSUtil.java:53, oss_config.py:4, 多个 yml
阿里云通义千问 API Key sk-672f9d1fc4404674bf1a713dfd130a14 model_config.py:75
DeepSeek API Key sk-26858b50690a49828766fcfcf3290de9 model_config.py:83,88
Metaphor API Key e09d3cdd-e7e1-41d7-... kb_config.py:138
心知天气 API Key STNmmw0iUKB96PNpJ kb_config.py:141

风险: 这些 Key 属于原公司账户。给客户部署时必须替换为客户自己的 Key否则

  1. 原公司可以随时吊销这些 Key
  2. 产生的 API 费用会计在原公司账户上
  3. 存在安全风险(原公司 OSS bucket 中可能有敏感数据)

2.6 Jasypt 加密密码泄露在源码注释中 [中等]

生产环境配置使用了 Jasypt 加密(ENC(...) 格式),但加密密钥直接写在了源代码的注释里:

文件位置: chat_web_backend/src/main/java/com/inspur/llm/chat/base/config/JasyptConfiguration.java

密钥 用途 行号
HadIuTIooXd0C93 prod/test 环境加解密 13, 27, 41, 55 行
Z4d5vrOSlASf0MX yjprod (冶金生产) 环境加解密 59 行

同一文件中还暴露了原公司阿里云 RDS 连接信息(注释中):

  • rm-2zer597iohnt2hik2.mysql.rds.aliyuncs.com (生产 RDS)
  • rm-2ze6u80a543d64vu0.mysql.rds.aliyuncs.com (测试 RDS)
  • 用户名: inpur,密码: 987654321a! / 123456789a!

2.7 Java 源码中硬编码 API 地址 [中等]

KnowledgeBaseController.java 中,调用 langchain-chat 的地址直接写死在 Java 代码里而不是配置文件中:

// KnowledgeBaseController.java:50
String url = "http://127.0.0.1:7861/knowledge_base/list_knowledge_bases";
// :63
String url = "http://127.0.0.1:7861/knowledge_base/create_knowledge_base";
// :75
String url = "http://127.0.0.1:7861/knowledge_base/delete_knowledge_base";
// :88
String url = "http://127.0.0.1:7861/knowledge_base/list_files";
// :100
String url = "http://127.0.0.1:7861/knowledge_base/delete_docs";

如果 langchain-chat 部署在不同机器或不同端口,需要改源码并重新编译。

2.8 绝对路径硬编码 [低]

多处使用了原公司开发人员本机或服务器的绝对路径:

路径 文件位置 说明
/opt/apps/logs/chat-server-backend-cast logback-spring.xml:6 日志路径
/opt/logs/${server.name}/access application.yml:16 访问日志路径
/opt/upload/${server.name} application-test.yml:67, application-prod.yml:66 文件上传路径
/Users/master/Documents/upload/ application-dev.yml:82, application-ck.yml:77 macOS 本地路径
/home/albert/workspaces/modelSpaces/models/... kb_config.py:164,166,168 原开发者本机路径
/usr/lib/jvm/java-11-openjdk-amd64 start.sh:5 JDK 路径

2.9 OAuth2/SSO 集成指向外部系统 [低]

部分 profile 配置了 OAuth2 单点登录,指向外部系统:

  • https://kxsso.cast.org.cn/ (中国科协 SSO) - application-yj.yml:96-97, application-ck.yml:90-91
  • http://www.metalinfo.cn (冶金信息网) - application-yjprod.yml:15

如果客户不需要对接这些系统,需要关闭或替换 OAuth2 配置。

2.10 Docker 镜像使用代理源 [低]

MySQL Docker 镜像使用了第三方代理源 docker.1ms.run/mysql:8.4.4mysql/docker-compose.yml:3),在客户内网环境中可能无法拉取。


三、我方已做的修改(为在 10.200.3.10 上启动)

根据 项目启动总结.md 和代码中的痕迹,我方已完成以下改动:

3.1 Java 编译环境修复

问题 解决方案 文件
Java 21 与 Lombok 不兼容 改用 Java 11 编译和运行 start.sh
Java 11 移除了 JAXB 在 pom.xml 中添加了 JAXB 依赖 pom.xml

3.2 新增 application-dev.yml 本地开发配置

创建/修改了 application-dev.yml,将 MySQL 指向本地 Docker

  • MySQL: 127.0.0.1:33306/chat_gpt_yj (本地 Docker 容器)
  • 密码: 1234567890

但 Redis 仍然指向原公司远程服务器 123.57.146.97:6379

3.3 本地 MySQL Docker 部署

通过 mysql/docker-compose.yml 在本地部署了 MySQL 8.4.4

  • 端口映射: 33306 -> 3306
  • root 密码: 1234567890
  • 默认数据库: chat_LLM
  • 有一份数据库转储文件: mysql/mysql_bind/dump-chat_gpt_yj-202503051410.sql

3.4 本地 Milvus 向量数据库部署

通过 milvus/docker-compose.yml 部署了 Milvus 2.6.4 + MinIO + etcd 集群。

3.5 前端修改

  • 禁用了 vueDevTools 插件避免启动错误
  • 前端上下文路径改为 /metalinfo
  • 前端通过 Vite 代理转发后端 API 请求到 localhost:8099

3.6 Python 后端配置

  • 模型根路径设置为本地: /home/gc/gangyan/models
  • 嵌入模型使用 CPU 运行: EMBEDDING_DEVICE = "cpu"
  • 配置了在线 LLM 模型: deepseek-chat, qwen-max, deepseek-reasoner
  • Milvus 连接指向本地: 127.0.0.1:19530

3.7 启动脚本

创建了 start.sh 启动脚本,使用 --spring.profiles.active=dev 激活本地开发配置。


四、当前仍然缺失/需要解决的问题

4.1 Redis 服务 [必须解决]

当前状态: dev 配置仍然连接原公司远程 Redis 123.57.146.97:6379

解决方案:

  1. 本地部署 Redis推荐使用 Docker
  2. 修改 application-dev.yml 中 Redis 配置指向本地
  3. 参考配置:
    redis:
      host: 127.0.0.1
      port: 6379
      password: <自定义密码>
    

4.2 Milvus 向量数据 [必须解决]

当前状态: Milvus 服务已部署但知识库集合collections可能为空。

需要做的:

  1. 确认 Milvus 中是否已有 t_policy_total_bge_new_v2 等集合
  2. 如果没有,需要重新导入向量数据(从原公司获取 Milvus 备份,或重新进行文档向量化入库)
  3. 知识库的文档源文件也需要确认是否齐全

4.3 MySQL 业务数据 [必须解决]

当前状态: 有表结构 SQL 和一份转储文件,但需确认:

  1. dump-chat_gpt_yj-202503051410.sql 是否包含完整业务数据
  2. 本地数据库名 chat_gpt_yj 与远程 chat_LLM 不一致,是否有影响
  3. 系统用户账户数据是否已迁移

4.4 阿里云 OSS 存储 [需要解决]

当前状态: 代码中硬编码使用原公司的阿里云 OSS

  • Bucket: bj-large-models / bg-large-models
  • Endpoint: oss-cn-beijing.aliyuncs.com

需要做的:

  1. 确认系统是否实际使用了 OSS如果只在本地上传文件则不影响
  2. 如需要 OSS客户需准备自己的阿里云 OSS 账户
  3. 需修改 AliyunOSSUtil.java 中的硬编码值(需重新编译)
  4. 需修改 oss_config.py 和多个 application-*.yml 中的 key/secret

4.5 LLM API Key [需要解决]

当前状态: 使用原公司的 API Key 调用通义千问和 DeepSeek。

需要做的:

  1. 客户注册自己的通义千问账户,获取 API Key
  2. 客户注册自己的 DeepSeek 账户,获取 API Key
  3. 修改 langchain-chat/configs/model_config.py 中的 api_key 字段

4.6 搜索服务 [需要解决]

当前状态: 搜索功能依赖外部服务,目前不可用:

  • 通用搜索: http://123.56.15.82:10326/search/search (原公司服务器)
  • 专业搜索: http://172.17.119.151:8327/search/professionalSearch (内网)

文件位置: langchain-chat/configs/kb_config.py:97-98

需要做的: 确认搜索功能是否为核心需求,如是则需要部署自己的搜索服务或接入第三方搜索 API。

4.7 画图服务 [需要解决]

当前状态: 画图接口指向原公司内网服务器,不可用:

  • http://192.168.56.123:5000/generate
  • http://192.168.56.123:5000/generate-image

文件位置: langchain-chat/configs/kb_config.py:101-102

4.8 文件下载服务 [需要解决]

kb_config.py:117DOWNLOAD_HOST_CK 指向 http://106.3.149.154:8081/cast_getfile,原公司旧服务器。

kb_config.py:165 中图片服务也指向旧 IP: http://106.3.149.154:8081/chat_backend_ck/get-image?file_name={}

4.9 Python 依赖中的本机路径 [需要解决]

kb_config.py 中多处引用原开发者路径:

# kb_config.py:164
GENERATED_IMAGES_BASE_PATH = "/home/albert/workspaces/modelSpaces/models/text_to_pic/generated_images"
# kb_config.py:166
KB_CHAT_TEMP_DIR = "/home/albert/workspaces/modelSpaces/models/tmp"
# kb_config.py:168
CHROME_DIR = "/home/albert/workspaces/modelSpaces/models/chrome"

这些路径在当前服务器上不存在,相关功能会报错。

4.10 日志和上传路径 [建议解决]

需要确保以下目录存在并有写入权限:

  • /opt/apps/logs/chat-server-backend-cast (日志)
  • /opt/logs/metal_llm/access (访问日志)
  • /opt/upload/metal_llm (文件上传)

五、给客户新服务器部署的完整检查清单

第一步:基础环境准备

  • 安装 Docker 和 Docker Compose
  • 安装 Java 11 (OpenJDK)
  • 安装 Python 3.8+ 和 Conda
  • 安装 Node.js 16+ 和 npm
  • 安装 Maven 3
  • 确保服务器有足够磁盘空间(模型文件 + 向量数据,建议 50GB+

第二步:数据库部署

  • 启动 MySQL Docker (mysql/docker-compose.yml)
  • 导入数据库 Schema (chat_web_backend/doc/sql/ 下的 SQL 文件)
  • 导入业务数据(如有转储文件)
  • 部署本地 Redis (新增 Docker 服务或单独安装)
  • 启动 Milvus 向量数据库 (milvus/docker-compose.yml)
  • 导入向量知识库数据

第三步:配置修改

Java 后端 (chat_web_backend/src/main/resources/):

  • 修改 MySQL 连接地址和密码(指向本地或客户数据库)
  • 修改 Redis 连接地址和密码(指向本地)
  • 替换阿里云 OSS Key/Secret如需要
  • 修改 serverUrlPrefix 为客户实际域名/IP
  • 确认 OAuth2 配置(关闭或对接客户 SSO
  • 修改日志和上传路径
  • 重新编译: mvn clean package -DskipTests

Python 后端 (langchain-chat/configs/):

  • model_config.py: 替换 LLM API Key通义千问、DeepSeek
  • model_config.py: 确认 MODEL_ROOT_PATH 路径正确
  • kb_config.py: 修改搜索服务 URL 或关闭搜索功能
  • kb_config.py: 修改画图服务 URL 或关闭画图功能
  • kb_config.py: 修改 MySQL 连接配置 (ck_mysql_config)
  • kb_config.py: 修改 GENERATED_IMAGES_BASE_PATH, KB_CHAT_TEMP_DIR, CHROME_DIR 路径
  • kb_config.py: 修改 DOWNLOAD_HOST_CKIMAGE_SERVER_URL_TEMPLATE
  • oss_config.py: 替换阿里云 OSS 凭证

前端 (chat_web_front/):

  • .env: 修改 VITE_GLOB_FRONT_CTX (前端上下文路径)
  • .env: 修改 VITE_GLOB_API_DEV_IP (后端 API 地址)
  • 生产环境需要 Nginx 反向代理配置

Java 源码中的硬编码 (需改代码并重新编译):

  • KnowledgeBaseController.java: 5 处 langchain-chat 地址硬编码
  • AliyunOSSUtil.java: OSS Key/Secret/Endpoint/Bucket 硬编码
  • DocController.java: IP 替换逻辑硬编码

第四步:启动验证

按顺序启动:

  1. MySQL Docker -> 验证数据库连接
  2. Redis -> 验证缓存连接
  3. Milvus Docker -> 验证向量库连接
  4. langchain-chat Python 后端 -> 验证 API 和模型加载
  5. chat_web_backend Java 后端 -> 验证业务 API
  6. chat_web_front 前端 -> 验证页面访问

六、二次开发可行性评估

6.1 整体评估: 中等可行 (有一定门槛)

维度 评分 说明
代码质量 中等 结构基本清晰,但存在大量硬编码,缺少注释
架构设计 中等偏上 前后端分离 + Python AI 后端,三层架构合理
可配置性 大量配置写死在代码/配置文件中,缺乏配置中心
文档完整性 几乎没有开发文档、API 文档、部署文档
技术栈现代性 中等 Vue 3 较新Spring Boot 2.3.7 偏旧Python 部分合理
测试覆盖 未发现单元测试和集成测试
安全性 API Key 明文硬编码、密码明文存储、Jasypt 密钥泄露

6.2 二次开发的优势

  1. 三层架构清晰: 前端、Java 后端、Python AI 后端职责分明,可以独立修改
  2. 主流技术栈: Vue 3、Spring Boot、FastAPI、LangChain 都是主流框架,开发人员容易上手
  3. 模块化设计: 知识库管理、对话管理、写作辅助等功能模块相对独立
  4. LLM 模型可替换: 通过配置可以切换不同的在线 LLM 模型 (通义千问/DeepSeek/智谱等)
  5. SQL 脚本齐全: 数据库建表脚本完整,可以在新环境重建
  6. 嵌入模型已包含: models/ 目录下已有 bge-m3bge-reranker-large 模型文件

6.3 二次开发的风险和难点

  1. 配置管理混乱: 6 个 Spring Profile 配置文件 (dev/test/prod/yj/yjprod/ck),每个都有不同的硬编码,难以统一管理
  2. Java 代码中硬编码: KnowledgeBaseController.javaAliyunOSSUtil.java 中的硬编码需要改源码
  3. Python 配置散落: Python 端配置分散在多个 py 文件中,修改需要理解每个配置的作用
  4. 缺乏 API 文档: 前后端交互接口没有文档(没有 Swagger 等),需要阅读源码
  5. 缺乏测试: 修改代码后无法通过自动化测试验证正确性
  6. 行业耦合度高: 知识库名称、分类等与冶金行业强绑定(如 "冶金行业新闻库"、"冶金中文期刊库" 等),如果客户是其他行业需要大量修改
  7. 第三方依赖: 搜索服务、画图服务等外部依赖没有源码,需要自行实现或替代
  8. Jasypt 加密: 生产配置使用了 Jasypt 加密,需要理解加密机制才能修改生产配置
  9. 自定义 JAR 包: lib/ 目录下有两个非公开 JAR (aspose-words-21.1-jdk17.jar, app-sign-sdk-0.0.2.jar),无源码,功能不明确

6.4 建议的二次开发优先级

P0 - 必须首先完成 (部署基础):

  1. 将所有远程服务替换为本地服务 (MySQL、Redis)
  2. 替换所有第三方 API Key 为客户自有
  3. 将 Java 源码中的硬编码 URL 改为可配置

P1 - 尽快完成 (稳定性):

  1. 统一配置管理,清理不需要的 Profile
  2. 将敏感信息移入环境变量
  3. 添加 Nginx 反向代理配置
  4. 编写部署文档

P2 - 按需完成 (功能增强):

  1. 根据客户行业修改知识库分类和名称
  2. 替换或重新实现搜索服务
  3. 添加 API 文档 (Swagger/OpenAPI)
  4. 添加基本的单元测试

七、各配置文件完整 IP/凭证清单

以下是需要检查和替换的所有外部依赖的完整清单:

原公司 IP 地址

IP 出现文件 需要改为
123.57.146.97 application-dev.yml, application-yj.yml, application-test.yml 本地 MySQL/Redis 地址
123.56.15.82 application-prod.yml, kb_config.py 客户服务器 IP 或删除
39.97.197.219 application-test.yml 客户测试服务器或删除
192.168.56.123 application-prod.yml, kb_config.py 客户内网 AI 服务器或删除
192.168.56.188 DocController.java 客户图片服务地址或删除
106.3.149.154 DocController.java, kb_config.py 客户文件服务地址或删除
172.17.119.151 kb_config.py 客户搜索服务地址或删除

凭证清单

凭证 类型 文件 操作
LTAI5tKV3JEn6EX6eVeQjrYN 阿里云 OSS AK 多处 替换为客户 AK
CtMmajeabIVU6xjCVt6KCcWp9IcgD1 阿里云 OSS SK 多处 替换为客户 SK
sk-672f9d1fc4404674bf1a713dfd130a14 通义千问 Key model_config.py 替换为客户 Key
sk-26858b50690a49828766fcfcf3290de9 DeepSeek Key model_config.py 替换为客户 Key
Redis_897653 Redis 密码 多个 yml 替换为本地密码
MYSQL!@#89765 远程 MySQL 密码 多个 yml 替换为本地密码
1234567890 本地 MySQL 密码 application-dev.yml, docker-compose 建议修改为强密码
HadIuTIooXd0C93 Jasypt 加密密钥 JasyptConfiguration.java 如需 Jasypt 则更换密钥
Z4d5vrOSlASf0MX Jasypt 加密密钥 JasyptConfiguration.java 如需 Jasypt 则更换密钥
nstlBj454x93w6n8rll3 OAuth2 Client ID application-yjprod.yml 替换或删除
minioadmin/minioadmin MinIO 凭证 milvus/docker-compose.yml 建议修改

八、运行时启动测试结果 (2026-02-26 实测)

以下是在 10.200.3.10 服务器上实际启动全部服务后的测试结果。

8.1 基础设施状态

组件 状态 说明
MySQL (Docker, 33306) 正常运行 数据库 chat_gpt_yj 已有 21 张表,含业务数据
Redis (Docker portal-redis, 6379) 正常运行 本地运行,无密码,但 Java 后端配置未指向本地
Milvus (Docker, 19530) 正常运行 健康检查通过,但核心知识库集合缺失
MinIO (Docker, 9002/9003) 正常运行 Milvus 依赖
etcd (Docker, 2379) 正常运行 Milvus 依赖

8.2 三大服务启动状态

服务 端口 状态 问题
langchain-chat (Python) 7861 正常运行 API 服务正常WebUI (Streamlit) 未安装8501 不可用
chat_web_backend (Java) 8099 运行但有报错 启动正常,但 Redis 连远程导致部分 API 返回 500
chat_web_front (Vue) 3000 正常运行 http://10.200.3.10:3000/metalinfo 可访问

8.3 实际 API 测试结果

登录测试

测试项 结果 说明
登录端点 /app/api/oauth/token (GET) 需要 client-id: app 请求头
新手机号自动注册 部分成功 用户会被创建到 gpt_user 表,但 Spring Security 认证有时序问题
已有手机号登录 需正确密码 loginByTel 对已存在用户不校验密码直接返回,但 Spring Security 会校验 BCrypt
loginType 3=手机号, 4=用户名密码 前端使用 loginType=3

逐项 API 实测结果 (curl 调用验证)

模块一: 问答

功能 测试方式 实际返回 结论
新建对话 POST /gpt/chat prompt="什么是碳达峰" code=200, 返回 chatNumber 正常
历史对话 GET /gpt/chat/listbyuserid code=200, data=[] (新用户无数据) 正常
多轮对话 POST 7861/chat/chat_test history=[] 返回 DeepSeek 回答 + Q1/Q2/Q3 推荐 正常
术语解释 POST 7861/word_explain word="碳中和" 返回碳中和详细解释(流式) 正常
政策问答 POST 7861/chat/knowledge_base_chat kb=t_policy_total_bge_new_v2 404: 未找到知识库 不可用
大模型切换 POST 7861/llm_model/list_config_models 返回 qwen-max/deepseek-chat/deepseek-reasoner 三个模型 正常
深度思考 POST 7861/chat/chat_test model=deepseek-reasoner 返回回答+推荐问题+摘要 正常
问题推荐 包含在 chat_test 返回中 返回 Q1/Q2/Q3 三个推荐问题 正常
知识库列表 GET /knowledgeChat/knowledgeBaseList 返回报告库/政策库/期刊论文 3 条配置 正常(但 Milvus 中无实际数据)

模块二: 写作

功能 测试方式 实际返回 结论
AI编辑器(Java→Python) POST /writer/answer type=1 500: 生成失败 (Python返回422参数不匹配) 不可用
智能大纲 POST /outlines/getOutlines title="钢铁行业碳达峰" 流式返回 Markdown 大纲内容 正常
续写 POST 7861/rewrite/con_rewrite 返回续写段落(约200字) 正常
扩写 POST 7861/rewrite/exp_write 返回扩写内容 正常
缩写 POST 7861/rewrite/abb_write 返回异常(仅返回"缩写"两字) 有 Bug
风格调整(正式) POST 7861/rewrite/formal_style 返回提示模板文本而非转换结果 有 Bug
关键词提取 POST 7861/gen_keywords 返回 "钢铁, 粗钢产量, 高耗能, 高排放" 正常
章节解析 POST 7861/gen_paragraph 返回结构化的三章解析 正常

模块三: 研读

功能 测试方式 实际返回 结论
关键词提取 POST 7861/gen_keywords 正确返回关键词列表 正常
章节解析 POST 7861/gen_paragraph 正确返回章节结构 正常
名词解释 POST 7861/word_explain 返回碳中和详细解释 正常
引用问答 POST 7861/chat/self_kb_chat quote=文本 返回基于引用文本的分析 正常
翻译 POST 7861/chat/translate_text 调用成功但返回格式异常(返回query值) 有 Bug
笔记 POST /gpt/file/addFileNote code=400 需要笔记位置参数 接口存在,参数复杂

模块四: 应用广场

功能 测试方式 实际返回 结论
实用工具 GET /config/getConfig?type=0 code=200, data=[] (空数组) 页面框架有,配置数据为空
知识应用 同上 无数据无实现

关键发现的运行时问题

问题 1: Redis 配置不匹配 [导致 500 错误]

本地已有 Redis 服务 (portal-redis, 端口 6379, 无密码),但 application-dev.yml 中 Redis 配置仍指向远程:

# application-dev.yml:29-31 当前配置 (错误)
host: 123.57.146.97
port: 6379
password: Redis_897653

应改为:

# 正确的本地配置
host: 127.0.0.1
port: 6379
password: ""  # 本地 Redis 无密码
database: 0   # 本地 Redis 使用 database 0 而非 13

影响范围: 历史对话列表、登录日志保存、Session 管理等依赖 Redis 的功能全部返回 500 错误。

问题 2: Milvus 核心知识库缺失 [导致知识问答不可用]

Milvus 当前仅有 3 个集合,均非核心业务库:

  • samples (示例数据)
  • p_d6c3b2030a094a84ad5f626eecfd13b4 (个人知识库)
  • p_43ea5da26f504a838e10cf09d68bb68d (个人知识库)

缺失的核心知识库 (MySQL knowledge_base_config 表中配置的):

集合名 用途 状态
t_policy_total_bge_new_v2 政策库 不存在
t_strategy_report_bge_v2 报告库 不存在
t_journal_article_bge_v1 期刊论文库 不存在

知识库问答调用会直接返回 404: 未找到知识库

问题 3: Java 后端 MySQL 连接池告警

Java 后端自 2026-02-05 启动至今已运行 3 周Druid 连接池出现大量 Communications link failure 错误(连接超时断开)。建议定期重启或配置连接池保活参数。

问题 4: Python WebUI (Streamlit) 未安装

Python 后端的 WebUI 进程启动失败:FileNotFoundError: No such file or directory: 'streamlit'。需要在 conda 环境中安装:pip install streamlit。WebUI 仅用于调试,不影响核心 API。

问题 5: 岗位智能体无数据

数据库中 gpt_assistantgpt_assistant_type 表均为空,岗位智能体功能完全不可用。需要配置智能体类型和预设智能体数据。

8.4 MySQL 数据库数据量统计

表名 记录数 说明
sys_user 149 系统管理员账户
gpt_user 226 前台用户 (手机号注册)
gpt_chat 3,931 对话会话
gpt_chat_message 12,126 对话消息
gpt_upload_file 403 上传文件
gpt_knowledge_base 330 知识库记录
outlines 956 写作大纲
writer_docs 235 写作文档
gpt_assistant 0 智能体 (空)
gpt_assistant_type 0 智能体类型 (空)
knowledge_base_config 3 知识库配置 (报告库/政策库/期刊)

数据库已有大量业务数据,说明转储文件 dump-chat_gpt_yj-202503051410.sql 已成功导入。


九、业务需求表 vs 代码实现功能对比

以下对比基于客户提供的业务需求表4 大模块 39 项功能)与代码实际实现情况。

9.1 模块一:问答

序号 功能 代码实现 运行时状态 差距分析
1 新建对话 已实现 - ChatController + chat_test.py 正常 无差距
2 历史对话 已实现 - ChatHistory.vue + ChatController.listChatByUserId() 不可用 Redis 连接失败导致 500 错误;修复 Redis 配置即可恢复
3 内容溯源 部分实现 - knowledge_base_chat.py 返回 source_documents 不可用 依赖知识库问答Milvus 集合缺失
4 多轮对话 已实现 - ChatMessage.parentMessageId + 历史对话缓冲 正常 无差距
5 文档问答 已实现 - FileController.fileTalk() + file_chat.py + self_kb_chat.py 正常 支持 Word/PDF/Excel/图片上传和问答
6 术语解释 已实现 - word_explain.py 端点 /word_explain 正常 无差距
7 选题推荐 已实现 - policy_fun_iast.pyquestion_recommend 模板 部分可用 与知识库关联的推荐不可用
8 政策问答 部分实现 - policy_fun_iast.py + 编译的 policy_fun.so 不可用 政策库 t_policy_total_bge_new_v2 在 Milvus 中不存在,互联网实时数据搜索服务 (123.56.15.82) 不可达
9 大模型切换 已实现 - /llm_model/change + 前端模型选择 正常 需求表要求 Qwen3+DeepSeek当前配置 qwen-max+deepseek-chat+deepseek-reasoner基本满足
10 深度思考 部分实现 - thinking_generator() + 前端 thinkContent 显示 部分可用 仅 deepseek-reasoner 模型支持,需要通过 enable_thinking 标志触发
11 岗位智能体 框架存在 - AgentController + agent_chat.py 不可用 gpt_assistantgpt_assistant_type 表为空,无预设智能体数据,需要配置"战略咨询助理""办公辅助"等角色
12 问题推荐 已实现 - 对话结束后推荐 3 个相关问题 (Q1/Q2/Q3) 正常 无差距

问答模块总结: 12 项功能中5 项正常可用2 项部分可用5 项不可用。核心问题是 Milvus 知识库缺失和 Redis 配置错误。

9.2 模块二:写作

序号 功能 代码实现 运行时状态 差距分析
1 AI编辑器 部分实现 - DocWriting.vue + UEditor 集成 部分可用 编辑器基础功能可用,但 AI 辅助写作依赖的部分功能受限
2 智能大纲 已实现 - OutlinesController + write_article.py,支持 3 种模板 正常 需求要求 3 种大纲模板,代码已支持
3 内容生成 已实现 - write_article.py 根据大纲自动生成报告章节 正常 流式响应实时生成
4 要点提炼 已实现 - gen_abstract.py 端点 /gen_abstract 正常 无差距
5 风格调整 已实现 - /rewrite/formal_style, /rewrite/party_style, /rewrite/col_style 正常 需求要求"政风/学术/口语/自定义"4种代码有正式/党政/口语 3 种,缺少"学术风格"和"自定义风格"
6 段落推荐 已实现 - sentence_reference.py 端点 /sentence_reference 部分可用 依赖知识库检索Milvus 集合缺失时退化为纯 LLM 生成
7 合写续写 已实现 - con_rewrite.py 端点 /rewrite/con_rewrite 正常 无差距
8 扩写缩写 已实现 - exp_rewrite.py + abb_rewrite.py 正常 无差距
9 文档溯源 部分实现 - relevant_articles.py 部分可用 溯源功能依赖知识库数据
10 报告导出 已实现 - FileController.downloadFile() 导出 Word 正常 使用 Aspose-Words 库生成 docx注意该库为商业授权

写作模块总结: 10 项功能中7 项正常可用3 项部分可用。整体完成度较高。

9.3 模块三:研读

序号 功能 代码实现 运行时状态 差距分析
1 要点提炼 已实现 - gen_abstract.py,结果存入 UploadFile.articleAbstract 正常 无差距
2 关键词提取 已实现 - gen_keywords.py 端点 /gen_keywords 正常 无差距
3 全文章节解析 已实现 - gen_paragraph.py 端点 /gen_paragraph 正常 无差距
4 语言翻译 已实现 - translate.py + FileTranslateController,支持 25+ 语言 正常 自动语种识别 + 文件翻译均已实现
5 名词解释 已实现 - word_explain.py 正常 无差距
6 相关文献 已实现 - relevant_articles.py 部分可用 依赖知识库向量检索Milvus 缺失时仅靠 LLM 生成
7 引用问答 已实现 - self_kb_chat.py 端点 /chat/self_kb_chat,支持 quote 参数 正常 无差距
8 复制 已实现 - 前端各组件均有复制按钮 正常 无差距
9 个人文献库 已实现 - FileController + KnowledgeBase 实体CRUD 完整 正常 支持上传/删除/下载/批量操作
10 笔记 已实现 - FileNoteController 端点 /gpt/file/addFileNote 正常 CRUD 完整

研读模块总结: 10 项功能中9 项正常可用1 项部分可用。完成度最高的模块。

9.4 模块四:应用广场

序号 功能 代码实现 运行时状态 差距分析
1 实用工具 仅有框架 - applications/index.vue 页面存在 不可用 需求要求"战略决策咨询、实用科研工具、标准库、AI 应用工具集",代码仅有页面壳子,无实际工具实现
2 知识应用 未实现 不可用 需求要求"行业专用知识工具和应用",代码中完全没有找到对应实现

应用广场模块总结: 2 项功能均不可用。此模块基本未开发。

9.5 功能覆盖率总结

模块 总功能数 正常可用 部分可用 不可用 覆盖率
问答 12 5 2 5 42% (运行时)
写作 10 7 3 0 70% (运行时)
研读 10 9 1 0 90% (运行时)
应用广场 2 0 0 2 0%
合计 34 21 6 7 62% (运行时)

注:"部分可用"指代码已实现但因 Milvus 数据缺失等依赖问题导致功能降级。 如果修复 Redis 配置 + 导入 Milvus 知识库数据,覆盖率可提升至约 80%。 剩余 20% 主要差距在:岗位智能体无数据、应用广场未开发、风格调整缺少学术/自定义选项。

9.6 修复优先级(提升覆盖率的最快路径)

  1. 修复 Redis 配置 (影响: +3 项功能恢复) - 将 application-dev.yml 中 Redis 指向本地 127.0.0.1:6379,去掉密码
  2. 导入 Milvus 知识库数据 (影响: +5 项功能恢复) - 需要原始文档 + 重新向量化入库,或从原公司获取 Milvus 备份
  3. 配置岗位智能体 (影响: +1 项功能) - 在 gpt_assistant_typegpt_assistant 表中插入预设数据
  4. 开发应用广场 (影响: +2 项功能) - 需要从零开发实用工具和知识应用模块

十、总结

这个项目的核心问题在于配置管理极度混乱:大量外部依赖以硬编码方式分散在 Java 源码、YAML 配置文件、Python 配置文件中,没有统一的配置管理方案。交接时也没有提供完整的数据迁移方案和部署文档。

给客户新服务器部署时,最大的坑是:

  1. Redis 没有本地部署方案,仍依赖原公司远程服务
  2. Milvus 向量数据缺失,知识库功能无法使用
  3. Java 源码中有硬编码,改配置不够还需要改代码重新编译
  4. 所有第三方 API Key 都是原公司的,需要全部替换
  5. 搜索服务、画图服务等外部依赖完全不可用,需要自行解决

二次开发是可行的,但需要先花精力解决上述配置和基础设施问题。建议在动手开发新功能之前,先完成一次完整的配置治理和独立部署验证。


十一、AI 编辑器详细问题分析

当前状态

AI 编辑器模块存在以下层次:

  1. 前端 UI: DocWriting.vue + UEditor 富文本编辑器集成 -- 存在
  2. Java 后端: WriterAssistantController.writerAnswer() -- 存在但有 Bug
  3. Python API: /rewrite/con_rewrite, /rewrite/exp_write, /gen_abstract 等 -- 部分可用

核心 Bug: Java→Python 参数格式不匹配

Java 后端 WriterAssistantController 在调用 Python API 时,将参数包装在 {"data": {...}} 结构中:

// WriterAssistantController.java:77-78
Map map = new HashMap();
map.put("data", writerAnswerVo);  // Python端期望的是扁平参数不是嵌套在data字段里

但 Python 端各 endpoint 期望的是扁平参数格式(如 {"context":"...", "paragraph_content":"...", "query":"..."}),导致 Python 返回 422 Unprocessable Entity

影响: 通过 Java 后端调用的所有写作辅助功能(续写、扩写、缩写、风格调整、要点提炼等)全部返回 500。

但直接调用 Python API 的续写、扩写功能是正常的。说明 Python 端代码没问题,是 Java→Python 的对接层出了问题。

可能的原因

  1. 原公司的 Python 后端可能有一个中间件来解析 data 字段,而我们部署的版本缺少这个中间件
  2. 或者 HttpUtil1.post() 方法在原版本中有不同的参数序列化方式
  3. 或者 Python API 在某次更新中改了参数格式但 Java 端没有同步更新

修复难度: 中等

需要修改 WriterAssistantController.java 的参数组装方式,使之匹配 Python API 的预期格式,然后重新编译 Java 后端。


十二、自行部署 vs 需要原公司支持的问题清单

我们自己能解决的问题

问题 解决方式 难度
Redis 配置错误 修改 application-dev.yml 指向本地 Redis (127.0.0.1:6379, 无密码) 简单
Java→Python 参数不匹配 (AI编辑器) 修改 WriterAssistantController.java 参数格式,重新编译 中等
KnowledgeBaseController.java 硬编码 URL 改为从配置文件读取 chat.host,重新编译 简单
AliyunOSSUtil.java 硬编码 Key 改为从配置文件读取或使用环境变量,重新编译 简单
DocController.java IP 硬编码 改为可配置,重新编译 简单
Python 路径硬编码 (/home/albert/...) 修改 kb_config.py 中的路径 简单
日志/上传路径不存在 创建目录或修改配置 简单
LLM API Key 替换 客户注册通义千问/DeepSeek 账户,修改 model_config.py 简单
阿里云 OSS 替换 客户准备自己的 OSS 账户,修改配置 简单
缩写/风格调整等 Python API Bug 调试 Python 端参数解析逻辑 中等
翻译功能返回格式异常 调试 translate.py 参数映射 中等
岗位智能体无数据 自行设计角色并插入 gpt_assistant_typegpt_assistant 中等
应用广场无数据 自行设计工具卡片数据插入 common_config 中等
Streamlit WebUI 缺失 pip install streamlit (非核心, 仅调试用) 简单
Java 连接池超时告警 定期重启或优化 Druid 保活配置 简单
OAuth2/SSO 配置 关闭或对接客户自己的 SSO 中等
Nginx 反向代理 自行编写 Nginx 配置文件 简单
Docker 镜像源问题 替换为客户可访问的镜像源或提前拉取 简单

一定需要原公司支持(或需要客户提供内容)的问题

问题 为什么需要 替代方案
Milvus 向量知识库数据 三个核心知识库(政策库、报告库、期刊论文库)的向量数据是原公司用行业文档通过 bge-m3 模型向量化后存入 Milvus 的。我们没有原始文档。 替代方案 A: 要求原公司提供 Milvus 数据备份(最快);替代方案 B: 要求原公司提供原始文档PDF/Word我们用本地 bge-m3 模型重新向量化入库(代码已有 /knowledge_base/upload_docs 接口);替代方案 C: 客户自己收集行业文档,从零建库(最慢但完全自主)
搜索服务 原公司自建的搜索服务 (123.56.15.82:10326/search),我们没有源码 可以用第三方搜索 API如 Bing Search API替代或者直接去掉搜索功能
画图服务 原公司部署在内网的 AI 画图服务 (192.168.56.123:5000),我们没有源码 可以接入其他 AI 画图 API如通义万相、Stable Diffusion API或去掉画图功能
policy_fun.so 编译文件 政策问答的核心逻辑被编译为 .so 文件,无法修改 有对应的 policy_fun_iast.py 可作为替代,功能基本等价
aspose-words-21.1-jdk17.jar 商业授权的 Word 文档处理库,用于报告导出 需要客户购买 Aspose 授权,或替换为免费的 Apache POI
app-sign-sdk-0.0.2.jar 无源码的签名 SDK功能不明 需要确认是否在 dev 环境实际使用

关于知识库的详细说明

这是最核心的依赖项。知识库问答(政策问答、内容溯源、段落推荐、相关文献等)占业务需求表的约 30% 功能。

当前状态:

  • 本地 Milvus 已部署并运行正常
  • 嵌入模型 bge-m3 已在 /home/gc/gangyan/models/bge-m3 目录
  • Python 端有完整的向量化入库代码 (/knowledge_base/upload_docs)
  • 缺的只是原始文档内容

自建知识库的可行性:

  • 技术上完全可行langchain-chat 已有文档上传→分段→向量化→入库的完整流程
  • 行业文档本身需要客户提供:政策文件、行业报告、期刊论文等
  • 如果客户能提供 PDF/Word 格式的行业文档,我们可以自行完成向量化入库
  • 预计需要数百到数千份文档才能达到原系统的知识库规模

建议向原公司索要的最小数据集:

  1. Milvus 的数据备份volumes 目录打包),或
  2. 原始文档文件列表及文件本身,或
  3. 至少提供知识库的文档来源说明(从哪些网站/数据库采集的)

十三、功能覆盖率修正 (基于实测数据)

之前的覆盖率评估部分基于代码分析推断,现修正为实际 API 调用验证的结果:

模块 总功能 实测正常 有 Bug 但可修 依赖缺失不可用 未实现
问答 12 6 0 5(知识库/智能体) 1(内容溯源)
写作 10 3 4(Java→Python对接Bug) 2(溯源/段落推荐依赖KB) 1(报告导出未测)
研读 10 5 2(翻译Bug/笔记参数) 1(相关文献依赖KB) 2(复制/文献库未测)
应用广场 2 0 0 0 2
合计 34 14(41%) 6(18%) 8(23%) 6(18%)

解读:

  • 41% 可直接使用: 普通对话、多轮对话、深度思考、大模型切换、术语解释、问题推荐、智能大纲、续写、扩写、关键词提取、章节解析、名词解释、引用问答 等
  • 18% 有 Bug 但我们可以自行修复: AI编辑器参数对接、缩写/风格调整的Python参数、翻译返回格式等
  • 23% 因知识库/智能体数据缺失不可用: 政策问答、知识库问答、内容溯源、段落推荐、相关文献、岗位智能体等 -- 需要原始文档数据
  • 18% 未实现或未充分测试: 应用广场2项完全未开发报告导出/复制/文献库管理未在API层面验证