# 从LLM输出到结构化分镜表:我在小说可视化路上踩的坑

16 阅读12分钟

1. 开头先聊两句行业大新闻

今年上半年业内有两个事让我印象特别深。一个是 DeepSeek 又融了一大笔 ,估值直接冲到了几百亿美金级别,各路分析都在说"中国AI的性价比之王已经坐实"。另一个是 可灵 Kling 的 IPO 传闻 ,AI视频生成赛道终于有人要上岸了。两个新闻串起来看,其实指向同一个方向:文本→视觉的链路,商业化窗口正在打开

但问题来了——你搞视频生成,脚本从哪来?你搞小说漫改,分镜谁画?大部分团队现在的做法还是"编剧写完文本→扔给画师手绘分镜→再进AI视频管线",中间这一步成了整个流程的瓶颈。去年我们团队启动超无穹项目的时候,第一个挑战就是:能不能让LLM直接输出可用的结构化分镜表?

答案是可以,但坑很多。这篇文章把一路踩过来的坑摊开说。

2. 这个需求到底是怎么来的

先交代背景。超无穹是一个AI创客平台,底层接各种LLM和视觉模型,上层做垂直场景的管线化交付。其中一个场景是"小说可视化"——用户上传一段网文或者原创故事,系统自动输出一套可视化的故事板(storyboard),可以直接喂给 AI 视频生成工具或者漫画工具去渲染。

分镜表是中间最关键的一环。我们定义的标准分镜表包含 9 列:

  • 镜号 (Shot ID)
  • 景别 (远景/全景/中景/近景/特写)
  • 运镜 (固定/推/拉/摇/移/跟/升/降)
  • 画面描述 (Describe what the camera sees)
  • 对白/旁白
  • 情绪基调 (紧张/温暖/悬疑/激昂等)
  • 时长 (秒)
  • 转场 (切/淡入淡出/溶解/划像)
  • AI绘画Prompt (可直接喂给SD/Midjourney)

说白了,就是把一段叙事文本,拆解成一连串可执行的拍摄指令 。一开始我们觉得这事LLM应该能搞定——毕竟 Claude 都能写剧本了,分镜不就是"剧本+镜头语言"么?结果发现完全不是这么回事。

3. 你以为LLM能直接输出分镜?天真了

第一版方案,我们直接写了一个非常"通顺"的 prompt,大概长这样:

Prompt (V1 - 太天真版)

你是一个专业的导演和分镜师。请根据以下小说段落,
生成一份分镜表,包含镜号、景别、运镜、画面描述、
对白、情绪、时长、转场、AI绘画Prompt。
小说段落:{text}

你猜LLM输出了什么?它输出了一份看起来特别专业但根本不能用 的东西——景别瞎标、时长随意、运镜全是"固定镜头"、AI绘画Prompt写得像小学生作文。关键问题是:

  • 第一个坑:LLM没有"镜头意识"。*它不会自动把一个连续动作拆成多个镜头,经常一句话就只有一个镜头描述。比如"他推开门走进房间坐在沙发上"——正常人会拆3-4个镜头,LLM直接一个全景搞定,节奏全死。

  • 第二个坑:AI绘画Prompt ≈ 废话。* 模型输出的 prompt 普遍缺乏具体的画风描述、光影设定、构图关键词,拿过去给 Stable Diffusion 画出来全是"一个人在一个房间里"级别的描述,毫无用处。

更离谱的是,同一个段落每次跑分镜都不一样——镜号对不上、情绪前后矛盾、转场随心所欲。这时候我才意识到:这件事表面上是"生成",实际上是"结构化规划" ,需要的不是大模型的创造力,而是大模型在约束下的规划能力。

4. 架构设计:超无穹是怎么拆这个问题的

所以回到第一性原理去重新想这个问题。小说→分镜这个任务,本质上包含三个独立的子任务:

  1. 叙事拆解(Narrative Parsing) — 把文本按动作/场景/情绪切分成"故事原子"
  2. 镜头规划(Shot Planning) — 每个原子决定景别、运镜、时长
  3. 视觉化描述(Visualization) — 生成可直接用于AI绘画的 prompt

超无穹 三阶段管线架构示意图

小说文本 → [叙事拆解 Agent] → 故事原子列表 → [镜头规划 Agent] → 分镜草稿 → [视觉化 Agent] → 完整分镜表 + AI Prompt

三个子任务用三个独立的 Agent 跑,每个 Agent 的 prompt 完全不同、约束完全不同。最后用一个融合层做一致性校验——检查镜号连续性、情绪逻辑、时长总和是否合理。

关键设计决策: 不依赖单个LLM的"全能理解",而是把问题分解成LLM擅长的子任务。叙事拆解用 DeepSeek (性价比高、上下文长),镜头规划用 Claude (对结构化输出最稳),视觉化prompt用 GPT-4 (对画面描述最细腻)。三个模型协作,每个做自己最擅长的事。

