Skip to main content
Glama

paeg-lang-style

Python License: MIT Tests PRs Welcome

Deutsch | English


Was ist das?

paeg-lang-style ist ein Modul für chinesische Sprachstandards – Drei-Schichten-Architektur (Nutzeranforderung):

Schicht

Fähigkeit

Kern-Dateien

Syntaxregel-Constraint (am wichtigsten)

Lexikalische/syntaktische/Interpunktionsregeln als System-Prompt, die das LLM anweisen, vollständige Wörter, vollständige Syntax und ausreichende Adverbiale zu verwenden – für jeden nutzbar

rule_registry.py + prompts/builder.py

Verbotsvokabular-Absicherung

Dynamisch gepflegte Verbotsvokabular-Datenbank (KI-Sprech/leere Schlagwörter/Pseudo-Empathie/ billige Ermutigung/Netzjargon), als Untergrenze, falls das LLM nicht gehorcht

forbidden.py

Umschreibungs-Skript

LLM-Ausgabe-Nachbearbeitung: Regel-Treffer erkennen → Feedback mit Regel-ID → mehrstufiges Self-Refine-Umschreiben

refiner.py + gate.py

Stammt aus dem PAEG-Bildungsagenten (Iterationen v0.12–v0.71), umgebaut zu einem host-unabhängigen eigenständigen Plugin – jedes Python-Projekt kann es anbinden.

Related MCP server: Chinese Sensitive Words MCP Server

Kernfunktionen

  • Erweiterbarer Regelsatz: Regeln extern in data/rules.json, Anhängen lädt sie sofort nach (RuleRegistry)

  • Allgemeine Regeln steuern das LLM: Vollständige Lexik/vollständige Syntax/ausreichende Adverbiale als allgemeine Regeln lassen das LLM generalisieren, statt Wort für Wort zu memorieren (vermeidet die Engstirnigkeit von „nur 倦 zu 疲倦 zu optimieren")

  • Deterministische Absicherung: Explizite Regeln („我在这里听着你。"→„我就在这里听你说说。") als Schutz, falls das LLM nicht gehorcht

  • Regel-ID-Feedback-Schleife: Umschreibungs-Feedback trägt „Verstoß gegen #rule-lx-001", bildet eine Regel-Generierung-Feedback-Schleife

  • Dynamische Verbotsvokabular-Datenbank: Laufzeit-Hinzufügen/-Entfernen + externes JSON-Hot-Reload

  • Injektions-Design: chat_fn wird erzwungen injiziert – binde deinen eigenen LLM-Aufruf an, null Host-Kopplung

  • Drei Profile: general / teaching / confessional – System-Prompts je nach Szenario zusammensetzen

  • KI-Geschmack-Erkennung: 5-dimensionale Signale: Satzlängen-Variation/Übergangswort-Dichte/Dreiteiligkeit/Gedankenstrich/Absatz-Symmetrie

  • 8+ Syntaxregeln: GB/T 15834-Interpunktionsnorm + sechs Kategorien fehlerhafter Sätze + Normen für Unterrichtssprache

  • 75 Tests alle grün + 20 Abschnitte Verhaltenskonsistenz (String-Gleichheit vs. PAEG-Originalimplementierung)

Installation

# 方式 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")

Erfordert Python 3.9+. Null Abhängigkeiten von Drittanbietern zur Laufzeit.

Als MCP-Server anbinden (wie MCP direkt installieren und nutzen)

Barrierefreiheitsstandard (§3.109): Jedes Projekt kann nach pip install durch eine Deklaration in der MCP-Client-Konfiguration angebunden werden – Null-Code-Brücke, Null-Host-Abhängigkeit.

# 方式 1:console_scripts 入口(pip install 后)
paeg-lang-style-mcp

# 方式 2:python -m 入口(源码运行)
python -m paeg_lang_style.mcp_server

MCP-Client-Konfigurationsdeklaration (z. B. 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"
    }
  }
}

Bereitgestellte MCP-Tools (7):

Toolname

Funktion

read/write

normalize_text

Text-Sprachstandard-Wächter (L0-Regeln + L2-Umschreibung)

read

language_policy_check

KI-Geschmack-Erkennung + Verbotsvokabular-Trefferbericht

read

forbidden_words

Verwaltung der dynamischen Verbotsvokabular-Datenbank (hinzufügen/entfernen/prüfen)

write

check_grammar

Grammatikprüfung (8 Regelkategorien)

read

check_ai_taste

KI-Geschmack 5-dimensionale Signale

read

build_style_prompt

System-Prompt-Zusammenbau (für jeden nutzbar)

read

list_rules

