840 lines
44 KiB
Markdown
840 lines
44 KiB
Markdown
|
|
> **说明**:以下表格中的公网 IP 多为历史迁移前审计记录。当前仓库内 Spring / Langchain 默认已改为本机 `127.0.0.1` 与 Docker(镜像目录 `/opt/docker-images`),请以实际 `application-*.yml` 与 `configs/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_897653`,database: 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 代码里而不是配置文件中:
|
|||
|
|
|
|||
|
|
```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.4`(`mysql/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. 参考配置:
|
|||
|
|
```yaml
|
|||
|
|
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:117` 中 `DOWNLOAD_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` 中多处引用原开发者路径:
|
|||
|
|
```python
|
|||
|
|
# 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_CK` 和 `IMAGE_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-m3` 和 `bge-reranker-large` 模型文件
|
|||
|
|
|
|||
|
|
### 6.3 二次开发的风险和难点
|
|||
|
|
|
|||
|
|
1. **配置管理混乱**: 6 个 Spring Profile 配置文件 (dev/test/prod/yj/yjprod/ck),每个都有不同的硬编码,难以统一管理
|
|||
|
|
2. **Java 代码中硬编码**: `KnowledgeBaseController.java` 和 `AliyunOSSUtil.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 配置仍指向远程:
|
|||
|
|
```yaml
|
|||
|
|
# application-dev.yml:29-31 当前配置 (错误)
|
|||
|
|
host: 123.57.146.97
|
|||
|
|
port: 6379
|
|||
|
|
password: Redis_897653
|
|||
|
|
```
|
|||
|
|
应改为:
|
|||
|
|
```yaml
|
|||
|
|
# 正确的本地配置
|
|||
|
|
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_assistant` 和 `gpt_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.py` 的 `question_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_assistant` 和 `gpt_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_type` 和 `gpt_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": {...}}` 结构中:
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
// 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_type` 和 `gpt_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层面验证
|