共计 1401 个字符,预计需要花费 4 分钟才能阅读完成。
背景痛点:为什么需要 Agent 技术
传统的小说生成模板存在明显的局限性,尤其是在处理长篇内容时,问题会逐渐暴露:

- 角色崩坏:随着故事发展,角色性格和行为模式容易前后矛盾
- 情节断裂:缺乏全局视角导致伏笔丢失或逻辑不通
- 风格漂移:不同章节间文风差异明显,影响阅读体验
技术选型:找到适合的解决方案
针对长篇生成的特殊性,我们对比了几种主流方案:
- 纯 LLM 微调
- 优点:实现简单,适合短文本
-
缺点:长文本时显存消耗大,成本高
-
RAG 检索增强
- 优点:可引用外部知识库
-
缺点:对情节连贯性提升有限
-
Agent 协作系统(最终选择)
- 优点:自主维护角色记忆,支持多线程情节发展
- 缺点:架构复杂度较高
决策树参考:
graph TD
A[需要长文本生成?] -->| 是 | B[需要角色一致性?]
A -->| 否 | C[使用基础 LLM]
B -->| 是 | D[采用 Agent 系统]
B -->| 否 | E[考虑 RAG 方案]
核心架构设计
采用三层架构实现职责分离:
- 记忆层(Redis)
- 存储角色属性、故事时间线等核心要素
-
使用 JSON Schema 规范数据结构
-
决策层(LangChain)
- 处理情节逻辑和冲突检测
-
包含子 Agent:角色 Agent、情节 Agent、风格 Agent
-
执行层(LLM)
- 负责最终文本生成
- 支持多模型路由(不同环节选用合适模型)
关键代码实现
角色一致性保持的核心算法:
# 角色向量检索模块
def get_character_embedding(character_name):
"""
从 Redis 获取角色特征向量
:param character_name: 角色名称
:return: 512 维 numpy 向量
"""
redis_client = get_redis_connection()
vec = redis_client.hget(f'char:{character_name}', 'embedding')
return np.frombuffer(vec, dtype=np.float32)
# 风格迁移算法
def apply_style_transfer(text, target_style):
"""
应用预设风格到生成文本
:param text: 原始文本
:param target_style: 风格标识(如 '武侠'、'悬疑'):return: 风格化后的文本
"""
style_embeddings = load_style_embeddings()
prompt = f"请用 {target_style} 风格改写下文:\n{text}"
return llm.generate(prompt)
性能优化实践
通过控制变量测试发现:
| 上下文窗口 | 连贯性评分 | 生成速度 | 内存占用 |
|---|---|---|---|
| 2k tokens | 78% | 快 | 12GB |
| 4k tokens | 85% | 中等 | 18GB |
| 8k tokens | 88% | 慢 | 32GB |
最终选择 4k 窗口作为平衡点。
常见问题解决方案
- 记忆泄漏问题
- 症状:Agent 忘记关键剧情设定
-
解决:实现定期记忆快照和检查点机制
-
对话循环陷阱
- 症状:角色间对话陷入重复模式
-
解决:引入话题新颖性评分机制
-
风格污染
- 症状:不同角色说话风格趋同
- 解决:强化角色专属词向量空间
总结与思考
当前系统在 10 万字级别的生成测试中表现良好,但仍存在值得探索的方向:
- 如何量化评估文学性质量而不仅是连贯性?
- 在保持结构的同时,怎样给读者留下更多解读空间?
- 多 Agent 协作时的权力分配机制如何设计更合理?
建议尝试调整不同 Agent 的权重参数,观察对生成效果的影响。这个领域还有很多有趣的实验等着我们去探索。
正文完
