生成策略
生成 ADV.JS 可直接运行的游戏配置有两种方案。
- JSON 方案:直接按照约定的格式生成 JSON 文件,包含剧本内容、图片链接等。
- Markdown 方案:生成剧本 Markdown 文件,再通过脚本转换为 JSON 格式读取。
| 方案 | 优点 | 缺点 |
|---|---|---|
| JSON | 直接生成 JSON 文件,易于读取和使用。 | - 嵌套较深,AI 难以直接生成符合标准的 JSON。(豆包的 JSON 结构只支持三层嵌套。) - Token 消耗较大。(例如多轮会话,每轮会话都需要占用重复的字段名 content 等。) |
| Markdown | 生成 Markdown 文件,易读性好,易于编辑和修改。 | 需要约定特殊语法,编写额外的转换脚本,增加了复杂性。 |
混合方案
我们计划探索混合方案,结合 JSON 和 Markdown 的优点。
专门设计针对 AI 生成的 JSON 格式,简化嵌套结构,减少重复字段。 后续再解析成游戏的 JSON 格式。
- 章节节点列表中存在一个
AdvFountainNode,遵循特定的 Fountain 语法。通过 Markdown 展示剧本会话内容以节约 Token。
json
{
"title": "第一章",
"id": "chapter1",
"nodes": [
{
"type": "fountain",
"plotSummary": "这个节点的剧情概要",
"content": "@老邢\n我得走\n\n@掌柜\n老邢\n\n@老邢\n我公务在身 我心系百姓 我公务在身 我心系百姓\n\n@掌柜\n你听我说\n\n@老邢\n啥也别说了 事已至此 各安天命"
}
]
}此时,content 可以通过特定的语法,以最少的 token 表现出多轮会话内容。 但此时 Markdown 丢失了一部份易读易编辑的特性。
json
{
"title": "第一章",
"id": "chapter1",
"nodes": [
{
"type": "fountain",
"src": "wlwz/ch1/node1.md"
}
]
}md
---
plotSummary: 这个节点的剧情概要
---
@老邢
我得走
@掌柜
老邢
@老邢
我公务在身 我心系百姓 我公务在身 我心系百姓
@掌柜
你听我说
@老邢
啥也别说了 事已至此 各安天命除了一次性生成后处理外,也可以分段生成。 以避免上下文长度不足的问题。(但也可能导致上下文关联性不够)
每个节点应当包含一个 plotSummary 字段,描述该节点的剧情概要。 以便后续基于此扩展剧情。