Anti-AIGC Rewriter 架构重构:内容优先模式

当前系统采用「原位回填」方案:读入 docx → 逐段分类 → 调 LLM 重写 → 把新文本塞回原段 run。这种做法的核心矛盾是既要保全格式又要降 AIGC 率,两件事冲突严重——run 级格式保留约束了改写的自由度,而且 replace_paragraph_text_preserve_runs 在跨 run 长度变化时经常出毛病。

背景与目标

用户新需求明确:放弃细粒度格式保留,转向「内容优先」模式,只保留结构骨架(标题层级 + 参考文献/致谢/声明),正文做强重写,导出全新 docx。

核心设计原则

项目旧方案新方案(内容优先)
格式策略保留 run 级字体/样式只保留标题层级 + 结尾区块
图题/表题/表注强保不再强保,可酌情重写
段内字体死保每个 run不保留,整段纯文本
输出方式原位修改原 docx导出全新 docx
System Prompt通用型大幅强化 6 条降 AIGC 规则

架构总览

┌──────────────┐     ┌──────────────┐     ┌──────────────┐     ┌──────────────┐│  file_parser │────▶│ doc_analyzer │────▶│ llm_rewriter │────▶│ doc_builder  ││ (解析原文件) │     │ (结构识别)   │     │ (强重写引擎)  │     │ (构建新docx) │└──────────────┘     └──────────────┘     └──────────────┘     └──────────────┘

四大模块职责

1. file_parser.py — 文件解析层(保留+微调)

  • 已有 txt/docx/pdf 解析
  • 新增parse_docx_structured() 函数,返回结构化段落列表而非纯文本拼接
  • 每个段落对象包含:text, style_nameheading_level(1/2/3/None), is_list_item

2. doc_analyzer.py — 结构识别器(新建)

  • 从 llm_service.py 中剥离段落分类逻辑(classify_paragraph_type, is_heading_like_text, is_trigger_match 等)
  • 负责将段落列表标记为以下类型之一:
    • heading — 一级/二级/三级标题(保留不改)
    • reference / acknowledgment / declaration — 结尾区块(保留不改)
    • body — 正文(强重写目标)
    • caption — 图题/表题(按新策略可酌情轻改或跳过)
  • 输出一个 AnalyzedDocument 对象:有序段落列表 + 各段类型标签

3. llm_rewriter.py — 强重写引擎(从 llm_service.py 重构)

  • 全新 System Prompt 融入用户的 6 条核心规则:
    1. 极高文本波动率:长短句交错,绝不排比
    2. 提升困惑度:禁用「首先、其次」,替换为「不可否认的是、结合实际情况来看」
    3. 注入生涩感:学术术语准确,模拟本科生毕设口吻
    4. 核心语义不变:保留数据+论点
    5. 精准锚定参考文献标号 [1] [2]
    6. 绝对禁止废话(零对话模式)
  • 附加改写策略(融入 prompt):
    • 打破句式对称
    • 剔除过渡冗余(「众所周知」「值得注意的是」等)
    • 动作实体化(减少主谓宾,多用被动/无主语句)
    • 提升专业词汇密度
  • 保留:分块 smart_chunking、段内拆分 split_paragraph_into_rewrite_units
  • 保留:重试/相似度检测/回退机制(needs_retry, is_too_similar, should_fallback_to_source)
  • 删除:replace_paragraph_text_preserve_runs(不再需要 run 级回填)

4. doc_builder.py — 新文档构建器(新建)

  • 接收 AnalyzedDocument + 重写结果
  • 创建全新 python-docx.Document()
  • 标题段:根据 heading_level 用 doc.add_heading(text, level=n) 添加
  • 正文段doc.add_paragraph(rewritten_text) 添加重写后的纯文本
  • 保留区块(参考文献、致谢等):原样添加
  • 可选:设置一个统一的学术论文样式模板(宋体正文 + 黑体标题等)

文件变更清单

[NEW] doc_analyzer.py

  • 从 llm_service.py 提取的结构识别逻辑
  • 定义 StructuredParagraph 和 AnalyzedDocument 数据类
  • analyze_document(paragraphs) → AnalyzedDocument

