Skip to main content
Glama

paeg-lang-style

Python License: MIT Tests PRs Welcome

日本語 | English


これは何か

paeg-lang-style は中国語言語規範モジュール——三層アーキテクチャ(ユーザー要件):

層

能力

コアファイル

構文ルール制約(最重要)

語彙/構文/句読点ルールをシステムプロンプトとして、LLM に完全な語、完全な構文、十分な副詞句の使用を指示——誰が使っても通用する

rule_registry.py + prompts/builder.py

禁止語フォールバック

動的に維持する禁止語辞書(AI 腔/空虚な大言壮語/偽共感/安っぽい励まし/ネット用語)、LLM が言うことを聞かない場合の最後の砦

forbidden.py

リライトスクリプト

LLM 出力後処理:ルール命中の検出 → ルール ID 付きフィードバック → 複数回の Self-Refine リライト

refiner.py + gate.py

PAEG 教育エージェント(v0.12-v0.71 のイテレーション)に由来し、ホスト依存ゼロの独立プラグインとして再設計——あらゆる Python プロジェクトに接続可能。

Related MCP server: Chinese Sensitive Words MCP Server

コア機能

  • 拡張可能なルールセット:ルールを data/rules.json に外部化、追記するだけでホットロード(RuleRegistry)

  • 通則で LLM を指揮:語彙完全/構文完全/十分な副詞句の通則により、LLM が単語単位で暗記するのではなく汎化する(「倦」を「疲倦」に直すだけの狭さを回避)

  • 決定的フォールバック:列挙層ルール(「我在这里听着你。」→「我就在这里听你说说。」)で LLM が言うことを聞かない場合に備える

  • ルール ID フィードバックループ:リライトフィードバックに「违反 #rule-lx-001」を含め、ルール-生成-フィードバックのループを形成

  • 動的禁止語辞書:実行時の追加/削除 + 外部 JSON のホットロード

  • 注入型設計:chat_fn を強制注入——自身の LLM 呼び出しを接続、ホスト結合ゼロ

  • profile 3 段階:general / teaching / confessional——シナリオに応じてシステムプロンプトを組み立て

  • AI 味検出:文長の変動/接続詞密度/三段構成/ダッシュ/段落対称性の 5 次元シグナル

  • 8+ 構文ルール:GB/T 15834 句読点規範 + 病文 6 分類 + 教学言語規範

  • 75 項目のテスト全緑 + 20 セグメントの動作一貫性(PAEG オリジナル実装と文字列一致)

インストール

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

要件: Python 3.9+。サードパーティ製ランタイム依存ゼロ。

MCP サーバーとして接続(MCP のようにインストールするだけで即使用可能)

到達可能性基準(§3.109):任意のプロジェクトで pip install 後、MCP クライアント設定で宣言するだけで接続可能——ゼロコードブリッジ、ゼロホスト依存。

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

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

MCP クライアント設定宣言(例: 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"
    }
  }
}

公開 MCP ツール(7 個):

ツール名

機能

read/write

normalize_text

テキスト言語規範ゲート(L0 ルール + L2 リライト)

read

language_policy_check

AI 味検出 + 禁止語ヒットレポート

read

forbidden_words

動的禁止語辞書管理(追加/削除/照会)

write

check_grammar

文法チェック(8 分類ルール)

read

check_ai_taste

AI 味 5 次元シグナル

read

build_style_prompt

システムプロンプト組み立て(誰が使っても通用)

read

list_rules

拡張可能ルールセット一覧

read

クイックスタート

3 ステップ:インストール → プロンプト組み立て → 出力処理。

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

目次

コアコンセプト

三層アーキテクチャ + ルールセットデータモデル——拡張性はルール定義/検出/プロンプト生成の 3 箇所に貫通:

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

ルールデータモデル(Rule——外部 JSON で拡張可能):

