k-skill 中世韩语风格转换器实战:korean-middle-korean 确定性文体改写全解析
2026/9/17 14:21:17 网站建设 项目流程

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 进一步解释了独立成技能的三点理由:

  1. 同一输入产出同一输出:规则固定、顺序固定,结果可复现;
  2. 替换过程可审计:所有应用过的规则都会写入replacements数组,用户可以逐条核对;
  3. 定位被文档化:明确声明这是风格转换而非学术复原,避免用户误以为是严谨的古文献翻译。

这一契约由源码中的PROFILE = "middle-korean-style-v1"CONTRACT字符串落地(见 korean_middle_korean.js)。docs/features中的文档还约定了一条重要的兼容性策略:middle-korean-style-v1的输出变化属于影响兼容性的契约变更,新增规则或调整顺序时,必须同步更新回归测试与文档示例。

适用边界

何时使用

当用户明确希望获得"中世韩语风格/훈민정음 感觉/古语 meme 风格"的转换时使用,典型触发语:

  • "이 문장을 한국 중세 국어로 바꿔줘"
  • "훈민정음 느낌 나는 밈 문장으로 변환해줘"
  • "중세국어풍으로 농담을 써줘"
  • "아래 글을 옛 국어 말투로 바꿔줘"

何时禁止使用

  • 需要学术论文、古文翻译、훈민정음 해례본 式严谨标注的工作;
  • 法律、医学、合同等因语义误解而危险的文档;
  • 出于仇恨、骚扰、名誉损害目的的嘲讽式转换。

响应时应诚实说明这是"중세국어풍/창작용 변환",不得断言为"精确的中世韩语翻译"。

环境准备

  • Node.js 18+:运行 helper 脚本的运行时环境;
  • skill 目录内包含 helperkorean-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仅接受jsontext,否则报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 策略的直接体现;数字35也被保留,仅单位월/일被替换为月/日

输出 Schema

createReport(korean_middle_korean.js)返回固定五字段结构:

字段类型说明
profilestring恒为"middle-korean-style-v1",标识规则版本
inputstring原始输入
outputstring转换后的文本
replacementsarray每条规则的应用记录:{ kind, from, to, count }
contractstring契约描述,说明本转换是确定性仿古改写

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原样还原:

  1. fenced code 块:[\s\S]*?;
  2. inline code:`[^`\n]*`
  3. Markdown 链接:text,含可选 title;
  4. URL:https?://...
  5. 邮箱: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条目:

原文替换后
야 이이
맛국노야맛國노〮야
설마쇼ᄆᆞ
새벽샛ᄇᆡ긔〮
배우俳優
구자욱이랑구자욱과
거리街里
손잡고손ᄋᆞᆯ 자ᇙ고
걸어다니는거러다니ᄂᆞᆫ
모습모ᄉᆡᆸ〮
찍혀찍히야
열애설熱愛說
터지고터ᄂᆞᆺ고
인정했지만인졍ᄒᆞ엿거ᄂᆞᆫ
인정했다인졍ᄒᆞ엿다〮
인정인졍
맛보기한맛보기〮ᄒᆞᆫ
느낌이랄까닏믁이ᄅᆞᆯ가〯
기분이구나기븐〮이로다
말해ᄆᆞᆯᄒᆞ야
사건
학교學校

从实现看,replaceLiteraltext.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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询