← 返回问藏

问藏的几个设计

A / B / C / D / E 2026-10-03

一个中文问题进来,经过五个环节,出去时是一条带坐标、可回查的答案。 这一页讲的不是「流程是什么」,是每一个环节上我们做了什么不一样的选择,以及为什么。

模型做的 维基巴利数据库 + 我们定取多少 问藏代码

贯穿全篇的一条:凡是能用代码判的,绝不交给 AI 判。

模型负责理解与表达,代码负责把关。下面每一个环节的取舍,基本都能回到这一句。

0
术语表 中文 ↔ 巴利的对照底座,整条流程都踩着它 我们维护
原理

三藏是巴利语的,提问是中文的。两者之间必须有一张对照表, 这张表的质量决定了检索的上限——表里没有的词,后面每一个环节都无从谈起。

而现成的中巴对照资源,冷僻术语一侧往往最薄。

我们的做法

《问藏巴利术语库》以维基巴利数据库的术语为底本, 由问藏的建立者维护,不定期审核和增补。

有人在看、在改,是这个库跟自动生成的词表最大的区别。

举例 · 这张表就是为这类词建的

这张术语表最初是被一个词逼出来的:「七色七非色」。 当时的大模型认不出它——这类词在网上流通的中文语料里几乎不出现, 模型没见过,就只能望文生义。

戒律术语成片地属于这一类。所以我们拿巴利律与《四分律》的对应段落, 逐条核定戒律术语的传统汉译。(《四分律》用大正藏 T22n1428,CBETA 电子本。)

这只是其中一例。库在继续维护,这类人工核定还会更多。

⚠️ 同时限定了它不能当什么用:《四分律》属法藏部、巴利律属上座部, 两者的犍度是部派对应而非翻译,次第与内容不完全一致——库中的犍度对应不作译名依据。

⚠️ 只取词,不取句:只取专名与出处定位(第几卷、出现几次),不取原文句子。 取词是事实,抄录是改作。

读者在网页上打一句中文
A
选词 从中文问句里认出该查哪几个巴利词 模型 + 问藏代码
原理

这是全流程最容易出错的一步。选错词,后面每一步都在为错误服务—— 材料取不回来,答案就无从谈起。

难在两头:中文术语与巴利词不是一一对应;而提问用的是口语,不是术语。

我们的做法

三道判据并行,各治一类,互为补充:

  1. 二字组合索引 + 稀有度加权。把表里每条中译切成二字组合建索引,提问同样切分。 命中两个组合算候选;或者命中一个「稀有」组合也算——一个组合只挂三条以内, 它就近乎唯一标识符,一次命中足以定位。
  2. 精确匹配,补泛词的缺口。提问中若有字串恰好等于某条中译,直接算命中。 这一类词稀有度判据够不着。
  3. 单字术语白名单。表中有数百条中译只有一个汉字,前两道判据结构上都够不着 ——二字组合要两个汉字才成组合,精确匹配有长度下限。
举例

稀有度:「央掘」只挂 1 条、「荤腥」2 条,一次命中即足以定位; 而「本生」挂 204 条、「长老」233 条,属噪声,不单独采信。

精确匹配:「空性」→ suññatā、「有为法」→ saṅkhatadhamma。

单字术语:蒜(lasuṇa)、衣(cīvara)、触(phassa)、 信(saddhā)、灭(nirodha)、遍(kasiṇa)。 不单开这一路,问「大蒜的戒律」连一个候选都捞不到。

⚠️ 第一道判据是修正来的:原先只认「命中两个组合」, 而刚好两个字的中文专名只能产生一个组合,得分恒定不足—— 两千余个两字术语曾对系统整体隐形。

⚠️ 单字一路不能整批放开:单字中译里混着「的」「吗」「不」「中」这类功能词, 「的」出现在四成以上的提问里。判据不是「在表里稀有」,而是「在真实提问里稀有」—— 拿数千道去重真题统计出现率,只放行出现率低于百分之一的那一批。 这两个「稀有」方向相反,正是这道判据的关键。

⚠️ 白名单固化在文件里,不在运行时重算—— 动态计算会让同一道题在不同时候给出不同候选,回归就失去基线。

附带一道 · 拼写纠错

维基巴利数据库一个词形都展开不出来时,从语料反查正确拼法; 并设四道闸,防止把本来正确的词改坏。

B
取材 拿这些词向维基巴利数据库要原文与词典 维基巴利数据库 + 我们定取多少
原理

巴利高度屈折,同一个词在经文里以几十种变格形出现,不能按字面找。

另一层:检索的成本结构决定了「一次要多少」的最优解,未必是「够用就好」。

我们的做法
  • 一次取满。一次请求取 40 条与取 8 条,对数据库的开销相同。 所以一律取满,再在本地决定用多少——节省的是我们自己的上下文预算,不是数据库的请求量。
  • 冷僻词全取,高频词截断。语料中出现不足 40 条的词本身就精准,截断它是自伤。
  • 跨词交集。检索这几个词同时出现在哪一段。
  • 顺序连读。检索命中的常是标题,正文在其后——命中之后还要往下连读若干段。
  • 补轮。读过已取回的材料之后,再补几个词接着查,至多三轮。
  • 并发。每个词的词典、原文、分层统计三路同时发出,多个词也同时跑; 总耗时取决于最慢的一路,不是逐项相加。
举例

跨词交集:「阿难有哪五项过失」一题,正是靠「这几个词同时出现在哪一段」答出来的。

补轮:实测三十题中,二十一题只跑一轮,五题两轮,四题跑满三轮—— 简单题自动省掉,难题才付代价。

B 之二 · 词典:哪一本先进入上下文,是学术判断

原理