{
  "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"(通則層):prompt_block をシステムプロンプトに組み込み、LLM に汎化を指示——「状態/感覚を表す一文字形容詞はすべて完全な二文字語形に拡張せよ(倦/乏/沉/累/苦/慌/虚/弱/低/烦/闷/困/急/乱)」。LLM は列挙されていない語にも自己汎化する。「倦→疲倦」だけを直すのではない。

  • type: "explicit"(列挙層):pattern + replacement による決定的フォールバック——LLM が言うことを聞かない場合の最後の防衛線。

外部プロジェクト接続ガイド

ユーザー要件:任意のプロジェクト/エージェントが当構文ルールモジュールを使いたい場合、どうすればよいか?

シナリオ A:単に「構文ルール制約」(システムプロンプト)だけを使いたい

from paeg_lang_style import RuleRegistry

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

build_prompt(profile) が返すルール断片(語彙完全通則/構文完全通則/十分な副詞句通則/句読点規範)を、 そのまま LLM の system prompt に連結する。これが「LLM に完全な語の使用を指示する」本質——当リライターには依存しない。

シナリオ B:「リライトスクリプト」で 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)                    # 病句/违禁词确定性修正

シナリオ C:「禁止語辞書」を使いたい

from paeg_lang_style import ForbiddenWords

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

シナリオ D:ルールを拡張したい(拡張性)

data/rules.json を編集し、ルールを 1 件追記するだけでホットロード:

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

シナリオ E:完全統合(ルール ID フィードバックループ含む)

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)

拡張性

拡張ポイント

方法

メカニズム

構文ルール

data/rules.json を編集して Rule を追記

RuleRegistry.load() でマージ + watch() でホットリロード + PAEG_RULES_PATH 環境変数でパス上書き

禁止語

ForbiddenWords.load_json("自定义.json") / add() / remove()

実行時に動的維持

コーパス

data/weil_corpus.json をニュートラルなコーパスに置換

コンストラクタの corpus_path パラメータ

profile

新ルール追加時に profile_tags を追加

build_prompt(profile) がシナリオに応じてフィルタ

LLM バックエンド

任意の chat_fn を注入

強制注入、ホスト結合ゼロ

ルール ID 契約

ルール id は安定、フィードバックで参照

ルール-生成-フィードバックのループ、telemetry に便利

保守性

  • ホスト依存ゼロ:ホストプロジェクトのモジュールを一切 import せず、独立してテスト可能

  • 旧 API 互換:rules.py/rules_enhanced.py は薄いラッパーとして維持、後方互換

  • 75 項目のテスト:ルールセット読み込み/ホットリロード/検出/組み立て/ユーザー拡張/破損フォールトトレランスを網羅

  • 動作一貫性:20 セグメントのサンプルが PAEG オリジナル実装と文字列一致(ゼロドリフト)

  • 破損フォールトトレランス:JSON 破損時は前回のルールセットを保持、「空にして実行」は絶対にしない

  • 膨張防止:token_budget でシステムプロンプト長を制御(デフォルト 800)

  • 明確なパターン:通則層(LLM を指揮)と列挙層(決定的フォールバック)の責務分離

組み込み構文ルール

ID

タイプ

カテゴリ

ルール

トリガーパターン

修正

rule-lx-general-001

通則

語彙

語彙完全

一文字状態語(倦/乏/沉/累/苦/慌/虚/弱/低/烦/闷/困/急/乱)

完全な二文字語形に拡張

rule-sx-general-001

通則

構文

構文完全

主語述語目的語/動詞目的語/前置詞/複合文

成分が揃っている

rule-sx-general-002

通則

構文

十分な副詞句

動詞で始まる短文/孤立した単独動詞

時間/場所/方法/条件/対象/目的の副詞句を補う

rule-pn-general-001

通則

句読点

句読点規範(GB/T 15834)

読点 vs コンマ/発言後のコロン

句読点規範

rule-lx-001

列挙

語彙

倦→疲倦

觉得倦了|感到倦|已倦

決定的置換

rule-lx-002

列挙

語彙

乏→疲乏

的乏($|[,。;])

決定的置換

rule-lx-003

列挙

語彙

道出→说出来

道出

決定的置換

rule-lx-004

列挙

語彙

探知→探索并了解

探知

決定的置換

rule-sx-001~004

列挙

構文

「听着你」の宙吊り

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

听你说说

rule-sx-005

列挙

構文

宙吊り目的語

与你探讨$ など

目的語を補う

rule-sx-006

列挙

構文

動詞目的語の搭配

带着(重量|分量)

有很重的分量

rule-sx-007

列挙

構文

翻訳調の冗長

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

動詞を直接言う

rule-pn-001

列挙

句読点

発言後のコンマ

说:"

コンマに変更

十分な副詞句通則の詳細(rule-sx-general-002、ユーザー追加):

