解决冲突(这啥呀*2)
This commit is contained in:
1 parent
80d20f5015
commit
468d420746
20 files changed
+1045
-22
No files matched your search
@@ -0,0 +1,262 @@
|
||||
# ai_review — AI 内容审核服务
|
||||
|
||||
基于 DeepSeek LLM + RAG 向量检索的文本内容审核微服务。接收纯文本,返回是否违规。
|
||||
|
||||
## 架构
|
||||
|
||||
```
|
||||
Client ──POST /review──▶ Flask (:8007)
|
||||
│
|
||||
ReviewAgent.review()
|
||||
│
|
||||
┌─────────┴─────────┐
|
||||
▼ ▼
|
||||
RAGStore.query() DeepSeek API
|
||||
(ChromaDB top-3) (chat completion)
|
||||
└───────┬───────────┘
|
||||
▼
|
||||
{"invalid": "true"/"false"}
|
||||
```
|
||||
|
||||
审核流程:从 ChromaDB 中检索与待审文本最相似的 3 条已标注样本,注入 system prompt 作为参考,交由 DeepSeek 做单轮判定。违规类别涵盖色情、毒品、赌博、诈骗、仇恨/暴力/恐怖主义,灰色内容从严判定。
|
||||
|
||||
## 目录结构
|
||||
|
||||
```
|
||||
ai_review/
|
||||
├── ai_review.py # Flask 入口 (waitress)
|
||||
├── .env # 环境变量配置
|
||||
├── requirements.txt # Python 依赖
|
||||
├── _set.sh # 初始化: 创建 venv、安装依赖
|
||||
├── _run.sh # 启动服务
|
||||
├── test_app.py # Streamlit 调试 UI
|
||||
└── agent/
|
||||
├── __init__.py
|
||||
├── review_agent.py # 核心审核逻辑 (DeepSeek + RAG)
|
||||
├── rag_store.py # ChromaDB 向量存储 (MD5 去重)
|
||||
└── knowledge_base.json # 种子样本 (7 违规 + 7 安全)
|
||||
```
|
||||
|
||||
## 接口文档
|
||||
|
||||
基础地址:`http://127.0.0.1:8007`
|
||||
|
||||
---
|
||||
|
||||
### POST /review
|
||||
|
||||
提交文本进行内容审核。
|
||||
|
||||
**Request**
|
||||
|
||||
```
|
||||
Content-Type: application/json
|
||||
```
|
||||
|
||||
| 字段 | 类型 | 必填 | 说明 |
|
||||
|------|------|------|------|
|
||||
| content | string | 是 | 待审核文本,不可为空 |
|
||||
|
||||
```json
|
||||
{"content": "待审核的文本内容"}
|
||||
```
|
||||
|
||||
**Response 200**
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| invalid | string | `"true"` 违规 / `"false"` 安全 |
|
||||
| error | string | 仅异常时出现:`"api_error"` 或 `"parse_failed"` |
|
||||
| detail | string | 仅 `api_error` 时出现,异常描述 |
|
||||
| raw | string | 仅 `parse_failed` 时出现,模型原始输出 |
|
||||
|
||||
```json
|
||||
{"invalid": "true"}
|
||||
```
|
||||
|
||||
```json
|
||||
{"invalid": "false"}
|
||||
```
|
||||
|
||||
API 不可用时 fail-open:
|
||||
|
||||
```json
|
||||
{"invalid": "false", "error": "api_error", "detail": "Connection timeout"}
|
||||
```
|
||||
|
||||
**Response 400**
|
||||
|
||||
```json
|
||||
{"error": "content is required"}
|
||||
{"error": "content cannot be empty"}
|
||||
```
|
||||
|
||||
**curl 示例**
|
||||
|
||||
```bash
|
||||
curl -X POST http://127.0.0.1:8007/review \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"content": "这是一段正常文本"}'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### POST /rag/feedback
|
||||
|
||||
人工纠偏接口。当 AI 审核结果与人工判断不一致时调用,将样本写入 RAG 知识库影响后续审核。
|
||||
|
||||
**Request**
|
||||
|
||||
```
|
||||
Content-Type: application/json
|
||||
```
|
||||
|
||||
| 字段 | 类型 | 必填 | 说明 |
|
||||
|------|------|------|------|
|
||||
| content | string | 是 | 被误判的文本 |
|
||||
| correct_type | string | 否 | `"violation"`(AI 漏判)或 `"safe"`(AI 误杀),默认 `"violation"` |
|
||||
|
||||
```json
|
||||
{"content": "被误判的文本", "correct_type": "safe"}
|
||||
```
|
||||
|
||||
**Response 200**
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| added | boolean | 是否成功写入 |
|
||||
| id | string/null | 新条目 ID(格式 `{v|s}_{md5前12位}`),重复时为 null |
|
||||
| md5 | string | 文本的 MD5 哈希 |
|
||||
| reason | string/null | 失败原因,成功时为 null,重复时为 `"duplicate"` |
|
||||
|
||||
新增成功:
|
||||
|
||||
```json
|
||||
{"added": true, "id": "s_a1b2c3d4e5f6", "md5": "a1b2c3d4e5f6...", "reason": null}
|
||||
```
|
||||
|
||||
重复提交:
|
||||
|
||||
```json
|
||||
{"added": false, "id": null, "md5": "a1b2c3d4e5f6...", "reason": "duplicate"}
|
||||
```
|
||||
|
||||
**Response 400**
|
||||
|
||||
```json
|
||||
{"error": "content is required"}
|
||||
{"error": "content cannot be empty"}
|
||||
{"error": "correct_type must be 'violation' or 'safe'"}
|
||||
```
|
||||
|
||||
**curl 示例**
|
||||
|
||||
```bash
|
||||
curl -X POST http://127.0.0.1:8007/rag/feedback \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"content": "这段文本被误杀了", "correct_type": "safe"}'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### GET /rag/list
|
||||
|
||||
列出 RAG 知识库中的全部条目。
|
||||
|
||||
**Request**
|
||||
|
||||
无参数。
|
||||
|
||||
**Response 200**
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| total | integer | 条目总数 |
|
||||
| entries | array | 条目列表 |
|
||||
| entries[].id | string | 条目 ID |
|
||||
| entries[].text | string | 样本文本 |
|
||||
| entries[].type | string | `"violation"` 或 `"safe"` |
|
||||
| entries[].category | string | 分类标签(如 `adult_content`、`gambling`、`human_feedback` 等) |
|
||||
|
||||
```json
|
||||
{
|
||||
"total": 14,
|
||||
"entries": [
|
||||
{"id": "v_001", "text": "...", "type": "violation", "category": "adult_service"},
|
||||
{"id": "s_001", "text": "...", "type": "safe", "category": "daily"}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
**curl 示例**
|
||||
|
||||
```bash
|
||||
curl http://127.0.0.1:8007/rag/list
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### GET /health
|
||||
|
||||
健康检查。
|
||||
|
||||
**Request**
|
||||
|
||||
无参数。
|
||||
|
||||
**Response 200**
|
||||
|
||||
```json
|
||||
{"status": "ok"}
|
||||
```
|
||||
|
||||
**curl 示例**
|
||||
|
||||
```bash
|
||||
curl http://127.0.0.1:8007/health
|
||||
```
|
||||
|
||||
## 配置 (.env)
|
||||
|
||||
```
|
||||
DEEPSEEK_API_KEY=<your-key>
|
||||
DEEPSEEK_BASE_URL=https://api.deepseek.com
|
||||
DEEPSEEK_MODEL=deepseek-chat
|
||||
DEEPSEEK_TEMPERATURE=0.0
|
||||
DEEPSEEK_MAX_TOKENS=128
|
||||
AI_REVIEW_HOST=127.0.0.1
|
||||
AI_REVIEW_PORT=8007
|
||||
```
|
||||
|
||||
## 快速开始
|
||||
|
||||
```bash
|
||||
# 初始化环境
|
||||
bash _set.sh
|
||||
|
||||
# 填入 .env 中的 DEEPSEEK_API_KEY
|
||||
|
||||
# 启动服务
|
||||
bash _run.sh
|
||||
```
|
||||
|
||||
服务默认监听 `127.0.0.1:8007`。
|
||||
|
||||
## 调试 UI
|
||||
|
||||
```bash
|
||||
streamlit run test_app.py
|
||||
```
|
||||
|
||||
提供文本提交、结果展示、人工纠错按钮、RAG 知识库浏览等功能。
|
||||
|
||||
## 设计要点
|
||||
|
||||
- **RAG 增强审核**:推理时检索相似已标注样本辅助判定,支持运行时持续学习。
|
||||
- **人工反馈闭环**:通过 `/rag/feedback` 纠正误判,新样本即时持久化并影响后续审核。
|
||||
- **MD5 去重**:防止向量库中出现重复条目。
|
||||
- **Fail-open**:DeepSeek API 不可用时放行内容(返回 `invalid: "false"`)。
|
||||
|
||||
## 依赖
|
||||
|
||||
openai, flask, flask-cors, waitress, chromadb, python-dotenv
|
||||
Reference in new issue
Block a user