273 lines
6.9 KiB
Markdown
273 lines
6.9 KiB
Markdown
# GLM-OCR Java服务 - 项目上下文文档
|
||
|
||
## 项目概述
|
||
|
||
这是一个基于DJL (Deep Java Library) 的纯Java实现的GLM-OCR本地部署服务,提供REST API接口进行文档识别。该项目不依赖任何外部服务(如vLLM、Ollama或Python环境),完全使用Java技术栈运行。
|
||
|
||
### 核心特性
|
||
|
||
- 纯Java实现,无需外部服务依赖
|
||
- 支持多种OCR任务:文本识别、公式识别、表格识别、信息提取
|
||
- 基于DJL框架,使用PyTorch引擎
|
||
- 支持CPU和GPU推理
|
||
- 提供完整的REST API和Swagger文档
|
||
- Apache 2.0开源协议
|
||
|
||
### 技术栈
|
||
|
||
- **Java**: 17
|
||
- **构建工具**: Maven 3.6+
|
||
- **Web框架**: Spring Boot 3.2.0
|
||
- **深度学习框架**: DJL 0.27.0 (PyTorch引擎)
|
||
- **PyTorch**: 2.1.1 (CPU版本)
|
||
- **分词器**: HuggingFace Tokenizers
|
||
- **图像处理**: TwelveMonkeys ImageIO
|
||
- **API文档**: SpringDoc OpenAPI 2.3.0
|
||
- **其他工具**: Lombok, Jackson, Commons IO
|
||
|
||
## 项目结构
|
||
|
||
```
|
||
glmocrdemojava/
|
||
├── pom.xml # Maven项目配置文件
|
||
├── README.md # 项目说明文档
|
||
├── api-test.http # API测试示例(VS Code REST Client格式)
|
||
├── AGENTS.md # 本文件,AI代理上下文文档
|
||
├── scripts/ # 脚本目录(当前为空)
|
||
└── src/main/
|
||
├── java/com/example/glmocr/
|
||
│ ├── GlmOcrApplication.java # Spring Boot主应用类
|
||
│ ├── config/
|
||
│ │ └── GlmOcrConfig.java # GLM-OCR配置类
|
||
│ ├── controller/
|
||
│ │ ├── OcrController.java # REST API控制器
|
||
│ │ └── GlobalExceptionHandler.java # 全局异常处理器
|
||
│ ├── dto/
|
||
│ │ ├── OcrRequest.java # OCR请求DTO
|
||
│ │ ├── OcrResponse.java # OCR响应DTO
|
||
│ │ └── HealthResponse.java # 健康检查响应DTO
|
||
│ ├── model/
|
||
│ │ ├── GlmOcrModel.java # DJL模型封装类
|
||
│ │ └── GlmOcrTranslator.java # 图像预处理和结果翻译器
|
||
│ ├── service/
|
||
│ │ └── GlmOcrService.java # OCR服务层
|
||
│ └── tokenizer/
|
||
│ └── TokenizerService.java # 分词器服务
|
||
└── resources/
|
||
└── application.yml # 应用配置文件
|
||
```
|
||
|
||
## 构建和运行
|
||
|
||
### 环境要求
|
||
|
||
- Java 17+
|
||
- Maven 3.6+
|
||
- GLM-OCR模型文件(需从ModelScope下载)
|
||
|
||
### 构建项目
|
||
|
||
```bash
|
||
mvn clean package -DskipTests
|
||
```
|
||
|
||
构建完成后,JAR文件位于 `target/glm-ocr-service-1.0.0.jar`
|
||
|
||
### 运行应用
|
||
|
||
```bash
|
||
java -jar target/glm-ocr-service-1.0.0.jar
|
||
```
|
||
|
||
服务将在 `http://localhost:9090` 启动。
|
||
|
||
### 测试
|
||
|
||
```bash
|
||
mvn test
|
||
```
|
||
|
||
### 首次运行前的准备
|
||
|
||
1. 下载GLM-OCR模型:
|
||
```bash
|
||
git lfs install
|
||
git clone https://modelscope.cn/ZhipuAI/GLM-OCR.git ./models/GLM-OCR
|
||
```
|
||
|
||
2. 修改配置文件 `src/main/resources/application.yml` 中的模型路径(如果需要)
|
||
|
||
## 配置说明
|
||
|
||
配置文件位于 `src/main/resources/application.yml`
|
||
|
||
### 核心配置项
|
||
|
||
| 配置项 | 说明 | 默认值 |
|
||
|--------|------|--------|
|
||
| `server.port` | 服务端口 | 9090 |
|
||
| `glm-ocr.model-path` | 模型本地路径 | ./models/GLM-OCR |
|
||
| `glm-ocr.device` | 推理设备 (cpu/gpu(0)/gpu(1)) | cpu |
|
||
| `glm-ocr.precision` | 精度 (fp32/fp16/bf16/int8) | fp32 |
|
||
| `glm-ocr.max-tokens` | 最大生成token数 | 8192 |
|
||
| `glm-ocr.batch-size` | 批次大小 | 1 |
|
||
| `glm-ocr.image-size` | 图像预处理大小 | 448 |
|
||
| `glm-ocr.temperature` | 温度参数 | 0.1 |
|
||
| `glm-ocr.top-p` | Top P采样参数 | 0.95 |
|
||
| `glm-ocr.timeout` | 请求超时时间(秒) | 120 |
|
||
|
||
## API接口
|
||
|
||
### 基础信息
|
||
|
||
- Base URL: `http://localhost:9090`
|
||
- API前缀: `/api/v1`
|
||
- Swagger文档: `http://localhost:9090/swagger-ui.html`
|
||
- OpenAPI规范: `http://localhost:9090/api-docs`
|
||
|
||
### 主要接口
|
||
|
||
| 方法 | 路径 | 说明 |
|
||
|------|------|------|
|
||
| GET | `/api/v1/health` | 健康检查 |
|
||
| POST | `/api/v1/ocr/text` | 文本识别 |
|
||
| POST | `/api/v1/ocr/formula` | 公式识别 |
|
||
| POST | `/api/v1/ocr/table` | 表格识别 |
|
||
| POST | `/api/v1/ocr/extract` | 信息提取 |
|
||
| POST | `/api/v1/ocr` | 通用OCR识别 |
|
||
| POST | `/api/v1/model/reload` | 重新加载模型 |
|
||
|
||
### 请求示例
|
||
|
||
#### 文本识别
|
||
|
||
```http
|
||
POST /api/v1/ocr/text
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"image": "iVBORw0KGgoAAAANSUhEUg...",
|
||
"imageType": "base64"
|
||
}
|
||
```
|
||
|
||
#### 信息提取
|
||
|
||
```http
|
||
POST /api/v1/ocr/extract
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"image": "iVBORw0KGgoAAAANSUhEUg...",
|
||
"imageType": "base64",
|
||
"extractionTemplate": "{\n \"name\": \"\",\n \"id_number\": \"\"\n}"
|
||
}
|
||
```
|
||
|
||
### 响应格式
|
||
|
||
成功响应:
|
||
```json
|
||
{
|
||
"success": true,
|
||
"result": "识别结果文本",
|
||
"processingTimeMs": 1234
|
||
}
|
||
```
|
||
|
||
失败响应:
|
||
```json
|
||
{
|
||
"success": false,
|
||
"error": "错误信息"
|
||
}
|
||
```
|
||
|
||
## 开发约定
|
||
|
||
### 代码风格
|
||
|
||
- 使用Lombok简化代码(@Data, @RequiredArgsConstructor等)
|
||
- 使用SLF4J进行日志记录
|
||
- 遵循Spring Boot最佳实践
|
||
- 使用Jakarta EE(而非javax)注解
|
||
|
||
### 包结构说明
|
||
|
||
- `config`: 配置类,使用@ConfigurationProperties绑定配置
|
||
- `controller`: REST控制器,处理HTTP请求
|
||
- `dto`: 数据传输对象,使用Swagger注解描述API
|
||
- `model`: 模型相关类,包括模型加载和翻译器
|
||
- `service`: 业务逻辑层
|
||
- `tokenizer`: 分词器服务
|
||
|
||
### 错误处理
|
||
|
||
- 使用GlobalExceptionHandler统一处理异常
|
||
- 返回格式统一的错误响应
|
||
- 模型初始化失败不阻止服务启动,允许后续手动加载
|
||
|
||
### 日志配置
|
||
|
||
- DEBUG级别:com.example.glmocr包
|
||
- INFO级别:ai.djl包
|
||
- 使用模式化日志输出
|
||
|
||
## 重要说明
|
||
|
||
### 模型依赖
|
||
|
||
- 模型文件需要从ModelScope下载
|
||
- 默认路径:`./models/GLM-OCR`
|
||
- 模型文件包括:config.json, model.safetensors, tokenizer.json等
|
||
|
||
### 图像输入
|
||
|
||
- 目前仅支持Base64编码的图像
|
||
- 图像格式支持:PNG, JPEG, GIF, WebP
|
||
- URL方式暂不支持
|
||
|
||
### 性能考虑
|
||
|
||
- 默认使用CPU推理,可在配置中切换到GPU
|
||
- 图像预处理大小默认为448x448
|
||
- 批次大小默认为1
|
||
|
||
### GPU支持
|
||
|
||
- 需要配置CUDA环境
|
||
- 在配置文件中设置 `device: gpu(0)`
|
||
- 需要使用GPU版本的PyTorch原生库
|
||
|
||
## 常见问题
|
||
|
||
### 模型加载失败
|
||
|
||
1. 检查模型路径配置是否正确
|
||
2. 确认模型文件完整下载
|
||
3. 检查文件权限
|
||
|
||
### 内存不足
|
||
|
||
1. 减小批次大小
|
||
2. 降低图像预处理尺寸
|
||
3. 减小最大token数
|
||
|
||
### 推理速度慢
|
||
|
||
1. 考虑使用GPU加速
|
||
2. 降低精度设置(fp16/bf16)
|
||
3. 优化图像尺寸
|
||
|
||
## 参考资料
|
||
|
||
- [GLM-OCR模型](https://modelscope.cn/models/ZhipuAI/GLM-OCR)
|
||
- [DJL文档](https://djl.ai/)
|
||
- [Spring Boot文档](https://spring.io/projects/spring-boot)
|
||
- [SpringDoc OpenAPI](https://springdoc.org/)
|
||
|
||
## 开源协议
|
||
|
||
- 本项目:MIT License
|
||
- DJL:Apache License 2.0
|
||
- GLM-OCR模型:MIT License |