各動作/判断に十分な副詞句で明確に説明する——時間、場所、方法、条件、対象、目的。 「复习单词。」 → 「你可以在每天睡前用十分钟复习单词。」 「使用这个软件。」 → 「你可以在每天固定的时间使用这个软件。」

禁止語辞書

カテゴリ

例

AI 腔の決まり文句

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

空虚な大言壮語

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

偽共感動詞

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

安っぽい励まし

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

低質なネット用語

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

空虚な賛美形容詞

深刻 / 全面 / 系统 / 本质

拡張方法:ForbiddenWords().load_json("path.json")——JSON 構造 {"extra_forbidden": [...], "ai_tells_extra": [...]}。

API リファレンス

RuleRegistry

メソッド

シグネチャ

説明

all()

() -> list[Rule]

全ルール

by_id(id)

(str) -> Rule|None

ID でルールを照会

add_rule(rule)

(dict) -> bool

実行時に追加(同 ID は組み込みを上書き)

remove_rule(id)

(str) -> bool

実行時に削除

load(path)

(str|None) -> int

外部 JSON をマージ(ホットロード)

watch(path)

(str|None) -> None

mtime 監視

check_reload()

() -> bool

チェックしてリロード

detect(text, profile)

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

ヒットしたルールを検出

apply_explicit(text, profile)

(str, str|None) -> str

決定的置換

build_prompt(profile, token_budget)

(str, int) -> str

システムプロンプトを組み立て

LanguageRefiner / make_refiner

メソッド

シグネチャ

説明

make_refiner(chat_fn, llm, corpus_path)

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

ファクトリ(chat_fn 必須)

refine(text, context, max_rounds)

(str, str, int) -> str

複数回 Self-Refine リライト

check_grammar(text)

(str) -> list

文法チェック

detect_ai_tells(text)

(str) -> list

禁止語ヒット

detect_ai_taste_signals(text)

(str) -> AITasteSignals

AI 味シグナル

gate_content / gate_short

関数

シグネチャ

説明

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

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

L0 ルール + L2 リライト

gate_short(text, context, refiner, polish_fn)

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

短文の高速パス(L0 のみ)

ForbiddenWords

メソッド

シグネチャ

説明

add(word) / remove(word)

(str) -> bool

実行時に追加/削除

load_json(path)

(str|None) -> int

外部辞書をマージ

detect(text)

(str) -> list

ヒット語リスト

detect_count(text)

(str) -> int

ヒット総数

get_style_prompt

パラメータ

説明

"all"

全量の言語スタイルプロンプト

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

セグメント

["weil", "syntax"]

複数セグメント連結

設定リファレンス

環境変数

変数

デフォルト値

説明

PAEG_RULES_PATH

src/paeg_lang_style/data/rules.json

ルールセットパスの上書き

data/ ファイル

ファイル

用途

拡張可能

data/rules.json

構文ルールセット

はい、追記で即ホットロード

data/forbidden_words.json

禁止語辞書

はい、動的維持

data/weil_corpus.json

コーパス few-shot

はい、置換可能

アーキテクチャ設計

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

PAEG メインプロジェクトとの統合

PAEG 教育エージェントは唯一のアダプテーション層 infra/lang_plugin_bridge.py を通じて接続(R18/R20 ゼロ破壊の鉄則):

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

詳細は docs/integration_paeg.md を参照。

テスト

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

貢献ガイド

貢献歓迎! CONTRIBUTING.md(未作成)をお読みください:

  • 新しい構文ルール:data/rules.json を編集して Rule を追加(テスト含む)

  • 新しい禁止語:ForbiddenWords.load_json または直接PRを送って組み込み辞書に追加

  • コードスタイル:既存のモジュール構造 + コメント規約に従う

更新履歴

詳細は CHANGELOG.md を参照。

謝辞

  • PAEG 教育智能体(v0.12-v0.71 イテレーション)——本プラグインはその言語仕様モジュールから抽出された

  • LanguageTool——ルール宣言型エンジンのパラダイム(dev.languagetool.org)

  • textstat——可読性測定のパラダイム(github.com/textstat/textstat)

  • GB/T 15834-2011《标点符号用法》——句読点規則の国家標準

  • Agent Skills 標準——段階的開示のパラダイム(agentskills.io)

ライセンス

MIT © 2026 PAEG Team — 詳細は 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