Liste des erweiterbaren Regelsatzes

read

Schnellstart

Drei Schritte: Installieren → Prompt zusammensetzen → Ausgabe verarbeiten.

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)
# → "我们把这个时代里的每一个孩子,把他们的潜能一步步唤起。"

Inhaltsverzeichnis

Kernkonzepte

Drei-Schichten-Architektur + Regelsatz-Datenmodell – Erweiterbarkeit durchgängig an drei Stellen: Regeldefinition/Erkennung/Prompt-Generierung:

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[收口: 规则再跑一遍]

Regel-Datenmodell (Rule – externes JSON erweiterbar):

{
  "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" (Allgemeine Ebene): prompt_block wird in den System-Prompt eingefügt und weist das LLM zur Generalisierung an – „Alle einstelligen Adjektive, die Zustand/Gefühl ausdrücken, werden grundsätzlich zur vollständigen zweistelligen Wortform erweitert (倦/乏/沉/累/苦/慌/虚/弱/低/烦/闷/困/急/乱)". Das LLM generalisiert selbst auf nicht aufgeführte Wörter, statt nur „倦→疲倦" zu korrigieren.

  • type: "explicit" (Explizite Ebene): pattern + replacement als deterministische Absicherung – letzte Verteidigungslinie, wenn das LLM nicht gehorcht.

Anbindungsleitfaden für externe Projekte

Nutzeranforderung: Jedes Projekt/jeder Agent, der unser Syntaxregel-Modul nutzen möchte – wie geht das?

Szenario A: Nur „Syntaxregel-Constraint" nutzen (System-Prompt)

from paeg_lang_style import RuleRegistry

# 语法规则拼进自己的系统提示词(谁用都拼)
system = "你是我的客服机器人。"
system += RuleRegistry().build_prompt("general")   # 或 "teaching" / "confessional"

Die von build_prompt(profile) zurückgegebenen Regel-Ausschnitte (Allgemeine Regel vollständige Lexik/Allgemeine Regel vollständige Syntax/Allgemeine Regel ausreichende Adverbiale/Interpunktionsnorm) direkt in den System-Prompt deines LLM einfügen. Das ist das Wesen von „das LLM zur Verwendung vollständiger Wörter anweisen" – ohne Abhängigkeit von unserem Umschreiber.

Szenario B: „Umschreibungs-Skript" zur Verarbeitung der LLM-Ausgabe nutzen

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)                    # 病句/违禁词确定性修正

Szenario C: „Verbotsvokabular-Datenbank" nutzen

from paeg_lang_style import ForbiddenWords

fb = ForbiddenWords()                     # 内置违禁词(AI 腔/空洞大词/伪共情/网络用语)
fb.load_json("my_words.json")             # 合并你自己的词库(动态扩充)
fb.add("你们公司的禁词")                  # 运行时新增
hits = fb.detect(text)                    # → ["禁词1", "禁词2"]

Szenario D: Regeln erweitern (Erweiterbarkeit)

data/rules.json bearbeiten, eine Regel anhängen lädt sie sofort nach:

{
  "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()             # 每次调用前检查

Szenario E: Vollständige Anbindung (inkl. Regel-ID-Feedback-Schleife)

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)

Erweiterbarkeit

Erweiterungspunkt

Methode

Mechanismus

Syntaxregeln

data/rules.json bearbeiten, Rule anhängen

RuleRegistry.load() führt zusammen + watch() Hot-Reload + PAEG_RULES_PATH-Umgebungsvariable überschreibt Pfad

Verbotsvokabular

ForbiddenWords.load_json("benutzerdefiniert.json") / add() / remove()

Laufzeit dynamisch pflegen

Korpus

data/weil_corpus.json durch neutralen Korpus ersetzen

corpus_path-Parameter beim Konstruieren

Profile

Beim Hinzufügen einer Regel profile_tags ergänzen

build_prompt(profile) filtert nach Szenario

LLM-Backend

Beliebige chat_fn injizieren

Erzwungene Injektion, null Host-Kopplung

Regel-ID-Vertrag

Regel-id stabil, Feedback referenziert sie

Regel-Generierung-Feedback-Schleife, für Telemetrie geeignet

