分镜选题优化与架构重构 - Qoder 20260101
概述
本次优化主要针对AIGC分镜系统的选题生成与分镜生成流程进行了架构重构和功能优化,重点解决了JSON解析问题、提示词结构优化、Rich Extra参数传递与应用以及系统稳定性提升问题。核心目标是实现选题与分镜生成的无缝衔接,确保丰富的创作参数(如实现步骤、案例分析、提示词模板库等)能够完整传递并应用到后续的分镜生成流程中。
核心优化内容
1. JSON解析与修复机制
问题背景
- 前端在
handleGenerateTheme方法中解析JSON时出现'Unterminated string in JSON at position 2410'错误 - LLM返回的JSON字符串包含未正确闭合的字符串或特殊字符
解决方案
- 后端增强处理:在
AdminUnified控制器中添加了多层JSON验证和修复逻辑aggressiveJsonCleanup:深度清理JSON字符串中的特殊字符fixUnescapedQuotes:修复未转义的引号问题- 多种格式兼容:支持
candidates、candidate_themes、candidate_topics等不同格式
- 前端容错处理:在
StoryBoard.vue中添加了安全JSON解析机制safeJsonParse:多层解析尝试fixUnescapedQuotes:前端字符串修复aggressiveJsonFix:激进的JSON修复策略
2. 提示词架构优化
旧架构问题
- 前端同时维护
systemPrompt和userPrompt,导致提示词管理复杂 - 系统提示词与用户内容耦合,难以维护和扩展
新架构设计
- 后端集中管理:通过
buildSystemPromptByScene方法实现场景化系统提示词构建 - 场景化处理:
theme_generation:主题生成场景storyboard_generation:分镜生成场景
- 前端简化:仅构建用户内容,通过
user_content参数传递给后端 - 架构优化目标:将结构约束逻辑完全迁移至API后端,前端不再需要维护
systemPrompt定义,实现前后端职责分离
实现细节
systemPrompt完全从前端移除userPrompt用于构建用户输入内容- 后端根据
scene参数自动应用合适的系统提示词
3. Rich Extra参数传递与应用
问题识别
- 主题生成时返回的丰富参数(
extra字段)未能正确传递到分镜生成 extra字段包含:core_features、creation_workflow、prompt_template_library、implementation_checklist、implementation_steps、case_study、tools_required、target_audience、content_style、key_elements、success_factors等- 用户期望这些丰富的参数(如实现步骤、案例分析、工具推荐等)在选题生成后能完整传递到分镜生成流程中
解决方案
- 数据结构优化:在
applyThemeToMeta方法中正确保存主题的扩展数据到storyboardMeta.themeExtendedData - 递归展平处理:实现
flattenObject函数,将嵌套对象结构转换为字符串格式 - 参数注入机制:在
agentGenerateAndSave方法中将扩展数据注入到分镜生成提示词中
数据流转流程
- 主题生成 → LLM返回包含
extra字段的JSON applyThemeToMeta→ 将extra数据保存到storyboardMeta.themeExtendedDataagentGenerateAndSave→ 从storyboardMeta.themeExtendedData提取数据- 构建分镜提示词 → 将扩展数据以
附加信息:\n...格式注入
数据持久化机制
- 问题:刷新页面或重新加载项目时,前端暂存的
extra数据丢失,导致二次生成分镜时缺少上下文。 - 解决方案:
- 保存阶段:在
ensureStoryboardForSession中,显式将themeExtendedData写入meta_json字段。 - 恢复阶段:在
handleLoadStoryboardProject中,从后端返回的meta_json解析并恢复themeExtendedData到storyboardMeta。
- 保存阶段:在
4. 模板字符串语法修复
问题
- JavaScript模板字符串中的换行符处理错误
- 导致代码语法错误和解析失败
修复策略
- 使用
\\n转义换行符 - 确保模板字符串语法正确
- 避免因换行符导致的解析错误
5. 账号方向与公式同步优化
问题
- 前端“账号方向”输入框支持自定义文本,但原逻辑仅处理数字ID,导致自定义方向无法同步到后端。
解决方案
- 混合类型处理:重构
syncDirectionToFormula方法,同时支持数字ID(既有选项)和文本字符串(自定义输入)。 - 双向同步:
- 前端:将
dirId和dirName正确写入formula对象。 - 后端:在
AdminUnified中接收direction字段,并在生成提示词时根据语言(中/英)动态注入账号方向说明。
- 前端:将
6. 默认服务商调整
变更内容
- 将“灵感生成”模块的默认 LLM 服务商从“火山引擎”调整为“阿里百炼”。
- 优化了模型加载逻辑,确保初始化及切换服务商时自动加载对应的模型列表。
实现细节
- 状态初始化:在
StoryBoard.vue中将llmProvider默认值设为'bailian'。 - 动态加载:在
created生命周期中增加判断,若默认服务商为bailian,自动调用loadBailianModels获取模型列表。 - 数据清理:移除了硬编码的
llmModelOptions,统一通过接口动态获取。
技术实现亮点
1. 场景化处理机制
javascript
// 前端调用
scene: 'theme_generation' 或 'storyboard_generation'
// 后端处理
public function buildSystemPromptByScene($scene, $extraData = [])
{
switch ($scene) {
case 'theme_generation':
// 主题生成系统提示词
break;
case 'storyboard_generation':
// 分镜生成系统提示词
break;
}
}2. 递归对象展平算法
javascript
const flattenObject = (obj, prefix = '') => {
const flattened = [];
for (const [key, value] of Object.entries(obj)) {
const fullKey = prefix ? `${prefix}.${key}` : key;
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
flattened.push(...flattenObject(value, fullKey));
} else if (Array.isArray(value)) {
flattened.push(`${fullKey}:${value.join(', ')}`);
} else {
flattened.push(`${fullKey}:${value}`);
}
}
return flattened;
};3. 多格式JSON兼容解析
支持以下格式的LLM响应:
candidates数组格式candidate_themes格式candidate_topics格式- 数字键对象格式(如阿里百炼)
- 分析报告格式(包含
analysis_summary、case_studies等)
业务价值
1. 稳定性提升
- JSON解析容错能力增强
- 特殊字符处理机制完善
- 系统鲁棒性显著提高
2. 功能增强
- Rich extra参数完整传递
- 主题与分镜生成流程无缝衔接
- 创作信息更加丰富和结构化
3. 架构优化
- 提示词管理职责分离
- 前后端协作更加清晰
- 代码维护性大幅提升
后续优化方向
- 性能优化:进一步优化JSON处理算法,减少计算开销
- 扩展性增强:支持更多LLM响应格式
- 监控完善:添加JSON处理过程的监控和日志记录
- 用户界面:优化extra参数在前端的展示和编辑体验
总结
本次优化成功解决了AIGC分镜系统中的关键问题,建立了更加稳定和高效的选题与分镜生成流程。核心成果包括:
- Rich Extra参数完整传递:实现了主题生成时返回的丰富参数(如
implementation_steps、case_study、prompt_template_library、implementation_checklist等)完整传递到分镜生成流程 - 架构优化:将结构约束逻辑完全迁移至API后端,前端不再需要维护
systemPrompt定义,实现前后端职责分离 - 系统稳定性提升:通过多层JSON解析和修复机制,显著提升了系统对LLM返回内容的容错能力
- 数据流转优化:确保选题与分镜生成无缝衔接,丰富的创作参数能够完整传递并应用到后续流程中
通过架构重构、算法优化和数据流转改进,系统现在能够更好地处理复杂场景和丰富参数,为用户提供更高质量的创作体验。