Skip to main content
Glama

paeg-lang-style

Python License: MIT Tests PRs Welcome

한국어 | English


이것은 무엇인가

paeg-lang-style은 중국어 언어 규범 모듈 — 3계층 아키텍처(사용자 요구사항):

계층

기능

핵심 파일

문법 규칙 제약(가장 중요)

어휘/문장/구두점 규칙을 시스템 프롬프트로 사용하여 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 말투 감지: 문장 길이 변이/전환어 밀도/3단 구성/대시/문단 대칭 5차원 신호

  • 8+ 문법 규칙: GB/T 15834 구두점 규범 + 병문 6가지 유형 + 교수 언어 규범

  • 75개 테스트 전체 통과 + 20개 구간 행동 일관성(vs 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 server 방식으로 연결(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 시스템 프롬프트에 직접 이어 붙이면 됩니다. 이것이 "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을 편집하고 규칙 하나를 추가하면 즉시 핫로드됩니다:

{
  "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개 샘플 vs 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