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.

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.

-
license - not tested
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

  • Prose linter + AI-slop detector: weasel words, passive voice, hedging, and research-cited AI tells

  • Deterministic validation for AI-generated artifacts: JSON Schema, OpenAPI response, SQL syntax.

  • Lints + auto-fixes how AI coding agents discover any new product. 24 rules, 6 tools, score 0-100.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Golden2002/paeg-lang-style-plugin'

If you have feedback or need assistance with the MCP directory API, please join our Discord server