paeg-lang-style
paeg-lang-style
中文 | English
Qué es esto
paeg-lang-style es un módulo de normas lingüísticas del chino — arquitectura de tres capas (requisito del usuario):
Capa | Capacidad | Archivo principal |
Restricción de reglas gramaticales (la más importante) | Reglas léxicas/sintácticas/de puntuación como prompt del sistema, que dirigen al LLM a usar palabras completas, sintaxis completa y complementos circunstanciales suficientes — quien lo use lo ensambla |
|
Red de seguridad de palabras prohibidas | Diccionario de palabras prohibidas mantenido dinámicamente (lenguaje artificial de IA/palabras grandilocuentes vacías/falsa empatía/ánimos baratos/lenguaje de internet), como línea de defensa cuando el LLM no obedece |
|
Script de reescritura | Postprocesado de la salida del LLM: detecta reglas incumplidas → retroalimentación con ID de regla → reescritura Self-Refine en múltiples rondas |
|
Originado del agente educativo PAEG (iteraciones v0.12-v0.71), transformado en un plugin independiente sin dependencias del host — cualquier proyecto Python puede integrarlo.
Related MCP server: Chinese Sensitive Words MCP Server
Características principales
Conjunto de reglas ampliable: reglas externalizadas en
data/rules.json, añadir y se carga en caliente (RuleRegistry)Principios generales que dirigen al LLM: los principios de completitud léxica/completitud sintáctica/complementos circunstanciales suficientes hacen que el LLM generalice, en lugar de memorizar palabra por palabra (evita la estrechez de "solo convertir 倦 en 疲倦")
Red de seguridad determinista: reglas de capa explícita ("我在这里听着你。"→"我就在这里听你说说。") evitan que el LLM desobedezca
Bucle de retroalimentación con ID de regla: la retroalimentación de reescritura incluye "viola #rule-lx-001", formando un bucle regla-generación-retroalimentación
Diccionario dinámico de palabras prohibidas: alta/baja en tiempo de ejecución + carga en caliente desde JSON externo
Diseño por inyección:
chat_fnse inyecta obligatoriamente — conecta tu propia llamada al LLM, cero acoplamiento con el hostTres perfiles: general / teaching / confessional — ensambla el prompt del sistema según el escenario
Detección de sabor IA: 5 señales dimensionales: variación de longitud de frase/densidad de conectores/estructura de tres partes/raya/paralelismo de párrafos
8+ reglas gramaticales: norma de puntuación GB/T 15834 + seis tipos de frases incorrectas + normas del lenguaje docente
75 pruebas en verde + 20 segmentos de consistencia de comportamiento (igualdad de cadenas con la implementación original de PAEG)
Instalación
# 方式 1:pip 安装(推荐)
pip install -e /path/to/paeg-lang-style-plugin
# 方式 2:直接引用(零安装)
# 把 src/ 加入 sys.path 即可
import sys
sys.path.insert(0, "/path/to/paeg-lang-style-plugin/src")Requiere Python 3.9+. Cero dependencias de terceros en tiempo de ejecución.
Integración como servidor MCP (instala y úsalo directamente, como MCP)
Estándar de accesibilidad (§3.109): cualquier proyecto, tras
pip install, puede integrarse declarándolo en la configuración del cliente MCP — cero puente de código, cero dependencias del host.
# 方式 1:console_scripts 入口(pip install 后)
paeg-lang-style-mcp
# 方式 2:python -m 入口(源码运行)
python -m paeg_lang_style.mcp_serverDeclaración de configuración del cliente MCP (p. ej. config/mcp_servers.json):
{
"mcpServers": {
"paeg-lang-style": {
"command": "python",
"args": ["-m", "paeg_lang_style.mcp_server"],
"cwd": "D:/wbo-workspace/paeg_project/paeg-lang-style-plugin"
}
}
}Herramientas MCP expuestas (7):
Nombre de la herramienta | Función | read/write |
| Puerta de normas lingüísticas del texto (reglas L0 + reescritura L2) | read |
| Detección de sabor IA + informe de palabras prohibidas encontradas | read |
| Gestión del diccionario dinámico de palabras prohibidas (alta/baja/consulta) | write |
| Comprobación gramatical (8 tipos de reglas) | read |
| Señales de sabor IA en 5 dimensiones | read |
| Ensamblaje del prompt del sistema (quien lo use lo ensambla) | read |
| Listado del conjunto de reglas ampliable | read |
Inicio rápido
Tres pasos: instalar → ensamblar el prompt → procesar la salida.
from paeg_lang_style import RuleRegistry, make_refiner, gate_content
# Step 1: 语法规则拼进你的系统提示词(谁用都拼)
system_prompt = "你是教育智能体,负责讲解数学概念。"
system_prompt += RuleRegistry().build_prompt("teaching") # 通则层指挥 LLM
# Step 2: 注入你的 LLM 调用(改写脚本)
def my_llm(system, user, max_tokens=800, **kw):
return call_my_llm_api(system, user, max_tokens=max_tokens)
refiner = make_refiner(chat_fn=my_llm)
# Step 3: LLM 输出后处理(L0 规则 + L2 重写)
raw_output = "总的来说,让我们一起赋能这个时代!"
clean = gate_content(raw_output, refiner=refiner)
# → "我们把这个时代里的每一个孩子,把他们的潜能一步步唤起。"Índice
Conceptos principales
Arquitectura de tres capas + modelo de datos del conjunto de reglas — la ampliabilidad atraviesa los tres puntos: definición de reglas/detección/generación de prompts:
graph LR
A[LLM 生成文本] --> B[gate_content 守门]
B --> C{L0 规则检测}
C -->|命中列举层| D[确定性替换<br/>听着你→听你说说]
C -->|通则触发| E[L2 refiner.refine<br/>chat_fn 注入 LLM]
E --> F[反馈带规则 ID<br/>违反 #rule-lx-001]
F --> G[多轮 Self-Refine]
D --> H[输出]
G --> H
H --> I[收口: 规则再跑一遍]Modelo de datos de reglas (Rule — ampliable mediante JSON externo):
{
"id": "rule-lx-general-001",
"type": "general",
"category": "lexical",
"pattern": "(倦|乏|沉|累|苦|慌|虚|弱|低|烦|闷|困|急|乱)",
"replacement": null,
"message": "存在单字状态词——应扩展为完整双字词形",
"prompt_block": "### 词法完整通则(指挥 LLM 泛化)...",
"severity": "high",
"enabled": true,
"source": "builtin",
"profile_tags": ["general", "teaching", "confessional"]
}type: "general"(capa de principios generales):prompt_blockse inserta en el prompt del sistema y dirige al LLM a generalizar — "todo adjetivo monosilábico que exprese estado/sensación debe ampliarse a la forma bisilábica completa (倦/乏/沉/累/苦/慌/虚/弱/低/烦/闷/困/急/乱)". El LLM generaliza por sí mismo a palabras no enumeradas, en lugar de corregir solo "倦→疲倦".type: "explicit"(capa explícita):pattern + replacementcomo red de seguridad determinista — la última línea de defensa cuando el LLM no obedece.
Guía de integración para proyectos externos
Requisito del usuario: cualquier proyecto/agente que quiera usar nuestro módulo de reglas gramaticales, ¿cómo lo hace?
Escenario A: solo quiero usar la "restricción de reglas gramaticales" (prompt del sistema)
from paeg_lang_style import RuleRegistry
# 语法规则拼进自己的系统提示词(谁用都拼)
system = "你是我的客服机器人。"
system += RuleRegistry().build_prompt("general") # 或 "teaching" / "confessional"El fragmento de reglas devuelto por build_prompt(profile) (principio general de completitud léxica/principio general de completitud sintáctica/principio general de complementos circunstanciales suficientes/norma de puntuación) se concatena directamente en el system prompt de tu LLM. Esta es la esencia de "dirigir al LLM a usar palabras completas" — no depende de nuestro reescritor.
Escenario B: quiero usar el "script de reescritura" para procesar la salida del LLM
from paeg_lang_style import make_refiner, gate_content
# 注入你自己的 LLM 调用包装(chat_fn 强制注入,零宿主耦合)
def my_chat(system, user, max_tokens=800, **kw):
return call_your_llm(system, user, max_tokens=max_tokens)
refiner = make_refiner(chat_fn=my_chat)
clean = gate_content(your_llm_output, refiner=refiner) # L0 规则 + L2 重写
# 纯规则(不调 LLM):
clean = gate_content(your_llm_output) # 病句/违禁词确定性修正Escenario C: quiero usar el "diccionario de palabras prohibidas"
from paeg_lang_style import ForbiddenWords
fb = ForbiddenWords() # 内置违禁词(AI 腔/空洞大词/伪共情/网络用语)
fb.load_json("my_words.json") # 合并你自己的词库(动态扩充)
fb.add("你们公司的禁词") # 运行时新增
hits = fb.detect(text) # → ["禁词1", "禁词2"]Escenario D: quiero ampliar las reglas (ampliabilidad)
Edita data/rules.json, añade una regla y se carga en caliente:
{
"rules": [
{
"id": "rule-my-001",
"type": "explicit",
"category": "lexical",
"pattern": "你们行业的黑话",
"replacement": "规范说法",
"message": "这是行业黑话,应改规范",
"severity": "medium",
"enabled": true,
"source": "user",
"profile_tags": ["general"]
}
]
}reg = RuleRegistry()
reg.load("data/rules.json") # 合并(追加即生效)
reg.watch("data/rules.json") # mtime 变更自动热重载
reg.check_reload() # 每次调用前检查Escenario E: integración completa (incluido el bucle de retroalimentación con ID de regla)
from paeg_lang_style import RuleRegistry, make_refiner, gate_content, get_style_prompt
# 1. 系统提示词(规则 + 风格)
system = get_style_prompt("all") + "\n" + RuleRegistry().build_prompt("general")
# 2. 改写器(规则检测 → 反馈带 ID → 重写)
refiner = make_refiner(chat_fn=my_chat)
# 3. 守门(L0 规则 + L2 重写 + 收口)
final = gate_content(raw, refiner=refiner)Ampliabilidad
Punto de ampliación | Forma | Mecanismo |
Reglas gramaticales | Editar |
|
Palabras prohibidas |
| Mantenimiento dinámico en tiempo de ejecución |
Corpus | Sustituir | Parámetro |
Perfil | Añadir |
|
Backend LLM | Inyectar cualquier | Inyección obligatoria, cero acoplamiento con el host |
Contrato de ID de regla | El | Bucle regla-generación-retroalimentación, apto para telemetría |
Mantenibilidad
Cero dependencias del host: no importa ningún módulo del proyecto host, comprobable de forma independiente
Compatibilidad con API antigua:
rules.py/rules_enhanced.pyse conservan como envoltorios finos, compatibles hacia atrás75 pruebas: cobertura completa de carga del conjunto de reglas/recarga en caliente/detección/ensamblaje/ampliación por el usuario/tolerancia a corrupción
Consistencia de comportamiento: 20 segmentos de muestra con igualdad de cadenas frente a la implementación original de PAEG (cero deriva)
Tolerancia a corrupción: si el JSON se corrompe, se conserva el conjunto de reglas anterior, nunca "se vacía y se ejecuta"
Anti-inflación:
token_budgetcontrola la longitud del prompt del sistema (por defecto 800)Patrón claro: separación de responsabilidades entre la capa de principios generales (dirige al LLM) y la capa explícita (red de seguridad determinista)
Reglas gramaticales integradas
ID | Tipo | Categoría | Regla | Patrón de activación | Corrección |
| Principio general | Léxico | Completitud léxica | Palabras de estado monosilábicas (倦/乏/沉/累/苦/慌/虚/弱/低/烦/闷/困/急/乱) | Ampliar a forma bisilábica completa |
| Principio general | Sintaxis | Completitud sintáctica | Sujeto-verbo-objeto/verbo-objeto/preposición/oración compuesta | Componentes completos |
| Principio general | Sintaxis | Complementos circunstanciales suficientes | Frases cortas que empiezan por verbo/verbos aislados solos | Añadir complementos de tiempo/lugar/modo/condición/objeto/finalidad |
| Principio general | Puntuación | Norma de puntuación (GB/T 15834) | Coma de enumeración vs coma/coma tras "decir" | Puntuación normativa |
| Explícita | Léxico | 倦→疲倦 |
| Sustitución determinista |
| Explícita | Léxico | 乏→疲乏 |
| Sustitución determinista |
| Explícita | Léxico | 道出→说出来 |
| Sustitución determinista |
| Explícita | Léxico | 探知→探索并了解 |
| Sustitución determinista |
| Explícita | Sintaxis | "听着你" colgante |
| 听你说说 |
| Explícita | Sintaxis | Objeto colgante |
| Completar el objeto |
| Explícita | Sintaxis | Concordancia verbo-objeto |
| 有很重的分量 |
| Explícita | Sintaxis | Redundancia de traducción |
| Decir directamente el verbo |
| Explícita | Puntuación | Coma tras "decir" |
| Usar coma en su lugar |
Detalle del principio general de complementos circunstanciales suficientes (rule-sx-general-002, añadido por el usuario):
Cada acción/juicio debe explicitarse con complementos circunstanciales suficientes — tiempo, lugar, modo, condición, objeto, finalidad. "复习单词。" → "你可以在每天睡前用十分钟复习单词。" "使用这个软件。" → "你可以在每天固定的时间使用这个软件。"
Diccionario de palabras prohibidas
Categoría | Ejemplos |
Frases hechas de IA | 总的来说 / 综上所述 / 值得注意的是 / 让我们一起 |
Palabras grandilocuentes vacías | 赋能 / 点亮 / 激活 / 重塑 / 升级 / 全方位 |
Verbos de falsa empatía | 接住(情绪)/ 托住 / 兜住 / 我懂你 / 心疼你 |
Ánimos baratos | 加油 / 你真棒 / 你一定可以 |
Lenguaje de internet de baja calidad | yyds / 绝绝子 / 栓Q / 破防 / 内卷 / 躺平 / 宝子 |
Adjetivos de elogio vacíos | 深刻 / 全面 / 系统 / 本质 |
Forma de ampliación: ForbiddenWords().load_json("path.json") — estructura JSON {"extra_forbidden": [...], "ai_tells_extra": [...]}.
Referencia de API
RuleRegistry
Método | Firma | Descripción |
|
| Todas las reglas |
|
| Consultar regla por ID |
|
| Añadir en tiempo de ejecución (mismo ID sobrescribe la integrada) |
|
| Eliminar en tiempo de ejecución |
|
| Fusionar JSON externo (carga en caliente) |
|
| Monitorización de mtime |
|
| Comprobar y recargar |
|
| Detectar reglas incumplidas |
|
| Sustitución determinista |
|
| Ensamblar prompt del sistema |
LanguageRefiner / make_refiner
Método | Firma | Descripción |
|
| Fábrica (chat_fn obligatorio) |
|
| Reescritura Self-Refine en múltiples rondas |
|
| Comprobación gramatical |
|
| Palabras prohibidas encontradas |
|
| Señales de sabor IA |
gate_content / gate_short
Función | Firma | Descripción |
|
| Reglas L0 + reescritura L2 |
|
| Ruta rápida para textos cortos (solo L0) |
ForbiddenWords
Método | Firma | Descripción |
|
| Alta/baja en tiempo de ejecución |
|
| Fusionar diccionario externo |
|
| Lista de palabras encontradas |
|
| Total de coincidencias |
get_style_prompt
Parámetro | Descripción |
| Prompt completo de estilo lingüístico |
| Por secciones |
| Concatenación de varias secciones |
Referencia de configuración
Variables de entorno
Variable | Valor por defecto | Descripción |
|
| Sobrescribir la ruta del conjunto de reglas |
Archivos data/
Archivo | Uso | Ampliable |
| Conjunto de reglas gramaticales | Sí, añadir y se carga en caliente |
| Diccionario de palabras prohibidas | Sí, mantenimiento dinámico |
| Corpus few-shot | Sí, sustituible |
Diseño de arquitectura
宿主系统(任何 Python 项目 / 智能体)
system_prompt += RuleRegistry().build_prompt() <- 语法规则拼系统提示词(谁用都拼)
gate_content(output, refiner=make_refiner(chat)) <- 输出后处理
|
| 零宿主依赖(不 import 宿主任何模块)
v
paeg_lang_style(独立插件)
+------------------+ +-----------------+ +-----------------+
| rule_registry | | forbidden.py | | ai_taste.py |
| 可扩充规则集 | | 动态违禁词库 | | AI 味检测 |
+--------+---------+ +--------+--------+ +--------+--------+
| | |
v v v
+-----------------------------------------------------------+
| refiner.py(改写脚本:chat_fn 注入 + 规则 ID 闭环) |
| gate.py(守门入口:L0+L2 编排) |
+-----------------------------------------------------------+
data/(rules.json / forbidden_words.json / 语料)Integración con el proyecto principal PAEG
El agente educativo PAEG se integra mediante la única capa de adaptación infra/lang_plugin_bridge.py (regla de hierro R18/R20 de cero rupturas):
from infra.lang_plugin_bridge import gate_content, get_style_prompt, make_refiner
# 插件挂载 → 走插件;插件未挂载 → 静默回退 PAEG 原实现(旧文件永不删除)Pruebas
python -m pytest tests/ -q
# 75 项:规则集加载/热重载/检测/拼装/用户扩充/损坏容错 + 通则 + 充分状语 + 行为一致性Guía de contribución
¡Las contribuciones son bienvenidas! Consulta CONTRIBUTING.md (pendiente de creación) para saber:
Nueva regla de sintaxis: edite
data/rules.jsonpara añadirRule(con pruebas)Nueva palabra prohibida:
ForbiddenWords.load_jsono envíe directamente un PR al diccionario integradoEstilo de código: siga la estructura de módulos existente + las normas de comentarios
Registro de cambios
Consulte CHANGELOG.md.
Agradecimientos
Agente educativo PAEG (iteraciones v0.12-v0.71) — este plugin se extrajo de su módulo de especificaciones lingüísticas
LanguageTool — paradigma de motor declarativo de reglas (dev.languagetool.org)
textstat — paradigma de medición de legibilidad (github.com/textstat/textstat)
GB/T 15834-2011《Uso de los signos de puntuación》 — norma nacional para las reglas de puntuación
Estándar Agent Skills — paradigma de divulgación progresiva (agentskills.io)
Licencia
MIT © 2026 PAEG Team — consulte el archivo LICENSE.
This server cannot be deployed
Maintenance
Related MCP Connectors
中文内容合规检查:广告法违禁词 + AI 标识规则,逐条给出法条依据。Chinese content compliance: ad-law banned terms + AI labeling.
Chinese web novel MCP: 36 tools (outline, prose, review, coach, KD export). BYOK, no API key.
DraftCheck: flags AI-writing patterns in prose with fix hints. Deterministic linter, not a detector.
Toxicity, sentiment, NER, PII detection, and language identification tools
Related MCP Servers
- FlicenseAqualityBmaintenanceL1-aware grammar, style, translation & tone tools with 70 local rules. Zero API keys needed.4-
- AlicenseAqualityCmaintenanceDetects Chinese sensitive/forbidden words across platforms like Xiaohongshu, Douyin, Kuaishou, and Bilibili, with risk levels and replacement suggestions.240 npm104MIT
- AlicenseBqualityBmaintenanceLocal-first toolkit with 16 tools for Chinese web-novel (网文) authors: style baselines, foreshadowing and plot-thread tracking, continuity & OOC audits, keyword and sentence-pattern analysis, and offline semantic search. No API key, no network — everything runs on your machine.19986 npm22MIT
- AlicenseAqualityCmaintenanceProvides AI models with tools to proofread and format Chinese text before delivery, covering typos, punctuation, casing, spacing, and platform-specific character limits. It runs as a zero-dependency MCP service so the model checks and fixes its own Chinese writing automatically.41MIT