从零构建图书创作与二次文创 AI Agent 系统技术分享从零构建图书创作与二次文创 AI Agent 系统技术分享一、项目背景二、技术选型三、系统架构四、核心模块详解1. Prompt 工程动态构建系统提示词2. 流式生成SSE 实时推送3. 模板系统内置 自定义4. 二次文创元素提取 定向生成5. 速率限制与 Token 统计五、前端交互设计1. 三栏布局2. 创作阶段导航3. 选中段落定向改写六、Docker 部署七、关键技术总结八、源码地址九、后续优化方向从零构建图书创作与二次文创 AI Agent 系统技术分享一、项目背景在 AIGC 时代如何让大模型成为作家的“智能助手”而不仅仅是一个聊天机器人本文介绍一个基于 DeepSeek API 的图书创作 二次文创 AI Agent 系统实现从世界观搭建、人物设定、大纲生成到章节续写的全链路创作能力同时支持基于原著的同人番外、短剧脚本等衍生内容开发。二、技术选型层级技术说明后端Python 3 Flask轻量 Web 框架提供 API 和页面渲染前端原生 HTML/CSS/JS marked.js单页面应用Markdown 实时渲染AIDeepSeek v4-flash通过 OpenAI 兼容协议调用通信fetch SSE (Server-Sent Events)流式生成实时展示存储JSON 文件模板、历史记录持久化零依赖部署Docker docker-compose一键容器化部署三、系统架构┌─────────────┐ HTTP/SSE ┌──────────────┐ Proxy ┌─────────────────┐ │ Browser │ ◄──────────────► │ Flask App │ ◄─────────► │ DeepSeek API │ │ (HTMLJS) │ │ (app.py) │ │ (v4-flash) │ └─────────────┘ └──────┬───────┘ └─────────────────┘ │ ▼ ┌──────────────┐ │ JSON Storage │ │ data/ │ └──────────────┘核心设计原则API Key 不暴露所有大模型请求经后端代理前端只调内部接口流式输出长文本生成采用 SSE用户可实时看到生成过程上下文保持每次请求携带完整对话历史保证内容连贯数据持久化JSON 文件存储重启不丢失四、核心模块详解1. Prompt 工程动态构建系统提示词app.py中的build_system_prompt()函数将用户选择的参数拼接为结构化 Promptdefbuild_system_prompt(params):genreparams.get(genre,)styleparams.get(style,)perspectiveparams.get(perspective,)stageparams.get(stage,full)customparams.get(custom,)# 体裁角色定义genre_roles{短文:你是一位优秀的短篇作家...,长篇小说:你是一位长篇小说作家...,故事脚本:你是一位编剧...,}# 文风描述style_descs{情感细腻:文字风格要情感细腻...,爽文风格:节奏明快爽感十足...,悬疑紧张:营造紧张悬疑的氛围...,}parts[]parts.append(genre_roles.get(genre,你是一位专业的创作助手。))ifstyleinstyle_descs:parts.append(style_descs[style])ifperspective第一人称:parts.append(使用第一人称叙事以我的视角展开故事。)# 创作阶段指令stage_instructions{worldbuilding:你现在处于【世界观搭建】阶段...,characters:你现在处于【人物设定】阶段...,outline:你现在处于【大纲生成】阶段...,continue:你现在处于【章节续写】阶段...,polish:你现在处于【内容润色】阶段...,}ifstageinstage_instructions:parts.append(stage_instructions[stage])ifcustom:parts.append(f额外要求{custom})return\n.join(parts)关键点通过字典映射将用户下拉框选择转换为专业指令支持创作阶段切换同一主题在不同阶段获得不同指导自定义指令追加到末尾灵活扩展2. 流式生成SSE 实时推送传统 API 调用需要等待完整响应对于长文本体验极差。本系统采用Server-Sent Events实现流式输出app.route(/api/generate/stream,methods[POST])defgenerate_stream():datarequest.json system_promptbuild_system_prompt(data.get(params,{}))user_inputdata.get(user_input,)messages[{role:system,content:system_prompt},{role:user,content:user_input}]defevent_stream():full_responsetoken_count0try:respmake_llm_request(messages,streamTrue,temperature0.8)forlineinresp.iter_lines(decode_unicodeTrue):ifnotlineornotline.startswith(data: ):continuedata_strline[6:].strip()ifdata_str[DONE]:breaktry:chunkjson.loads(data_str)contentchunk[choices][0].get(delta,{}).get(content,)ifcontent:full_responsecontent token_count1yieldfdata:{json.dumps({content:content,count:token_count})}\n\nexcept:continue# 保存历史save_history(project_id,system_prompt,user_input,full_response,token_count)yieldfdata:{json.dumps({done:True,project_id:project_id})}\n\nexceptExceptionase:yieldfdata:{json.dumps({error:str(e)})}\n\nreturnResponse(stream_with_context(event_stream()),mimetypetext/event-stream,headers{Cache-Control:no-cache})前端接收逻辑functioncallSSE(url,body,onChunk,onDone,onError){abortControllernewAbortController();fetch(url,{method:POST,headers:{Content-Type:application/json},body:JSON.stringify(body),signal:abortController.signal}).then(response{constreaderresponse.body.getReader();constdecodernewTextDecoder();letbuffer;functionread(){reader.read().then(({done,value}){if(done){onDoneonDone();return;}bufferdecoder.decode(value,{stream:true});constlinesbuffer.split(\n);bufferlines.pop()||;for(constlineoflines){if(line.startsWith(data: )){try{constdataJSON.parse(line.slice(6));if(data.error){onError(data.error);return;}if(data.done){onDone(data);return;}onChunk(data);// 逐字追加显示}catch(e){}}}read();});}read();});}3. 模板系统内置 自定义模板存储在data/templates_default.json和data/templates_custom.json结构如下{小说:{都市爽文:{system:你是一位网文大神级作家。请创作一部都市爽文...,user_template:题材{theme}\n文风{style}\n,params:{文风:爽文风格,篇幅:3000字开篇}}}}套用流程前端点击套用按钮自动填充右侧参数面板文风、篇幅等将user_template填入输入框用户只需替换{theme}占位符点击生成即可保存自定义模板app.route(/api/templates/save,methods[POST])defsave_template():datarequest.json namedata.get(name)categorydata.get(category,自定义)configdata.get(config)withopen(CUSTOM_TEMPLATE_FILE,r,encodingutf-8)asf:customsjson.load(f)ifcategorynotincustoms:customs[category]{}customs[category][name]configwithopen(CUSTOM_TEMPLATE_FILE,w,encodingutf-8)asf:json.dump(customs,f,ensure_asciiFalse,indent2)returnjsonify({status:ok})4. 二次文创元素提取 定向生成步骤 1提取原文核心元素app.route(/api/derivative/extract,methods[POST])defextract_elements():textrequest.json.get(text,)messages[{role:system,content:你是一个专业的文本分析专家。请提取以下字段 - characters: 人物列表 - scenes: 场景列表 - plot_points: 关键剧情点 - quotes: 经典台词 - worldview: 世界观要素 仅返回JSON不要额外解释。},{role:user,content:f原文\n{text[:8000]}}]respmake_llm_request(messages,streamFalse,temperature0.3)resultresp.json()[choices][0][message][content]# 清理可能的 markdown 代码块标记cleanedre.sub(r^\w*\n?,,result.strip())cleanedre.sub(r\n?$,,cleaned)elementsjson.loads(cleaned)returnjsonify({elements:elements})步骤 2基于方向生成衍生内容DERIVATIVE_DIRECTIONS{同人番外:请基于原文的人物和世界观创作一篇同人番外故事...,剧情改写:请基于原文的故事框架进行剧情改写...,结局重写:请为原文重新设计一个结局...,短剧脚本:请将原文改编为短剧脚本格式...,有声书台词:请将原文改编为有声书台词版本...,}app.route(/api/derivative/generate/stream,methods[POST])defderivative_generate_stream():directiondata.get(direction,同人番外)direction_promptDERIVATIVE_DIRECTIONS.get(direction)system_promptf你是一位专业的文创开发专家。{direction_prompt}ifcustom_instruction:system_promptf\n额外要求{custom_instruction}user_contentf原文内容\n{original_text[:6000]}ifelements:user_contentf\n\n已提取的核心元素\n{json.dumps(elements)}# ... 后续流式生成逻辑同上5. 速率限制与 Token 统计简易速率限制防滥用_rate_records{}# {ip: [timestamps]}RATE_LIMIT30# 每分钟最多 30 次RATE_WINDOW60# 窗口 60 秒defcheck_rate_limit(client_ip):nowtime.time()records_rate_records.get(client_ip,[])records[tfortinrecordsifnow-tRATE_WINDOW]iflen(records)RATE_LIMIT:returnFalserecords.append(now)_rate_records[client_ip]recordsreturnTrue在每个 API 入口调用client_iprequest.remote_addrifnotcheck_rate_limit(client_ip):returnjsonify({error:请求过于频繁请稍后再试}),429Token 统计_token_stats{total_input:0,total_output:0,requests:0}# 每次生成完成后累加_token_stats[total_output]token_count _token_stats[requests]1app.route(/api/stats)defget_stats():returnjsonify(_token_stats)前端左下角实时展示今日消耗。五、前端交互设计1. 三栏布局┌──────────┬──────────────────────────┬──────────────┐ │ 左侧导航 │ 中央编辑区 │ 右侧参数面板 │ │ │ │ │ │ ✏ 创作 │ [输入框] │ 创作主题 │ │ 模板 │ [生成结果 Markdown] │ 体裁下拉 │ │ 文创 │ │ 文风下拉 │ │ 历史 │ │ 篇幅下拉 │ │ │ │ 自定义指令 │ │ │ │ [保存模板] │ └──────────┴──────────────────────────┴──────────────┘2. 创作阶段导航用户在完整创作 / 世界观搭建 / 人物设定 / 大纲生成 / 章节续写 / 内容润色之间切换后端根据当前阶段调整 System Prompt。3. 选中段落定向改写用户在生成结果中选中一段文字自动弹出改写按钮输入指令如让描写更生动后端调用/api/generate/rewrite返回改写后内容并替换原文六、Docker 部署DockerfileFROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . RUN mkdir -p data/history data/user_templates uploads EXPOSE 5000 CMD [python, app.py]docker-compose.ymlversion:3.8services:book-ai-agent:build:.container_name:book-ai-agentports:-5000:5000volumes:-./data:/app/data-./uploads:/app/uploadsenvironment:-TZAsia/Shanghairestart:unless-stopped启动命令docker-composeup-d--build访问http://localhost:5000即可使用。七、关键技术总结技术点实现方式价值Prompt 动态拼接参数字典映射 阶段指令让非技术人员也能生成高质量 PromptSSE 流式输出Flaskstream_with_context 前端ReadableStream长文本生成体验提升 10 倍模板系统JSON 文件存储 前端卡片展示降低使用门槛沉淀最佳实践二次文创两阶段处理提取→生成结构化理解原文衍生更精准速率限制基于 IP 的时间窗口计数防止 API 滥用控制成本Docker 化多阶段构建 Volume 挂载一键部署数据持久化八、源码地址本项目完整代码已开源包含app.pyFlask 后端730 行templates/index.html前端单页面988 行Dockerfiledocker-compose.yml容器化配置requirements.txtPython 依赖GitHub:九、后续优化方向向量数据库集成引入 Chroma/Pinecone实现长文档语义检索多模型路由根据任务复杂度自动选择 deepseek-v4-flash / deepseek-chat协作功能支持多人同时编辑同一项目实时同步移动端适配响应式布局支持手机端创作插件系统允许开发者扩展新的文创方向或模板类型结语本系统展示了如何将大模型 API、Prompt 工程、Web 开发有机结合打造一个真正可用的 AI 辅助创作工具。希望对你有所启发
从零构建图书创作与二次文创 AI Agent 系统:技术分享
发布时间:2026/6/11 1:12:54
从零构建图书创作与二次文创 AI Agent 系统技术分享从零构建图书创作与二次文创 AI Agent 系统技术分享一、项目背景二、技术选型三、系统架构四、核心模块详解1. Prompt 工程动态构建系统提示词2. 流式生成SSE 实时推送3. 模板系统内置 自定义4. 二次文创元素提取 定向生成5. 速率限制与 Token 统计五、前端交互设计1. 三栏布局2. 创作阶段导航3. 选中段落定向改写六、Docker 部署七、关键技术总结八、源码地址九、后续优化方向从零构建图书创作与二次文创 AI Agent 系统技术分享一、项目背景在 AIGC 时代如何让大模型成为作家的“智能助手”而不仅仅是一个聊天机器人本文介绍一个基于 DeepSeek API 的图书创作 二次文创 AI Agent 系统实现从世界观搭建、人物设定、大纲生成到章节续写的全链路创作能力同时支持基于原著的同人番外、短剧脚本等衍生内容开发。二、技术选型层级技术说明后端Python 3 Flask轻量 Web 框架提供 API 和页面渲染前端原生 HTML/CSS/JS marked.js单页面应用Markdown 实时渲染AIDeepSeek v4-flash通过 OpenAI 兼容协议调用通信fetch SSE (Server-Sent Events)流式生成实时展示存储JSON 文件模板、历史记录持久化零依赖部署Docker docker-compose一键容器化部署三、系统架构┌─────────────┐ HTTP/SSE ┌──────────────┐ Proxy ┌─────────────────┐ │ Browser │ ◄──────────────► │ Flask App │ ◄─────────► │ DeepSeek API │ │ (HTMLJS) │ │ (app.py) │ │ (v4-flash) │ └─────────────┘ └──────┬───────┘ └─────────────────┘ │ ▼ ┌──────────────┐ │ JSON Storage │ │ data/ │ └──────────────┘核心设计原则API Key 不暴露所有大模型请求经后端代理前端只调内部接口流式输出长文本生成采用 SSE用户可实时看到生成过程上下文保持每次请求携带完整对话历史保证内容连贯数据持久化JSON 文件存储重启不丢失四、核心模块详解1. Prompt 工程动态构建系统提示词app.py中的build_system_prompt()函数将用户选择的参数拼接为结构化 Promptdefbuild_system_prompt(params):genreparams.get(genre,)styleparams.get(style,)perspectiveparams.get(perspective,)stageparams.get(stage,full)customparams.get(custom,)# 体裁角色定义genre_roles{短文:你是一位优秀的短篇作家...,长篇小说:你是一位长篇小说作家...,故事脚本:你是一位编剧...,}# 文风描述style_descs{情感细腻:文字风格要情感细腻...,爽文风格:节奏明快爽感十足...,悬疑紧张:营造紧张悬疑的氛围...,}parts[]parts.append(genre_roles.get(genre,你是一位专业的创作助手。))ifstyleinstyle_descs:parts.append(style_descs[style])ifperspective第一人称:parts.append(使用第一人称叙事以我的视角展开故事。)# 创作阶段指令stage_instructions{worldbuilding:你现在处于【世界观搭建】阶段...,characters:你现在处于【人物设定】阶段...,outline:你现在处于【大纲生成】阶段...,continue:你现在处于【章节续写】阶段...,polish:你现在处于【内容润色】阶段...,}ifstageinstage_instructions:parts.append(stage_instructions[stage])ifcustom:parts.append(f额外要求{custom})return\n.join(parts)关键点通过字典映射将用户下拉框选择转换为专业指令支持创作阶段切换同一主题在不同阶段获得不同指导自定义指令追加到末尾灵活扩展2. 流式生成SSE 实时推送传统 API 调用需要等待完整响应对于长文本体验极差。本系统采用Server-Sent Events实现流式输出app.route(/api/generate/stream,methods[POST])defgenerate_stream():datarequest.json system_promptbuild_system_prompt(data.get(params,{}))user_inputdata.get(user_input,)messages[{role:system,content:system_prompt},{role:user,content:user_input}]defevent_stream():full_responsetoken_count0try:respmake_llm_request(messages,streamTrue,temperature0.8)forlineinresp.iter_lines(decode_unicodeTrue):ifnotlineornotline.startswith(data: ):continuedata_strline[6:].strip()ifdata_str[DONE]:breaktry:chunkjson.loads(data_str)contentchunk[choices][0].get(delta,{}).get(content,)ifcontent:full_responsecontent token_count1yieldfdata:{json.dumps({content:content,count:token_count})}\n\nexcept:continue# 保存历史save_history(project_id,system_prompt,user_input,full_response,token_count)yieldfdata:{json.dumps({done:True,project_id:project_id})}\n\nexceptExceptionase:yieldfdata:{json.dumps({error:str(e)})}\n\nreturnResponse(stream_with_context(event_stream()),mimetypetext/event-stream,headers{Cache-Control:no-cache})前端接收逻辑functioncallSSE(url,body,onChunk,onDone,onError){abortControllernewAbortController();fetch(url,{method:POST,headers:{Content-Type:application/json},body:JSON.stringify(body),signal:abortController.signal}).then(response{constreaderresponse.body.getReader();constdecodernewTextDecoder();letbuffer;functionread(){reader.read().then(({done,value}){if(done){onDoneonDone();return;}bufferdecoder.decode(value,{stream:true});constlinesbuffer.split(\n);bufferlines.pop()||;for(constlineoflines){if(line.startsWith(data: )){try{constdataJSON.parse(line.slice(6));if(data.error){onError(data.error);return;}if(data.done){onDone(data);return;}onChunk(data);// 逐字追加显示}catch(e){}}}read();});}read();});}3. 模板系统内置 自定义模板存储在data/templates_default.json和data/templates_custom.json结构如下{小说:{都市爽文:{system:你是一位网文大神级作家。请创作一部都市爽文...,user_template:题材{theme}\n文风{style}\n,params:{文风:爽文风格,篇幅:3000字开篇}}}}套用流程前端点击套用按钮自动填充右侧参数面板文风、篇幅等将user_template填入输入框用户只需替换{theme}占位符点击生成即可保存自定义模板app.route(/api/templates/save,methods[POST])defsave_template():datarequest.json namedata.get(name)categorydata.get(category,自定义)configdata.get(config)withopen(CUSTOM_TEMPLATE_FILE,r,encodingutf-8)asf:customsjson.load(f)ifcategorynotincustoms:customs[category]{}customs[category][name]configwithopen(CUSTOM_TEMPLATE_FILE,w,encodingutf-8)asf:json.dump(customs,f,ensure_asciiFalse,indent2)returnjsonify({status:ok})4. 二次文创元素提取 定向生成步骤 1提取原文核心元素app.route(/api/derivative/extract,methods[POST])defextract_elements():textrequest.json.get(text,)messages[{role:system,content:你是一个专业的文本分析专家。请提取以下字段 - characters: 人物列表 - scenes: 场景列表 - plot_points: 关键剧情点 - quotes: 经典台词 - worldview: 世界观要素 仅返回JSON不要额外解释。},{role:user,content:f原文\n{text[:8000]}}]respmake_llm_request(messages,streamFalse,temperature0.3)resultresp.json()[choices][0][message][content]# 清理可能的 markdown 代码块标记cleanedre.sub(r^\w*\n?,,result.strip())cleanedre.sub(r\n?$,,cleaned)elementsjson.loads(cleaned)returnjsonify({elements:elements})步骤 2基于方向生成衍生内容DERIVATIVE_DIRECTIONS{同人番外:请基于原文的人物和世界观创作一篇同人番外故事...,剧情改写:请基于原文的故事框架进行剧情改写...,结局重写:请为原文重新设计一个结局...,短剧脚本:请将原文改编为短剧脚本格式...,有声书台词:请将原文改编为有声书台词版本...,}app.route(/api/derivative/generate/stream,methods[POST])defderivative_generate_stream():directiondata.get(direction,同人番外)direction_promptDERIVATIVE_DIRECTIONS.get(direction)system_promptf你是一位专业的文创开发专家。{direction_prompt}ifcustom_instruction:system_promptf\n额外要求{custom_instruction}user_contentf原文内容\n{original_text[:6000]}ifelements:user_contentf\n\n已提取的核心元素\n{json.dumps(elements)}# ... 后续流式生成逻辑同上5. 速率限制与 Token 统计简易速率限制防滥用_rate_records{}# {ip: [timestamps]}RATE_LIMIT30# 每分钟最多 30 次RATE_WINDOW60# 窗口 60 秒defcheck_rate_limit(client_ip):nowtime.time()records_rate_records.get(client_ip,[])records[tfortinrecordsifnow-tRATE_WINDOW]iflen(records)RATE_LIMIT:returnFalserecords.append(now)_rate_records[client_ip]recordsreturnTrue在每个 API 入口调用client_iprequest.remote_addrifnotcheck_rate_limit(client_ip):returnjsonify({error:请求过于频繁请稍后再试}),429Token 统计_token_stats{total_input:0,total_output:0,requests:0}# 每次生成完成后累加_token_stats[total_output]token_count _token_stats[requests]1app.route(/api/stats)defget_stats():returnjsonify(_token_stats)前端左下角实时展示今日消耗。五、前端交互设计1. 三栏布局┌──────────┬──────────────────────────┬──────────────┐ │ 左侧导航 │ 中央编辑区 │ 右侧参数面板 │ │ │ │ │ │ ✏ 创作 │ [输入框] │ 创作主题 │ │ 模板 │ [生成结果 Markdown] │ 体裁下拉 │ │ 文创 │ │ 文风下拉 │ │ 历史 │ │ 篇幅下拉 │ │ │ │ 自定义指令 │ │ │ │ [保存模板] │ └──────────┴──────────────────────────┴──────────────┘2. 创作阶段导航用户在完整创作 / 世界观搭建 / 人物设定 / 大纲生成 / 章节续写 / 内容润色之间切换后端根据当前阶段调整 System Prompt。3. 选中段落定向改写用户在生成结果中选中一段文字自动弹出改写按钮输入指令如让描写更生动后端调用/api/generate/rewrite返回改写后内容并替换原文六、Docker 部署DockerfileFROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . RUN mkdir -p data/history data/user_templates uploads EXPOSE 5000 CMD [python, app.py]docker-compose.ymlversion:3.8services:book-ai-agent:build:.container_name:book-ai-agentports:-5000:5000volumes:-./data:/app/data-./uploads:/app/uploadsenvironment:-TZAsia/Shanghairestart:unless-stopped启动命令docker-composeup-d--build访问http://localhost:5000即可使用。七、关键技术总结技术点实现方式价值Prompt 动态拼接参数字典映射 阶段指令让非技术人员也能生成高质量 PromptSSE 流式输出Flaskstream_with_context 前端ReadableStream长文本生成体验提升 10 倍模板系统JSON 文件存储 前端卡片展示降低使用门槛沉淀最佳实践二次文创两阶段处理提取→生成结构化理解原文衍生更精准速率限制基于 IP 的时间窗口计数防止 API 滥用控制成本Docker 化多阶段构建 Volume 挂载一键部署数据持久化八、源码地址本项目完整代码已开源包含app.pyFlask 后端730 行templates/index.html前端单页面988 行Dockerfiledocker-compose.yml容器化配置requirements.txtPython 依赖GitHub:九、后续优化方向向量数据库集成引入 Chroma/Pinecone实现长文档语义检索多模型路由根据任务复杂度自动选择 deepseek-v4-flash / deepseek-chat协作功能支持多人同时编辑同一项目实时同步移动端适配响应式布局支持手机端创作插件系统允许开发者扩展新的文创方向或模板类型结语本系统展示了如何将大模型 API、Prompt 工程、Web 开发有机结合打造一个真正可用的 AI 辅助创作工具。希望对你有所启发