5. Prompt工程:从"导演"到"精分编剧"

这是整件事里我最想分享的部分。Prompt 不是"写得通顺就行",而是要给LLM一个可操作的思维框架 。以镜头规划 Agent 为例,最终版 prompt 的核心思路是这样:

Prompt 核心指令(精简版)

## 角色
你是一个严格遵循镜头语言规范的预可视化导演。
你的任务不是"创作",而是"规划"。

## 输入
一段已拆解的故事原子,格式为JSON数组,每个原子包含:
{ text, action_type, emotion, importance }

## 输出规范
每个故事原子必须拆解为1-4个镜头,规则如下:
- 动作类原子:最少2个镜头(动作前+动作中)
- 对话类原子:根据情绪切换景别
- 场景转换:必须有过渡镜头

## 景别选择逻辑
- 动作/打斗 → 近景+快速运镜
- 环境描写 → 远景/全景+慢速摇移
- 重要道具 → 特写
- 情感冲突 → 近景+固定镜头

## 时长规则
- 固定镜头:3-5秒
- 摇移/跟拍:5-8秒
- 动作镜头:2-3秒
- 情绪镜头:4-7秒

## 禁止
- 不要添加原文没有的内容
- 不要合并不同原子
- 输出必须为 JSON

看到区别了吗?LLM需要的不是"自由发挥",而是"决策树" 。你把景别的选择逻辑写成 if-else 形式的规则,输出质量就直接上一个台阶。这跟写代码是一模一样的逻辑——你给的 spec 越明确,产出越可控。

  • 小技巧:在 prompt 里加一个"反例"列表效果极好。比如明确写"不要出现'美丽的风景''帅气的动作'这类空洞描述",输出质量肉眼可见提升。

另外值得一提的是输出格式。我们一开始用 Markdown 表格,后来全面切到 JSON——因为后续管线需要程序化解析。这里有个深坑:LLM输出的JSON经常不合法 ,多一个逗号、少一个引号是常事。解决方案不是修 prompt,而是在管线里加一层自动修复,用 json5 库做宽松解析。

6. 模型对比:DeepSeek vs GPT-4 vs Claude

三个模型各有所长,直接上我们内部压测的结果。测试集是 50 段不同风格的小说片段(网文/传统文学/剧本/散文),评估维度是分镜的可用率(不需要人工修改即可进入下一管线的比例)。

维度DeepSeek (V3)GPT-4 (Turbo)Claude (Sonnet 4)
叙事拆解准确率92% 🏆87%89%
镜头规划合理性78%81%88% 🏆
AI Prompt 可用率65%83% 🏆79%
JSON 合规率(一次通过)74%82%91% 🏆
上下文敏感度(>8K tokens)优秀 🏆良好良好
成本(每100次)~$0.8 🏆~$8.0~$5.5

结论很清晰:

  • 叙事拆解,DeepSeek 性价比之王名不虚传。 尤其是长文本场景,它的 128K 上下文窗口是实打实的优势,而且拆解精度在网文语料上甚至超过 GPT-4。
  • 镜头规划,Claude 的"结构化基因"最强。 它对"按照规则输出"这件事的理解比另外两个都好,JSON 合规率 91% 在工程上非常省心。
  • 视觉化 Prompt,GPT-4 的画面感确实独一档。 同样的故事原子,GPT-4 写出来的 prompt 在光影、构图、色彩上明显更专业。

所以我们现在的策略是:管线里三个模型混用,DeepSeek 做第一道拆解,Claude 做镜头规划,GPT-4 做最终的 prompt 润色。既不浪费钱,也不牺牲质量

7. 落地效果:一段小说→九列分镜表

说再多理论不如直接看效果。下面是一段测试用的网文片段(我自己写的,不入流但是够典型):

林深推开门,雨声一下子涌了进来。他站在门口愣了两秒,房间里黑漆漆的,只有窗外路灯的光在墙上投出一片模糊的橘色。他摸到墙上的开关按了两下,没反应。叹了口气,他把湿透的外套脱下来扔在玄关的凳子上,光着脚踩过冰凉的地板走进客厅。

超无穹的输出,只截取前四个镜头:

7. 落地效果:一段小说→九列分镜表

说再多理论不如直接看效果。下面是一段测试用的网文片段(我自己写的,不入流但是够典型):

林深推开门,雨声一下子涌了进来。他站在门口愣了两秒,房间里黑漆漆的,只有窗外路灯的光在墙上投出一片模糊的橘色。他摸到墙上的开关按了两下,没反应。叹了口气,他把湿透的外套脱下来扔在玄关的凳子上,光着脚踩过冰凉的地板走进客厅。

超无穹的输出,只截取前四个镜头:

📋 超无穹 输出分镜(JSON片段)