同一个巴利词,维基巴利数据库可返回十余本词典的释义,而上下文预算有限。 谁进、谁不进,直接决定释义的可靠性——这件事如果不管, 就等于交给返回顺序去决定。

我们的做法
  • 设权威档。T-Pāḷi-Myanmar(第六次结集后缅甸国家整理,词条最全)、 U Hau Sein、Critical(即 CPD)三本列为权威, 必进上下文,不占语言名额。
  • 权威档同样限量。不限量的话,一本词典就能把三藏原文挤出上下文。
  • 同书异本共用名额。U Hau Sein Roma 是 U Hau Sein 的罗马转写本, 不是另一本词典;各给名额等于同一份内容占两份位置。 转写本优先——模型读拉丁字母比读缅文字形可靠。
  • 语言优先级随读者语言变,权威档不变。中文页优先中文词典,英文页优先英文词典; 哪本算权威不因读者语言而改。
举例

为什么要限量:实测 CPD 单个词可返回三十余条(kassapa 就是), 不设上限则释义淹没原文。

这张表之前是什么样:同一语言内选哪一本,完全取决于数据库的返回顺序—— 中文有八本争两个名额,谁进上下文靠运气。这张表把选择权收了回来。

⚠️ 权威名单是学术判断,不是工程判断——不由程序自行扩充。

C
作答 只用取回来的原文写中文答案,每条引用附坐标 模型
原理

模型只许用 B 取回来的材料作答,不许凭记忆补。

而专名的中文呈现有两条路:音译,或沿用汉传意译。汉传意译读来熟悉, 但它对应的是汉译佛典的语境,未必指向同一个人、同一部经—— 熟悉感会盖掉这层不确定。

我们的做法

不熟的专名用音译,不用汉传意译。 判准是读者认不认得,不是有没有汉传译名——家喻户晓的照旧。

举例

Mahāgovinda 写作「马哈果温达(Mahāgovinda)」,不写「大典尊」。

音译用「马哈」而不用「摩诃」——「摩诃」留给汉传专名。

这一步做不到零错:模型会手滑——人名写错、经号写错、书名张冠李戴。 所以策略不是让 C 不犯错,是让 D 把 C 的错拦在读者之前。

D
核验 交付前逐条验一遍,核不过的坐标摘掉 问藏代码进行检查,不是 AI
原理

答案由模型生成,而模型的错误是概率性的,永远消不完。 若检查也交给模型,就是用一个概率性的东西去兜另一个概率性的东西。

改由代码来判,性质就变了:一个 bug 会让同类错误百分之百放行; 反过来,一道正确的检查能让同类错误百分之百拦住。 确定性是检查环节唯一值得要的东西。

我们的做法

七道,逐条机械核验:

  1. 书名与书号对不对得上
  2. 答案是不是写到一半断了
  3. 坐标存不存在——取不到原文的直接摘掉,不留在答案里
  4. 引文与原文对不对得上
  5. 有没有拿「是不是佛说」给材料排高低
  6. 引了语料里没有的书
  7. 成对易混的巴利词有没有译串
举例 · 第七道

udāna 写成「因缘」(nidāna 才是)、 Koṇḍañña 写成「拘那含」(Koṇāgamana 才是)、 lokantarika 写成「无间地狱」(avīci 才是)。

⚠️ 只认绑定式——巴利词与错译贴在一起才算; 同一篇里两个词各自出现属正常行文。

⚠️ 只禁错译,不规定正译。规定正译就要在译名口径上做取舍, 那不是这道检查该管的事。

E
说不准就说不准 这一趟查得对不对?拿不准就告诉读者 问藏代码 + 模型
原理

一个总是斩钉截铁的系统,和一个总是含糊其辞的系统,都不可用。 可用的前提是:它对自己的把握程度有判断,并且说出来。

⚠️ 而且 D 治不了这一类:D 检查的是「答得合不合格」, 查错了对象,七道闸可以全部放行——形式上完全合格,答案却答的是另一个问题。

我们的做法

只设「存疑」一档,不设「确定」一档。绝大多数提问两条存疑信号都不亮; 若对它们一律盖「确定」章,那是把误导做得更精致。不亮就什么也不显示。

另外把检索过程播给读者看——换词根、推翻前一轮、发现材料与提问对不上,都照实说一句。

举例

「表里没有这个词,我按字面拆开,先试试。」

「等一下——查到的这两处讲的是菩萨思惟,跟你问的对不上。」

「换个词根再查。」

把怀疑过程摊开,本身就是可信度的证据—— 读者看见的是我们在替他较真,而不是一句含糊的免责声明。

带坐标的答案 —— 每一句都能点回巴利原文

改这条流程的时候,凭什么敢改

上面画的是一道题怎么被回答。这一节是另一件事:我们要动上面任何一个环节的时候, 用什么挡住「改好了一处,悄悄弄坏了三处」——而且没有人看得出来。

关一
做什么
任何改动先上预览站,不碰正式站。
关键
预览站有它自己的后端——缓存、问答日志全部与正式站隔离。 所以它能独立跑流量,实验跑歪也污染不到读者那边。
关二
做什么
两个题库:一个防倒退、一个测改进。改完拿同一套固定题目重跑,新旧并排比对。
关键
看的重点不是「变好了多少」,而是「有没有原本答对的变错了」。
还有
判据本身也要验证——拿已知答砸的样本去喂判据,确认它真的会判失败。

曾经用「答案里含某两个字」当失败判据,误伤了两条好答案;改成「是否以某句话开头」才对。

也遇到过某题重跑一次就变差——链路里有大模型,单题翻转不等于倒退。 换几个问法重测,确认是稳定倒退才动手改;追着噪声改代码,只会越改越乱。