k-skill 中世韩语风格转换器实战:korean-middle-korean 确定性文体改写全解析
【免费下载链接】k-skill한국인을 위한 스킬 모음집 - 에이전트를 한국인으로项目地址: https://gitcode.com/GitHub_Trending/ks/k-skill
korean-middle-korean 是 k-skill 技能仓库中面向韩语创作场景的文体转换技能:它把现代韩语句子改写为带中世韩语(훈민정음/중세국어)观感的"仿古文体",用于玩梗、幽默创作,而非学术复原。本文以 instruction.md 为核心骨架,结合 korean_middle_korean.js 源码与 test_korean_middle_korean.js 测试,完整讲解其设计契约、CLI 用法、规则流水线与可验证性,读完后你可以直接用一条命令把任意韩语句子变成"중세국어풍"风格,并解释每一步替换依据。
这个技能解决什么问题
当用户提出"이 문장을 한국 중세 국어로 바꿔줘""훈민정음 느낌 나는 밈 문장으로 변환해줘""중세국어풍으로 농담을 써줘""아래 글을 옛 국어 말투로 바꿔줘"这类需求时,直接让 LLM 自由发挥会导致每次转换强度和标注都不一致。该技能用确定性的规则集把"仿中世韩语"这一创作性需求固定成一份最小契约:
- 将部分现代韩语助词改写为中世风格拼写,例如
은/는 → ᄋᆞᆫ、을/를 → ᄋᆞᆯ、에서 → 애; - 将部分现代语尾改写为
ᄒᆞ-系古语尾,例如했다 → ᄒᆞ엿다〮、하는 → ᄒᆞᄂᆞᆫ、말하는 → ᄆᆞᆯᄒᆞᄂᆞᆫ; - 将日期单位改写为
年、月、日; - 给部分汉字词混入 Hanja 提示,例如
熱愛說、俳優、學校; - 将 URL、邮箱、Markdown 链接、inline/fenced code span 视为结构令牌,原样保留不做转换;
- 对人名、数字、专有名词采用best-effort策略:规则匹配不上时保留原文,而不是强行改写;
- Hanja 提示通过宽范围全局替换应用,因此即使看起来像合成词或专有名词的字符串内部也可能被改写。
从源码结构看,这些承诺被硬编码在 korean_middle_korean.js 的createReport流水线中,是可以用测试和实际运行反复验证的确定性行为,而不是提示词层面的"尽力而为"。
为什么需要独立技能:确定性契约
instruction.md 明确指出:"이 스킬은 학술적 복원이 아니라 창작용 스타일 변환이다"(本技能是创作用风格转换,而非学术复原)。配套的 docs/features/korean-middle-korean.md 进一步解释了独立成技能的三点理由:
- 同一输入产出同一输出:规则固定、顺序固定,结果可复现;
- 替换过程可审计:所有应用过的规则都会写入
replacements数组,用户可以逐条核对; - 定位被文档化:明确声明这是风格转换而非学术复原,避免用户误以为是严谨的古文献翻译。
这一契约由源码中的PROFILE = "middle-korean-style-v1"与CONTRACT字符串落地(见 korean_middle_korean.js)。docs/features中的文档还约定了一条重要的兼容性策略:middle-korean-style-v1的输出变化属于影响兼容性的契约变更,新增规则或调整顺序时,必须同步更新回归测试与文档示例。
适用边界
何时使用
当用户明确希望获得"中世韩语风格/훈민정음 感觉/古语 meme 风格"的转换时使用,典型触发语:
- "이 문장을 한국 중세 국어로 바꿔줘"
- "훈민정음 느낌 나는 밈 문장으로 변환해줘"
- "중세국어풍으로 농담을 써줘"
- "아래 글을 옛 국어 말투로 바꿔줘"
何时禁止使用
- 需要学术论文、古文翻译、훈민정음 해례본 式严谨标注的工作;
- 法律、医学、合同等因语义误解而危险的文档;
- 出于仇恨、骚扰、名誉损害目的的嘲讽式转换。
响应时应诚实说明这是"중세국어풍/창작용 변환",不得断言为"精确的中世韩语翻译"。
环境准备
- Node.js 18+:运行 helper 脚本的运行时环境;
- skill 目录内包含 helper:
korean-middle-korean技能目录下的 scripts/korean_middle_korean.js; - 无需任何 API 密钥:这是一个纯本地、纯规则的确定性工具。
技能的元数据定义在 skill.json 中:名称korean-middle-korean,类别writing,区域ko-KR,阶段phase: v1,许可证 MIT。通过 CLI 首次使用时,可以执行npx -y @nomadamas/k-skill@0 instruct korean-middle-korean获取实时指令,用npx -y @nomadamas/k-skill@0 files korean-middle-korean查看随 CLI 捆绑的辅助文件清单(见 SKILL.md)。
CLI 用法详解
参数总览
parseArgs(korean_middle_korean.js)规定了严格的参数契约:
| 参数 | 含义 | 约束 |
|---|---|---|
--text TEXT | 直接传入待转换文本 | 三种输入源(--text/--file/--stdin)必须且只能提供一种 |
--file PATH | 从文件读取文本(UTF-8) | 同上 |
--stdin | 从标准输入读取文本 | 同上 |
--format json\|text | 输出格式,默认json | 仅接受json或text,否则报unknown format |
--help/-h | 打印用法帮助 | 不受"单一输入源"约束 |
错误场景在源码中有明确校验:--text缺值抛"--text requires a value",同时传入多个输入源抛"provide exactly one input source: --text, --file, or --stdin",未知参数抛"unknown argument: ..."。测试 test_korean_middle_korean.js 专门验证了这些边界。
四种常用命令
# 1. 直接传入文本,默认 JSON 输出 npx -y @nomadamas/k-skill@0 exec korean-middle-korean scripts/korean_middle_korean.js -- --text "민수는 3월 5일 학교에서 공부했다." # 2. 仅输出转换后的文本 npx -y @nomadamas/k-skill@0 exec korean-middle-korean scripts/korean_middle_korean.js -- --text "열애설을 인정했다." --format text # 3. 从文件读取并输出纯文本 npx -y @nomadamas/k-skill@0 exec korean-middle-korean scripts/korean_middle_korean.js -- --file ./input.txt --format text # 4. 管道输入,JSON 输出 cat input.txt | npx -y @nomadamas/k-skill@0 exec korean-middle-korean scripts/korean_middle_korean.js -- --stdin --format json注意npx ... exec korean-middle-korean scripts/korean_middle_korean.js --后面的--用于把后续参数透传给脚本本身。在仓库本地调试时,也可以直接用 node 运行同一入口(测试套件正是这么做的,见 test_korean_middle_korean.js):
node korean-middle-korean/scripts/korean_middle_korean.js --text "학교에서 공부했다." --format text # 输出: 學校애 공부ᄒᆞ엿다〮.真实运行示例
以"민수는 3월 5일 학교에서 공부했다."为例,默认 JSON 输出如下(实际运行验证):
{ "profile": "middle-korean-style-v1", "input": "민수는 3월 5일 학교에서 공부했다.", "output": "민수ᄋᆞᆫ 3月 5日 學校애 공부ᄒᆞ엿다〮.", "replacements": [ { "kind": "date", "from": "월→月", "to": "$1月", "count": 1 }, { "kind": "date", "from": "일→日", "to": "$1日", "count": 1 }, { "kind": "lexicon", "from": "학교", "to": "學校", "count": 1 }, { "kind": "ending", "from": "공부했다→공부ᄒᆞ엿다〮", "to": "공부ᄒᆞ엿다〮", "count": 1 }, { "kind": "particle", "from": "은/는→ᄋᆞᆫ", "to": "$1ᄋᆞᆫ", "count": 1 }, { "kind": "particle", "from": "에서→애", "to": "$1애", "count": 1 } ], "contract": "Deterministic Korean Middle Korean-style rewrite: public-domain orthographic flavor rules, fixed broad lexicon replacements, archaic particles/endings, Sino-Korean Hanja hints, protected URL/email/Markdown-code spans, and best-effort preservation for names/numbers when no rule matches." }注意:人名민수因为没有命中任何规则而被原样保留,这正是 best-effort 策略的直接体现;数字3、5也被保留,仅单位월/일被替换为月/日。
输出 Schema
createReport(korean_middle_korean.js)返回固定五字段结构:
| 字段 | 类型 | 说明 |
|---|---|---|
profile | string | 恒为"middle-korean-style-v1",标识规则版本 |
input | string | 原始输入 |
output | string | 转换后的文本 |
replacements | array | 每条规则的应用记录:{ kind, from, to, count } |
contract | string | 契约描述,说明本转换是确定性仿古改写 |
replacements中的kind共四类,对应流水线中的四个规则族:
date:日期单位替换(년→年、월→月、일→日);lexicon:词典固定替换(如열애설→熱愛說);ending:语尾替换(如했다→ᄒᆞ엿다〮);particle:助词替换(如은/는→ᄋᆞᆫ),以及와的"保留"记录。
用户若想了解转换依据,直接引用replacements数组逐条说明即可。--format text则只输出output字段的纯文本。
源码级解析:转换流水线
整个转换是一条确定性的规则链,顺序在createReport中固定。规则顺序本身属于 v1 契约的一部分——测试 test_korean_middle_korean.js 验证了"最后一条 date 记录必须出现在第一条 lexicon 记录之前",保证日期先于词典处理。
第一步:结构令牌保护
protectSpans(korean_middle_korean.js)在任何替换之前,先把五类结构文本抽离为私有区字符令牌\uE000{n}\uE001(U+E000/U+E001),处理完后再由restoreSpans原样还原:
- fenced code 块:[\s\S]*?;
- inline code:
`[^`\n]*`; - Markdown 链接:
text,含可选 title; - URL:
https?://...; - 邮箱:
user@domain.tld。
这意味着即使链接文字或代码内容里含학교、했다等命中词,也绝不会被改写。测试 test_korean_middle_korean.js 对此有完整覆盖:URL、邮箱、Markdown 链接、inline code、fenced code 均被保持原样,而块外的普通文本照常转换。
第二步:日期单位规范化
output = replaceRegex(output, /(\d+)년/g, "$1年", replacements, "date", "년→年"); output = replaceRegex(output, /(\d+)월/g, "$1月", replacements, "date", "월→月"); output = replaceRegex(output, /(\d+)일/g, "$1日", replacements, "date", "일→日");2015년 7월 21일→2015年 7月 21日。注意这里的일仅在紧跟数字时替换,避免误伤普通名词。
第三步:词典固定替换
LEXICON数组(korean_middle_korean.js)定义了 22 条字面量替换,按数组顺序逐个应用,每次替换都会在replacements中记录lexicon条目:
| 原文 | 替换后 |
|---|---|
야 이 | 이 |
맛국노야 | 맛國노〮야 |
설마 | 쇼ᄆᆞ |
새벽 | 샛ᄇᆡ긔〮 |
배우 | 俳優 |
구자욱이랑 | 구자욱과 |
거리 | 街里 |
손잡고 | 손ᄋᆞᆯ 자ᇙ고 |
걸어다니는 | 거러다니ᄂᆞᆫ |
모습 | 모ᄉᆡᆸ〮 |
찍혀 | 찍히야 |
열애설 | 熱愛說 |
터지고 | 터ᄂᆞᆺ고 |
인정했지만 | 인졍ᄒᆞ엿거ᄂᆞᆫ |
인정했다 | 인졍ᄒᆞ엿다〮 |
인정 | 인졍 |
맛보기한 | 맛보기〮ᄒᆞᆫ |
느낌이랄까 | 닏믁이ᄅᆞᆯ가〯 |
기분이구나 | 기븐〮이로다 |
말해 | ᄆᆞᆯᄒᆞ야 |
사건 | 일 |
학교 | 學校 |
从实现看,replaceLiteral用text.split(from).length - 1统计命中次数(korean_middle_korean.js),再以split/join做全局替换。测试 test_korean_middle_korean.js 特意验证了宽范围替换的特性:"배우자는 학교에서 일했다."会得到俳優자——即배우被替换后,剩余的자原样保留,说明 Hanja 提示按子串全局生效,复合词内部也可能被改写。
第四步:语尾替换
六个正则规则(korean_middle_korean.js),其中하는、된、것이냐使用前瞻(?=\s|[",.?!]|$)限定在词边界处才命中:
말하는 → ᄆᆞᆯᄒᆞᄂᆞᆫ;공부했다〮? → 공부ᄒᆞ엿다〮(〮?兼容已有声调点的输入);했다〮? → ᄒᆞ엿다〮;하는(词尾) → ᄒᆞᄂᆞᆫ;된(词尾) → ᄃᆞᆫ;것이냐(句尾) → 것이냐〮。
第五步:助词替换
四个正则规则(korean_middle_korean.js),前置字符匹配集为[가-힣ᄀ-ᇿA-Za-z0-9一-龥]+,同样只在词边界处替换:
X은/X는 → Xᄋᆞᆫ;X을/X를 → Xᄋᆞᆯ;X에서 → X애;X와 → X와(保留不变,但在replacements中记录一条"와 보존"审计痕迹)。
第六步:标点归一化与结构还原
output = output.replace(/\s+([,.;:?!])/g, "$1"); // 去掉标点前的多余空白 output = restoreSpans(output, protectedInput.protectedSpans); // 还原受保护片段从实际输出"熱愛說이 이런 기븐〮이로다"라고可以看出,引号等结构片段在保护后得以精确还原,而句点前的空白被归一化。
响应与使用策略
- 回答以
output字段为中心,必要时先展示转换结果; - 明确用词:是"중세국어풍/창작용 변환"(中世韩语风格/创作用转换),而不是"정확한 중세국어 번역"(精确的中世韩语翻译);
- 若用户强调必须保留原文语义,可在转换文后追加一句"의미 보존 확인"(语义保留确认);
- 若用户看起来需要学术级准确性,应主动说明该技能的创作定位与局限,并提示需要专业古文献审查。
工作流建议:接收文本 → 通过k-skill exec运行 helper → 返回output→ 用户索要依据时汇总replacements应用记录 → 判断场景需要时提前声明创作型定位。
验收与测试
instruction.md的 "Done when" 清单定义了完成标准:
npx -y @nomadamas/k-skill@0 exec korean-middle-korean scripts/korean_middle_korean.js -- --help能正常打印帮助;--text、--file、--stdin三种输入全部可用;- JSON 与 text 两种输出格式全部可用;
- 示例输出中应出现日期(
2015年 7月 21日)、Hanja(俳優、街里、熱愛說)以及中世风格的助词、语尾与声调点(〮/〯)——即 issue #270 中演示的典型特征。
仓库提供了覆盖上述契约的完整回归测试 test_korean_middle_korean.js,本地运行方式:
node --test scripts/test_korean_middle_korean.js测试覆盖了:issue #270 长样本的声调点/Hanja/日期断言、人名与数字的 best-effort 保留、URL/邮箱/Markdown/code span 的保护、createReport的元数据与replacements证据、v1 规则顺序契约、parseArgs输入源约束,以及--text/--file/--stdin三种 CLI 路径(含安装在 skill 目录内运行时學校애 공부ᄒᆞ엿다〮.的断言)。你也可以用同样的命令做冒烟验证:
npx -y @nomadamas/k-skill@0 exec korean-middle-korean scripts/korean_middle_korean.js -- --text "민수는 3월 5일 학교에서 공부했다." --format text总结
korean-middle-korean 把"仿中世韩语"这一主观创作需求工程化为可复现、可审计的确定性规则链:结构令牌保护保证链接与代码不被污染,日期/词典/语尾/助词四个规则族按固定顺序产出middle-korean-style-v1风格文本,replacements数组让每次改写都有据可查,而 best-effort 策略守住人名数字的语义底线。对于需要在 Agent 工作流中稳定产出"옛 국어 말투"的创作场景,这是一个开箱即用、无密钥依赖、可被测试锁定的标准方案。
【免费下载链接】k-skill한국인을 위한 스킬 모음집 - 에이전트를 한국인으로项目地址: https://gitcode.com/GitHub_Trending/ks/k-skill
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考