← 日志列表 / All journal entries

两晋十六国史料整理手记 03

Historical Source Notes 03

从线索回到史料

从候选资料到史料依据

之前,我已经通过联网检索和结构化整理,为两晋十六国的一批历史人物建立了生平事迹与人物画像资料。这些记录保留了相应的网络来源,但其中的历史叙述、现代研究观点与各种转述,仍然需要进一步核实。接下来的工作转向历史原典:利用本地史料原文,为已有的人物事件与相关陈述寻找对应原文,判断证据能够支持到什么程度,并保留可供后续查阅的出处。

这一阶段希望借助自动化处理大量重复的检索与比对工作,但目标并不只是为每条记录附上一段古文。找到相关记载,与确认某种历史说法成立,是两个不同的问题。 尤其当一条陈述同时包含时间、人物、行为和因果关系时,原文可能只支持其中的一部分。

如何让模型参与史料核验,同时保留明确的证据边界,是这一阶段需要解决的主要问题。


建立史料检索与核验流程

最初的想法比较直接:先清洗和整理本地古籍,将文本切分为可以定位的段落,建立向量检索库,再由模型对检索结果进行判断,最后将证据、出处与核验状态补回原有的人物资料。

在这个过程中,我让 Ai参与分析样本、编写和调整脚本,通过实际批处理检验流程,并借助独立审查检查容易遗漏的问题。脚本主要负责数据清洗、分块、索引、批量调度及结果校验;模型则负责在原文中辨认相关人物与事件,判断候选陈述和证据之间的关系。

这样的分工既利用了程序在重复处理和格式检查上的稳定性,也利用了llm对自然语言与历史语境的理解能力。

不过,实际推进后发现,检索与核验的质量,很大程度上取决于更前面的史料处理。如果古籍文本在清洗时已经丢失了重要内容,后续检索和模型判断便失去了可靠的基础。


古籍清洗中的信息损失

原本以为,古籍清洗只是正式建库之前的一项准备工作。实际情况要复杂得多。

我使用的是比较容易下载的Wiki的史料原文,具体书目见第一篇日志。

这批原典包含大量 Wikitext 标记,其中既有页面格式,也有专名、注文、校勘、异文及版本说明等有实际意义的信息。最初的清洗规则有时会把这些内容连同模板一起删除,甚至曾使《晋书》中的一段诏书只剩下空白的引文结构。


重写清洗脚本后,新的问题仍不断出现。例如,专名模板中的部分地名被截断,页头中的版本说明被遗漏,少见字形或转录正文也可能在转换过程中丢失。

这些情况说明,古籍中的一些格式信息,本身就承担着记录历史内容或说明史料来源的作用。简单地删除标记,未必能够得到忠实于原文的纯文本。

因此我逐步调整了清洗方式:保留原始文本作为回溯依据,清洗文本用于检索,来源索引则单独记录书目、卷篇及版本等信息。对于存在特殊结构的文本,尽量根据实际内容决定如何处理,而不是仅依赖统一的替换规则。

独立审查也促使我重新认识完整性检查的范围。清洗后的文件结构正常,不代表原始资料中的内容都已进入检索库。后续检查就发现,部分篇章仅保留了指向其他页面的转录提示,真正的正文尚未下载,需要在建库前补齐。

这一阶段曾反复经历检查通过、发现新问题、修订后再次检查的过程。不能简单地以“没有发现错误”作为全部完成的依据。

更合理的方式是明确当前检查覆盖了什么、哪些信息必须保留,以及尚存的问题是否会影响后续检索和引用。


从检索结果到事实判断

史料整理完成后,下一步是为候选陈述寻找原文证据。

检索流程同样经历了调整。早期尝试过较复杂的分块和重排序方案,但在实际规模下,重排序服务遇到了输入限制与明显的耗时问题。最终采用了相对简单的向量召回,再由模型判断候选段落与原始陈述之间的关系。这并不意味着复杂的检索方法没有价值,而是在当时的设备、模型与任务规模下,额外的处理环节没有表现出足够的收益。


正式核验开始后,另一个问题逐渐显现:引文可以准确,模型对引文的理解却未必正确。

例如,某人物被记载为“第三子”,另一处称其为“少子”,模型曾将两种说法判为冲突。但二者并不必然矛盾。类似的问题还包括将局部月份差异扩大为整件事情被否定,或者没有区分事件本身与附带细节的证据状态。

因此,核验不能只给整条记录简单地判定真假。原文支持事件发生,却不一定支持其中的具体年份、所有参与者或现代概括的因果关系。核心事实与局部细节,需要分别判断。

我据此调整了冲突判定标准,并针对疑难记录组织进一步复核。最初判为冲突的一批陈述中,不少在重新理解原文或修正分类标准后被调整为部分支持;真正存在直接矛盾的内容则继续保留冲突标记。

对于没有找到证据的记录,也不能直接认定为错误。检索遗漏、人物异名、古今表达差异和史料库的覆盖范围,都可能影响结果。于是,又增加了针对未找到记录的补充查询与重新核验,而没有让所有材料重复经历完整流程。

经过这些调整,脚本与模型的分工也更加明确:程序能够检查数据结构、出处映射和引文是否确实存在于原始文本中;模型负责解释引文与候选陈述之间的关系;对于冲突、遗漏及其他疑难判断,还需要进一步复核。

程序检查能够保证部分证据关系的形式正确,却不能直接证明历史解释成立。模型能够理解语义,也不意味着每次判断都值得无条件接受。


总结

这一阶段最终完成了30位人物的候选资料与本地历史原典之间的批量匹配。每条记录保留相应的核验状态与判断理由,找到证据的条目则附有原文和出处。


结果区分为支持、部分支持、冲突及未找到证据等情况,而没有为了获得一份看起来完整的资料库,强行消除不确定性。

这套流程已经能够完成当前规模的资料处理,并为后续人物档案写作提供可追溯的依据。不过,核验状态仍然是当前模型与复核流程作出的判断,不能直接等同于历史事实的最终结论。尤其对于部分支持和涉及重要因果关系的陈述,后续使用时仍需结合具体证据审慎处理。


回顾这一阶段,最深的体会并不是检索或核验采用了什么技术,而是需要区分不同层次的可靠性,并让每一项验收结论有明确的依据。


古籍清洗通过检查,说明文本满足了现有规则;引文逐字匹配,说明引用可以回查;模型认为某条陈述得到支持,则还涉及对历史语义的理解。这些结论彼此相关,却不能互相替代。

另一方面,质量控制也必须考虑实际用途和投入成本。如果每次发现新的边界问题,都无限扩大处理和审查范围,整个项目就很难继续推进。与其追求一次性消除所有疑问,不如明确哪些问题已经处理,哪些仍然存在,以及现有资料能否支持下一阶段的工作。

完成原典匹配之后,人物资料已经有了更明确的证据基础。但这些结构化记录依然不适合直接阅读和创作。