Skip to content

给大语言模型 (Large Language Models, LLMs) 的语法指南

纯文本版

本指南基于 DraMark Language Specification(v0.4.1,2026-03-19),面向需要让 LLM 生成 DraMark 文本的场景。

目标:让模型稳定产出“可解析、少歧义、可直接落地”的剧本文本。

一、先记 10 条硬规则

  1. 角色声明必须独占一行:@角色名
  2. @@ 独占一行表示退出角色语境。
  3. 唱段用 $$ 包裹,支持 $$ 标题
  4. 唱段内可用 !! ... !! 临时切到念白段落。
  5. 译配起始必须是 = (等号后有空格),退出是独占一行 =
  6. 行内 Tech Cue 是 <<...>>,必须同一行闭合。
  7. 块级 Tech Cue 用 <<< ... >>> 或多行 <<<>>>(也兼容回退闭合 <<<)。
  8. 注释 % 作为行内注释时,前面必须有空白。
  9. --- / 标题 # 是结构边界,会触发状态重置(根级有效)。
  10. 代码保护区最高优先级:围栏代码块和行内代码里的 DraMark 标记全部失效。

二、推荐输出骨架(给 LLM 的默认模板)

dramark
---
meta:
  title: 标题
  author: 作者
translation:
  enabled: false
---

# 第一幕

场景说明(GlobalBlock)。

@角色A
台词一。

@角色B [情绪]
台词二。{动作} <<LX01 GO>>
@@

角色B说完后的舞台调度、场景描述(GlobalBlock)。

@角色A
下一段台词。

---

$$ 歌曲标题
@角色A
唱词 A

!!
@角色B
这里是唱段中的念白
!!

@角色A
继续唱词
$$

关键模式@角色 进入 → 台词 → @@ 退出 → 场景动作 → @下一角色 进入。没有 @@ 的话,场景动作会被当成上一个角色的台词。

三、状态机思维(生成时最重要)

可把生成过程理解为一个块栈:

  • 默认在 GlobalBlock(念白/场景动作语境)
  • @ 进入 CharacterBlock
  • @@ 退出 CharacterBlock,回到 GlobalBlock(写场景动作前必须先 @@
  • = 进入 TranslationBlock
  • $$ 进入 SongBlock
  • !! 在 SongBlock 内开启/关闭 SpokenSegment
  • <<< 进入 TechCueBlock,>>> 或回退 <<< 关闭
  • --- / # 重置到 GlobalBlock(同时关闭 CharacterBlock 等)

遇到不兼容新指令时,先关内层再开外层。闭合顺序可记为:

CommentBlockState -> TechCueBlock -> TranslationBlock -> CharacterBlock -> SongBlock

常见错误:在 @角色 后直接写场景动作(没有 @@),结果场景动作被当作台词。

四、译配输出规范(LLM 高发错误区)

正确:

dramark
@冉阿让
= Who am I?
我是谁?
= Can I conceal myself?
我能否隐瞒真相?

错误示例:

dramark
@冉阿让
=Who am I?   % 错:等号后缺空格,不是译配起始

显式退出译配:

dramark
=
回到普通对白。

五、角色名与歧义规避

  • 支持空格角色名,推荐加引号:@"冉 阿让"
  • 可选多角色声明:@Peter Pan @Wendy [aside]
  • 不要写 @角色 台词同一行(strict 模式会降级为普通文本并报警告)。

六、Tech Cue 生成策略

  • 行内短提示优先:<<SND: THUNDER>>
  • 多行调度用块级:
dramark
<<< LX
面光渐暗 <<LX01-FADE>>
追光预备 <<LX02-READY>>
>>>
  • 在 TechCueBlock 外看到 >>>,通常应按 CommonMark 处理,不要强行当 DraMark 闭合。
  • 块级 Tech Cue 不做块级嵌套(内部 <<< ... 默认当文本,除非作为对称回退闭合条件满足)。

七、注释与转义

  • 行首 % 是注释行。
  • 行内注释必须写成 文本 空格% 注释
  • 需要字面量符号时使用转义:`@ % $ { } < > = ``。

八、代码保护区(必须遵守)

以下区域内,LLM 不应触发任何 DraMark 语义:

  • 围栏代码块(``` 或 ~~~)
  • 行内代码(...

示例(应全部按字面量保留):

dramark
```cpp
vector<vector<int>> a;
std::cout << "Hello >>";
```

九、给 LLM 的“生成约束提示词”可复用片段

text
你在输出 DraMark(v0.4.1)时必须遵守:
1) @角色声明独占一行;不要写成"@角色 台词同一行"。
2) 需要在角色台词之间写场景动作时,必须先写 @@ 退出角色。
3) 译配起始使用"= 空格原文";单独"="表示退出译配。
4) 唱段使用 $$ 包裹;唱段内可用 !!...!! 插入念白。
5) 行内 Tech Cue 必须是同一行内闭合的 <<...>>。
6) 代码块和行内代码中的特殊符号全部视为普通文本。
7) 若不确定,优先生成简单、可闭合、少嵌套结构。

十、最小自检清单(输出后)

  1. 是否存在 @角色 台词同一行?有则改为两行。
  2. 是否在 @角色 后直接写场景动作(忘了 @@)?有则在中间插入 @@
  3. 是否把 =原文 写成了无空格形式?有则改为 = 原文
  4. 每个 $$!!<<< 是否都能闭合?
  5. <<...>> 是否都在同一物理行闭合?
  6. 代码块/行内代码内是否误用了 DraMark 语义解释?

通过以上检查,通常即可得到稳定可解析的 DraMark 文本。

基于 MIT 许可发布