一个中文问题进来,经过五个环节,出去时是一条带坐标、可回查的答案。 这一页讲的不是「流程是什么」,是每一个环节上我们做了什么不一样的选择,以及为什么。
贯穿全篇的一条:凡是能用代码判的,绝不交给 AI 判。
模型负责理解与表达,代码负责把关。下面每一个环节的取舍,基本都能回到这一句。
三藏是巴利语的,提问是中文的。两者之间必须有一张对照表, 这张表的质量决定了检索的上限——表里没有的词,后面每一个环节都无从谈起。
而现成的中巴对照资源,冷僻术语一侧往往最薄。
《问藏巴利术语库》以维基巴利数据库的术语为底本, 由问藏的建立者维护,不定期审核和增补。
有人在看、在改,是这个库跟自动生成的词表最大的区别。
这张术语表最初是被一个词逼出来的:「七色七非色」。 当时的大模型认不出它——这类词在网上流通的中文语料里几乎不出现, 模型没见过,就只能望文生义。
戒律术语成片地属于这一类。所以我们拿巴利律与《四分律》的对应段落, 逐条核定戒律术语的传统汉译。(《四分律》用大正藏 T22n1428,CBETA 电子本。)
这只是其中一例。库在继续维护,这类人工核定还会更多。
⚠️ 同时限定了它不能当什么用:《四分律》属法藏部、巴利律属上座部, 两者的犍度是部派对应而非翻译,次第与内容不完全一致——库中的犍度对应不作译名依据。
⚠️ 只取词,不取句:只取专名与出处定位(第几卷、出现几次),不取原文句子。 取词是事实,抄录是改作。
这是全流程最容易出错的一步。选错词,后面每一步都在为错误服务—— 材料取不回来,答案就无从谈起。
难在两头:中文术语与巴利词不是一一对应;而提问用的是口语,不是术语。
三道判据并行,各治一类,互为补充:
稀有度:「央掘」只挂 1 条、「荤腥」2 条,一次命中即足以定位; 而「本生」挂 204 条、「长老」233 条,属噪声,不单独采信。
精确匹配:「空性」→ suññatā、「有为法」→ saṅkhatadhamma。
单字术语:蒜(lasuṇa)、衣(cīvara)、触(phassa)、 信(saddhā)、灭(nirodha)、遍(kasiṇa)。 不单开这一路,问「大蒜的戒律」连一个候选都捞不到。
⚠️ 第一道判据是修正来的:原先只认「命中两个组合」, 而刚好两个字的中文专名只能产生一个组合,得分恒定不足—— 两千余个两字术语曾对系统整体隐形。
⚠️ 单字一路不能整批放开:单字中译里混着「的」「吗」「不」「中」这类功能词, 「的」出现在四成以上的提问里。判据不是「在表里稀有」,而是「在真实提问里稀有」—— 拿数千道去重真题统计出现率,只放行出现率低于百分之一的那一批。 这两个「稀有」方向相反,正是这道判据的关键。
⚠️ 白名单固化在文件里,不在运行时重算—— 动态计算会让同一道题在不同时候给出不同候选,回归就失去基线。
附带一道 · 拼写纠错
维基巴利数据库一个词形都展开不出来时,从语料反查正确拼法; 并设四道闸,防止把本来正确的词改坏。
巴利高度屈折,同一个词在经文里以几十种变格形出现,不能按字面找。
另一层:检索的成本结构决定了「一次要多少」的最优解,未必是「够用就好」。
跨词交集:「阿难有哪五项过失」一题,正是靠「这几个词同时出现在哪一段」答出来的。
补轮:实测三十题中,二十一题只跑一轮,五题两轮,四题跑满三轮—— 简单题自动省掉,难题才付代价。
B 之二 · 词典:哪一本先进入上下文,是学术判断
同一个巴利词,维基巴利数据库可返回十余本词典的释义,而上下文预算有限。 谁进、谁不进,直接决定释义的可靠性——这件事如果不管, 就等于交给返回顺序去决定。
为什么要限量:实测 CPD 单个词可返回三十余条(kassapa 就是), 不设上限则释义淹没原文。
这张表之前是什么样:同一语言内选哪一本,完全取决于数据库的返回顺序—— 中文有八本争两个名额,谁进上下文靠运气。这张表把选择权收了回来。
⚠️ 权威名单是学术判断,不是工程判断——不由程序自行扩充。
模型只许用 B 取回来的材料作答,不许凭记忆补。
而专名的中文呈现有两条路:音译,或沿用汉传意译。汉传意译读来熟悉, 但它对应的是汉译佛典的语境,未必指向同一个人、同一部经—— 熟悉感会盖掉这层不确定。
不熟的专名用音译,不用汉传意译。 判准是读者认不认得,不是有没有汉传译名——家喻户晓的照旧。
Mahāgovinda 写作「马哈果温达(Mahāgovinda)」,不写「大典尊」。
音译用「马哈」而不用「摩诃」——「摩诃」留给汉传专名。
这一步做不到零错:模型会手滑——人名写错、经号写错、书名张冠李戴。 所以策略不是让 C 不犯错,是让 D 把 C 的错拦在读者之前。
答案由模型生成,而模型的错误是概率性的,永远消不完。 若检查也交给模型,就是用一个概率性的东西去兜另一个概率性的东西。
改由代码来判,性质就变了:一个 bug 会让同类错误百分之百放行; 反过来,一道正确的检查能让同类错误百分之百拦住。 确定性是检查环节唯一值得要的东西。
七道,逐条机械核验:
udāna 写成「因缘」(nidāna 才是)、 Koṇḍañña 写成「拘那含」(Koṇāgamana 才是)、 lokantarika 写成「无间地狱」(avīci 才是)。
⚠️ 只认绑定式——巴利词与错译贴在一起才算; 同一篇里两个词各自出现属正常行文。
⚠️ 只禁错译,不规定正译。规定正译就要在译名口径上做取舍, 那不是这道检查该管的事。
一个总是斩钉截铁的系统,和一个总是含糊其辞的系统,都不可用。 可用的前提是:它对自己的把握程度有判断,并且说出来。
⚠️ 而且 D 治不了这一类:D 检查的是「答得合不合格」, 查错了对象,七道闸可以全部放行——形式上完全合格,答案却答的是另一个问题。
只设「存疑」一档,不设「确定」一档。绝大多数提问两条存疑信号都不亮; 若对它们一律盖「确定」章,那是把误导做得更精致。不亮就什么也不显示。
另外把检索过程播给读者看——换词根、推翻前一轮、发现材料与提问对不上,都照实说一句。
「表里没有这个词,我按字面拆开,先试试。」
「等一下——查到的这两处讲的是菩萨思惟,跟你问的对不上。」
「换个词根再查。」
把怀疑过程摊开,本身就是可信度的证据—— 读者看见的是我们在替他较真,而不是一句含糊的免责声明。
上面画的是一道题怎么被回答。这一节是另一件事:我们要动上面任何一个环节的时候, 用什么挡住「改好了一处,悄悄弄坏了三处」——而且没有人看得出来。
曾经用「答案里含某两个字」当失败判据,误伤了两条好答案;改成「是否以某句话开头」才对。
也遇到过某题重跑一次就变差——链路里有大模型,单题翻转不等于倒退。 换几个问法重测,确认是稳定倒退才动手改;追着噪声改代码,只会越改越乱。