Wartbarkeit

  • Null Host-Abhängigkeit: Importiert keine Module des Host-Projekts, unabhängig testbar

  • Alt-API-Kompatibilität: rules.py/rules_enhanced.py bleiben als dünne Wrapper, abwärtskompatibel

  • 75 Tests: Vollständige Abdeckung von Regelsatz-Laden/Hot-Reload/Erkennung/Zusammenbau/Nutzererweiterung/Beschädigungstoleranz

  • Verhaltenskonsistenz: 20 Stichproben vs. PAEG-Originalimplementierung String-Gleichheit (null Drift)

  • Beschädigungstoleranz: Bei beschädigtem JSON bleibt der vorherige Regelsatz erhalten, niemals „leer laufen"

  • Aufblähungsschutz: token_budget steuert die Länge des System-Prompts (Standard 800)

  • Klares Muster: Allgemeine Ebene (steuert das LLM) und explizite Ebene (deterministische Absicherung) mit getrennten Zuständigkeiten

Integrierte Syntaxregeln

ID

Typ

Kategorie

Regel

Auslösemuster

Korrektur

rule-lx-general-001

Allgemein

Lexik

Vollständige Lexik

Einstellige Zustandswörter (倦/乏/沉/累/苦/慌/虚/弱/低/烦/闷/困/急/乱)

Erweiterung zur vollständigen zweistelligen Wortform

rule-sx-general-001

Allgemein

Syntax

Vollständige Syntax

Subjekt-Prädikat-Objekt/Verb-Objekt/Präposition/Komposita

Alle Satzglieder vorhanden

rule-sx-general-002

Allgemein

Syntax

Ausreichende Adverbiale

Kurzsätze, die mit Verb beginnen/vereinzelte nackte Verben

Zeit/Ort/Art/Bedingung/Objekt/Zweck-Adverbiale ergänzen

rule-pn-general-001

Allgemein

Interpunktion

Interpunktionsnorm (GB/T 15834)

Aufzählungskomma vs. Komma/Doppelpunkt nach „sagen"

Interpunktionsnorm

rule-lx-001

Explizit

Lexik

倦→疲倦

觉得倦了|感到倦|已倦

Deterministische Ersetzung

rule-lx-002

Explizit

Lexik

乏→疲乏

的乏($|[,。;])

Deterministische Ersetzung

rule-lx-003

Explizit

Lexik

道出→说出来

道出

Deterministische Ersetzung

rule-lx-004

Explizit

Lexik

探知→探索并了解

探知

Deterministische Ersetzung

rule-sx-001~004

Explizit

Syntax

„听着你" schwebend

(我在这里|在这里|我)?听着你 + Satzende

听你说说

rule-sx-005

Explizit

Syntax

Schwebendes Objekt

与你探讨$ usw.

Objekt ergänzen

rule-sx-006

Explizit

Syntax

Verb-Objekt-Kollokation

带着(重量|分量)

有很重的分量

rule-sx-007

Explizit

Syntax

Übersetzungsfloskel-Redundanz

进行(一个)?(分析|讨论|思考)

Verb direkt nennen

rule-pn-001

Explizit

Interpunktion

Komma nach „sagen"

说:"

Komma verwenden

Details zur Allgemeinen Regel „Ausreichende Adverbiale" (rule-sx-general-002, vom Nutzer hinzugefügt):

Jede Handlung/jedes Urteil mit ausreichenden Adverbialen klar machen – Zeit, Ort, Art, Bedingung, Objekt, Zweck. „复习单词。" → „你可以在每天睡前用十分钟复习单词。" „使用这个软件。" → „你可以在每天固定的时间使用这个软件。"

Verbotsvokabular-Datenbank

Kategorie

Beispiele

KI-Sprech-Floskeln

总的来说 / 综上所述 / 值得注意的是 / 让我们一起

Leere Schlagwörter

赋能 / 点亮 / 激活 / 重塑 / 升级 / 全方位

Pseudo-Empathie-Verben

接住(情绪)/ 托住 / 兜住 / 我懂你 / 心疼你

Billige Ermutigung

加油 / 你真棒 / 你一定可以

Minderwertiger Netzjargon

yyds / 绝绝子 / 栓Q / 破防 / 内卷 / 躺平 / 宝子

Leere Lob-Adjektive

深刻 / 全面 / 系统 / 本质

Erweiterungsmethode: ForbiddenWords().load_json("path.json") – JSON-Struktur {"extra_forbidden": [...], "ai_tells_extra": [...]}.

API-Referenz

RuleRegistry

Methode

Signatur

Beschreibung

all()

() -> list[Rule]

Alle Regeln

by_id(id)

(str) -> Rule|None

Regel nach ID nachschlagen

add_rule(rule)

(dict) -> bool

Laufzeit hinzufügen (gleiche ID überschreibt eingebaute)

remove_rule(id)

(str) -> bool

Laufzeit entfernen

load(path)

(str|None) -> int

Externes JSON zusammenführen (Hot-Reload)

watch(path)

(str|None) -> None

mtime-Überwachung

