glmocrdemojava/AGENTS.md

273 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
- DJLApache License 2.0
- GLM-OCR模型MIT License