Skip to content

Commit 1ffe1e4

Browse files
authored
Merge pull request #588 from ccprocessor/dev
Release v4.2.1
2 parents ceeb749 + dac1a9e commit 1ffe1e4

21 files changed

Lines changed: 1933 additions & 353 deletions

File tree

docs/specification/output_format/content_list_spec.md

Lines changed: 226 additions & 229 deletions
Large diffs are not rendered by default.

llm_web_kit/api/DATABASE_README.md

Lines changed: 358 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,358 @@
1+
# 数据库配置说明
2+
3+
## 功能概述
4+
5+
本项目新增了 MySQL 请求日志功能,用于记录每次 HTML 解析请求的详细信息,包括:
6+
7+
- **任务ID** (`task_id`): 用于关联同一任务的多个请求
8+
- **请求ID** (`request_id`): 每次请求的唯一标识符(自动生成UUID)
9+
- **输入类型** (`input_type`): html_content(HTML字符串)、url(URL地址)、file(文件上传)
10+
- **输入HTML** (`input_html`): 输入的HTML字符串内容
11+
- **URL** (`url`): 输入的URL地址
12+
- **输出Markdown** (`output_markdown`): 解析后输出的Markdown格式内容
13+
- **成功状态** (`is_success`): 请求是否成功
14+
- **错误信息** (`error_message`): 失败时的详细错误信息
15+
- **创建时间** (`created_at`): 请求创建时间
16+
- **更新时间** (`updated_at`): 记录最后更新时间
17+
18+
## 数据库设置
19+
20+
### 1. 安装 MySQL
21+
22+
确保已安装 MySQL 5.7+ 或 MariaDB 10.2+。
23+
24+
### 2. 创建数据库和表
25+
26+
执行 `database_setup.sql` 文件中的 SQL 语句:
27+
28+
```bash
29+
mysql -u root -p < database_setup.sql
30+
```
31+
32+
或者登录 MySQL 后执行:
33+
34+
```sql
35+
source /path/to/database_setup.sql;
36+
```
37+
38+
### 3. 配置环境变量
39+
40+
复制 `.env.example``.env`
41+
42+
```bash
43+
cp .env.example .env
44+
```
45+
46+
编辑 `.env` 文件,配置数据库连接:
47+
48+
```env
49+
DATABASE_URL=mysql+aiomysql://root:your_password@localhost:3306/llm_web_kit
50+
```
51+
52+
**连接字符串格式说明:**
53+
54+
```
55+
mysql+aiomysql://用户名:密码@主机:端口/数据库名
56+
```
57+
58+
**示例:**
59+
60+
- 本地开发: `mysql+aiomysql://root:123456@localhost:3306/llm_web_kit`
61+
- 远程服务器: `mysql+aiomysql://user:pass@192.168.1.100:3306/llm_web_kit`
62+
63+
### 4. 安装依赖
64+
65+
```bash
66+
pip install -r requirements.txt
67+
```
68+
69+
新增的依赖包括:
70+
71+
- `sqlalchemy>=2.0.0` - ORM框架
72+
- `aiomysql>=0.2.0` - 异步MySQL驱动
73+
- `pymysql>=1.1.0` - MySQL客户端库
74+
75+
## 使用说明
76+
77+
### 启动服务
78+
79+
```bash
80+
python llm_web_kit/api/run_server.py
81+
```
82+
83+
或者:
84+
85+
```bash
86+
python -m llm_web_kit.api.main
87+
```
88+
89+
### API 调用示例
90+
91+
#### 1. 解析 HTML 内容
92+
93+
```bash
94+
curl -X POST "http://127.0.0.1:8000/api/v1/html/parse" \
95+
-H "Content-Type: application/json" \
96+
-d '{
97+
"html_content": "<html><body><h1>Hello World</h1></body></html>",
98+
"url": "https://example.com",
99+
"options": {
100+
"task_id": "task_001",
101+
"clean_html": true
102+
}
103+
}'
104+
```
105+
106+
**响应示例:**
107+
108+
```json
109+
{
110+
"success": true,
111+
"message": "HTML 解析成功",
112+
"timestamp": "2025-10-27T15:30:00.123456",
113+
"request_id": "550e8400-e29b-41d4-a716-446655440000",
114+
"data": {
115+
"markdown": "# Hello World",
116+
...
117+
}
118+
}
119+
```
120+
121+
#### 2. 上传 HTML 文件
122+
123+
```bash
124+
curl -X POST "http://127.0.0.1:8000/api/v1/html/upload" \
125+
-F "file=@/path/to/file.html"
126+
```
127+
128+
### 传递任务ID
129+
130+
如果需要关联多个请求到同一任务,可以在 `options` 中传递 `task_id`
131+
132+
```json
133+
{
134+
"html_content": "...",
135+
"options": {
136+
"task_id": "my_task_123"
137+
}
138+
}
139+
```
140+
141+
## 数据库查询示例
142+
143+
### 查询最近的请求记录
144+
145+
```sql
146+
SELECT * FROM request_logs
147+
ORDER BY created_at DESC
148+
LIMIT 100;
149+
```
150+
151+
### 查询某个任务的所有请求
152+
153+
```sql
154+
SELECT * FROM request_logs
155+
WHERE task_id = 'task_001'
156+
ORDER BY created_at;
157+
```
158+
159+
### 查询失败的请求
160+
161+
```sql
162+
SELECT request_id, input_type, error_message, created_at
163+
FROM request_logs
164+
WHERE is_success = 0
165+
ORDER BY created_at DESC;
166+
```
167+
168+
### 统计成功率
169+
170+
```sql
171+
SELECT
172+
COUNT(*) as total_requests,
173+
SUM(is_success) as success_count,
174+
ROUND(SUM(is_success) / COUNT(*) * 100, 2) as success_rate
175+
FROM request_logs;
176+
```
177+
178+
### 按日期统计请求量
179+
180+
```sql
181+
SELECT
182+
DATE(created_at) as date,
183+
COUNT(*) as total,
184+
SUM(is_success) as success,
185+
COUNT(*) - SUM(is_success) as failed
186+
FROM request_logs
187+
GROUP BY DATE(created_at)
188+
ORDER BY date DESC;
189+
```
190+
191+
### 查询特定请求的详细信息
192+
193+
```sql
194+
SELECT * FROM request_logs
195+
WHERE request_id = '550e8400-e29b-41d4-a716-446655440000';
196+
```
197+
198+
## 功能特性
199+
200+
### 1. 自动日志记录
201+
202+
每次调用 `/api/v1/html/parse``/api/v1/html/upload` 接口时,系统会自动:
203+
204+
- 生成唯一的 `request_id`
205+
- 记录请求开始时间
206+
- 保存输入参数(HTML内容、URL等)
207+
- 记录解析结果(Markdown输出)
208+
- 记录成功/失败状态和错误信息
209+
210+
### 2. 异步数据库操作
211+
212+
使用 SQLAlchemy 异步引擎和 aiomysql 驱动,不会阻塞 API 请求处理。
213+
214+
### 3. 优雅降级
215+
216+
如果数据库未配置或连接失败:
217+
218+
- API 服务仍然正常运行
219+
- 只是不记录请求日志
220+
- 不影响 HTML 解析功能
221+
222+
### 4. 连接池管理
223+
224+
使用数据库连接池,提高性能:
225+
226+
- 默认池大小: 5
227+
- 最大溢出: 10
228+
- 可通过环境变量配置
229+
230+
## 故障排查
231+
232+
### 问题1: 数据库连接失败
233+
234+
**错误信息:**
235+
236+
```
237+
数据库连接初始化失败: (2003, "Can't connect to MySQL server...")
238+
```
239+
240+
**解决方案:**
241+
242+
1. 检查 MySQL 服务是否运行
243+
2. 验证 `DATABASE_URL` 配置是否正确
244+
3. 确认数据库用户权限
245+
4. 检查防火墙设置
246+
247+
### 问题2: 表不存在
248+
249+
**错误信息:**
250+
251+
```
252+
Table 'llm_web_kit.request_logs' doesn't exist
253+
```
254+
255+
**解决方案:**
256+
执行 `database_setup.sql` 创建表:
257+
258+
```bash
259+
mysql -u root -p llm_web_kit < database_setup.sql
260+
```
261+
262+
### 问题3: 依赖包缺失
263+
264+
**错误信息:**
265+
266+
```
267+
ModuleNotFoundError: No module named 'aiomysql'
268+
```
269+
270+
**解决方案:**
271+
安装依赖包:
272+
273+
```bash
274+
pip install sqlalchemy aiomysql pymysql
275+
```
276+
277+
### 问题4: 字符编码问题
278+
279+
**解决方案:**
280+
确保数据库和表使用 `utf8mb4` 字符集:
281+
282+
```sql
283+
ALTER DATABASE llm_web_kit CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
284+
ALTER TABLE request_logs CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
285+
```
286+
287+
## 性能优化建议
288+
289+
### 1. 定期清理历史数据
290+
291+
```sql
292+
-- 删除30天前的日志
293+
DELETE FROM request_logs
294+
WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);
295+
```
296+
297+
### 2. 添加分区表(可选)
298+
299+
对于大量数据,可以按月分区:
300+
301+
```sql
302+
ALTER TABLE request_logs
303+
PARTITION BY RANGE (TO_DAYS(created_at)) (
304+
PARTITION p202501 VALUES LESS THAN (TO_DAYS('2025-02-01')),
305+
PARTITION p202502 VALUES LESS THAN (TO_DAYS('2025-03-01')),
306+
...
307+
);
308+
```
309+
310+
### 3. 监控慢查询
311+
312+
启用 MySQL 慢查询日志,优化查询性能。
313+
314+
### 4. 调整连接池大小
315+
316+
根据并发量调整 `.env` 中的配置:
317+
318+
```env
319+
DB_POOL_SIZE=10
320+
DB_MAX_OVERFLOW=20
321+
```
322+
323+
## 安全建议
324+
325+
1. **不要提交 .env 文件到版本控制**
326+
2. **使用强密码**
327+
3. **限制数据库用户权限**(只授予必要的权限)
328+
4. **定期备份数据库**
329+
5. **在生产环境使用 SSL 连接**
330+
331+
## 技术架构
332+
333+
```
334+
FastAPI Application
335+
336+
Router (htmls.py)
337+
338+
RequestLogService (request_log_service.py)
339+
340+
DatabaseManager (database.py)
341+
342+
SQLAlchemy + aiomysql
343+
344+
MySQL Database
345+
```
346+
347+
## 相关文件
348+
349+
- `models/db_models.py` - 数据库模型定义
350+
- `database.py` - 数据库连接管理
351+
- `services/request_log_service.py` - 请求日志服务
352+
- `routers/htmls.py` - API 路由(集成日志记录)
353+
- `database_setup.sql` - 数据库建表语句
354+
- `.env.example` - 环境变量配置示例
355+
356+
## 联系支持
357+
358+
如有问题,请查看项目文档或提交 Issue。

0 commit comments

Comments
 (0)