diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..099e0b1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/__pycache__ +/AI_novel +/vectorstore +config.json diff --git a/AI_novel/Novel_directory.txt b/AI_novel/Novel_directory.txt index 9d27345..b059ce0 100644 --- a/AI_novel/Novel_directory.txt +++ b/AI_novel/Novel_directory.txt @@ -1,101 +1,302 @@ + 目录 +《星旅提瓦特》 -第1章 :意外的穿越 -第2章 :提瓦特的初印象 -第3章 :神秘的元素之力 -第4章 :初识伙伴 -第5章 :探索孤独的心灵 -第6章 :冲突的种子 -第7章 :寻找归属感 -第8章 :揭开旧生活的面纱 -第9章 :伊尔的内心战争 -第10章 :莱娜的隐秘之谜 -第11章 :不同理念的碰撞 -第12章 :信任的考验 -第13章 :元素的传承 -第14章 :国家的危机 -第15章 :历史的回响 -第16章 :离别的痛苦 -第17章 :意外的救助 -第18章 :二人的矛盾升级 -第19章 :莱娜的秘密身份 -第20章 :勇气与脆弱 -第21章 :信仰的丧失 -第22章 :敌人的阴影 -第23章 :团结的力量 -第24章 :心灵的契约 -第25章 :遭遇的考验 -第26章 :寻找真相的旅程 -第27章 :伊尔的困惑与苦痛 -第28章 :希望的曙光 -第29章 :道德的抉择 -第30章 :揭露阴谋的关键 -第31章 :危机的加深 -第32章 :莱娜的征途 -第33章 :生与死的抉择 -第34章 :攀登的决心 -第35章 :遭遇叛徒 -第36章 :难忘的过往 -第37章 :勇敢面对内心 -第38章 :追寻信念的光芒 -第39章 :重聚的温暖 -第40章 :绝境中的选择 -第41章 :心灵的感召 -第42章 :勇气的火焰 -第43章 :愈合的力量 -第44章 :两个世界的裂痕 -第45章 :莱娜的使命 -第46章 :面对过去的抉择 -第47章 :背后的黑手 -第48章 :团结的契机 -第49章 :意外的力量觉醒 -第50章 :发现真相的第一步 -第51章 :感情的纠葛 -第52章 :信任重建 -第53章 :旧敌的再现 -第54章 :希望与绝望 -第55章 :勇敢的寡言者 -第56章 :天理的试炼 -第57章 :未知的恐惧 -第58章 :内心的挣扎 -第59章 :辉煌的重现 -第60章 :绝地反击 -第61章 :宿命的交汇 -第62章 :与过去的和解 -第63章 :冲突的顶点 -第64章 :理想与现实的抉择 -第65章 :命运的交错 -第66章 :成长的代价 -第67章 :星的决定 -第68章 :失去的痛苦 -第69章 :最后的希望 -第70章 :勇气之源 -第71章 :荣耀之战 -第72章 :爱的牺牲 -第73章 :背负随行 -第74章 :重塑信仰 -第75章 :群星的聚集 -第76章 :命运的逆转 -第77章 :决战的前夜 -第78章 :承载的力量 -第79章 :归者的使命 -第80章 :能否拯救一切 -第81章 :灵魂的救赎 -第82章 :心灵的碰撞 -第83章 :胜利与失败 -第84章 :被遗忘的记忆 -第85章 :阳光再现 -第86章 :信念的拥抱 -第87章 :重生的希望 -第88章 :抉择的时刻 -第89章 :命运的启示 -第90章 :最后的决策 -第91章 :逆光而行 -第92章 :双重的身份 -第93章 :献出所有的希望 -第94章 :心的归宿 -第95章 :重聚与亲密 -第96章 :与敌的对峙 -第97章 :星的觉醒 -第98章 :平衡的重现 -第99章 :团结的结晶 -第100章 :新世界的曙光 \ No newline at end of file +1. 穿越之旅 + - 星在星穹铁道上的意外穿越,开启了提瓦特的新篇章。 + +2. 迷雾中的初遇 + - 星在蒙德初见琴,感受到这片土地的风与友善。 + +3. 蒙德的秘密 + - 星探索蒙德的文化,发现这里隐藏的历史与神秘。 + +4. 骑士团的使命 + - 琴向星介绍骑士团的职责,星逐渐卷入其中。 + +5. 甘雨的来信 + - 星收到来自璃月的信件,甘雨的温暖与关怀让她心生向往。 + +6. 璃月之旅 + - 星前往璃月,体验独特的岩之文化。 + +7. 千年的孤独 + - 星与甘雨初次相遇,分享各自的孤独与渴望。 + +8. 阿贝多的实验 + - 阿贝多邀请星参与炼金实验,引发了一系列搞笑而意外的事件。 + +9. 黑暗势力的影子 + - 黑暗势力开始在提瓦特活动,星感到前所未有的危机。 + +10. 命运的旋涡 + - 星与各国角色的命运交织,感受到身处漩涡中心的无奈。 + +11. 凯亚的神秘 + - 星与凯亚的互动越来越频繁,潜在的情感开始萌芽。 + +12. 面对过往 + - 星通过梦境回忆起自己在星穹铁道的生活与遗憾。 + +13. 稻妻的召唤 + - 星接到前往稻妻的邀请,了解这个国家的雷之文化。 + +14. 雷电将军的统治 + - 星初见雷电将军,感受到她的冷酷与威严。 + +15. 战斗与信念 + - 星卷入稻妻的内部纷争,为正义而战。 + +16. 情感的对峙 + - 琴、甘雨、凯亚之间的情感矛盾逐渐升级。 + +17. 背叛与和解 + - 星被误解与背叛,她努力修复人际关系。 + +18. 水之国的秘境 + - 星探访Fontaine,领略水元素的神秘魅力。 + +19. 纳特兰的热情 + - 前往Natlan,星感受到火的激情与热烈。 + +20. Sumeru的冰雪 + - 星走入Sumeru,迎接无尽的冰与寒冷。 + +21. 智慧的考验 + - 与阿贝多共同追寻智慧的真相,接受炼金术的挑战。 + +22. 情感的困境 + - 星在角色之间的情感纠葛中挣扎,难以选择。 + +23. 友谊的羁绊 + - 星与各国角色逐渐建立深厚的友谊,共同面对危机。 + +24. 黑暗势力的蔓延 + - 邻国的黑暗势力逐渐扩张,威胁提瓦特的和平。 + +25. 群星的呼唤 + - 星感受到神秘力量的召唤,探索自我本源。 + +26. 秘密的真相 + - 星发现自身的特殊能力与提瓦特的关联。 + +27. 智者的对话 + - 星与甘雨探讨信仰与价值观的碰撞。 + +28. 夜幕下的约定 + - 星与凯亚在月光下的对话,情感逐渐升温。 + +29. 战斗的号角 + - 黑暗势力全面进攻,星与伙伴们面对强敌。 + +30. 牺牲与成长 + - 在战斗中有人牺牲,星经历痛苦与成长。 + +31. 团结的力量 + - 各国联合奋起反抗,星成为他们的钱塘。 + +32. 情感的纠葛 + - 角色之间复杂的情感关系达到高潮。 + +33. 历史的回响 + - 星深入探讨提瓦特历史背后的秘密。 + +34. 迷失的自我 + - 星感到无比迷茫,寻找自己的价值与归属。 + +35. 命运的选择 + - 角色们面临各自的命运抉择,星更加坚定。 + +36. 友情的考验 + - 伴随战斗的加剧,友情经受着巨大的考验。 + +37. 爱的蜕变 + - 星与琴之间的感情逐渐升温,内心波动加剧。 + +38. 黑暗的深渊 + - 星与伙伴们深入敌后的冒险,面临生死考验。 + +39. 重拾信念 + - 在黑暗中,星与甘雨共同重拾对信念的坚定。 + +40. 最终的冲突 + - 星与黑暗势力的最终对决,真相逐渐揭晓。 + +41. 团结的胜利 + - 各国角色携手打败黑暗势力,提瓦特迎来光明。 + +42. 内心的归属 + - 星在战后寻找自我的归属,决定留在提瓦特。 + +43. 新的征程 + - 星与伙伴们共同规划下一步的冒险。 + +44. 与琴的告别 + - 雅致的情感告别,琴与星的羁绊愈加深厚。 + +45. 甘雨的承诺 + - 甘雨向星表达深厚的友情与支持。 + +46. 凯亚的反思 + - 凯亚在最终战斗后对自己的态度进行反思。 + +47. 雷电将军的转变 + - 雷电将军在星的影响下开始重新思考自己的信念。 + +48. 新的挑战 + - 星与伙伴们面对新的冒险与挑战,继续探索提瓦特的奥秘。 + +49. 互相扶持 + - 星与朋友在困难时互相扶持,建立更深的友谊。 + +50. 遗失的记忆 + - 星逐渐恢复穿越前的记忆,理解自身的命运。 + +51. 彼岸的希望 + - 星与伙伴们共同追寻实现梦想的希望。 + +52. 未来的选择 + - 角色们对未来进行深思,探索各自的可能。 + +53. 团体的温暖 + - 在冒险中重温团队间的温暖与支持。 + +54. 残留的悔恨 + - 星感受过去的悔恨与无奈,努力向前。 + +55. 神秘的力量 + - 星探索神秘力量与提瓦特的结合。 + +56. 爱的边界 + - 星思考情感的定义,突破爱的边界。 + +57. 全新的开始 + - 各角色在经历洗礼后,迎接全新的开始。 + +58. 不屈的信仰 + - 角色们坚定信仰,团结共同拯救提瓦特。 + +59. 重拾勇气 + - 在战斗与磨难中,星与伙伴们再次重拾勇气。 + +60. 未来的希冀 + - 星对未来设定新的希望与目标。 + +61. 历史的传承 + - 星逐渐明白提瓦特历史的传承与意义。 + +62. 迷失的难题 + - 星面临内心迷失的问题,努力找到解答。 + +63. 永恒的承诺 + - 角色们对彼此许下永恒的承诺与信任。 + +64. 心灵的感应 + - 星与伙伴们之间建立特殊的心灵感应。 + +65. 茫茫星海 + - 星思考自己所站的位置,在浩瀚星海中感到渺小。 + +66. 时间的流转 + - 在经历日月交替中,角色们逐渐成长。 + +67. 生活的真谛 + - 星领悟生活的真谛与意义,与角色们共同分享。 + +68. 团体的凝聚 + - 团队的凝聚力在冒险中进一步加强。 + +69. 信念的重构 + - 角色们对信念进行重构,理解不同的信仰。 + +70. 心灵的告白 + - 角色们在特定场合进行深情告白,情感达到了顶点。 + +71. 挑战的延续 + - 随着冒险的深入,角色们面对新的挑战与冒险。 + +72. 心灵的同行 + - 星与角色们沿途的心灵交流,增进理解与信任。 + +73. 困扰的阴影 + - 星面临来自内心阴影的困扰,努力寻求解决。 + +74. 踏上归途 + - 星决定在提瓦特长久地生活,而非返回原来的世界。 + +75. 爱的升华 + - 星与琴、甘雨的爱在困扰中升华出新层次。 + +76. 新的开始 + - 星与伙伴们共同踏上新的冒险之旅。 + +77. 艰难的抉择 + - 各角色面临自己的抉择,做出新的决定。 + +78. 追寻真相 + - 星深入探寻提瓦特的核心秘密,与朋友们并肩作战。 + +79. 心灵的重建 + - 各角色在情感的波折中重建自己的内心世界。 + +80. 无畏的冒险 + - 与伙伴们一起,不畏艰险继续冒险。 + +81. 承诺的反思 + - 分开与相聚中,角色们不断反思彼此的承诺。 + +82. 明亮的未来 + - 星展望稳定与和平的未来,与伙伴们共同祈愿。 + +83. 精神的力量 + - 星意识到精神力量在冒险过程中的重要性。 + +84. 合作的喜悦 + - 在面对挑战时,角色们愈加体会到合作的魅力。 + +85. 内心的力量 + - 星在冒险中探索内心的力量与可能性。 + +86. 失落的记忆 + - 星逐渐恢复关于提瓦特的重要记忆,涌现出久违的温暖。 + +87. 团结的信念 + - 在新的旅途中,各国团结一心,捍卫家园。 + +88. 挑战的巅峰 + - 对抗黑暗势力的最终巅峰,所有角色齐心协力。 + +89. 转折的温柔 + - 星与伙伴们在战斗中涌现脆弱之心,增进情感。 + +90. 爱的告白 + - 星为自己珍惜的情感付出,开启告白之旅。 + +91. 希望的光芒 + - 战斗之后,星与伙伴们共同追寻新的希望。 + +92. 信仰的纽带 + - 各角色在信仰上建立起新的纽带。 + +93. 永恒的牵绊 + - 星与伙伴们对彼此的承诺与牵绊更加坚定。 + +94. 最终的归宿 + - 星对自己在提瓦特的归宿有了清晰的认识。 + +95. 团体的梦想 + - 各角色分享对未来的梦想,愿景永不消逝。 + +96. 温暖的重聚 + - 在冒险后,星与伙伴们的重聚,感受到温暖。 + +97. 爱的升华 + - 星与众伙伴的情感达到新的高度,相守相伴。 + +98. 珍惜的时光 + - 彼此珍惜的时光让角色们的关系更加紧密。 + +99. 新的篇章 + - 星准备开启新的篇章,与伙伴们一同探索未知。 + +100. 与星同行 + - 星在提瓦特生活与冒险的美好结尾,成为真正的家园。 diff --git a/AI_novel/Novel_setting.txt b/AI_novel/Novel_setting.txt index 84c7cd1..e8a2b61 100644 --- a/AI_novel/Novel_setting.txt +++ b/AI_novel/Novel_setting.txt @@ -1,36 +1,54 @@ + 最终作品设定 -小说设定 + 小说名称:《星旅提瓦特》 -小说名称: 星陨提瓦特 + 主题 +在遥远的星空彼端,星穹铁道的主角星在一次意外中穿越到原神的提瓦特大陆,面对黑暗势力的威胁,她肩负起拯救这片土地的重任。在这个充满元素力量的新世界中,星与来自不同国家、不同背景的角色们建立起紧密的情感联系,爱恨交织,最终揭开了隐藏在历史背后的秘密。 -总字数走向: 约40万字,分为100章,每章约4000字。整体走向为主角经历成长、探索与冲突,逐渐揭开提瓦特大陆的秘密与危机,最终实现拯救与情感的圆满。 + 类型 +玄幻、冒险、爱情 -小说类型与基调: 本作为玄幻、穿越与冒险题材,主线围绕丰富的爱恨情仇展展开。基调相对轻松,同时穿插挑战与深思,旨在营造出一种既有趣又引人深思的氛围。 + 故事设定 +- 背景世界:提瓦特大陆分为七个国家,代表不同元素力量,包括蒙德(风)、璃月(岩)、稻妻(雷)、须弥(草)、Fontaine(水)、Natlan(火)和Sumeru(冰)。每个国家都有独特的文化、信仰和神明,星必须探索这些国家,寻找力量与盟友,以对抗威胁提瓦特的邪恶势力。 -写作风格: 采用细腻、抒情的写作风格,重点描绘角色内心的探索与情感。叙事视角主要为第三人称全知视角,辅以第一人称的内心独白,以增强角色深度。 +- 主角:星,一名20岁的年轻女性,星穷铁道的乘客,因意外穿越到提瓦特。性格坚韧、不屈,内心渴望寻求归属与理解。她拥有跨越宇宙的能力,能感应元素力量,随着故事的发展,她逐渐发现自己与提瓦特的元素力量有着密切联系。 -整体世界观: 故事设定在提瓦特大陆,这是一个拥有七个不同国度和独特元素力量的神秘幻想世界。历史与传说丰富,比如“天理之战”及各个神祇的传奇故事。科技与魔法并存,元素魔法高度发达,社会结构以王国与神明为核心,复杂的势力交错使人民生活受其影响。 +- 主要角色: + - 琴:25岁,蒙德骑士团副团长,勇敢且正义感强,对星的好奇与保护欲逐渐转化为深厚的情感,面临职责与情感的内心矛盾。 + + - 甘雨:外形20多岁,千岁的璃月半仙,聪慧温柔,与星结成伙伴关系,逐渐对星产生复杂的情感,因使命感而感到孤独。 + + - 凯亚:28岁,蒙德骑士,幽默而神秘,与星之间的互动充满火花,暗生好感,却因性格使然表现得轻佻。 + + - 雷电将军:未知年龄(看似30岁),稻妻的统治者,冷酷无情。星的出现让她开始反思自己的信念,内心对星逐渐产生吸引。 + + - 阿贝多:24岁,璃月的炼金术士,追求真理与知识。对星的独特吸引力使他更加关注她,两人之间的互动充满潜在的火花。 -核心内容梗概: 故事采用英雄之旅结构,主角星因意外穿越到提瓦特,面临神明失去信仰、元素失衡,国家动荡的空前危机。在寻找回家的过程中,星结识了来自不同国家的伙伴,体验各地人文风情,并逐渐揭示穿越的真相。最终,星与伙伴们合力对抗共同的敌人,重塑世界的平衡,也收获真挚的情感。 + 故事进展 +- 第一章:穿越之旅:星在乘坐星穹铁道时遭遇神秘现象,被传送到提瓦特大陆,初次感受到这里的魔法与危险。 +- 中段:星逐渐适应提瓦特生活,遇见各国角色并与他们建立关系,发展情感。同时,黑暗势力逐渐显现,开始捣乱。 +- 爱恨交错的情感:星与不同角色之间情感波动形成复杂的三角关系与误会,推动情节发展与冲突。 +- 高潮:各国联合对抗黑暗势力,星发现隐藏的真相,角色间的关系在生死考验中经历波折。 +- 结局:星经过艰辛战斗,拯救提瓦特,找到了内心的归属,决定留在提瓦特继续她的冒险。 -情节安排设想: 主线围绕星的成长与拯救提瓦特的冒险分为三个阶段:第一阶段是星的穿越与初识,以及角色冲突的引入;第二阶段是与伙伴的深入互动,逐步揭露敌人阴谋及情感发展;第三阶段是最终决战与角色命运交织。副线聚焦其他角色的故事,展示他们与星的命运交织,为故事营造丰富的世界感。 + 章节安排 +- 总章节数:100章,每章约4000字。章节围绕故事的重大事件、角色关系发展及情感冲突展开,穿插战斗场景与情感对话,逐渐推进主线与副线,构建深厚的世界观。 -角色关系与主要角色设定: + 预期效果 +通过这部小说,读者将体验星穹铁道与原神世界的交融,感受到精彩的冒险故事与复杂的人际关系中爱的珍贵与痛苦。 -1. 星(主角): 一名勇敢、好奇且善良的年轻人,满怀探索未知的欲望,面临对归属感的挣扎。在拯救提瓦特的过程中,她渴望成为真正的英雄,同时也处理与伙伴间复杂的情感关系。 +--- -2. 伊尔(冷静的魔法师): 理智、谨慎,拥有强大师法的他在经历失败后变得冷淡,内心深处隐藏痛苦。希望能通过知识与能力解决危机,努力解脱自己的内心痛楚。与星的理想与现实相悖,易引发冲突。 + 角色关系发展 +- 随着故事的发展,角色与星的关系在战斗与情感交流中不断变化,形成复杂的三人关系和误会,推动情节发展。每位角色在星的影响下找到了各自的定位与归属,形成更为团结的团队,共同守护提瓦特的未来。 -3. 莱娜(隐秘的元素使者): 神秘而强大的她深谙元素魔法,在寻找与星的关系中,探索自己的身份之谜。与伊尔之间存在信任危机,随着故事发展,二人将面临信任与情感的考验。 + 敏感线及处理限制 +在故事中,涉及到复杂情感关系与角色成长的敏感线须谨慎处理,以避免负面影响: +1. 情感纠葛:避免过于戏剧化的情感对立,确保角色情感发展符合逻辑。 +2. 信念冲突:尊重各角色的信念,展现多元化价值观,而非仅单一立场。 +3. 责任与牺牲:描绘牺牲时避免血腥或悲惨的过度描写,确保具有深刻意义。 +4. 文化差异:尊重各国文化,避免采用刻板印象,准确表现各国背景。 +5. 性别角色:展现女性角色的多维性与复杂性,避免单一化形象。 +6. 身份认同:积极探讨归属感与自我认同,保障角色内心旅程的积极性。 -暗线与伏笔构思: - -1. 星的过往: 星对旧生活的怀念与痛苦逐渐显现,推动她在救助他人和回归原生活之间的抉择,进而引发与伙伴之间的深入讨论。 - -2. 伊尔的秘密: 伊尔对过去的隐瞒以及与敌对势力的牵连,在关键时刻暴露,导致团队关系动摇,让星更深刻地理解他的痛苦。 - -3. 莱娜的使命: 莱娜的神秘身份及意图逐步显露,最终必须面对身份的真实,仅在关键时刻,有赖于星与伊尔的支持,坚定她内心的归属感。 - -4. 星与伊尔的理念冲突: 星与伊尔在道德取向上发生摩擦,在选择重大事件时,两人的冲突达到顶峰,最终通过事件的解决促进彼此之间的理解与成长。 - -在这些设定中,角色的动机与暗线及伏笔相互交织,为整个故事增添了复杂性与紧张感,确保每一位角色的成长与情感发展贯穿始终,丰富了提瓦特大陆的冒险传奇。 \ No newline at end of file +通过谨慎处理这些敏感线,小说将更加深刻和动人,吸引读者产生共鸣。 diff --git a/AI_novel/chapter.txt b/AI_novel/chapter.txt deleted file mode 100644 index 075f280..0000000 --- a/AI_novel/chapter.txt +++ /dev/null @@ -1,72 +0,0 @@ - -星缓缓睁开眼睛,意识到自己正躺在一片陌生的土地上。四周是葱茏的树木,阳光透过树叶洒下斑驳的光影,微风轻拂,带来一丝清新的气息。她试图站起身来,身体却感到无力,仿佛刚经历了一场翻天覆地的梦境。迷茫与恐惧瞬间涌上心头——她究竟身处何地? - -“别 panicking,星。”她自言自语,努力让自己冷静下来。可无论她怎么深呼吸,心中的慌乱与不安依旧如影随形。刚才她还在自己的家中,思绪被一扇打开的窗户吸引,目光追随着飞过的鸟儿,突然遭遇了一道神秘的光芒,她的意识就在那瞬间被撕扯了开来。而现在,她却身处于这个陌生的世界,这一切都让她感到无比的恐慌。 - -尝试坐起身来,星环顾四周,发现这片森林似乎与她的记忆截然相反。树木高耸入云,树干粗壮而苍翠,叶子则在微风中轻轻摇晃,发出沙沙的声响。然而,这些美丽的自然景象并没有为她带来一丝安慰——相反,她觉得一种不安的气息弥漫在空气中,仿佛这片森林隐藏着某种不为人知的秘密。 - -星的心中掠过一丝奇异的感觉,似乎这片土地上有着某种她无法理解的力量在流动。她强迫自己站起身,决定探索这个世界。若想办法找到回家的路,先得了解这个地方。她开始慢慢前行,脚下的土地干燥而坚硬,偶尔踩到几根枯枝,发出清脆的声响。 - -随着深入森林,她注意到周围的植物似乎散发着微弱的光芒,仿佛在回应着她的存在。星试图触摸那些植物,感受那股能量,却发现它们在她的手指间划过时变成了莹莹的光点,瞬间就消散了。她心中一紧,这显然不是普通的植物,她的直觉告诉她,自己可能身处于一个充满魔法的地方。 - -就在这时,她的思绪被一阵低语声打断。星停下脚步,四处张望,试图找到声音的来源。声音似乎从四面八方传来,但却又似乎是从某个深渊中回荡而出,朦胧而模糊。 - -“是谁在说话?”星喃喃自语,然而没有人回应。她心中浮现出一丝不安,迫切想要找到声音的源头。正当她准备继续探索时,眼前突然闪过一道亮光。她的心一颤,抬头看去,透过树木的缝隙,她隐约看到一个身影,似乎在远处的空旷地带移动。 - -出于好奇,星忍不住向前走去,穿越过一片茂密的灌木丛。终于,她走出林间,来到了一个开阔的空地上。眼前的一幕让她惊讶不已——一座宏伟的法阵正镶嵌于地面,阵法复杂而美丽,闪烁着微光,似乎在向她召唤。 - -“这是什么?”星自言自语,心中充满了疑惑与好奇。她走到法阵边缘,感觉到一股温暖的气流从阵法中透出。星的手指微微颤动,不由自主地伸向了那个法阵,触碰到了那些复杂的符文。瞬间,她感到一阵剧烈的震动,法阵光芒大盛,星的身体被卷入其中,意识在瞬间模糊而又清晰。 - -“啊!”她惊呼,仿佛被一股无形的力量撕扯着。整个世界都在颠覆,光芒刺眼,四周的景象如同狂风中的飘絮般不断变换,星感到自己像是随风而舞的叶子,无法控制。就在意识即将消散的瞬间,她听到了那个低语声,竟然清晰而响亮:“命运的选择。” - -然后,星失去了意识。 - -当她再次睁开眼睛时,发现自己坐在一块石头上,周围是一片开阔的草地,远处是连绵起伏的山脉,天空湛蓝,阳光温暖,仿佛一切都是那么美好。可在她心中,却依然残留着那股恐惧与不安。 - -“这是哪里?”她自言自语,四处打量。就在这时,一个阴影笼罩了她,星抬头一看,面前站着一个高大的男子,身穿长袍,手中握着法杖,面容冷峻,眼神中透着智慧与审视。 - -“你是谁?”星有些警惕地问道,虽然心中已经有了几分预感。 - -“我是伊尔,一个魔法师。”男子的声音低沉而有力,似乎带着某种压迫感,“你应该是从那个法阵中被传送过来的吧?” - -星点点头,虽然内心依旧充满困惑,但她知道自己必须与眼前这个陌生人好好交流。“是的,我…我不知道自己为什么来到这里。” - -伊尔微微皱眉,目光在她身上扫视,似乎在打量她的言语是否可信。“这片土地并不安全,你的到来可不是什么偶然。元素的平衡正在崩溃,神明的意志也逐渐淡去。” - -“神明的意志?”星困惑地问道,心中浮现出关于提瓦特的传说与故事。她从小就听说过这个富饶而神秘的大陆,但从未想过自己会置身其中。 - -“没错,”伊尔坚定地点头,“提瓦特大陆上,七位神明各自守护着一个国度,而你在这里的出现,可能与某种更大的命运息息相关。” - -“我只想回家。”星低声说道,心中依然渴望着熟悉的生活,尽管她也感受到这个新的世界是如此吸引人。 - -“回家并不是那么简单。”伊尔的声音中透着冷静,他的眼神中闪烁着某种复杂的情感,“在这片土地上,你必须要面对许多你无法想象的挑战。” - -星感到了一丝绝望,她并不想成为一名英雄,自己不过是一名普通的年轻人。“我……我能做些什么?” - -“或许我们可以一起探索这个世界。”伊尔的语气缓和了一些,似乎对她产生了一丝信任,“我对魔法的研究或许能帮助你找到线索。” - -“谢谢你,伊尔。”星感激地点头,虽然她对眼前的陌生人依然有些顾虑,但她知道自己必须要有人陪伴,才能在这个陌生的世界中生存下去。 - -就在这时,草地的另一侧,一道神秘的光芒闪过,随即出现了另一个身影。那是一位少女,长发披肩,身穿轻盈的衣袍,眼神深邃而神秘,她似乎在默默地注视着星与伊尔。 - -“你是……”星愣了一下,有些惊讶。 - -“我叫莱娜。”少女轻声说道,她的声音如同空灵的风铃,给人一种奇特的亲切感,“我感觉到了你的到来,希望能和你们一起探索这个世界。” - -“你也感知到了?”伊尔微微皱眉,似乎对莱娜的出现有些意外,却又没有质疑的意思。 - -“是的。”莱娜的眼神透着某种不易察觉的情感,“我对自然元素有着强烈的感应,能够感受到世界的变化。” - -星心中一震,莱娜的出现让她感到了一丝安慰,也增添了对这个世界的探索欲望。“或许我们可以一起合作,找出这个世界的秘密。” - -莱娜微微一笑,仿佛认可了星的提议。“我相信,我们的命运将会交织在一起。” - -三人之间逐渐形成了一种微妙的默契。尽管星对这个新世界的未来仍感到模糊不清,内心的惶恐也未完全消散,但在伊尔与莱娜的陪伴下,她逐渐意识到自己不再孤单。接下来,等待她的将是未知的冒险,她必须做好面对的准备。 - -正当星准备问伊尔关于这个世界的更多事情时,突然,一股强烈的能量波动猛然袭来,她耳边仿佛听到了那道低语的声音再度浮现,清晰而坚定:“命运的选择,终于来临!” - -星的心脏骤然加速,四周的空气似乎在那一瞬间凝固。她抬头,看到远处的天空中,一片阴云迅速聚集而来,预示着某种危险的逼近。一个模糊的影像在天际闪现,似乎正暗示着未来的冲突与挑战,而她所要面对的,绝不仅仅是对自我归属的探索。 - -“我们要走!”伊尔的声音打断了星的思绪,他的目光变得凝重,“不可忽视的危机即将降临,我们必须立刻找到安全的地方!” - -星与莱娜对视一眼,心中都涌起一股紧迫感。对即将来临的挑战,三人并肩而立,准备迎接未知的未来。此刻,她们的命运已经交织在了一起,故事的篇章才刚刚开启,而未来的旅程充满了未知与悬念。 \ No newline at end of file diff --git a/AI_novel/character_state.txt b/AI_novel/character_state.txt index e69de29..766fbc4 100644 --- a/AI_novel/character_state.txt +++ b/AI_novel/character_state.txt @@ -0,0 +1,38 @@ +### 更新后的角色信息 + +#### 星(主角) +- **年龄**: 20岁 +- **背景**: 原本生活在大都市的普通女性,因对归属感的渴望而选择乘坐星穹铁道,意外穿越到了提瓦特的异世界。性格内向而敏感,心中充满探索未知的渴望,也对勇气与坚定有着深深的向往。在穿越前,常感孤独,并在快节奏的生活中迷失。希望找到属于自己的位置。 +- **当前状态**: 刚经历第一次战斗,成功调动了风的元素力量,感受到力量带来的惊喜与恐惧。与琴建立了更深的信任关系,并对凯亚产生了好奇。内心对“失落者”的传闻感到不安,迫切想探索更多秘密。 +- **持有物品**: 发现并拥有一枚神秘的元素徽章,能够帮助她更好地感应周围的元素力量。 +- **能力变化**: 初步掌握了风的元素力量,能够调动周围空气并产生简单的风力效果。对元素力量的认知和控制有所提高,但仍感到不安。 + +#### 琴 +- **年龄**: 25岁(推测) +- **身份**: 蒙德骑士团副团长 +- **背景**: 作为一名优秀的骑士,琴责任心强,性格坚定而富有魅力。她总是尽力保护弱者,并热心助人。随着与星的互动加深,逐渐对星的潜力有了更深的认识,并愿意将自己的经验传授给她。 +- **当前状态**: 在与星的合作中,感受到自身责任感的加重,积极支持星的成长和探索。虽然因战斗受了些许伤,但依然充满信心。 +- **能力变化**: 通过指导星,她在观察中感受到自己的领导能力在逐渐增强,并对元素力量的理解也在加深。 + +#### 凯亚 +- **年龄**: 28岁(推测) +- **身份**: 蒙德骑士 +- **背景**: 个性幽默而神秘,内心深处隐藏着自己的故事与秘密。他对星产生了浓厚的兴趣,并希望给予帮助,打算在日后更多地与星互动。 +- **当前状态**: 在观察星与琴的互动中,感受到两者之间的信任逐渐加深,暗自思考如何以自己独特的方式帮助她。同时,他对于“失落者”的传闻也开始感到不安。 +- **能力变化**: 在星的成长过程中,他开始适时提供帮助,利用骑士团的资源,提升自己在团体中的影响力。 + +### 角色关系与动态 +- **星与琴**: 在共同战斗和探索中,两者的信任关系愈加深厚,星逐渐在琴身上看到勇气与责任感。琴将继续引导星应对未来的挑战。 +- **星与凯亚**: 凯亚对星的关注逐渐加深,可能会在未来向星提供帮助与指导,星对此感到好奇与期待。 +- **琴与凯亚**: 两者之间默契依旧,琴对凯亚的调侃逐渐演变为互相支持,形成了良好的团队氛围。 + +### 正在发生的重要事件 +1. **战斗事件**: 星首次参与战斗,成功调动元素力量击退风狼,展示出她在新环境中的适应能力与潜力。此战斗让星的力量得到了初步的验证与掌握。 +2. **探索蒙德城**: 星与琴一同游览蒙德城,了解提瓦特的文化,努力寻找归属感。在探索过程中,星的内心感受到归属的渴望逐渐增强。 +3. **黑暗势力的威胁**: 关于“失落者”的传言开始在城镇中流传,星的内心感到一丝不安,暗示着未来的挑战。星开始对这股黑暗势力的成因与目的产生疑问。 + +### 新增角色 +- **无**: 目前未新增重要角色。 + +### 总结 +在这一章节中,星与琴通过合作加深了彼此的理解与信任,而凯亚则为星的旅程增添了神秘与支持。星经历了首次战斗,展现了她的潜力与勇气,但同时也面临对力量无法完全掌控的恐惧。随着黑暗势力的威胁逐渐显露,星的冒险将进一步展开,她的使命、归属感以及与伙伴间的关系将随着故事的发展不断深化。 \ No newline at end of file diff --git a/AI_novel/global_summary.txt b/AI_novel/global_summary.txt index e69de29..c476b5e 100644 --- a/AI_novel/global_summary.txt +++ b/AI_novel/global_summary.txt @@ -0,0 +1,9 @@ +### 更新后的全局摘要: + +故事的主角星是一名二十岁的年轻女性,渴望寻找归属感。在一次神秘的星穹铁道旅行中,列车突然发生剧烈震动,星被一种强大的力量吸引,随即穿越时空,经历了奇异的景象。当她醒来时,发现自己身处一个生机勃勃的新世界——提瓦特。 + +在这个陌生的世界中,星感受到一种元素的力量,但也遭遇了受到黑暗力量影响的野兽。在危急时刻,一位名叫琴的骑士及时救下了她,并成为她在此世界的向导和首个伙伴。琴向星介绍了提瓦特的各国文化及其信仰,并带她游览蒙德城,逐渐让星感受到归属感。然而,星的直觉告诉她这片土地并不如表面般美好,暗影中的身影让她倍感不安。 + +在与琴的互动中,星对骑士的勇气与责任感心生向往,决心努力变得勇敢。在一次遭遇强大风狼的战斗中,琴展现了无畏与坚定,而星在琴的鼓励下,首次成功调动了元素力量,击退了风狼,增强了自信与能力。此时,另一位骑士凯亚的出现为她们的冒险增添了更多悬念与期待。 + +随着星、琴和凯亚之间的信任与默契加深,她逐渐意识到提瓦特的黑暗势力正在潜藏,威胁着这个美丽的世界。在战斗与温馨的互动之后,星发誓要找到自己来到这个世界的原因,并与新的伙伴们一起面对即将到来的挑战。她的冒险才刚刚开始,未来的旅程将充满挑战与奇迹,同时隐藏着更多未知的秘密等待她去探索与揭示。 \ No newline at end of file diff --git a/AI_novel/lastchapter.txt b/AI_novel/lastchapter.txt index 8b609e7..d947426 100644 --- a/AI_novel/lastchapter.txt +++ b/AI_novel/lastchapter.txt @@ -1,71 +1,69 @@ -星缓缓睁开眼睛,意识到自己正躺在一片陌生的土地上。四周是葱茏的树木,阳光透过树叶洒下斑驳的光影,微风轻拂,带来一丝清新的气息。她试图站起身来,身体却感到无力,仿佛刚经历了一场翻天覆地的梦境。迷茫与恐惧瞬间涌上心头——她究竟身处何地? +在刚刚经历过激烈战斗的蒙德城,傍晚的阳光透过云层洒下金色的光辉,为这座充满生机的城市增添了一层温暖的纱衣。星和琴并肩走回城镇,琴微微侧身,依然带着战斗后的兴奋与满足,星却感受到心中的复杂情绪在不断翻涌。她刚刚第一次施展出元素力量,尽管成功地击退了风狼,内心的雀跃却因为随之而来的恐惧而逐渐淡化。 -“别 panicking,星。”她自言自语,努力让自己冷静下来。可无论她怎么深呼吸,心中的慌乱与不安依旧如影随形。刚才她还在自己的家中,思绪被一扇打开的窗户吸引,目光追随着飞过的鸟儿,突然遭遇了一道神秘的光芒,她的意识就在那瞬间被撕扯了开来。而现在,她却身处于这个陌生的世界,这一切都让她感到无比的恐慌。 +“你真的做得很好,星。”琴的声音如同一阵温暖的微风,轻轻拂过星的脸庞,然而星却只能微微一笑,心中却难以平静。她的内心仿佛被一层迷雾笼罩,虽然在琴的鼓励下,她感受到了一丝勇气,但对力量的惧怕依然如影随形。 -尝试坐起身来,星环顾四周,发现这片森林似乎与她的记忆截然相反。树木高耸入云,树干粗壮而苍翠,叶子则在微风中轻轻摇晃,发出沙沙的声响。然而,这些美丽的自然景象并没有为她带来一丝安慰——相反,她觉得一种不安的气息弥漫在空气中,仿佛这片森林隐藏着某种不为人知的秘密。 +“谢谢你,琴……”星低声说道,目光游离在城镇的街道上。眼前的景象虽然美好,但她却感到一阵无形的压迫感,仿佛有一双无形的手在她的心头紧紧握住,无法呼吸。 -星的心中掠过一丝奇异的感觉,似乎这片土地上有着某种她无法理解的力量在流动。她强迫自己站起身,决定探索这个世界。若想办法找到回家的路,先得了解这个地方。她开始慢慢前行,脚下的土地干燥而坚硬,偶尔踩到几根枯枝,发出清脆的声响。 +正当她沉浸在思考之中时,琴突然停下了脚步,眼中闪过一丝困惑。“你听到了吗?城里似乎有些不同寻常。”琴的眉头微微皱起,耳边响起了低沉的低语声,似乎是从远处传来。星定神一听,果然在街道的尽头,有人群围着正在交谈,低语声隐约提到黑暗的力量与失踪的居民。 -随着深入森林,她注意到周围的植物似乎散发着微弱的光芒,仿佛在回应着她的存在。星试图触摸那些植物,感受那股能量,却发现它们在她的手指间划过时变成了莹莹的光点,瞬间就消散了。她心中一紧,这显然不是普通的植物,她的直觉告诉她,自己可能身处于一个充满魔法的地方。 +“我们去看看。”星的心中瞬间燃起一丝好奇与紧迫感,虽然对未知的事情感到害怕,但内心的探险欲望却推着她向前。她与琴一起穿过熙熙攘攘的人群,朝着传言的来源走去。 -就在这时,她的思绪被一阵低语声打断。星停下脚步,四处张望,试图找到声音的来源。声音似乎从四面八方传来,但却又似乎是从某个深渊中回荡而出,朦胧而模糊。 +当她们接近人群时,星注意到围着一名老者,他苍白的脸上满是忧愁,声音颤抖地讲述着黑暗势力的传说。围观的人们听得津津有味,不时低声讨论。星心中顿时一紧,这些黑暗势力的传闻正是她在穿越到这个世界后,心中深埋的恐惧。那种感觉就像是一场梦魇,时刻在她的背后徘徊。 -“是谁在说话?”星喃喃自语,然而没有人回应。她心中浮现出一丝不安,迫切想要找到声音的源头。正当她准备继续探索时,眼前突然闪过一道亮光。她的心一颤,抬头看去,透过树木的缝隙,她隐约看到一个身影,似乎在远处的空旷地带移动。 +“几日前,我的小儿子失踪了。”老者紧握着手中的拐杖,声音颤抖得如同风中摇曳的树叶。他的脸上充满了无助与绝望,似乎在周围人们的注视下,所有的悲伤和愤怒都化为一股无形的压迫感。 -出于好奇,星忍不住向前走去,穿越过一片茂密的灌木丛。终于,她走出林间,来到了一个开阔的空地上。眼前的一幕让她惊讶不已——一座宏伟的法阵正镶嵌于地面,阵法复杂而美丽,闪烁着微光,似乎在向她召唤。 +“听说是黑暗势力在作怪,他们要吞噬这个世界的光明,吞噬一切。”人群中有人附和着老者的话,众人开始小声议论,恐惧在空气中弥漫。星的心中一紧,一种不详的预感油然而生。 -“这是什么?”星自言自语,心中充满了疑惑与好奇。她走到法阵边缘,感觉到一股温暖的气流从阵法中透出。星的手指微微颤动,不由自主地伸向了那个法阵,触碰到了那些复杂的符文。瞬间,她感到一阵剧烈的震动,法阵光芒大盛,星的身体被卷入其中,意识在瞬间模糊而又清晰。 +“琴,我们应该调查一下。”星不自觉地握紧了拳头,虽然内心仍有惶恐,但她渴望了解真相,想要找到那些失踪的同胞,想要揭开这不可名状的恐怖面纱。 -“啊!”她惊呼,仿佛被一股无形的力量撕扯着。整个世界都在颠覆,光芒刺眼,四周的景象如同狂风中的飘絮般不断变换,星感到自己像是随风而舞的叶子,无法控制。就在意识即将消散的瞬间,她听到了那个低语声,竟然清晰而响亮:“命运的选择。” +“是的,我们必须对此保持警惕。”琴果断地点头,决心在星的眼前闪烁。她的重要性在于对星的支持,随着她们的旅行,身为副团长的琴也意识到,保护自己身边的伙伴同样是她的职责。 -然后,星失去了意识。 +二人跟随老者的讲述,逐渐吸引了周围人们的注意。就在这时,星的目光不由自主地朝人群的另一侧飘去,一名神秘的流浪者吸引了她的注意。他身材瘦削,裹着一件破旧的斗篷,脸上有些阴影,难以看清其真实的面容。他静静地站在一旁,似乎与周围的喧嚣格格不入。 -当她再次睁开眼睛时,发现自己坐在一块石头上,周围是一片开阔的草地,远处是连绵起伏的山脉,天空湛蓝,阳光温暖,仿佛一切都是那么美好。可在她心中,却依然残留着那股恐惧与不安。 +“你在找什么?”星不知为何,被他的身影吸引,向他们走去。流浪者的眼中闪烁着不同寻常的光芒,仿佛看透了一切,轻声说道:“我在寻找星星。”他的声音柔和,却透着一种诡异的神秘感。 -“这是哪里?”她自言自语,四处打量。就在这时,一个阴影笼罩了她,星抬头一看,面前站着一个高大的男子,身穿长袍,手中握着法杖,面容冷峻,眼神中透着智慧与审视。 +“星星?”星一愣,心中燃起了一种莫名的好奇。耳边传来的低语声似乎在召唤她,流浪者的言语如同钥匙,打开了她心中的那扇门。“你知道关于这片土地的事情吗?”她努力抑制着内心的热切,尽量让自己的声音听起来平静。 -“你是谁?”星有些警惕地问道,虽然心中已经有了几分预感。 +流浪者微微一笑,眼神中透出一种难以言喻的智慧,“这里的一切都是有联系的,尤其是你与那些失落者。”他的语气中透着一丝神秘,仿佛暗示着她与黑暗势力之间的某种联系。 -“我是伊尔,一个魔法师。”男子的声音低沉而有力,似乎带着某种压迫感,“你应该是从那个法阵中被传送过来的吧?” +“失落者……”星喃喃自语,心中涌起一阵不安。她的直觉告诉她,这个流浪者并不简单,或许他知道她所不知的真相。 -星点点头,虽然内心依旧充满困惑,但她知道自己必须与眼前这个陌生人好好交流。“是的,我…我不知道自己为什么来到这里。” +就在这时,琴从一旁走过来,皱眉看着流浪者,语气中透出一丝警惕:“你是谁?为什么要在这里说这些?你知道些什么吗?”琴的声音如同风暴前的宁静,隐含着不安与防备。 -伊尔微微皱眉,目光在她身上扫视,似乎在打量她的言语是否可信。“这片土地并不安全,你的到来可不是什么偶然。元素的平衡正在崩溃,神明的意志也逐渐淡去。” +“我只是个流浪者,听闻真相的人很多,但愿意讲述的人却少之又少。”流浪者微微一笑,似乎对琴的警惕不以为意。他的声音如同夜风,轻柔却充满力量。“然而,星,你的出现是命运的调和,而失落者的命运与整个提瓦特息息相关。” -“神明的意志?”星困惑地问道,心中浮现出关于提瓦特的传说与故事。她从小就听说过这个富饶而神秘的大陆,但从未想过自己会置身其中。 +星的表情微微一变,心中既兴奋又恐惧。她知道自己与这个世界的联系正在逐渐清晰,但流浪者的话却让她感到更深的困惑。“我与失落者有什么关系?”星忍不住问道,心中充满了疑惑。 -“没错,”伊尔坚定地点头,“提瓦特大陆上,七位神明各自守护着一个国度,而你在这里的出现,可能与某种更大的命运息息相关。” +流浪者并没有直接回答她,反而指向天空,目光中透露出一丝沉思:“星星在夜空中闪烁,它们承载着无数个故事和秘密,唯有那些能够倾听的人才能找到答案。”他的话语如同星辰般神秘,让星的思绪越发模糊。 -“我只想回家。”星低声说道,心中依然渴望着熟悉的生活,尽管她也感受到这个新的世界是如此吸引人。 +正当两人之间的对话逐渐深入时,突然一阵破坏性的力量让她们的谈话戛然而止。周围的空气瞬间变得沉重,众人开始慌乱地向后退去,气氛骤然冷却。琴的警觉立刻提升,迅速拉住星的手。她们感觉到了一股强大的黑暗力量正在逼近。 -“回家并不是那么简单。”伊尔的声音中透着冷静,他的眼神中闪烁着某种复杂的情感,“在这片土地上,你必须要面对许多你无法想象的挑战。” +“我们必须离开这里!”琴低声说道,眼中闪过一丝坚定。星的心中顿时涌起一阵不安,四周的低语声瞬间被一种阴冷的气息取代,仿佛整个世界都在彼此期待着什么。 -星感到了一丝绝望,她并不想成为一名英雄,自己不过是一名普通的年轻人。“我……我能做些什么?” +就在此时,几道黑影从人群中窜出,快速朝着星和琴的方向扑来。星的心跳骤然加速,目光中只看到那些黑影如同空中的阴影,凶狠而迅速。它们犹如夜幕中降临的猛兽,瞬间将周围人群的欢声笑语吞没。 -“或许我们可以一起探索这个世界。”伊尔的语气缓和了一些,似乎对她产生了一丝信任,“我对魔法的研究或许能帮助你找到线索。” +“准备战斗!”琴的声音坚定有力,手握武器,展现出骑士的果敢与领导力。星的心中燃起一丝勇气,尽管她对力量的掌控仍显薄弱,但此刻的她已经没有退缩的余地。 -“谢谢你,伊尔。”星感激地点头,虽然她对眼前的陌生人依然有些顾虑,但她知道自己必须要有人陪伴,才能在这个陌生的世界中生存下去。 +黑影迅速逼近,星努力保持冷静,将先前的战斗经验回想起。就在恐惧与期待交织的瞬间,她深吸一口气,心中默念着:“我要坚持下去,我不能让任何人受到伤害!” -就在这时,草地的另一侧,一道神秘的光芒闪过,随即出现了另一个身影。那是一位少女,长发披肩,身穿轻盈的衣袍,眼神深邃而神秘,她似乎在默默地注视着星与伊尔。 +当黑影终于逼近,她们再次面对眼前的敌人,那是几只被黑暗力量扭曲的怪物,形态狰狞,气息阴冷。星心头一紧,几乎无法控制自己的情绪,然而琴的身影在她的脑海中闪过,那份责任与勇气激励着她。她握紧元素徽章,试图感应大自然的力量。 -“你是……”星愣了一下,有些惊讶。 +“星,聚焦你的元素力量!”琴在她耳边坚定地鼓励着。星用力点头,努力将自己与周围的空气相连,再次感应那股温暖的气息。她心中不再是恐惧,而是一种前所未有的坚定与力量。她知道,她必须保护琴,也保护这个她逐渐爱上的世界。 -“我叫莱娜。”少女轻声说道,她的声音如同空灵的风铃,给人一种奇特的亲切感,“我感觉到了你的到来,希望能和你们一起探索这个世界。” +“风之力,听我号令!”星大声呼喊,周围的空气开始涌动,在她的指尖汇聚成风的漩涡。正当她准备施展力量时,那几只怪物已然冲到面前,凶猛地朝她们扑来。琴毫不犹豫地迎上前去,剑光闪烁,与怪物展开激烈的战斗。 -“你也感知到了?”伊尔微微皱眉,似乎对莱娜的出现有些意外,却又没有质疑的意思。 +随着琴的剑舞动,星感受到了那份热血沸腾的激情,心中劈开了恐惧的阴影。在这一刻,星的力量逐渐增强,她闭上双眼,努力与风的力量合为一体。她感受到周围的空气开始流动,仿佛有一种无形的力量正随着她的心跳而起舞。 -“是的。”莱娜的眼神透着某种不易察觉的情感,“我对自然元素有着强烈的感应,能够感受到世界的变化。” +“来吧!”星的声音透着一丝坚定,“我将不再恐惧!” -星心中一震,莱娜的出现让她感到了一丝安慰,也增添了对这个世界的探索欲望。“或许我们可以一起合作,找出这个世界的秘密。” +就在黑暗的怪物即将扑到她面前的瞬间,星指尖的一道旋风破空而出,直接轰向面前的敌人。风的力量如同洪流,撕裂着空气,瞬间将怪物击退,剧烈的撞击声响彻耳畔。惊愕的目光在怪物的脸上浮现,随之而来的则是无尽的绝望。 -莱娜微微一笑,仿佛认可了星的提议。“我相信,我们的命运将会交织在一起。” +“做得很好,星!”琴欣慰的声音如同春风,令她感到温暖。然而,星的心中却涌动着更多的疑问与不安。她能够在一瞬间调动起力量,但对力量的真正理解却依然如谜。 -三人之间逐渐形成了一种微妙的默契。尽管星对这个新世界的未来仍感到模糊不清,内心的惶恐也未完全消散,但在伊尔与莱娜的陪伴下,她逐渐意识到自己不再孤单。接下来,等待她的将是未知的冒险,她必须做好面对的准备。 +随着她的逐步掌控,战斗的局势逐渐扭转。星和琴一起奋力抵抗着来自黑暗势力的侵袭,双方的斗争愈演愈烈,空气中弥漫着紧张的气息。就在她们即将取得胜利之际,流浪者的身影在维持安静的角落里静静注视着这一切,似乎在观察着星的每一个举动。 -正当星准备问伊尔关于这个世界的更多事情时,突然,一股强烈的能量波动猛然袭来,她耳边仿佛听到了那道低语的声音再度浮现,清晰而坚定:“命运的选择,终于来临!” +“她并不知晓自己真正的命运。”流浪者低声自语,那话语依旧飘散在夜空中,吸引着星的目光。她的心中不断回响着他的声音,仿佛在暗示着一场更大的阴谋正在悄然逼近。 -星的心脏骤然加速,四周的空气似乎在那一瞬间凝固。她抬头,看到远处的天空中,一片阴云迅速聚集而来,预示着某种危险的逼近。一个模糊的影像在天际闪现,似乎正暗示着未来的冲突与挑战,而她所要面对的,绝不仅仅是对自我归属的探索。 +随着战斗的结束,星和琴在壮烈的胜利中保持沉默,心中却充满了未解的疑惑与不安。星的内心深处,她知道这场战斗仅仅是开始,真正的挑战还在后面等着她。而她与琴的关系也在这一回合战斗中愈发紧密,彼此的信任逐渐加深,却也孕育着新的未知。 -“我们要走!”伊尔的声音打断了星的思绪,他的目光变得凝重,“不可忽视的危机即将降临,我们必须立刻找到安全的地方!” - -星与莱娜对视一眼,心中都涌起一股紧迫感。对即将来临的挑战,三人并肩而立,准备迎接未知的未来。此刻,她们的命运已经交织在了一起,故事的篇章才刚刚开启,而未来的旅程充满了未知与悬念。 \ No newline at end of file +“琴,我们必须找到关于失落者的真相,我总觉得这与我的命运息息相关。”星凝视着远方的黑暗,心中暗自发誓将坚定地前行。在这个星空璀璨的世界,她即将走上新的旅程,揭开那隐藏在历史背后的秘密。 \ No newline at end of file diff --git a/__pycache__/config_manager.cpython-310.pyc b/__pycache__/config_manager.cpython-310.pyc index c8224ea..62b3d07 100644 Binary files a/__pycache__/config_manager.cpython-310.pyc and b/__pycache__/config_manager.cpython-310.pyc differ diff --git a/__pycache__/consistency_checker.cpython-310.pyc b/__pycache__/consistency_checker.cpython-310.pyc index a88e555..ab16c36 100644 Binary files a/__pycache__/consistency_checker.cpython-310.pyc and b/__pycache__/consistency_checker.cpython-310.pyc differ diff --git a/__pycache__/novel_generator.cpython-310.pyc b/__pycache__/novel_generator.cpython-310.pyc index 1ad9ee7..f18d8cd 100644 Binary files a/__pycache__/novel_generator.cpython-310.pyc and b/__pycache__/novel_generator.cpython-310.pyc differ diff --git a/__pycache__/prompt_definitions.cpython-310.pyc b/__pycache__/prompt_definitions.cpython-310.pyc index d1eb36e..3e98f89 100644 Binary files a/__pycache__/prompt_definitions.cpython-310.pyc and b/__pycache__/prompt_definitions.cpython-310.pyc differ diff --git a/__pycache__/ui.cpython-310.pyc b/__pycache__/ui.cpython-310.pyc index 1c305f6..ce543c2 100644 Binary files a/__pycache__/ui.cpython-310.pyc and b/__pycache__/ui.cpython-310.pyc differ diff --git a/__pycache__/utils.cpython-310.pyc b/__pycache__/utils.cpython-310.pyc index 0b7873f..e08e35c 100644 Binary files a/__pycache__/utils.cpython-310.pyc and b/__pycache__/utils.cpython-310.pyc differ diff --git a/config.json b/config.json index 13cf58e..b31b991 100644 --- a/config.json +++ b/config.json @@ -4,7 +4,7 @@ "model_name": "gpt-4o-mini", "topic": "星穹铁道主角星穿越到原神提瓦特大陆,拯救提瓦特大陆,并与其中的角色展开爱恨情仇的小说设定", "genre": "玄幻", - "num_chapters": 100, + "num_chapters": 200, "word_number": 4000, "filepath": "C:/Users/xieli/Desktop/AI_NovelGenerator/AI_novel" } \ No newline at end of file diff --git a/novel_generator.py b/novel_generator.py index 744ac66..f088842 100644 --- a/novel_generator.py +++ b/novel_generator.py @@ -1,11 +1,20 @@ import os -from typing_extensions import TypedDict +import logging +from typing import Dict, List, Optional +try: + from typing import TypedDict # Python 3.8+ 直接可用;若是3.7可改用 typing_extensions +except ImportError: + from typing_extensions import TypedDict + from langchain_openai import ChatOpenAI from langgraph.graph import StateGraph, START, END -from typing import Dict +from langchain_openai import OpenAIEmbeddings +from langchain_community.vectorstores import Chroma +from langchain.docstore.document import Document from utils import ( - read_file, append_text_to_file, clear_file_content, save_string_to_txt + read_file, append_text_to_file, clear_file_content, + save_string_to_txt ) from prompt_definitions import ( set_prompt, character_prompt, dark_lines_prompt, @@ -14,15 +23,72 @@ from prompt_definitions import ( chapter_outline_prompt, chapter_write_prompt ) -# 向量检索相关 (以Chroma为例),需要安装 langchain, chromadb 等 -from langchain.embeddings.openai import OpenAIEmbeddings -from langchain.vectorstores import Chroma -from langchain.docstore.document import Document +# ============ 日志配置(可选) ============ +logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s") + +# ============ 向量检索相关函数(Chroma) ============ -# 默认用此目录存放向量库 VECTOR_STORE_DIR = "vectorstore" -# =============== 多步生成:设置 & 目录 =============== +def init_vector_store(api_key: str, base_url: str, texts: List[str]) -> Chroma: + """ + 初始化并返回一个Chroma向量库,将传入的文本进行嵌入并保存到本地目录。 + 如果不存在该目录,会自动创建。 + """ + embeddings = OpenAIEmbeddings( + openai_api_key=api_key, + openai_api_base=base_url # <-- 这里用传进来的 base_url + ) + documents = [Document(page_content=t) for t in texts] + vectorstore = Chroma.from_documents( + documents, + embedding=embeddings, + persist_directory=VECTOR_STORE_DIR + ) + vectorstore.persist() + return vectorstore + + +def load_vector_store(api_key: str, base_url: str) -> Optional[Chroma]: + """读取已存在的向量库。若不存在则返回 None。""" + if not os.path.exists(VECTOR_STORE_DIR): + return None + embeddings = OpenAIEmbeddings( + openai_api_key=api_key, + openai_api_base=base_url # <-- 使用 base_url + ) + return Chroma(persist_directory=VECTOR_STORE_DIR, embedding_function=embeddings) + + +def update_vector_store(api_key: str, base_url: str, new_chapter: str) -> None: + """将最新章节文本插入到向量库里,用于后续检索参考。若库不存在则初始化。""" + store = load_vector_store(api_key, base_url) + if not store: + logging.info("Vector store does not exist. Initializing a new one...") + init_vector_store(api_key, base_url, [new_chapter]) + return + + new_doc = Document(page_content=new_chapter) + store.add_documents([new_doc]) + store.persist() + + +def get_relevant_context_from_vector_store(api_key: str, base_url: str, query: str, k: int = 2) -> str: + """ + 从向量库中检索与 query 最相关的 k 条文本,拼接后返回。 + 若向量库不存在则返回空字符串。 + """ + store = load_vector_store(api_key, base_url) + if not store: + logging.warning("Vector store not found. Returning empty context.") + return "" + docs = store.similarity_search(query, k=k) + combined = "\n".join([d.page_content for d in docs]) + return combined + + +# ============ 多步生成:设置 & 目录 ============ + class OverallState(TypedDict): topic: str genre: str @@ -34,6 +100,7 @@ class OverallState(TypedDict): final_novel_setting: str novel_directory: str + def Novel_novel_directory_generate( api_key: str, base_url: str, @@ -43,43 +110,62 @@ def Novel_novel_directory_generate( number_of_chapters: int, word_number: int, filepath: str -): +) -> None: """ - 使用多步流程,生成 Novel_setting.txt 与 Novel_directory.txt + 使用多步流程,生成 Novel_setting.txt 与 Novel_directory.txt 并保存到 filepath。 + + :param api_key: OpenAI API key + :param base_url: OpenAI API base url + :param llm_model: 所使用的 LLM 模型名称 + :param topic: 小说主题 + :param genre: 小说类型 + :param number_of_chapters: 章节数 + :param word_number: 单章目标字数 + :param filepath: 存放生成文件的目录路径 """ + # 确保文件夹存在 + os.makedirs(filepath, exist_ok=True) + model = ChatOpenAI( model=llm_model, api_key=api_key, base_url=base_url ) - def generate_base_setting(state: OverallState): + def generate_base_setting(state: OverallState) -> Dict[str, str]: prompt = set_prompt.format( topic=state["topic"], genre=state["genre"], number_of_chapters=state["number_of_chapters"], - word_number=state["word_number"], + word_number=state["word_number"] ) response = model.invoke(prompt) if not response: + logging.warning("generate_base_setting: No response.") return {"novel_setting_base": ""} return {"novel_setting_base": response.content.strip()} - def generate_character_setting(state: OverallState): - prompt = character_prompt.format(novel_setting=state["novel_setting_base"]) + def generate_character_setting(state: OverallState) -> Dict[str, str]: + prompt = character_prompt.format( + novel_setting=state["novel_setting_base"] + ) response = model.invoke(prompt) if not response: + logging.warning("generate_character_setting: No response.") return {"character_setting": ""} return {"character_setting": response.content.strip()} - def generate_dark_lines(state: OverallState): - prompt = dark_lines_prompt.format(character_info=state["character_setting"]) + def generate_dark_lines(state: OverallState) -> Dict[str, str]: + prompt = dark_lines_prompt.format( + character_info=state["character_setting"] + ) response = model.invoke(prompt) if not response: + logging.warning("generate_dark_lines: No response.") return {"dark_lines": ""} return {"dark_lines": response.content.strip()} - def finalize_novel_setting(state: OverallState): + def finalize_novel_setting(state: OverallState) -> Dict[str, str]: prompt = finalize_setting_prompt.format( novel_setting_base=state["novel_setting_base"], character_setting=state["character_setting"], @@ -87,19 +173,22 @@ def Novel_novel_directory_generate( ) response = model.invoke(prompt) if not response: + logging.warning("finalize_novel_setting: No response.") return {"final_novel_setting": ""} return {"final_novel_setting": response.content.strip()} - def generate_novel_directory(state: OverallState): + def generate_novel_directory(state: OverallState) -> Dict[str, str]: prompt = novel_directory_prompt.format( final_novel_setting=state["final_novel_setting"], number_of_chapters=state["number_of_chapters"] ) response = model.invoke(prompt) if not response: + logging.warning("generate_novel_directory: No response.") return {"novel_directory": ""} return {"novel_directory": response.content.strip()} + # 构建状态图 graph = StateGraph(OverallState) graph.add_node("generate_base_setting", generate_base_setting) graph.add_node("generate_character_setting", generate_character_setting) @@ -107,6 +196,7 @@ def Novel_novel_directory_generate( graph.add_node("finalize_novel_setting", finalize_novel_setting) graph.add_node("generate_novel_directory", generate_novel_directory) + # 注意修正此处节点名称 graph.add_edge(START, "generate_base_setting") graph.add_edge("generate_base_setting", "generate_character_setting") graph.add_edge("generate_character_setting", "generate_dark_lines") @@ -125,78 +215,35 @@ def Novel_novel_directory_generate( result = app.invoke(input_params) if not result: - print("⚠️ invoke() 结果为空,生成失败。") + logging.warning("Novel_novel_directory_generate: invoke() 结果为空,生成失败。") return final_novel_setting = result.get("final_novel_setting", "") final_novel_directory = result.get("novel_directory", "") + if not final_novel_setting or not final_novel_directory: - print("⚠️ 生成失败:缺少 final_novel_setting 或 novel_directory。") + logging.warning("生成失败:缺少 final_novel_setting 或 novel_directory。") return # 写入文件 filename_set = os.path.join(filepath, "Novel_setting.txt") filename_novel_directory = os.path.join(filepath, "Novel_directory.txt") - final_novel_setting_cleaned = final_novel_setting.replace('#', '').replace('*', '') - final_novel_directory_cleaned = final_novel_directory.replace('#', '').replace('*', '') + # 清理文本(去除多余 # 或 * 等) + def clean_text(txt: str) -> str: + return txt.replace('#', '').replace('*', '') + final_novel_setting_cleaned = clean_text(final_novel_setting) + final_novel_directory_cleaned = clean_text(final_novel_directory) + + # 以追加方式保存;如果希望覆盖可改为 save_string_to_txt() append_text_to_file(final_novel_setting_cleaned, filename_set) append_text_to_file(final_novel_directory_cleaned, filename_novel_directory) - -# =============== 生成章节(含角色状态 & 全局摘要 & 向量检索) =============== - -def init_vector_store(api_key: str, texts: list[str]) -> Chroma: - """ - 初始化并返回一个Chroma向量库,将传入的文本进行嵌入。 - 若需要可对 texts 做分句或分块处理;这里只演示简单用法。 - """ - embeddings = OpenAIEmbeddings(openai_api_key=api_key) - documents = [Document(page_content=t) for t in texts] - vectorstore = Chroma.from_documents(documents, embedding=embeddings, persist_directory=VECTOR_STORE_DIR) - vectorstore.persist() - return vectorstore - -def load_vector_store(api_key: str) -> Chroma: - """ - 读取已存在的向量库。若不存在则返回None或新建一个空的。 - """ - if not os.path.exists(VECTOR_STORE_DIR): - return None - embeddings = OpenAIEmbeddings(openai_api_key=api_key) - return Chroma(persist_directory=VECTOR_STORE_DIR, embedding_function=embeddings) + logging.info("Novel settings and directory generated successfully.") -def update_vector_store(api_key: str, new_chapter: str): - """ - 将最新章节文本插入到向量库里,用于后续检索参考。 - 可根据实际需求做分块处理。此处仅作简单示范。 - """ - store = load_vector_store(api_key) - if not store: - # 如果vector store不存在,先初始化 - store = init_vector_store(api_key, [new_chapter]) - return - - embeddings = OpenAIEmbeddings(openai_api_key=api_key) - new_doc = Document(page_content=new_chapter) - store.add_documents([new_doc]) - store.persist() - - -def get_relevant_context_from_vector_store(api_key: str, query: str, k: int=2) -> str: - """ - 从向量库中检索与 query 最相关的 k 条文本,拼接后返回。 - 用于在生成大纲或写正文时,为大模型提供更多上下文。 - """ - store = load_vector_store(api_key) - if not store: - return "" - docs = store.similarity_search(query, k=k) - # 简单拼接 - combined = "\n".join([d.page_content for d in docs]) - return combined +# ============ 生成章节(每章独立文件) ============ def generate_chapter_with_state( novel_settings: str, @@ -213,11 +260,25 @@ def generate_chapter_with_state( 多步流程: 1) 更新/创建全局摘要 2) 更新/生成角色状态文档 - 3) 根据向量检索获取往期章节相关内容 + 3) 向量检索获取往期上下文 4) 大纲 -> 正文 - 5) 更新向量库 - 最终写入 chapter.txt、lastchapter.txt、character_state.txt、global_summary.txt + 5) 写入 chapter_{novel_number}.txt, 更新 lastchapter.txt + 6) 更新向量库 + + :param novel_settings: 最终的作品设定(字符串) + :param novel_novel_directory: 小说目录信息(此处暂时未使用,可根据需求做扩展) + :param api_key: OpenAI API Key + :param base_url: OpenAI Base URL + :param model_name: LLM 模型名称 + :param novel_number: 当前要生成的章节号 + :param filepath: 文件存放的目录 + :param word_number: 单章目标字数 + :param lastchapter: 上一章内容(若为空字符串,表示无上一章) + :return: 本章生成的正文内容 """ + # 确保文件夹存在 + os.makedirs(filepath, exist_ok=True) + model = ChatOpenAI( model=model_name, api_key=api_key, @@ -225,35 +286,44 @@ def generate_chapter_with_state( temperature=0.9 ) - # --- 文件名定义 --- + # --- 文件路径定义 --- + chapters_dir = os.path.join(filepath, "chapters") + os.makedirs(chapters_dir, exist_ok=True) + + chapter_file = os.path.join(chapters_dir, f"chapter_{novel_number}.txt") + lastchapter_file = os.path.join(filepath, "lastchapter.txt") character_state_file = os.path.join(filepath, "character_state.txt") global_summary_file = os.path.join(filepath, "global_summary.txt") - chapter_file = os.path.join(filepath, "chapter.txt") - lastchapter_file = os.path.join(filepath, "lastchapter.txt") - # --- 读取现有文档(可能为空) --- old_char_state = read_file(character_state_file) old_global_summary = read_file(global_summary_file) - # --- 1) 更新全局摘要 (若上一章文本不为空) --- + # 1) 更新全局摘要 def update_global_summary(chapter_text: str, old_summary: str) -> str: - prompt = summary_prompt.format(chapter_text=chapter_text, global_summary=old_summary) + prompt = summary_prompt.format( + chapter_text=chapter_text, + global_summary=old_summary + ) response = model.invoke(prompt) if not response: + logging.warning("update_global_summary: No response.") return old_summary return response.content.strip() if lastchapter.strip(): - # 用上一章内容更新全局摘要 new_global_summary = update_global_summary(lastchapter, old_global_summary) else: new_global_summary = old_global_summary - # --- 2) 更新角色状态文档 --- + # 2) 更新角色状态文档 def update_character_state(chapter_text: str, old_state: str) -> str: - prompt = update_character_state_prompt.format(chapter_text=chapter_text, old_state=old_state) + prompt = update_character_state_prompt.format( + chapter_text=chapter_text, + old_state=old_state + ) response = model.invoke(prompt) if not response: + logging.warning("update_character_state: No response.") return old_state return response.content.strip() @@ -262,13 +332,19 @@ def generate_chapter_with_state( else: new_char_state = old_char_state - # --- 3) 从向量库检索相关上下文,用来帮助生成新的大纲 --- - # 例如,可以根据“角色状态”或“本章关键词”来查询。 - # 简单示范:以 "回顾剧情" 作为检索Query - relevant_context = get_relevant_context_from_vector_store(api_key, "回顾剧情", k=2) + # 3) 从向量库检索上下文 + relevant_context = get_relevant_context_from_vector_store( + api_key, base_url, "回顾剧情", k=2 # <-- 多传一个 base_url + ) - # --- 4) 大纲 -> 正文 --- - def outline_chapter(novel_setting: str, char_state: str, global_summary: str, chap_num: int, extra_context: str) -> str: + # 4) 生成大纲 + def outline_chapter( + novel_setting: str, + char_state: str, + global_summary: str, + chap_num: int, + extra_context: str + ) -> str: prompt = chapter_outline_prompt.format( novel_setting=novel_setting, character_state=char_state + "\n\n【历史上下文】\n" + extra_context, @@ -277,12 +353,23 @@ def generate_chapter_with_state( ) response = model.invoke(prompt) if not response: + logging.warning("outline_chapter: No response.") return "" return response.content.strip() - chap_outline = outline_chapter(novel_settings, new_char_state, new_global_summary, novel_number, relevant_context) + chap_outline = outline_chapter( + novel_settings, new_char_state, new_global_summary, novel_number, relevant_context + ) - def write_chapter(novel_setting: str, char_state: str, global_summary: str, outline: str, wnum: int, extra_context: str) -> str: + # 5) 生成正文 + def write_chapter( + novel_setting: str, + char_state: str, + global_summary: str, + outline: str, + wnum: int, + extra_context: str + ) -> str: prompt = chapter_write_prompt.format( novel_setting=novel_setting, character_state=char_state + "\n\n【历史上下文】\n" + extra_context, @@ -292,26 +379,38 @@ def generate_chapter_with_state( ) response = model.invoke(prompt) if not response: + logging.warning("write_chapter: No response.") return "" return response.content.strip() - chapter_content = write_chapter(novel_settings, new_char_state, new_global_summary, chap_outline, word_number, relevant_context) + chapter_content = write_chapter( + novel_settings, + new_char_state, + new_global_summary, + chap_outline, + word_number, + relevant_context + ) + # 写入文件并更新记录 if chapter_content: - # --- 写入 chapter.txt 与 lastchapter.txt --- - append_text_to_file(chapter_content, chapter_file) + save_string_to_txt(chapter_content, chapter_file) + # 更新 lastchapter.txt clear_file_content(lastchapter_file) save_string_to_txt(chapter_content, lastchapter_file) - # --- 更新全局摘要、角色状态到文件 --- + # 更新角色状态、全局摘要 clear_file_content(character_state_file) save_string_to_txt(new_char_state, character_state_file) clear_file_content(global_summary_file) save_string_to_txt(new_global_summary, global_summary_file) - # --- 5) 更新向量检索库 --- - update_vector_store(api_key, chapter_content) + # 6) 更新向量检索库 + update_vector_store(api_key, base_url, chapter_content) + logging.info(f"Chapter {novel_number} generated successfully.") + else: + logging.warning(f"Chapter {novel_number} generation failed.") return chapter_content