深度剖析ChineseErrorCorrector推理主链路:OpenAI兼容接口、v3/v4双版本自动适配与VLLM异步批量推现实装
【免费下载链接】ChineseErrorCorrector一个面向中文文本纠错任务的综合平台,集学术研究、模型训练、模型评测和推理部署于一体,文本纠错新Sota。( 2026 ACL Main Oral )项目地址: https://gitcode.com/gh_mirrors/ch/ChineseErrorCorrector
ChineseErrorCorrector 是一个面向中文文本纠错任务的综合平台,集学术研究、模型训练、模型评测与推理部署于一体,其旗舰模型 ChineseErrorCorrector4-4B 荣获 2026 ACL Main Oral,是中文文本纠错领域的新 SOTA。本文将带你完整走通它的推理主链路:如何用 vLLM 部署中文纠错大模型、如何通过 OpenAI 兼容接口零代码切换 v3/v4 两代模型,以及 VLLM 异步批量推理的工程实装细节。
推理主链路总览:OpenAI 兼容接口解耦部署 🏗️
早期中文文本纠错部署通常把 4B 大模型权重直接加载进本地代码,推理逻辑与运行环境强耦合。ChineseErrorCorrector 的推理主链路做了彻底解耦:推理代码不再加载任何大模型权重,所有生成请求都通过 HTTP 走 OpenAI 兼容接口,调用 vLLM 启动的中文纠错大模型服务。
这样做有三个直接好处:
- 部署与推理分离:模型服务与业务代码可独立升级、独立扩容;
- 工程门槛低:只需要标准 OpenAI SDK 请求知识即可完成调用;
- 天然支持批量推理:与 vLLM 的异步并发能力无缝结合。
主链路入口是 ChineseErrorCorrector/main.py 中的ErrorCorrect类,职责分两层:外层负责业务逻辑(门控、结果格式化、错误类型合并),内层调用 ChineseErrorCorrector/llm/infer/openai_infer.py 中的OpenAITextCorrectInfer完成真正的模型请求与解析。
最快部署方法:三步启动 vLLM 中文纠错服务 🚀
推理前先用 vLLM 把 4B 中文纠错模型服务跑起来,只需三步:
第 1 步:克隆仓库并安装依赖
git clone https://gitcode.com/gh_mirrors/ch/ChineseErrorCorrector cd ChineseErrorCorrector pip install -r requirements.txt第 2 步:用 vLLM 启动模型服务(OpenAI 兼容接口,默认端口 8000)
vllm serve twnlp/ChineseErrorCorrector4-4B \ --port 8000 \ --max-model-len 2048 \ --gpu-memory-utilization 0.9 \ --seed 42💡 v4 模型会输出
<think>...</think>思考块,--max-model-len 2048建议保留,为生成预留足够 token;如改用上一代 v3 模型,1024 即可。
第 3 步:配置接口地址。所有参数集中在 ChineseErrorCorrector/config.py 的TextCorrectConfig中,也支持环境变量覆盖,无需改代码:
| 配置项 | 默认值 | 说明 |
|---|---|---|
OPENAI_BASE_URL | http://localhost:8000/v1 | OpenAI 兼容服务地址(环境变量CEC_OPENAI_BASE_URL) |
OPENAI_API_KEY | EMPTY | vLLM serve 默认不校验(环境变量CEC_OPENAI_API_KEY) |
OPENAI_MODEL | twnlp/ChineseErrorCorrector4-4B | 须与vllm serve加载的模型名一致(环境变量CEC_OPENAI_MODEL) |
CONCURRENCY | 16 | 异步批量推理的并发请求数 |
MAX_TOKENS | 2048 | 单次生成最大 token 数 |
v3/v4 双版本自动适配:新旧纠错模型零代码切换 🔁
ChineseErrorCorrector 系列已推出两代 4B 模型,输出格式并不相同:
| 版本 | 模型 | 输出格式 |
|---|---|---|
| v3 | ChineseErrorCorrector3-4B | 直接输出纠正后的句子 |
| v4 | ChineseErrorCorrector4-4B(ACL 2026 Main) | 先输出think思考块(错误类型 + 修改原因),再输出纠正后的句子 |
主链路用三个小函数实现了两代模型的自动适配(实现见 openai_infer.py):
版本自动识别:按模型名判定 v3 还是 v4
当MODEL_VERSION为默认的auto时,resolve_model_version直接根据模型名判定:名字中只要包含4-4b、corrector4或cec4任一关键词就识别为 v4,否则按 v3 处理;也可以设置环境变量CEC_MODEL_VERSION=v3或v4手动覆盖。
版本确定后,系统自动从TextCorrectConfig.PROMPTS挑选对应 prompt,并采用不同的消息组装策略:
- v3:prompt 与句子直接拼接("你是一个文本纠错专家,纠正输入句子中的语法错误……输入句子为:"),与历史行为保持完全一致;
- v4:prompt 使用专业纠错专家指令(覆盖错别字、词语搭配错误、词性错误、语序错误等 10 类错误),句子另起一行拼接,实测更稳。
输出解析:思考块自动剥离与三级容错
v4 的回复里夹带思考块,代码用正则做了三层兜底,任何异常输出都不会污染最终结果:
- 成对剥离:
strip_think_block用正则去掉think.../think之间的内容; - 未闭合兜底:若模型只吐出
think却没有/think,直接丢弃think之后的全部内容; - 字段抽取:
parse_v4_output进一步从思考块中提取"错误类型:xxx"与"修改原因:xxx"两个结构化字段,/think之后的内容作为纠正后的句子。
最终两代模型被统一成同一结构返回给上游:
{ "text": "纠正后的句子", "error_type": "错别字" | "词语搭配错误" | ... | None, "error_reason": "原句中的xxx应为yyy..." | None, }v3 的后两个字段恒为None,下游业务因此对两代模型完全无感,升级模型只需换一个环境变量。
这套错误类型体系也贯穿了项目的数据增强工具——一键支持 14 种语法错误增强(缺字漏字、错别字、缺少标点、主语不明、谓语残缺等),详见 ChineseErrorCorrector/README_DAT.md:
数据增强会对干净句子随机施加 1~4 种错误扰动,合成纠错训练数据:
VLLM 异步批量推理:信号量控制并发的工程实装 ⚡
批量纠错才是工程主战场。OpenAITextCorrectInfer用三个方法实现了高吞吐的 VLLM 异步批量推理:
_ainfer_one_detailed:通过AsyncOpenAI发起单条异步请求,请求前后持有信号量asyncio.Semaphore,并发数由CONCURRENCY(默认 16)控制,避免瞬间打满 vLLM 服务;ainfer_detailed:用asyncio.gather并发执行全部句子并保持结果顺序,确保输出与输入一一对应;infer_detailed(同步封装):内部调用asyncio.run,不懂异步的业务代码也能一行完成批量推理。
推理完成后,ChineseErrorCorrector/utils/correct_tools.py 中的res_format用difflib.SequenceMatcher对原句与纠正句做字级对齐,自动提取出每处错误的(原字、新字、位置),拼出最终输出结构:
[ { "source": "下个星期,我跟我朋唷打算去法国玩儿。", "target": "下个星期,我跟我朋友打算去法国玩儿。", "errors": [["唷", "友", 8]], "error_type": "错别字", "error_reason": "原句中的“朋唷”应为“朋友”,属于同音字误用……" } ]换成 v3 模型时结构不变,仅后两字段为null,接口完全版本透明。
可选加速:ELECTRA 字级门控省算力 💡
如果语料中有大量句子明显无错,让每句都走 4B 自回归生成是算力浪费。项目在 ChineseErrorCorrector/llm/infer/electra_char_gate_infer.py 提供可选的 ELECTRA 字级判别器门控:
- 在 config.py 中把
TextCorrectConfig.USE_DETECTOR置为True; - 主链路先让轻量 ELECTRA 对每个字打分,句子级最大错误概率(
max_p_err)超过阈值的句子才标记need_correct=True送 4B 大模型; - 无错句子直接保留原文,跳过高成本的自回归生成。
| 配置项 | 默认值 | 说明 |
|---|---|---|
USE_DETECTOR | False | 是否启用 ELECTRA 字级门控 |
DETECTOR_SENTENCE_THRESHOLD | 0.5 | 句级阈值(max_p_err) |
DETECTOR_MAX_LENGTH | 256 | 最大序列长度 |
DETECTOR_BATCH_SIZE | 32 | 门控 batch size |
门控模型参数量远小于 4B,GPU 前向可达每秒上百句量级。完整说明、性能对比与权重获取方式见 README_ELECTRA.md。
运行示例与输出结构速览
vLLM 服务启动后,直接运行入口脚本:
python ChineseErrorCorrector/main.py示例会批量纠正"对待每一项工作都要一丝不够。"与"大约半个小时左右"两个典型句子:前者"不够"被纠正为"不苟",后者删除赘余的"左右",并输出含原句、纠正句、字级错误列表及 v4 错误类型与修改原因的完整结构化结果。换用 v3 模型时,只需改CEC_OPENAI_MODEL环境变量,接口与输出结构保持不变。
部署清单:4 步走向生产 ✅
- 起服务:
vllm serve ChineseErrorCorrector4-4B,端口 8000,max-model-len建议 2048; - 配地址:修改 config.py 或用
CEC_OPENAI_*环境变量覆盖,模型名须与服务端一致; - 版本无忧:v3/v4 自动适配,v4 额外返回错误类型与修改原因,可直接做可解释性展示;
- 控成本:默认并发 16,数据无错比例高时开启 ELECTRA 字级门控,减少大模型调用次数。
整套架构把中文文本纠错的推理主链路收敛到配置、主入口、OpenAI 客户端三个文件,新手也能快速把它接进自己的业务系统。
【免费下载链接】ChineseErrorCorrector一个面向中文文本纠错任务的综合平台,集学术研究、模型训练、模型评测和推理部署于一体,文本纠错新Sota。( 2026 ACL Main Oral )项目地址: https://gitcode.com/gh_mirrors/ch/ChineseErrorCorrector
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考