Skip to content

AI 小说生成系统

利用 AI 能力快速生成小说内容,支持多种生成模式和自定义 API 接入


📖 系统概述

AI 小说生成系统是灵码小说助手的核心引擎,提供流式内容生成能力。系统支持多种生成模式(大纲生成、章节生成、内容续写等),并允许用户接入自己的 AI API 服务。


🎯 功能特性

1. 流式生成技术

实时创作体验:

用户请求 → AI 开始生成 → 逐字/逐句返回 → 实时显示在界面
特性说明
实时输出内容生成后立即显示,无需等待完整响应
思维链可视化可选显示 AI 的推理过程
中断支持用户可随时停止生成
断点续传网络中断后可从断点继续

2. 多种生成模式

模式入口说明
大纲生成大纲系统根据项目设定生成完整大纲
大纲续写大纲系统基于现有大纲续写后续内容
章节生成章节系统根据大纲生成章节正文
章节续写章节编辑基于现有内容续写
快捷生成生成器页面独立的快速生成入口

3. 参数化控制

生成参数:

参数说明示例
title小说标题"星际迷航"
genre小说类型科幻、奇幻、悬疑...
style写作风格现实主义、浪漫主义...
requirements详细要求"主角性格要冷酷"
word_count目标字数3000
temperature创意度0.7 (0-1)

小说类型:

  • 科幻、奇幻、悬疑、爱情、历史
  • 军事、都市、武侠、仙侠、游戏
  • 体育、灵异、同人、轻小说

写作风格:

  • 现实主义、浪漫主义、古典主义
  • 现代主义、魔幻现实主义
  • 黑色幽默、意识流、自然主义

4. 自定义 API 接入

用户可配置自己的 AI API:

配置项键名说明
API 地址api_base兼容 OpenAI 格式的 API 地址
API 密钥api_keyAPI 访问密钥(加密存储)
模型名称api_model使用的模型(如 gpt-4)
最大 Tokenapi_max_tokens单次生成最大 Token 数

🗄️ 数据模型

UserSetting 模型(API 配置存储)

python
class UserSetting(models.Model):
    id = fields.IntField(pk=True)
    user_id = fields.IntField()              # 用户ID
    key = fields.CharField(max_length=100)   # 配置键
    value = fields.TextField()               # 配置值(加密存储)

    class Meta:
        table = "user_settings"
        unique_together = (("user_id", "key"),)

预定义配置键:

  • api_key: API 密钥
  • api_base: API 地址
  • api_model: 模型名称
  • api_max_tokens: 最大 Token 数
  • auto_save: 是否自动保存

生成请求模型

python
class GenerateRequest(BaseModel):
    project_id: Optional[int]         # 关联项目
    title: str                        # 标题
    genre: Optional[str]              # 类型
    style: Optional[str]              # 风格
    requirements: Optional[str]       # 详细要求
    word_count: Optional[int] = 2000  # 目标字数
    temperature: Optional[float] = 0.7  # 创意度
    context: Optional[str]            # 上下文(续写时使用)
    characters: Optional[List[int]]   # 使用的角色ID列表

🔌 API 接口

基础路径

/api/generator

接口列表

方法路径说明
POST/generate生成小说内容(流式)
POST/generate/outline生成大纲(流式)
POST/continue续写内容(流式)
POST/stop停止生成
GET/models获取可用模型列表

用户设置接口

方法路径说明
GET/api/user/settings获取用户设置
PUT/api/user/settings更新用户设置
POST/api/user/settings/test-api测试 API 连接

请求/响应示例

生成小说内容

请求:

json
POST /api/generator/generate
{
  "title": "星际迷航",
  "genre": "科幻",
  "style": "硬科幻",
  "requirements": "主角是一名宇航员,在执行任务时遇到外星文明",
  "word_count": 3000,
  "temperature": 0.7,
  "characters": [1, 2]
}

响应 (Server-Sent Events):

data: {"type": "content", "text": "公元"}
data: {"type": "content", "text": "2157年"}
data: {"type": "content", "text": ","}
data: {"type": "content", "text": "人类"}
...
data: {"type": "done", "word_count": 3024}

续写内容

请求:

json
POST /api/generator/continue
{
  "project_id": 1,
  "chapter_id": 5,
  "context": "李明走进了那扇神秘的大门...",
  "word_count": 1000
}

测试 API 连接

请求:

json
POST /api/user/settings/test-api
{
  "api_base": "https://api.openai.com/v1",
  "api_key": "sk-xxx",
  "api_model": "gpt-4"
}

响应:

json
{
  "success": true,
  "message": "API 连接成功",
  "model_info": {
    "model": "gpt-4",
    "max_tokens": 8192
  }
}

🖥️ 用户交互

快捷生成页面

布局结构:

┌─────────────────────────────────────────────────────────────┐
│  AI 小说生成器                                              │
├────────────────────────┬────────────────────────────────────┤
│                        │                                    │
│  参数设置              │  生成结果                          │
│                        │                                    │
│  标题: [星际迷航____]  │  ┌──────────────────────────────┐ │
│                        │  │                              │ │
│  类型: [科幻____▼]     │  │  公元2157年,人类的星际     │ │
│                        │  │  探索已经进入了新纪元...    │ │
│  风格: [硬科幻__▼]     │  │                              │ │
│                        │  │  ▌ (光标闪烁,正在生成)     │ │
│  字数: [3000____]      │  │                              │ │
│                        │  └──────────────────────────────┘ │
│  详细要求:             │                                    │
│  [________________]    │  字数: 1,234 / 3,000              │
│  [________________]    │                                    │
│                        │  [停止] [复制] [保存到项目]        │
│  [开始生成]            │                                    │
│                        │                                    │
└────────────────────────┴────────────────────────────────────┘

API 设置页面

布局结构:

┌─────────────────────────────────────────────────────────────┐
│  用户设置 > API 配置                                        │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  API 地址                                                   │
│  [https://api.openai.com/v1________________________]        │
│                                                             │
│  API 密钥                                                   │
│  [sk-xxxxxxxxxxxxxxxxxxxxxxxxxx____________________]  [显示]│
│                                                             │
│  模型名称                                                   │
│  [gpt-4____________________________________________]        │
│                                                             │
│  最大 Token 数                                              │
│  [4096_____________________________________________]        │
│                                                             │
│  [测试连接]                           [保存配置]            │
│                                                             │
│  ⓘ API 密钥将加密存储,确保您的数据安全                    │
│                                                             │
└─────────────────────────────────────────────────────────────┘

交互操作

操作方式说明
开始生成点击按钮开始流式生成内容
停止生成点击停止中断当前生成
复制内容点击复制复制生成内容到剪贴板
保存到项目点击保存将内容保存到指定项目/章节
测试 API点击测试验证 API 配置是否正确

生成状态

空闲 → 生成中 → 完成/停止/错误
  │       │
  │       └── 显示进度和字数

  └── 可以开始新的生成

⚙️ 技术实现

前端

路径: src/features/novel_generator/frontend/

文件说明
api.tsAPI 调用封装
pages/GeneratorPage.tsx生成器页面
components/ParameterPanel.tsx参数设置面板
components/ResultPanel.tsx结果展示面板
components/StreamingText.tsx流式文本组件
hooks.ts自定义 Hooks
reducer.ts状态管理

后端

路径: src/features/novel_generator/backend/

文件说明
router.pyFastAPI 路由
services/generator_service.py生成服务
services/prompt_builder.pyPrompt 构建器

路径: src/backend/

文件说明
ai.pyAI 调用封装
core/sse.pySSE 响应处理
core/stream_error_handler.py流式错误处理
services/prompt_service.pyPrompt 模板服务

流式响应实现

后端 (FastAPI):

python
from fastapi.responses import StreamingResponse

@router.post("/generate")
async def generate(request: GenerateRequest):
    async def stream_generator():
        async for chunk in ai_service.generate_stream(request):
            yield f"data: {json.dumps(chunk)}\n\n"
    
    return StreamingResponse(
        stream_generator(),
        media_type="text/event-stream"
    )

前端 (React):

typescript
// 使用 EventSource 或 fetch + ReadableStream
const response = await fetch('/api/generator/generate', {
  method: 'POST',
  body: JSON.stringify(params),
})

const reader = response.body.getReader()
const decoder = new TextDecoder()

while (true) {
  const { done, value } = await reader.read()
  if (done) break
  
  const text = decoder.decode(value)
  // 解析 SSE 数据并更新 UI
  onChunk(text)
}

API 密钥加密

python
from src.backend.core.security import encrypt_api_key, decrypt_api_key

# 存储时加密
encrypted_key = encrypt_api_key(raw_api_key)
await UserSetting.create(user_id=user_id, key="api_key", value=encrypted_key)

# 使用时解密
setting = await UserSetting.get(user_id=user_id, key="api_key")
api_key = decrypt_api_key(setting.value)

Prompt 模板

路径: src/assets/template/

模板文件用途
project_generate.jinja2项目内容生成
project_continue.jinja2项目内容续写
outline.jinja2大纲生成
chapter_generate.jinja2章节生成
chapter_continue.jinja2章节续写
chapter_expand.jinja2章节扩写
chapter_compress.jinja2章节缩写
chapter_optimize.jinja2章节优化
character_generate.jinja2角色生成
short_story.jinja2短篇快速生成

🔒 安全考虑

API 密钥保护

  • 加密存储: 使用 AES 加密存储用户 API Key
  • 传输安全: 仅通过 HTTPS 传输
  • 访问控制: 用户只能访问自己的配置
  • 密钥脱敏: 前端显示时部分隐藏

请求限制

  • 频率限制: 防止滥用
  • Token 限制: 单次请求最大 Token 数限制
  • 并发限制: 同一用户同时只能有一个生成任务

🔗 关联文档