一段游戏对话既要有角色口吻,也要接得上世界设定。先把已知事实、NPC 知道什么、玩家能选什么分开,再让模型起草,可以减少“气氛有了、剧情却改设定”的情况。

本例沿用 s197 的狐狸邮差阿榛,为岔路口守林人写一段送信对话:问路线、问木桥、问信件内容,三条分支各自回答后进入同一个收尾。下载 NPC 对话练习包可查看虚构设定、提示词、模型原始输出、人工定稿和检查脚本。

1. 先写设定事实和边界

把场景写成短清单,只放会影响玩家选择的内容:

  • 阿榛是邮差,正把一封封好的信送到溪边木屋;没有人知道信里写什么。
  • 雨刚停,阿榛来到林间岔路。北边旧木桥被倒枝挡住,当前不能通行。
  • 西边石滩水位低于岸边白色标记,可以通行。
  • 守林人阿岩只知道这两条路况,不知道信的内容。

这些事实保存在 scenario.json。如果角色知道的事、玩家的目标或路况变了,先改事实清单,再重新生成对白。

2. 让 Qwen 生成分支草稿

Qwen 官方仓库介绍 Qwen3.8 系列及 27B 模型;本机使用 Ollama 运行 qwen3.8-27b:latest。Ollama 的 Qwen3.8 模型库提供本机调用入口,Chat API 文档说明可用 format: "json" 返回 JSON、关闭流式响应,并按模型支持情况关闭 thinking 输出。

先启动本机 Ollama,在练习包目录运行:

python3 generate_dialogue.py

脚本把设定清单和 prompt.md 发给 http://127.0.0.1:11434/api/chat,再验证模型返回的 JSON 有 5 个预设节点、选项跳转目标正确、对白不超长。此次本机 Ollama 0.35.1 / Qwen3.8-27B Q4_K_M 生成用时45.18秒,输入593、输出344 tokens;请求和原始响应保存在练习包 evidence/。

3. 人工核事实和玩家选择

这轮模型生成了三个选项:问哪条路能走、问北边桥、问信里写了什么。回答分别是“西边石滩水位低于白标记,能过”“北边旧木桥被树枝挡住,过不去”和“阿岩不知道信里写了什么”。这些说法都能回到设定清单。

初稿最后一句写成“阿榛点头,转身走向西边石滩”。虽然西边是已知可通行路线,但三条分支都走到这一句,会替玩家作出选择。因此我把收尾改成中性句:“阿榛收好信,准备继续向溪边木屋送信。”人工定稿保存在 dialogue-final.json,初始模型稿仍留在 draft.json 供对照。

对白节点与跳转示意:

start
├─ 问路线 → route ──┐
├─ 问木桥 → bridge ─┼→ finish
└─ 问信件 → letter ─┘

4. 检查分支结构

核稿后运行离线检查:

python3 generate_dialogue.py --check

检查会确认三个问题分支分别有回答,并且都能到达收尾节点。它不判断台词是否有趣、符合角色口吻,也不能证明接进游戏引擎后按钮、动画和状态切换都正常。要继续扩剧情,可为新的玩家选择增加节点,再同步更新结构检查和事实表。

来源

本机模型版本、提示词、原始响应和耗时见练习包。该样例只验证一份虚构设定下的单轮对白草稿,不评估其他模型、完整剧情或游戏内交互。