当前系统采用「原位回填」方案:读入 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_name,heading_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] - 绝对禁止废话(零对话模式)
- 附加改写策略(融入 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个精确的专业术语或方法名。【边界意识】标题、目录、文献引用项、致谢、声明类文本,不改写,原样返回。
验证计划
自动化测试
- 现有测试:
python -m pytest tests/test_llm_service.py -v(验证 split_paragraph_into_rewrite_units 回归) - 新增单测:
tests/test_doc_analyzer.py— 测试段落分类准确性(标题/正文/参考文献/图题)tests/test_doc_builder.py— 测试从 AnalyzedDocument 构建 docx 的结构正确性
手动验证
- 启动服务
bash start.sh - 在浏览器中上传一个包含标题、正文、参考文献的
.docx测试文件 - 点击重写,观察:
- 流式输出是否正常
- 标题是否被跳过(不被重写)
- 参考文献区块是否被保留
- 下载的新 docx 是否包含正确的标题层级
- 打开下载的 docx 检查格式结构
發佈留言