AI小说生成器
一款基于大语言模型的多功能小说生成器,集成了完整的创作工作流,从世界观架构到章节生成,再到一致性维护,为创作者提供全方位的智能写作辅助。
✨ 核心功能
🎨 小说设定工坊
- 世界观架构:基于主题和题材生成完整的小说设定
- 角色动态设计:创建具有发展弧光的角色系统
- 剧情蓝图规划:构建逻辑严谨的章节架构
📖 智能章节生成
- 多阶段生成保障:确保剧情连贯性和逻辑一致性
- 上下文感知:基于前文内容智能续写
- 风格统一:维持整体文风和叙事节奏
🧠 状态追踪系统
- 角色发展轨迹:实时更新角色状态和关系变化
- 伏笔管理系统:跟踪未解决冲突和待推进剧情线
- 全局摘要维护:动态更新故事进展概览
🔍 语义检索引擎
- 向量化存储:基于ChromaDB的上下文向量库
- 智能检索:相关性驱动的知识片段提取
- 长程一致性:跨越章节的设定统一维护
📚 知识库集成
- 本地文档支持:导入参考文档增强创作素材
- 智能文本分割:基于语义的文档分段处理
- 向量化存储:高效的知识检索和利用
✅ 自动审校机制
- 剧情矛盾检测:识别设定冲突和逻辑不一致
- 连续性检查:确保角色状态和情节发展的连贯性
- 冲突预警:提前发现潜在的故事性问题
🖥 可视化工作台
- 一体化界面:配置、生成、审校全流程GUI操作
- 实时进度跟踪:直观显示生成状态和结果
- 参数灵活调整:支持温度、token数等精细调控
🛠 安装指南
环境要求
- Python 3.9+ 运行环境(推荐3.10-3.12)
- pip 包管理工具
- 有效API密钥(OpenAI/DeepSeek等云端服务或Ollama等本地接口)
安装步骤
-
下载项目
git clone https://github.com/YILING0013/AI_NovelGenerator cd AI_NovelGenerator -
安装依赖
pip install -r requirements.txt -
运行应用
python main.py
可选步骤
如遇依赖安装问题,可安装C++编译工具:
- 下载 Visual Studio Build Tools
- 安装时勾选 C++ 桌面开发 选项
🚀 使用说明
基础配置
首先在GUI界面中配置LLM接口参数:
# 示例配置结构
{
"api_key": "your_api_key",
"base_url": "https://api.deepseek.com/v1",
"model_name": "deepseek-chat",
"temperature": 0.7,
"max_tokens": 8192
}
核心工作流
1. 小说架构生成
Novel_architecture_generate(
interface_format="OpenAI",
api_key=api_key,
base_url=base_url,
llm_model="deepseek-chat",
topic="科幻未来",
genre="硬科幻",
number_of_chapters=20,
word_number=3000,
filepath="./novel_project"
)
2. 章节蓝图规划
Chapter_blueprint_generate(
interface_format=interface_format,
api_key=api_key,
base_url=base_url,
llm_model=model_name,
filepath=filepath,
number_of_chapters=number_of_chapters
)
3. 章节内容生成
# 生成章节草稿
chapter_draft = generate_chapter_draft(
interface_format=interface_format,
api_key=api_key,
base_url=base_url,
model_name=model_name,
temperature=temperature,
filepath=filepath,
novel_number=chapter_num,
user_guidance=user_guidance
)
4. 一致性检查
consistency_result = check_consistency(
novel_setting=novel_setting,
character_state=character_state,
global_summary=global_summary,
chapter_text=chapter_text,
api_key=api_key,
base_url=base_url,
model_name=model_name
)
知识库集成
导入参考文档增强创作素材:
import_knowledge_file(
embedding_api_key=embedding_api_key,
embedding_url=embedding_url,
embedding_interface_format=embedding_interface_format,
embedding_model_name=embedding_model_name,
file_path="./knowledge.txt",
filepath=filepath
)
💻 核心代码
章节蓝图解析器
def parse_chapter_blueprint(blueprint_text: str):
"""
解析整份章节蓝图文本,返回结构化数据
返回格式:
{
"chapter_number": int, # 章节编号
"chapter_title": str, # 章节标题
"chapter_role": str, # 本章定位
"chapter_purpose": str, # 核心作用
"suspense_level": str, # 悬念密度
"foreshadowing": str, # 伏笔操作
"plot_twist_level": str, # 认知颠覆
"chapter_summary": str # 本章简述
}
"""
chunks = re.split(r'\n\s*\n', blueprint_text.strip())
results = []
# 正则模式匹配各字段
chapter_number_pattern = re.compile(r'^第\s*(\d+)\s*章\s*-\s*\[?(.*?)\]?$')
role_pattern = re.compile(r'^本章定位:\s*\[?(.*)\]?$')
purpose_pattern = re.compile(r'^核心作用:\s*\[?(.*)\]?$')
for chunk in chunks:
lines = chunk.strip().splitlines()
if not lines:
continue
# 解析章节头部信息
header_match = chapter_number_pattern.match(lines[0].strip())
if header_match:
chapter_number = int(header_match.group(1))
chapter_title = header_match.group(2).strip()
# 解析其他字段
chapter_data = {
"chapter_number": chapter_number,
"chapter_title": chapter_title,
"chapter_role": "",
"chapter_purpose": "",
"suspense_level": "",
"foreshadowing": "",
"plot_twist_level": "",
"chapter_summary": ""
}
# 遍历剩余行匹配各字段
for line in lines[1:]:
line_stripped = line.strip()
# 各字段模式匹配...
results.append(chapter_data)
# 按章节编号排序返回
results.sort(key=lambda x: x["chapter_number"])
return results
一致性检查器
def check_consistency(
novel_setting: str,
character_state: str,
global_summary: str,
chapter_text: str,
api_key: str,
base_url: str,
model_name: str,
temperature: float = 0.3,
plot_arcs: str = "",
interface_format: str = "OpenAI",
max_tokens: int = 2048,
timeout: int = 600
) -> str:
"""
调用模型进行一致性检查,检测剧情冲突和逻辑不一致
新增对未解决冲突或剧情要点的衔接情况检查
"""
# 构建检查提示词
prompt = CONSISTENCY_PROMPT.format(
novel_setting=novel_setting,
character_state=character_state,
global_summary=global_summary,
plot_arcs=plot_arcs,
chapter_text=chapter_text
)
# 创建LLM适配器
llm_adapter = create_llm_adapter(
interface_format=interface_format,
base_url=base_url,
model_name=model_name,
api_key=api_key,
temperature=temperature,
max_tokens=max_tokens,
timeout=timeout
)
# 调用模型进行检查
response = llm_adapter.invoke(prompt)
return response if response else "审校Agent无回复"
配置管理器
def load_config(config_file: str) -> dict:
"""从指定配置文件加载配置,不存在时创建默认配置"""
if not os.path.exists(config_file):
create_config(config_file)
try:
with open(config_file, 'r', encoding='utf-8') as f:
return json.load(f)
except:
return {}
def create_config(config_file: str) -> dict:
"""创建默认配置文件,包含多种模型配置"""
config = {
"last_interface_format": "OpenAI",
"last_embedding_interface_format": "OpenAI",
"llm_configs": {
"DeepSeek V3": {
"api_key": "",
"base_url": "https://api.deepseek.com/v1",
"model_name": "deepseek-chat",
"temperature": 0.7,
"max_tokens": 8192,
"timeout": 600,
"interface_format": "OpenAI"
},
# 其他模型配置...
},
"embedding_configs": {
"OpenAI": {
"api_key": "",
"base_url": "https://api.openai.com/v1",
"model_name": "text-embedding-ada-002",
"retrieval_k": 4,
"interface_format": "OpenAI"
}
}
}
return config
LLM适配器框架
class BaseLLMAdapter:
"""统一的LLM接口基类,为不同后端提供一致的方法签名"""
def invoke(self, prompt: str) -> str:
raise NotImplementedError("Subclasses must implement .invoke(prompt) method.")
class DeepSeekAdapter(BaseLLMAdapter):
"""DeepSeek官方/OpenAI兼容接口适配器"""
def __init__(self, api_key: str, base_url: str, model_name: str,
max_tokens: int, temperature: float = 0.7,
timeout: Optional[int] = 600):
self.base_url = check_base_url(base_url)
self.api_key = api_key
self.model_name = model_name
self.max_tokens = max_tokens
self.temperature = temperature
self.timeout = timeout
self._client = ChatOpenAI(
model=self.model_name,
api_key=self.api_key,
base_url=self.base_url,
max_tokens=self.max_tokens,
temperature=self.temperature,
timeout=self.timeout
)
def invoke(self, prompt: str) -> str:
"""调用模型生成内容"""
response = self._client.invoke(prompt)
return response
该项目通过模块化设计和统一的接口抽象,为小说创作提供了完整的AI辅助解决方案,显著提升了创作效率和质量一致性。