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 プロジェクトに接続可能。

コア機能

  • 拡張可能なルールセット:ルールを 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 ファイルを参照。

-
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