[NEW] doc_builder.py

  • build_document(analyzed_doc, rewrite_results, output_path) → 生成新 docx

[NEW] llm_rewriter.py

  • 全新 System Prompt + 重写策略
  • rewrite_body_paragraphs(analyzed_doc, client, model, reference_list) → AsyncGenerator 流式重写

[MODIFY] llm_service.py

  • 大幅瘦身:移除段落分类逻辑(→ doc_analyzer.py)、移除 run 替换逻辑
  • process_paper_stream() 重构为编排层,调用上述三个模块
  • 保留 API key 工具函数 + generate_paper_stream()

[MODIFY] file_parser.py

  • 新增 parse_docx_structured() 返回结构化段落对象列表

[MODIFY] main.py

  • API 不变,内部调用链路更新

用户审阅事项

IMPORTANT

导出新 docx 意味着原文件的所有图片、嵌入式表格、SmartArt 等非文本元素将不会携带到新文档中。 如果你的论文含有重要的图片/表格,需要在重写完成后手动从原文件复制过来。后续迭代可以考虑自动搬运图片,但本次重构先聚焦文本重写核心。

NOTE

图题和表题(如「图 1 系统架构图」)在新方案中默认跳过不重写、原样保留到新文档。如果你希望对它们也做轻改,可以告诉我。


数据流详解

是否用户上传 docx/txt/pdffile_parser: 解析docx?parse_docx_structured提取段落 + style + heading_levelparse_txt / parse_pdf提取纯文本doc_analyzer: 分类标注AnalyzedDocument每段带类型标签llm_rewriter: 逐段强重写仅处理 body 类型段落流式输出到前端doc_builder: 构建新 docx保存到 outputs/用户下载

System Prompt 设计(核心)

text你是核心学术期刊的特约文字校对专家,执行"学术语域重构与信息密度提升"任务。【绝对规则】1. 极高文本波动率:交替使用极短句(5-10字)和长复句(50字以上),   绝不使用排比结构,刻意打破句式对称。适当增加长句的从句嵌套深度,   模拟人类学者的复杂思考路径。2. 提升困惑度:禁用"首先、其次、再次、最后、一方面/另一方面"等连接词,   替换为"不可否认的是、结合实际情况来看、从另一维度审视、就学理而言"等   低频学术表达。逻辑连贯性应通过上下文语义自然衔接。3. 注入生涩感:术语必须准确,但行文应模仿真实本科生毕设的主观推导口吻,   带有轻微的"正在探索"感。将口语化表达转为规范学术概念   (例:把它分成几块 → 进行模块化解耦;效果更好 → 显著优化了某某指标)。4. 核心语义不变:保留所有关键数据、论点、实验结果。不得新增观点。5. 精准锚定参考文献:原文标号([1],[2]等)必须精准转移到重写后   对应论点的末尾,不得遗漏、不得错位。6. 零废话输出模式:直接输出重写后的正文。绝不允许包含任何解释性、   确认性或过渡性文字。【附加策略】- 剔除过渡冗余:删除"众所周知""在此大环境下""值得注意的是"等无意义连词。- 动作实体化:减少"我们设计了…"主谓宾结构,多用无主语句或被动语态  (例:我们使用了Jieba分词 → 研究引入Jieba分词引擎)。- 提升专业词汇密度:确保每段至少有2-3个精确的专业术语或方法名。【边界意识】标题、目录、文献引用项、致谢、声明类文本,不改写,原样返回。

验证计划

自动化测试

  1. 现有测试python -m pytest tests/test_llm_service.py -v(验证 split_paragraph_into_rewrite_units 回归)
  2. 新增单测
    • tests/test_doc_analyzer.py — 测试段落分类准确性(标题/正文/参考文献/图题)
    • tests/test_doc_builder.py — 测试从 AnalyzedDocument 构建 docx 的结构正确性

手动验证

  1. 启动服务 bash start.sh
  2. 在浏览器中上传一个包含标题、正文、参考文献的 .docx 测试文件
  3. 点击重写,观察:
    • 流式输出是否正常
    • 标题是否被跳过(不被重写)
    • 参考文献区块是否被保留
    • 下载的新 docx 是否包含正确的标题层级
  4. 打开下载的 docx 检查格式结构

留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *