Deepseek大语言模型在多语种手稿数字化中的工程实践与策略
摘要
大量前人留下的手稿,是现代图片文字识别(OCR)的终极考验。目前几乎所有的工具,均无法达成可接受的文本识别水准。以钱钟书多语种手写笔记为例,包含了多达8种西方语言的广泛题材文本摘录,因文字种类繁多、笔迹复杂、多有插入与标记等,版式多变而长期难以实现数字化。本项目利用 DeepSeek v4大语言模型、结合 Playwright 浏览器自动化技术,构建一套高成功率、低技术门槛的半自动化文本提取流水线的完整实践。通过分阶段的多轮策略优化——从全自动脚本到人在环中的半自动模式,再结合识图模式的精准分流与定期重启机制,成功解决了“无视觉API”与“上下文污染”两大瓶颈,实现了多种语言的异构手稿向可计算文本(.md)的95%以上成功率的高效转化。
关键词:数字人文、手写识别、大语言模型、DeepSeek、Playwright、钱钟书、多语种手稿
一、引言
近几年,大语言模型(LLM)的视觉理解能力为手写识别带来了新的可能。然而,各种借助大语言模型的OCR工具的一个局限,是采用量化模型的本地部署或云端部署,没有能借助云端模型的潜能。本文作者曾尝试将手稿图像上传deepseek v3浏览器窗口,成功获得较为完整的识别效果。但有两个局限。一是DeepSeek等模型在开放初期,图像输入端通常局限于浏览器交互,缺乏公开的应用程序接口(API),无法大规模、高质量、可重复的批量转化;二是Deepseek v3仍是文本模式,无法识别图像排版,因此难以控制排版相关的位置信息处理。因此,催生了此次技术实践。
二、技术困境与工具选择:从无API到Playwright
在本次工程启动阶段,DeepSeek推出了“识图模式”灰度测试,但仍未向公众开放快速模式(chat)与图像识别模式的图像API接口。
理想的批量处理依赖于对后端接口的调用,但由于缺乏API接口,必须寻找一种模拟浏览器操作的方法,以实现自动化。本研究选择了浏览器自动化框架 Playwright 作为核心工具。Playwright 能够模拟人类在浏览器中的点击、键盘输入与文件上传操作,且支持Python语言调用,在稳定性和灵活性之间取得了较好的平衡。
2.1 核心工具:Playwright 浏览器自动化框架
Playwright 是微软开源的一款用于 Web 浏览器自动化测试和网页抓取的工具库。它支持 Chromium、Firefox 和 WebKit 三大浏览器内核,并提供了统一的 API 接口,适用于 Python、JavaScript、.NET 和 Java 等多种编程语言。
为什么选择 Playwright?
在本次工程中,Playwright 展现出以下核心优势:
- 高稳定性:相比于 Selenium 等传统自动化工具,Playwright 内置了自动等待机制,能够智能地等待页面元素加载完成后才执行操作,极大减少了因页面渲染延迟导致的脚本失败。
- 跨浏览器支持:可通过一行代码在 Chrome、Edge 等多种浏览器中运行脚本,便于测试不同浏览器对 DeepSeek 网页端的兼容性。
- 强大的元素定位能力:支持多种选择器(CSS、XPath、文本内容等),能够精准定位 DeepSeek 网页中动态渲染的输入框、上传按钮等元素。
- 浏览器上下文管理:支持多标签页、多用户会话的并行管理,为后续扩展到更复杂的并行任务提供了可能性。
2.2 运行环境与工具部署清单
本次工程实践基于特定的软件环境与工具链构建,以下为详细的运行环境说明与部署步骤。
2.2.1 硬件环境
本次工作主要在一台配备以下规格的本地计算机上完成:
• 操作系统:Windows 10 / Windows 11(64位)
• 处理器:Intel Core i7 或 AMD Ryzen 7 及以上(或同等性能的芯片)
• 内存:建议 16GB 以上(因为需要同时运行浏览器、脚本及可能的本地 LLM 推理)
• 硬盘空间:至少 50GB 可用空间(用于存放海量手稿图片、生成的文本文件及浏览器缓存)
• 网络:稳定的互联网连接(用于访问 DeepSeek 网页端及 API)
说明:本次流程对图形处理能力(GPU)无硬性要求,因为模型推理在 DeepSeek 云端完成,本地仅需运行浏览器和脚本即可。
2.2.2 软件环境
本次实践所需的基础软件环境如下:
软件/工具 版本要求 用途
Python 3.8 及以上 运行所有自动化脚本(含 Playwright 伪代码调用和 API 调用)
Playwright 1.30 及以上 浏览器自动化框架,控制 Chrome/Edge 进行文件上传、输入和点击
Google Chrome 或 Microsoft Edge 最新稳定版 作为 Playwright 的浏览器后端,运行 DeepSeek 网页端
DeepSeek 账号 已注册并登录 用于访问 DeepSeek 网页识图模式及申请 API Key
文本编辑器 VS Code、Notepad++ 或系统自带记事本 用于阅读、修改或调试脚本代码
2.2.3 环境安装与配置步骤
以下为从零开始搭建运行环境的操作步骤:
步骤1:安装 Python - 前往 Python 官方网站(python.org)下载安装包。
- 安装时务必勾选 “Add Python to PATH”(将 Python 加入环境变量),否则后续命令行无法直接调用 python 命令。
- 安装完成后,打开命令行(CMD 或 PowerShell),输入 python --version 检查是否安装成功。
步骤2:安装 Playwright 与相关依赖 - 在命令行中执行以下命令,安装 Playwright 的 Python 库:
bash
pip install playwright - 继续执行以下命令,安装 Playwright 所依赖的浏览器内核(首次安装需要下载约 300~500MB,请保持网络通畅):
bash
playwright install chromium
(如果计划使用 Edge 浏览器,也可以选择 playwright install msedge) - 此时,基本环境已就绪,可以通过 python test.py 测试 Playwright 是否能成功启动浏览器。
步骤3:申请 DeepSeek API Key(用于后期修订) - 登录 DeepSeek 开发者平台(platform.deepseek.com)。
- 在个人中心或 API 管理页面申请 API Key。
- 在脚本中用该 Key 替换 your_deepseek_api_key_here 占位符。
- 需要注意:部分 DeepSeek API 接入点可能需要实名认证。
步骤4:创建项目目录与文件结构
建议按以下结构组织项目文件(可根据实际情况调整):
text
D:\MinerU\
├── workspace\
│ ├── input\
│ │ └── qian\ocr\ # 存放待识别的手稿图片(.png/.jpg)
│ ├── output_markdown\
│ │ └── qian\Foreign language notes\ # 存放识别生成的 .md 文件
│ └── script\
│ ├── ocr_batch.py # 全自动或半自动识别脚本
│ ├── llm_revise.py # API修订脚本
│ └── test_playwright.py # Playwright 环境测试脚本
├── raw_ocr_input.txt # 积累的识图模式原始输出文本
└──识图模式指令.txt # 保存中文 Prompt 模板
2.2.4 环境测试脚本(可选)
为了验证 Playwright 是否安装成功,可以新建一个 test_playwright.py 文件,写入以下内容并运行:
python
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto("https://chat.deepseek.com")
print("✅ 浏览器已成功启动,DeepSeek 页面加载完成。请检查是否能够正常显示。")
input("按回车键关闭浏览器...")
browser.close()
如果运行后弹出一个浏览器窗口并成功加载 DeepSeek 页面,则说明环境配置完全正确。
三、演进之路:从“全自动”到“人在环中”的转型
工程从“全自动”目标起步,但在实际运行中受到网页状态、模型识别能力与硬件限制的挑战。
3.1 全自动模式的局限性
• 网页疲劳与上下文污染:运行超10页后,模型开始出现“幻觉”——内容自创、字体或内容反复循环,或偏离原文。
• 输入框焦点丢失与页面卡顿:连续提交多张后,自动填充提示词的指令失效。
• 成功率断崖式下跌:从初期较好,到20页后出现大面积超时(Timeout)与识别无效。
3.2 策略调整与半自动(人在环中)模式
鉴于完全自动化难以适应当前技术生态,开发人员将策略调整为 “人在环中”(Human-in-the-loop) 的半自动模式。核心改动是在每处理一张图后,设置一次阻塞等待(input()),在确认当前图识别完成并输出结果后,再进入下一张图的循环。这一变化将“自动化传送带”转变为“人工确认通道”,使操作者得以:
• 实时核查AI输出质量。
• 及时打断幻觉与循环。
• 有效解决上下文污染问题——浏览器对话历史始终保持在极短长度。
3.3 DeepSeek 两种识别模式的机制差异与效果对比
在工程实践中,我们发现 DeepSeek 的“文本对话模式”与“识图模式”在处理手稿时存在显著的机制与效果差异:
对比维度 文本对话模式(Chat) 识图模式(Vision)
底层机制 基于文本扫描与语义理解,将图片视为“文本的载体” 基于整页图像信息处理,理解页面布局与视觉结构
排版理解 对段落、行距、页边距等版面信息理解较弱 能感知整页的视觉逻辑,包括页边、插入、标注等
页码识别 通常仅关注正文文本,难以捕捉页面底部边缘的数字 能够识别页面底部的页码(如文本框外的数字)并按要求输出
适用场景 处理文本密集、排版标准、字体清晰的常规手稿 处理多语种混排、行间插入、复杂版式的手稿
3.4 多语种手写识别中的特有挑战
在实际操作中发现,不同语种手写识别的难度并不均匀:
• 英文与中文:识别效果相对稳定,因这两种语言的字符结构较为明确,且大模型训练语料充足。
• 德文与法文:手稿中的德文、法文字母连笔较多,且常与英文交替出现。当手稿中某处字迹模糊时,模型极易陷入“模式跟随”陷阱,产生无意义的数字串或重复循环输出。例如,当遇到一段无法辨认的德文时,模型有时会输出一连串无意义的数字,并一直延续到该段落的结尾,严重干扰后续的识别质量。
3.5 钱钟书手写稿的字体特征及其对识别的积极影响
尽管存在上述挑战,钱钟书先生手写稿的独特字体特征也对本次实践的成功起到了重要的促进作用:
- 手写体规范:钱钟书手写体(无论中文与外文)结构严整、笔画分明,前后风格高度一致,这为模型的模式识别提供了可靠的基础。
- 摘录来源的经典性:其所摘录的文本,无论是中文古籍还是外文经典著作,都已成为大模型训练语料中的高频文本。这意味着,当模型面对一张清晰的笔记页面时,它在文本填充阶段具有极高的“语境预见性”,能够基于其对经典文本的先验知识来补全模糊的字符,从而显著提高识别准确率。
3.6 双模式分流与识图模式的接入
深度测试发现,普通对话模式输出的准确率虽已达较高水平,但对于复杂页面(如法文潦草字迹、行间插入、中文古籍引文等)仍存在明显不足。此时DeepSeek的网页端全面开放了独立“识图模式”入口,开发人员迅速调整工作流:
• 普通通道:通过原脚本处理大部分外文笔记。
• 识图通道:遇到乱码或反复识别失败时,将图片单独传入识图模式。该模式下识别的成功率极高,几乎能够完美输出结果。
这一“双通道分流”策略,将总成功率提升至接近95%。
3.7 定期重启机制与缓存管理
长期运行后,浏览器渲染引擎和模型上下文会积累隐性噪声。为了对抗这种“污染”,工程实践引入了“预定30页重开一次”机制。当连续处理满30页后,主动终止脚本,关闭并重启浏览器,随后重新运行脚本。这种“给模型放假”的方式,有效维持了长期输出的高质量。
3.8 识图模式的“无缝接力”与操作
当 DeepSeek 网页端全面开放独立的“识图模式”入口后,原本需要通过切换页面或重新上传的繁琐操作被彻底简化。在实际工程中,我们发现了一个极其高效的操作技巧:
操作流程描述: 在半自动脚本运行过程中,当普通对话模式(或之前的上传窗口)未能成功识别时,操作者无需停顿脚本,只需利用脚本流程中的“等待下一步”间隙(即按下回车继续下一张之前的时刻),快速执行以下操作: - 在已打开的 DeepSeek 浏览器窗口中,点击进入“识图模式”专属入口。
- 此时,网页处于“已登陆且准备接收文件”的状态。脚本在接下来的步骤中上传的图片,会因为浏览器当前激活的识图会话,而自动被送入识图模式进行处理。
这一技巧的关键在于“时间窗口”的利用。脚本在发送下一张图片的指令时,已经默认处于识图模式下。这一操作彻底消除了“将失败图片单独保存并手工重新上传”的繁琐中间步骤,极大地提升了流水线的顺畅度。
3.9 双模板运行架构
根据实际需求,我们将脚本封装为两种可独立运行的运行模板,分别对应不同的应用场景:
模板A:全自动识别与保存模板(Batch & Auto)
适用场景:对于页面规范、识别成功率较高的数据批次;或是在操作人员离开电脑时运行,实现“静默收割”。
模板A伪代码:
python
import os, time
from playwright.sync_api import sync_playwright
IMAGE_FOLDER = r"data\input"
OUTPUT_FOLDER = r"data\output"
PROMPT = "Your strict transcription prompt here..."
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto("https://chat.deepseek.com")
time.sleep(5) # 等待手动登录
for filename in os.listdir(IMAGE_FOLDER):
if filename.endswith(('.png', '.jpg')):
file_path = os.path.join(IMAGE_FOLDER, filename)
page.locator("input[type='file']").set_input_files(file_path)
page.locator("div.ds-input").click()
page.keyboard.type(PROMPT, delay=10)
page.keyboard.press("Enter")
print(f"Processing {filename}...")
time.sleep(20)
try:
ai_text = page.locator("div.ds-markdown").last.inner_text()
# 后续提取与保存逻辑...
except:
print(f"Error processing {filename}.")
continue
browser.close()
模板B:半自动人控识别与保存模板(Human-in-the-loop)
适用场景:模型出现幻觉、重复循环、或者需要调用“识图模式”进行精准分流处理时,用于保证输出质量。
模板B伪代码:
python
... 循环开始 ...
for filename in os.listdir(IMAGE_FOLDER):
if filename.endswith(('.png', '.jpg')):
file_path = os.path.join(IMAGE_FOLDER, filename)
page.locator("input[type='file']").set_input_files(file_path)
page.keyboard.type(PROMPT)
page.keyboard.press("Enter")
# =============== 核心:人控暂停 ===============
print("\n✅ 图片已提交,请查看浏览器结果。")
print("👉 若正常识别:复制结果,按回车继续。")
print("👉 若需识图模式:点击识图模式,识别完成后复制结果,按回车继续。")
input("请完成上述操作后,按【回车】继续下一张...")
# ============================================
四、数据管理与后期精校策略
虽然脚本已完成从图像到文本的提取,但初版 .md 文件仍可能包含少量拼写错误或翻译偏差。为此,本实践设计了后续智能精校处理策略:
- 多轮验证:保留识别初版,将疑问内容标记,通过大模型二次分析。
- 联网查证:利用 DeepSeek 的联网能力,对模糊的书名、人名进行在线验证与补全。
- 文本结构化:结合 Obsidian 等工具,辅以元认知标记,将 .md 文件连接成学术知识图谱,最终实现“可计算”的文本库。
4.1 建议的LLM修订Prompt模板
要最大限度地修正识别错误,同时避免LLM擅自修改原文内容,必须设计一套清晰、明确、带有双重约束的指令(Prompt)。以下为建议使用的中文修订Prompt模板:
text
你是一位资深的古籍与多语言文献校对专家。
请对以下从手写图片中识别出的文本进行修订,并遵守以下所有严格约束:
【修订任务】
- 纠正识别过程中的拼写错误和误识别单词(包括英、法、德、意等外文与中文)。
- 修正错误的标点符号和断裂的段落。
- 对于明显的专有名词(如书名、人名、地名)识别错误,根据上下文语境进行合理修正。
- 如果在句中明显存在“幻觉”(即连续无意义字符或错乱、不符合常识的段落),请根据上下文进行“修补”与“对齐”。
【绝对禁止的行为】
- 禁止添加、删除或修改原文中清晰可辨的学术内容。
- 禁止基于外部知识(如个人理解)将识别内容进行“扩充”或“引申”。
- 禁止变更原文的逻辑结构与句子顺序。
【输出格式】
- 保持原有段落结构。
- 对每一个修订处,在修订的单词或句子后标记修订说明(例如:"[修订:原识别为 XXX,根据上下文修正为 YYY]")。
- 对于无法置信的模糊区域,在该处标注:"[此处文字过于潦草,无法准确识别/修订]",不要强行补全。
【待修订文本】
(此处插入识别出的原始文本)
4.2 增强型修订Prompt:引入联网检索与引用源验证
在基础版修订Prompt的基础上,可以增加“联网检索与引用源验证”任务,使修订从“纠错”升级为“学术性校验”。
text
(上述基础要求保留,增加以下增强任务)
【增强任务:联网检索与引用验证】
- 联网检索:当遇到疑似经典引文、书名、人名或特定历史事件时,尝试利用联网检索进行查证。
- 验证并补全:如果识别出的文字可能偏离原稿,请通过联网检索来验证其准确性。若确信原文引用有误或模糊,请根据检索结果进行补全并备注。
- 引用错误提示:如果发现手稿中存在明显的引用错误或误记(例如页码错误、人名张冠李戴),请在修订文本中标记"【疑似引用错误:手稿此处引用为XXX,经网络检索验证,应为YYY】"。
【绝对禁止的行为】
- 禁止基于个人理解,将识别内容进行"扩充"或"引申"。
- 禁止添加、删除或修改原文中清晰可辨的学术内容。
- 严禁利用联网检索"虚构"不存在的文献信息。
4.3 DeepSeek API 的成本优势与缓存命中率分析
对于大规模数字化项目,DeepSeek API 展现出极高的成本优势:
• 极低的 Token 单价:DeepSeek 的 API 定价在行业内处于极低水平,使得即使是处理庞大数量的多语种识别文本与修订任务,总体费用依然维持在可接受的范围内。
• 文本修订阶段的成本优化:相比于直接使用 API 进行图像识别,后期修订阶段是将已生成的 .md 文本发送至 API 进行纠错与验证。由于输入的是纯文本而非视觉图像,单次请求消耗的 Token 数量极低,整个修订过程的经济负担很轻。
• 缓存命中率的潜在优势:在后期修订过程中,如果提交到 API 的文本片段存在大量相同或相似的上下文,DeepSeek 服务器端可能会存在缓存机制。对于高频出现的文本块,模型可能在极短的时间内直接返回结果,无需重新进行完整的前向计算,从而大幅提升处理速度并降低实际 Token 消耗。
4.4 API调用DeepSeek进行识别文本修订的伪代码实现
以下代码展示了如何通过DeepSeek的API对已生成的 .md 文件进行批量修订。该脚本会在遍历文件夹时读取每个 .md 文件,将内容与之前设计的修订Prompt组合后发送至API,并将修订后的结果覆盖保存回原文件。
伪代码示例(Python):
python
import os
import time
import requests
================= 配置参数 =================
API_KEY = "your_deepseek_api_key_here" # 替换为真实API Key
TEXT_FOLDER = r"D:\MinerU\workspace\output_markdown\qian\Foreign language notes"
MODEL_NAME = "deepseek-chat" # 或 deepseek-reasoner
ENABLE_WEB_SEARCH = True # 是否开启联网检索
TEMPERATURE = 0.1 # 低温度确保修订稳定
MAX_RETRIES = 3 # API调用重试次数
============================================
修订Prompt模板(使用前面设计好的中文增强版)
REVISION_PROMPT_TEMPLATE = """
你是一位资深的古籍与多语言文献校对专家。
请对以下从手写图片中识别出的文本进行深度修订,并遵守以下所有严格约束:
【修订任务】
- 纠正识别过程中的拼写错误和误识别单词(包括英、法、德、意等外文与中文)。
- 修正错误的标点符号和断裂的段落。
- 对于明显的专有名词(如书名、人名、地名)识别错误,根据上下文语境进行合理修正。
- 如果在句中明显存在"幻觉"(即连续无意义字符或错乱、不符合常识的段落),请根据上下文进行"修补"与"对齐"。
【增强任务:联网检索与引用验证】
- 联网检索:当遇到疑似经典引文、书名、人名或特定历史事件时,尝试利用联网检索进行查证。
- 验证并补全:如果识别出的文字可能偏离原稿,请通过联网检索来验证其准确性。若确信原文引用有误或模糊,请根据检索结果进行补全并备注。
- 引用错误提示:如果发现手稿中存在明显的引用错误或误记,请在修订文本中标记"【疑似引用错误:手稿此处引用为XXX,经网络检索验证,应为YYY】"。
【绝对禁止的行为】
- 禁止基于个人理解,将识别内容进行"扩充"或"引申"。
- 禁止添加、删除或修改原文中清晰可辨的学术内容。
- 严禁利用联网检索"虚构"不存在的文献信息。
【输出格式】
- 保持原有段落结构。
- 对每一个修订处,在修订的单词或句子后标记修订说明。
- 对于无法置信的模糊区域,在该处标注:"[此处文字过于潦草,无法准确识别/修订]"。
- 对于联网检索验证的结果,在对应处进行标注。
【待修订文本】
{original_text}
"""
def call_deepseek_api(prompt_text):
"""调用DeepSeek API,支持联网检索与重试机制"""
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
payload = {
"model": MODEL_NAME,
"messages": [
{"role": "user", "content": prompt_text}
],
"temperature": TEMPERATURE,
"enable_web_search": ENABLE_WEB_SEARCH
}
for attempt in range(MAX_RETRIES):
try:
response = requests.post(
"https://api.deepseek.com/v1/chat/completions",
headers=headers,
json=payload,
timeout=60
)
if response.status_code == 200:
return response.json()["choices"][0]["message"]["content"]
else:
print(f"API返回错误代码 {response.status_code},第 {attempt+1} 次重试...")
time.sleep(2 ** attempt) # 指数退避
except Exception as e:
print(f"API调用异常: {e},第 {attempt+1} 次重试...")
time.sleep(2 ** attempt)
return None # 全部重试失败后返回空
def batch_revise():
"""批量修订所有.md文件"""
if not os.path.exists(TEXT_FOLDER):
print(f"❌ 文件夹不存在: {TEXT_FOLDER}")
return
md_files = [f for f in os.listdir(TEXT_FOLDER) if f.endswith(".md")]
total = len(md_files)
print(f"✅ 找到 {total} 个待修订的 .md 文件")
for idx, filename in enumerate(md_files):
filepath = os.path.join(TEXT_FOLDER, filename)
print(f"\n[{idx+1}/{total}] 正在处理: {filename}")
# 读取原始内容
try:
with open(filepath, 'r', encoding='utf-8') as f:
original_text = f.read()
except Exception as e:
print(f"❌ 读取文件失败: {e}")
continue
# 如果文件内容为空,跳过
if not original_text.strip():
print(f"⚠️ 文件为空,跳过: {filename}")
continue
# 构造完整Prompt
full_prompt = REVISION_PROMPT_TEMPLATE.format(original_text=original_text)
# 调用API
print("⏳ 正在调用DeepSeek API进行修订...")
revised_text = call_deepseek_api(full_prompt)
if revised_text is None:
print(f"❌ API调用失败,保留原文: {filename}")
continue
# 保存修订结果
try:
with open(filepath, 'w', encoding='utf-8') as f:
f.write(revised_text)
print(f"✅ 修订完成: {filename}")
except Exception as e:
print(f"❌ 保存文件失败: {e}")
# 避免请求过于频繁
time.sleep(1)
print(f"\n🎉 全部 {total} 个文件处理完成!")
if name == "main":
batch_revise()
代码说明:
- API调用封装:call_deepseek_api() 函数负责与 DeepSeek API 通信,支持 enable_web_search 参数来开启联网检索。
- 重试机制:包含指数退避重试,当API调用失败时会自动重试最多3次。
- 错误处理:对于读取失败、内容为空或API调用失败的文件,会跳过或保留原文,确保整个流程不会中断。
- 低温度设置:TEMPERATURE = 0.1 确保修订结果稳定、可靠,避免模型过度发挥。
五、人在环中的核心驱动——学者视角与专业判断的不可替代性
本实践并非试图利用AI替代人的学术判断,恰恰相反,其设计初衷是最大化释放人的专业能力。在"大规模手稿数字化"这个场景下,工具提供的是"效率杠杆",而由"人"来掌握杠杆的支点和发力方向。从前期策略制定、中期流程控制到后期文本精校,人的主导作用贯穿始终。
5.1 专业化理解:文本意义的终极锚点
大模型具有惊人的"识别能力",但它缺乏对识别对象(钱钟书先生笔记)的"意义理解"。这种理解体现在:
• 语种边界与混排识别:外文混排时,AI常常无法准确区分语种边界,导致跨语种乱码。人的专业判断可以快速定位语种转换点,识别出"这是一个插入的西方专有名词"。
• 学术术语的判断:手稿中某些看似"潦草"的字符,在上下文语境中,实际上是一个极为重要的学术术语。普通AI可能将其视为"误识别",而具有四十余年钱学积淀的研究者,一眼就能判断其真实面貌。
• 价值判别的唯一性:只有人知道"这份文本的价值在哪里"。哪些是经典引文,哪些是钱钟书的个人点评,哪些是随手记下的心算草稿——这些判断直接决定了哪些错误必须修正,哪些模糊可以容忍,哪些偏差可以忽略。
5.2 半自动化流程中的人为决策节点
在"人在环中"的工作流设计里,人为决策被嵌入到几个关键窗口:
• 识别模式的选择:当脚本提交一张图片后,操作者需要在几秒钟内做出判断:"这张图进入普通模式,还是需要切换到识图模式?"
• 何时中断与重启:"30页重开一次"的机制,由操作者根据前一小时的识别质量、错误频率,以及自己当前的工作状态来决定。
• 对幻觉的识别与隔离:当AI出现"重复循环"或"编造段落"时,操作者需要迅速判断:"这是一个可以清除的缓存污染,还是模型对该页彻底失效?"
5.3 LLM提示词设置:人的意图注入与交互优化
后期修订阶段是人为控制发挥最深层影响的部分。在调用LLM进行修正时,提示词是人将自身的专业理解、学术规范与对精度的要求,通过自然语言注入到模型执行过程中的桥梁。本次实践中,人为优化主要体现在:
• 优先级分配:在修订提示词中,明确界定"拼写错误"、"标点修正"、"专有名词修正"和"模糊区域标注"的权重。
• 风格化约束:在提示词中强调"保持原有段落结构"、"保留引文格式",确保校正后的文本不会偏离钱氏学术文本的气质。
• 联网检索的度:在启用联网检索增强修订之前,人需要决定"哪些类型的引用需要联网验证",并限制AI在"修饰性润色"上的自由度。
5.4 手稿复杂版式的后期人工处理
即使目前最先进的识图模式,也无法完全处理钱钟书手稿中涂抹、行间插入、批注、删改、侧边栏标注、以及难以辨认的连笔修改。这些独特的"学术痕迹"包含了极具研究价值的思维过程:
• 涂抹与删改:被涂黑或划掉的文字,需要人对上下文进行分析,判断删改前的原文是什么,以及为何删除。这往往是学术思想演变的痕迹。
• 插入与批注:在行间、页边、上方或下方夹入的简短文字、符号或简写,往往指向特定的学术文献或思考方向,需要人工按照原稿布局进行还原。
• 版本之间的异文:同一段引文在不同笔记中可能表述不同,人必须对照原稿确定最终版本。
六、参考文献与附录
6.1 参考文献
[1] 钱钟书. 钱钟书手稿集·外文笔记[M]. 北京: 商务印书馆.
[2] Playwright 官方文档. https://playwright.dev/
[4] DeepSeek API 文档. https://platform.deepseek.com/
[4] Vaswani, A., et al. Attention is All You Need. NeurIPS, 2017.
[5] OpenAI. GPT-4 Technical Report. arXiv:2303.08774, 2023.
6.2 附录:项目目录结构参考
text
D:\MinerU\
├── workspace\
│ ├── input\
│ │ └── qian\ocr\ # 存放待识别的手稿图片(.png/.jpg)
│ ├── output_markdown\
│ │ └── qian\Foreign language notes\ # 存放识别生成的 .md 文件
│ └── script\
│ ├── ocr_batch.py # 全自动或半自动识别脚本
│ ├── llm_revise.py # API修订脚本
│ └── test_playwright.py # Playwright 环境测试脚本
├── raw_ocr_input.txt # 积累的识图模式原始输出文本
└──识图模式指令.txt # 保存中文 Prompt 模板
6.3 附录:文本图片与识别效果示例
- 外文笔记图片与识别效果

