一个用于对网络下载的小说进行最小侵入式精校的系统,专注于纠错而非润色。
- ✅ 最小侵入式精校:只纠正错误,不改变原文风格
- ✅ 多模型支持:支持 OpenAI、DeepSeek、Ollama 本地模型
- ✅ 智能分段:自动分段处理,支持通用分段和 Ollama 专用小分段
- ✅ 整段直发:对 OpenAI / DeepSeek 等云端模型,短文本可整段发送,减少切片合并
- ✅ 差异对比:可视化展示原文与精校文本的差异,忽略纯格式改动
- ✅ 任务与结果管理:后台任务队列 + 任务进度页 + 比对结果列表页
- ✅ Ollama 预纠错:可选先经 pycorrector(Kenlm/MacBert/Gpt)一轮纠错再送 Ollama,提升本地模型效果;可在设置页开关并选择预纠错模型(默认 Kenlm)
- ✅ 系统配置面板:前端实时调整分段、重试、默认模型、Prompt 文件等配置
- ✅ 一键导出:支持导出精校后的完整文本或单章节
TextProof/
├── backend/ # 后端服务
│ ├── models/ # 模型适配器层
│ │ ├── base.py # 适配器基类
│ │ ├── openai_adapter.py
│ │ ├── deepseek_adapter.py
│ │ ├── ollama_adapter.py
│ │ └── factory.py # 工厂模式创建适配器
│ ├── services/ # 业务逻辑层
│ │ ├── correction_service.py # 文本精校主服务
│ │ ├── task_manager.py # 异步任务管理
│ │ └── storage/sqlite_store.py # 结果持久化存储
│ ├── utils/ # 工具模块
│ │ ├── text_splitter.py # 文本分段(支持overlap与智能合并)
│ │ ├── chapter_splitter.py # 按章节拆分长篇小说
│ │ ├── prompt_manager.py # Prompt管理(支持文件与热更新)
│ │ ├── diff_utils.py # 差异计算,忽略纯空白改动
│ │ ├── cost_estimator.py # 调用成本预估
│ │ └── time_estimator.py # 处理时间预估
│ ├── config.py # 配置管理
│ ├── main.py # FastAPI主应用
│ └── requirements.txt # Python依赖
├── frontend/ # 前端应用
│ ├── src/
│ │ ├── components/ # React组件
│ │ │ ├── TextUpload.jsx # 文本上传/输入 + 模型选择
│ │ │ ├── CorrectionProgress.jsx # 精校进度条
│ │ │ ├── TextComparison.jsx # 旧版对比组件
│ │ │ ├── ComparisonViewPage.jsx # 独立比对结果页面(章节/整本)
│ │ │ ├── ResultListPage.jsx # 比对结果列表(卡片 + 分页)
│ │ │ ├── TaskProgressPage.jsx # 后台任务进度列表
│ │ │ └── SettingsPage.jsx # 系统配置(模型/分段/Prompt等)
│ │ ├── services/ # API服务
│ │ │ └── api.js
│ │ ├── App.jsx # 主应用组件
│ │ └── main.jsx # 入口文件
│ ├── package.json
│ └── vite.config.js
└── README.md
- 安装依赖
cd backend
pip install -r requirements.txt- 配置环境变量
复制 .env.example 为 .env 并填写配置:
cp .env.example .env编辑 .env 文件,至少配置一个模型提供商的API密钥:
# OpenAI配置
OPENAI_API_KEY=your_openai_api_key_here
# 或 DeepSeek配置
DEEPSEEK_API_KEY=your_deepseek_api_key_here
# 或 Ollama配置(本地部署)
OLLAMA_BASE_URL=http://localhost:11434- 启动后端服务
python main.py
# 或使用 uvicorn
uvicorn main:app --reload --host 0.0.0.0 --port 8000后端服务将在 http://localhost:8000 启动。
- 安装依赖
cd frontend
npm install- 启动开发服务器
npm run dev前端应用将在 http://localhost:3000 启动。
GET /health?provider=openai&model_name=gpt-4-turbo-previewPOST /api/correct
Content-Type: application/json
{
"text": "待校对的文本",
"provider": "openai", // 可选
"model_name": "gpt-4-turbo-preview", // 可选
"chunk_size": 2000, // 可选
"chunk_overlap": 200 // 可选
}响应(简化示例):
{
"original": "原文",
"corrected": "校对后的文本",
"chunks_processed": 5,
"total_chunks": 5,
"has_changes": true
}POST /api/correct/file?provider=openai&model_name=gpt-4-turbo-preview
Content-Type: multipart/form-data
file: [TXT文件]POST /api/diff
Content-Type: application/json
{
"text": "原文",
"corrected": "校对后的文本" // 可选,不提供则先校对
}响应:
{
"original_segments": [
{"text": "文本片段", "type": "same|deleted"}
],
"corrected_segments": [
{"text": "文本片段", "type": "same|added"}
],
"has_changes": true
}GET /api/providers- 获取/更新运行时配置(分段、重试、默认模型等,可选持久化到
.env):
GET /api/config
POST /api/config- 获取/更新 Prompt(可选择仅更新内存,或写入默认 Prompt 文件并更新
PROMPT_FILE):
GET /api/prompt?reload=false
POST /api/prompt- 任务与结果相关:
GET /api/tasks/GET /api/tasks/{task_id}:查看异步任务进度GET /api/results:比对结果列表(分页)GET /api/results/{id}:结果详情GET /api/results/{id}/download:下载原文或精校文本
统一的模型适配器接口,支持:
- OpenAI: 通过 OpenAI API
- DeepSeek: 通过 DeepSeek API(兼容 OpenAI 格式)
- Ollama: 本地部署的模型
所有适配器实现 BaseModelAdapter 接口,提供:
correct_text(): 校对文本health_check(): 健康检查correct_text_with_retry(): 带重试的校对
- 优先按段落(
\n\n)分割 - 超长段落按句子分割
- 支持重叠(overlap)防止上下文丢失
- 智能合并,去除重复的 overlap 部分,兼容模型对文本的轻微改写
- 对 Ollama 可使用更小的
OLLAMA_CHUNK_SIZE,适配本地大模型显存 - 对 OpenAI / DeepSeek,当单段长度不超过
FAST_PROVIDER_MAX_CHARS时可整段直发
默认 Prompt 严格限制:
- ✅ 只纠正错误(错别字、病句、拼音转中文、标点错误)
- ❌ 禁止润色、改写、增删内容
- ❌ 禁止改变文风、语气、措辞
Prompt 支持通过文件和前端界面自定义:
- 在后端
.env中设置:
PROMPT_FILE=./prompts/custom_prompt.txt- 在前端「系统配置 → Prompt配置」:
- 直接编辑 Prompt 文本
- 选择是否持久化到默认 Prompt 文件并自动更新
PROMPT_FILE - 点击「刷新」可强制从 Prompt 文件重新加载(无需重启后端)
使用 diff-match-patch 算法计算差异,支持:
- 高亮显示修改部分
- 删除内容显示删除线
- 新增内容高亮显示
from services.correction_service import CorrectionService
service = CorrectionService(provider="openai", model_name="gpt-4-turbo-preview")
result = await service.correct_text("待校对的文本")
print(result["corrected"])- 打开前端应用
http://localhost:3000 - 选择"粘贴文本"或"上传文件"
- 选择模型提供商(可选)
- 点击"开始校对"
- 查看对比结果并导出
- 模型与列表:
DEFAULT_MODEL_PROVIDER: 默认模型提供商(如openai/deepseek/ollama)DEFAULT_MODEL_NAME: 默认模型名称OPENAI_MODELS/DEEPSEEK_MODELS/OLLAMA_MODELS: 各提供商可用模型列表,逗号分隔
- 分段与上下文:
CHUNK_SIZE: 全局文本分段大小(默认 2000)CHUNK_OVERLAP: 全局分段重叠大小(默认 200)OLLAMA_CHUNK_SIZE: Ollama 专用分段大小,适配本地大模型(建议 800–1000)OLLAMA_CHUNK_OVERLAP: Ollama 专用分段重叠OLLAMA_USE_PYCORRECTOR: 是否对 Ollama 启用 pycorrector 预纠错(默认true)OLLAMA_PYCORRECTOR_MODEL: 预纠错模型,可选kenlm(轻量,默认)、macbert、gpt;macbert/gpt 需额外依赖与资源FAST_PROVIDER_MAX_CHARS: 对 OpenAI / DeepSeek 等云端模型的整段直发阈值(字符数)
- 重试策略:
MAX_RETRIES: 最大重试次数(默认 3)RETRY_DELAY: 重试延迟(秒,默认 1.0)
- Prompt:
PROMPT_FILE: 自定义 Prompt 文件路径(相对backend目录)
建议优先通过前端「系统配置」页面修改配置并选择是否持久化到
.env,
直接编辑.env后需重启后端服务才能生效。
在 frontend/.env 中配置:
VITE_API_BASE_URL=http://localhost:8000当使用 Ollama 时,可在设置页开启「Ollama 预纠错」:先经 pycorrector 一轮纠错,再将结果送入 Ollama 做二次纠错,以提升本地模型效果。
- 预纠错模型:默认
kenlm(统计模型,CPU、轻量;首次使用会下载语言模型到~/.pycorrector/)。可选macbert、gpt,效果更好但需更多依赖与显存。 - 依赖:
pip install pycorrector torch(见requirements.txt;pycorrector 依赖 PyTorch)。kenlm 未放入默认依赖,因在 Windows 下需 C++ 编译环境且易构建失败。Linux/Mac 若需 kenlm 预纠错:pip install kenlm或pip install -r requirements-ollama.txt。Windows 下请使用设置中的 macbert 预纠错或关闭预纠错。 - 配置:前端「系统配置 → 处理配置」中「Ollama 预纠错」区块可开关并选择预纠错模型;或通过
.env设置OLLAMA_USE_PYCORRECTOR、OLLAMA_PYCORRECTOR_MODEL。
- API 密钥安全:不要将
.env文件提交到版本控制 - 模型选择:根据文本长度和预算选择合适的模型
- 分段大小:过长可能导致上下文丢失,过短可能增加 API 调用次数
- 重试机制:网络不稳定时会自动重试,但可能增加处理时间
- 在
backend/models/下创建新的适配器类,继承BaseModelAdapter - 实现
correct_text()和health_check()方法 - 在
factory.py中注册新适配器
- 在
backend/prompts/下创建 Prompt 文件(如custom_prompt.txt) - 在
.env中设置PROMPT_FILE=./prompts/custom_prompt.txt - 通过前端「系统配置 → Prompt配置」编辑和持久化 Prompt
MIT License
欢迎提交 Issue 和 Pull Request!