[  {    "shot_id": 1,    "scale": "特写",    "camera": "固定",    "description": "一只手推在深色木门的边缘,门缓缓打开,雨水溅落的细节清晰可见,背景虚化",    "dialogue": "",    "emotion": "压抑",    "duration": 3,    "transition": "切",    "prompt": "extreme close-up of hand pushing wooden door, raindrops splashing on door surface, shallow depth of field, dark ambient lighting, cinematic 4K, photorealistic, Nikon 85mm f/1.4, moody color grading"  },  {    "shot_id": 2,    "scale": "中近景",    "camera": "缓慢前推",    "description": "林深侧身站在门口,雨水从他发梢滴落,他望着漆黑的室内,眼神失焦,窗外橘色路灯的光在他侧脸形成明暗对比",    "dialogue": "",    "emotion": "疲倦失落",    "duration": 5,    "transition": "切",    "prompt": "medium close-up of man standing at doorway, wet hair dripping, silhouette against warm orange street light from window, dark interior, low-key lighting, cinematic, film grain, anamorphic lens flare"  },  {    "shot_id": 3,    "scale": "特写",    "camera": "固定",    "description": "手指按下墙壁开关,咔哒两声,灯没有亮,手指在开关上停留片刻后垂下",    "dialogue": "",    "emotion": "无奈",    "duration": 3,    "transition": "切",    "prompt": "extreme close-up of fingers pressing light switch, switch not responding, fingers lingering then dropping, shallow DOF, dim lighting, melancholic atmosphere"  },  {    "shot_id": 4,    "scale": "全景",    "camera": "缓慢右摇",    "description": "一件湿透的深色外套被丢在玄关凳子上,镜头缓慢右摇,露出冰冷的地板和通向客厅的暗色走道",    "dialogue": "",    "emotion": "孤寂清冷",    "duration": 6,    "transition": "淡入淡出",    "prompt": "wide shot of dark hallway, wet coat on stool in foreground, slow pan right revealing wooden floor and dark corridor, cold color temperature, noir atmosphere, cinematic composition, volumetric lighting from distant street lamp"  }]

你可以对比一下原文——原文大约 120 字,LLM 拆成了 4 个镜头,每个镜头有明确的视觉意图和情绪指向。第三步那个开关特写,就是典型的"LLM原来不会自动拆"但经过规则引导后做到的。AI 绘画 Prompt 也直接能用了,开箱丢给 SD 或者 Midjourney 出图效果不错。

整个片段一共输出了 9 个镜头,覆盖了原文所有信息点。最让我满意的是情绪链——从压抑→疲倦→无奈→孤寂,情感曲线跟原文完全对得上。

8. 踩坑总结 & 经验打包

写到这基本把核心内容说完了。最后把踩过的坑打包成一个清单,以后谁再做类似的事直接拿去避雷:

坑1:LLM不会自动拆镜头
解法:用故事原子化拆解作为前置步骤,强制LLM先"逐句理解"再"逐句规划"。
一句话原则——先拆再拍,别一起拍

坑2:JSON输出总报错
解法:用 json5 做宽松解析 + 第二遍LLM校验修复。别指望大模型一次输出完美 JSON,尤其是深层嵌套。

坑3:Prompt 写得像散文
解法:不要在 prompt 里写"请专业地输出",写规则、写约束、写反例。LLM 是规则引擎,不是你的编剧朋友。

坑4:单一模型走到底
解法:多模型混用,让每个模型做自己最擅长的事。DeepSeek 拆文本、Claude 管结构、GPT-4 写画面,成本和质量都不亏。

坑5:忽略一致性校验
解法:加一个 post-processing 层,检查镜头连续性、情感矛盾、时间轴冲突。代码写死的规则比LLM再跑一遍靠谱 100 倍。

如果你只想记住一句话:
LLM 做结构化输出的上限不取决于模型大小,取决于你把约束条件写得有多清楚。Prompt 即代码 ——接受这个前提,很多东西就好办了。

9. 最后说两句

做小说可视化这件事,一开始我以为难点在"AI 能不能理解小说"。做完了才发现,难点在"人能不能把需求说清楚" 。LLM 的强大不是它什么都能做,而是它给了你一个机会——只要你把问题拆得够细、规则写得够死,它就能给你一个稳定可用的结果。

超无穹目前已经把这条管线跑通了,从上传小说到生成九列分镜表,再到自动喂给 AI 视频/漫画管线,整个链路大概 3-5 分钟。团队内部现在管这个叫"从脑子到屏幕的高速公路"。

后面我们计划开源的 prompt 模板和管线架构也在整理中,如果这篇对你有点用——

体验入口评论区扣"分镜"

或者直接访问 超无穹 官网进 AI 创客平台 → 小说可视化 · 留言聊聊你踩过的坑

有什么问题或者你也在做类似的事,评论区见。你的经验可能就是我下一个坑的解药。