check_reload()

() -> bool

Prüfen und neu laden

detect(text, profile)

(str, str|None) -> list[Rule]

Treffende Regeln erkennen

apply_explicit(text, profile)

(str, str|None) -> str

Deterministische Ersetzung

build_prompt(profile, token_budget)

(str, int) -> str

System-Prompt zusammenbauen

LanguageRefiner / make_refiner

Methode

Signatur

Beschreibung

make_refiner(chat_fn, llm, corpus_path)

(*, chat_fn, ...) -> LanguageRefiner

Fabrik (chat_fn Pflicht)

refine(text, context, max_rounds)

(str, str, int) -> str

Mehrstufiges Self-Refine-Umschreiben

check_grammar(text)

(str) -> list

Grammatikprüfung

detect_ai_tells(text)

(str) -> list

Verbotsvokabular-Treffer

detect_ai_taste_signals(text)

(str) -> AITasteSignals

KI-Geschmack-Signale

gate_content / gate_short

Funktion

Signatur

Beschreibung

gate_content(text, context, apply_l2, refiner, polish_fn)

(str, str, bool, refiner|None, fn|None) -> str

L0-Regeln + L2-Umschreibung

gate_short(text, context, refiner, polish_fn)

(str, str, ...) -> str

Schnellpfad für kurze Texte (nur L0)

ForbiddenWords

Methode

Signatur

Beschreibung

add(word) / remove(word)

(str) -> bool

Laufzeit hinzufügen/entfernen

load_json(path)

(str|None) -> int

Externes Vokabular zusammenführen

detect(text)

(str) -> list

Liste der Trefferwörter

detect_count(text)

(str) -> int

Gesamtzahl der Treffer

get_style_prompt

Parameter

Beschreibung

"all"

Vollständiger Sprachstil-Prompt

"weil" / "lexicon" / "syntax" / "forbidden"

Einzelne Abschnitte

["weil", "syntax"]

Mehrere Abschnitte zusammengefügt

Konfigurationsreferenz

Umgebungsvariablen

Variable

Standardwert

Beschreibung

PAEG_RULES_PATH

src/paeg_lang_style/data/rules.json

Pfadüberschreibung für Regelsatz

data/-Dateien

Datei

Zweck

Erweiterbar

data/rules.json

Syntaxregelsatz

Ja, Anhängen lädt sofort nach

data/forbidden_words.json

Verbotsvokabular-Datenbank

Ja, dynamisch gepflegt

data/weil_corpus.json

Korpus few-shot

Ja, ersetzbar

Architekturdesign

宿主系统(任何 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 / 语料)

Integration mit dem PAEG-Hauptprojekt

Der PAEG-Bildungsagent bindet über die einzige Adapterschicht infra/lang_plugin_bridge.py an (R18/R20-Null-Bruch-Eisernes-Gesetz):

from infra.lang_plugin_bridge import gate_content, get_style_prompt, make_refiner
# 插件挂载 → 走插件;插件未挂载 → 静默回退 PAEG 原实现(旧文件永不删除)

Siehe docs/integration_paeg.md.

Tests

python -m pytest tests/ -q
# 75 项:规则集加载/热重载/检测/拼装/用户扩充/损坏容错 + 通则 + 充分状语 + 行为一致性

Beitragsleitfaden

Beiträge sind willkommen! Bitte lies CONTRIBUTING.md (in Arbeit), um zu erfahren:

  • Neue Grammatikregeln: Bearbeite data/rules.json und füge Rule hinzu (mit Tests)

  • Verbotene Wörter hinzufügen: ForbiddenWords.load_json oder direkt einen PR für die integrierte Wortliste einreichen

  • Code-Stil: bestehende Modulstruktur + Kommentarkonventionen befolgen

Änderungsprotokoll

Siehe CHANGELOG.md.

Danksagungen

  • PAEG-Bildungsagent (Iterationen v0.12-v0.71) — Dieses Plugin wurde aus seinem Sprachspezifikationsmodul extrahiert

  • LanguageTool — Paradigma der deklarativen Regel-Engine (dev.languagetool.org)

  • textstat — Paradigma der Lesbarkeitsmessung (github.com/textstat/textstat)

  • GB/T 15834-2011 „Verwendung von Satzzeichen“ — Nationaler Standard für Zeichensetzungsregeln

  • Agent Skills Standard — Paradigma der progressiven Offenlegung (agentskills.io)

Lizenz

MIT © 2026 PAEG Team — Näheres siehe Datei LICENSE.

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    B
    maintenance
    Local-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.
    19
    986 npm
    22
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Provides 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.
    4
    1
    MIT