AI & 辞典的正确结合方式:搜文解字,一个辞典增强生成框架(DAG)

搜文解字

词典增强生成框架 | A Dictionary-Augmented Generation Framework.

检索增强生成(RAG)是指对大型语言模型输出进行优化,使其能够在生成响应之前引用预训练数据之外的其他数据。

辞典增强生成(DAG)是指对大型语言模型输出进行优化,使其能够在生成响应之前引用权威辞典的解释。

最典型的应用场景:「在辞典解释里查找与上下文语境最接近的释义」,如果你有读过Anki高考的20条原则(1-5)—来自《有效的学习:组织知识的20条原则》 - @Thoughts Memo ,为了提高复习效率,可能就会在使用 jidoujisho、Yomichan 制作 Anki 卡片时删除多余的解释,只保留最接近上下文的解释(即:最小信息原则)。

原理

提示词

这个项目最关键的就是下面的提示词了:

# Role: 辞典查询助手

## Profile
- Author: NoHeartPen
- Version: 0.1
- Description: 辞典查询助手是从严谨、权威的辞典解释中,搜索并返回与上下文语境最接近义项的语言学习助手。

## Rules
1. 尊重原文,不得翻译提供的辞典的完整解释,不得修改提供的辞典的完整解释
2. 如果上下文语境出现辞典尚未收录的用法,直接返回 "辞典尚未收录这个用法"
3. 当辞典收录了用户提供的上下文语境下的用法时,只返回与上下文语境最接近的义项的辞典解释,不要返回与上下文语境无关的其他解释
4. 任何时候都不需要提供任何辅助说明
5. 保留原文的格式,包括HTML标签和换行符
6. 在生成的回答中不要包含「你的回答:」这样的内容
7. 如果用户不提供上下文,直接返回 "不提供上下文的用户就是在耍流氓(恼"
8. 如果用户不提供辞典解释,直接返回"不提供辞典解释的用户就是在耍流氓(恼"

## Workflow
1. 让用户以 "上下文:[], 想要查询的单词:[], 辞典的完整解释:[]" 的方式提供上下文和需要查询的单词。
2. 针对用户给定的上下文、需要查询的单词和辞典的完整解释,分析用户提供的辞典完整解释中和上下文语境最接近的解释义项

## Example
上下文:[全部さらけ出して], 想要查询的单词:[さらけ出して], 辞典的完整解释:[さらけ‐だ・す「×曝け出す」  
[動サ五(四)]  
① 隠すところなく、すべてを現す。ありのままを見せる。「内情を―・す」「弱点を―・す」  
② 追い出す。  
「おらあ女房を―・してしまって」〈滑・膝栗毛・発端〉]
你的回答:① 隠すところなく、すべてを現す。ありのままを見せる。「内情を―・す」「弱点を―・す」 

## Initialization 
作为角色 <Role>, 严格遵守 <Rules>, 仿照<Example>,分析下面用户提供的内容,并返回结果:

提示:按照 one-shot的原则,你应该把例子换成英语(或者其他你想查的语言),这样可以提高生成的准确度。我对这个提示词在日语上的表现挺满意的,但试了下英语,发现效果不太好。

词形还原

其实对于大多数做 AI 应用的公司来说, RAG 的关键不在 AI 上,而在检索上——也就是如何通过向量化外部数据,让计算机找到生成更可靠的内容需要的数据。

DAG 的技术难点其实也是「向量化」:即如何让计算机「找到」辞典里的词条,然后依据词条的解释来生成来内容。

如果是在「在辞典解释里查找与上下文语境最接近的释义」这样的场景,用自然语言处理里的「词形还原」和「词干提取」技术即可(中文一般叫「分词」,日语一般叫「形态素解析」。

语言学中的词形还原(英语:Lemmatization)是将一个单词的屈折形式组合在一起的过程,以便可以将它们作为单个项目进行分析,由该单词的原形或词典形式进行识别。
例如在英语中,动词“to walk”可能出现“walk”、“walked”、“walks”或“walking”。人们在字典中可能查到的基本形式“walk”,被称为该词的词义。

用自然语言处理的常见工具 NLTK(英语)、jieba(中文)、Mecab(日语)都能快速实现,这里就不重复了。

如果有坛友愿意折腾,建议用 spaCy,因为这个提供统一的API来分析多种语言。

如果只是上面这样的场景,「搜文解字」不至于说自己是一个框架。

其他场景

但回到大众对 GPT 最熟悉的印象——聊天对话,问题就变得非常复杂了。

比如,我在语言学习群里看到有经常人问:「xxx 和 xxx 有什么区别」,这种情况就不能只搜索一个单词,要同时搜索2个单词。

坛友的第一反应可能是:用正则表达式来提取提问里的英语单词,然后做词形还原。

但这种方法其实是治标不治本:

  1. 很容易提取错(各位可以看下自己和 AI 的聊天记录)
  2. 如果用户是以『这句「A B C D」里的「C」是什么意思』的格式提问,用正则提取其实是会把ABCD 都提取出来
  3. 无法推广到其他语言—之前有坛友吐槽 AI大模型VS传统辞书 时是用的「夷简」这个现代汉语中不太常见的词来测试 AI,这个怎么用正则提取呢?(注:如果坛友是用「what’s the mean of “夷简”」来提问的话,反着写正则提取汉字部分也是可以的做到的,但…我个人不接受这种假设)

可以借鉴 AI Agent的流程,通过提示词要求 AI 先总结哪些要查的单词,但我试过好几个提示词效果都不是很好。如果你试出来好的提示词可以分享下么?我什么都愿意做的!.jpg

但判断对话里用户问的问题需要查哪个词条,其实和自然语言处理的经典问题「命名实体识别」有点关系:

具命实体辨识(英语:Named Entity Recognition,简称NER),又称作专名识别、命名实体,是指识别文本中具有特定意义的实体,主要包括人名、地名、机构名、专有名词等,以及时间、数量、货币、比例数值等文字。

索引实体识别:(英语: Index Entity Recognition,简称 IER),是指识别文本中是否包含指定的一组词汇(也就是索引)中的词条。
这是我瞎编的233

需要注意的是,现有的「命名实体识别」的库一般是把一句话里的特殊词提取出来,而「索引实体识别」除了提取一句话里的词条,还应该判断提取出来的词条中哪些和回答问题相关—不过直接把所有词条的解释都提供给 AI也不是不行2333(DeepSeek R1:我(未命中缓存时)都百万 token 输入 4 元,百万 token 输出 16 元了,你还嫌贵是吧?

再举个更有挑战的场景:如果是提问者问的是语法、句型有关的问题,又该怎样判断出索引呢?

(温馨提示:前面提到的工具都不能判断一句话里用了什么语法,提供一个我正在验证的思路:参考语法书目录,构建特殊的索引来做全文检索)

以上问题如果都能解决的话,「搜文解字」就可以说自己才不是什么烂大街的 AI 词典,而是基于辞典增强生成(DAG) 技术的次世代辞典(笑

坛友:所以你是又开了个新坑么

翻译记忆增强生成

最后,再提一个更有趣的猜想吧:了解过计算机辅助翻译的同学,可能意识上面的过程其实和人类译员翻译时参考翻译记忆库非常类似。

所以,能不能实现一个翻译记忆增强生成框架呢?(TMAG,即 Translation Memory Augmented Generation)

说具体点:生成时参考的不是辞典解释,而是翻译记忆库。让 GPT 在翻译时先从数据库里检索出相似的优秀译文,模仿这些优秀的译文进行翻译,翻译效果会不会更好呢?期待大家验证这个猜想!

什么是翻译记忆:

译者首先提供一段来源文字(亦即要拿来被翻译的文字)给翻译记忆库,程序会先分析这段文字,试着在数据库里找寻既有的翻译区段是否与过去曾经翻译过的文字相符。如果找到相符的旧有翻译(legacy translation pairs),则会呈现出来给译者检阅。译者可以选择接受旧有的翻译、拒绝、或是加以修改。若加以修改,则修改的版本也会被记录并存进数据库里。

相关讨论

[[同一本词典中,为什么有的单词是英式拼写为主词条,有的则是美式?]] https://forum.freemdict.com/t/topic/36474 「有的单词的英式词条下有详细解释,而美式词条则省略释义且引导读者前往英式词条」…那看来还得再查一次?

[[FreeMdict_考试义项频率统计求助]] https://forum.freemdict.com/t/topic/32154 这篇帖子讨论的其实是辞典编撰相关的问题,『日本国語大辞典 第三版』官方网站提到「クラウド上でのデータ共有、編集支援システムや自動組版の仕組みの構築など、新しい技術によって辞書の作り方を大きく変えます。」,不知道会怎么用 AI。

8 个赞

AI 不太能理解非结构化的数据。关键还是提取词典数据,之前链接有人提到过,mdx 词典 + json 索引,应该就可以补充需要 RAG 的场景。

1 个赞

这个绝对不应该是难点,LLMs本身就具有提取关键词的能力,根本不需要用正则去手动处理,AI能通过概率统计的方法识别关键词,这可比什么正则要高级多了

1 个赞

AI 提取的关键词不一定能和需要检索的数据一致。

不是AI从业者看不太懂,礼貌顶一下

这个问题应该也好解决吧,除了词形还原,还可以把某一本词典的词头索引,作为参考数据预先喂给AI

我自己使用的经验,个人是习惯用全英和AI对话的,英语相关问题自然是prompt和response全是英文,关键词提取还是没有出错过的

如果让 AI 分析一句英文里的词组或者语法,给出的回答(关键字)就会比较容易出错。如果给的词组和 mdx 里的对不上,查找也会出错,就谈不上检索增强了。

词组确实是一个难点,AI能成功识别句子中的词组,但是词典数据里有没有这个词组,是以什么方式呈现的,就不好说了

语法的话,我其实比较好奇,为什么要把语法归纳在这一个话题下面,应该视为另一类问题

根据我过往的经验,语法应该一个点一个点学,每次学聚焦于一个语法点。那么,直接通过对话的形式是更好的,AI也能识别出语法点,用户再自行检索语法书

语法是因为你引用的后面有段话提了,我觉得查找正确的索引也很成问题,不知道楼主要怎么解决。(对普通用户来说,用好 RAG 最关键的是 Retrieval,微调模型是不可能的,顶多优化下提示词。

1 个赞

敬请期待我连一个字都没开始写的《日语语法结构的理解与运用:日语句型识别的算法原理和工程实践》。

有兴趣的话,可以读一下非辞書的日语词组识别算法的单元测试:

下面是算法的源码:

如果你真的读懂上面的测试和源码,那用Mecab 把日语语法的经典例句都解析一遍(每个语法点至少找10个例句),仔细观察下解析的结果。

如果你意识到了每组例句的解析结果都有些共性,那么,恭喜你!

现在你就差最后一步了:读一下 Whoosh 这个完全用 Python 写的全文检索的第三方库的源代码,然后参考上面的词组识别算法,用 Mecab 做分词器自己从零写一个精简的全文检索引擎吧!

哦,对了,差点忘了最重要的事情:记得写单元测试(希望坛友不会被单元测试逼疯2333我开始写单元测试后的精神状态:嘿嘿嘿哈哈哈啊啊,日语真好玩诶,诶,不对,我单元测试怎么又挂了?!

发了论文的话,可以告诉我一声,我实在是懒得搞了,还是直接抄别人的作业来得快

1 个赞

找到一个指标,MTEB(Massive Text Embedding Benchmark),MTEB 包括:判断不同文本关系(如重复,语义相似)分类聚集;重排序与检索……

一些开源小模型排名很靠前

2 个赞

歪个楼,我其实一直想请教您,有什么工具可以高亮出一个日语句子里的语法点吗?如图:
Screenshot 2025-02-17 at 00.12.03
Screenshot 2025-02-17 at 00.09.43
感觉这对沉浸学习的词句挖掘还是很有帮助的。否则,必须主动学习文法才能了解它们、应对考试。
我知道很多文法其实是惯用句。Mecab等工具能细粒度分词,如图,但不查词典很难知道这里有一个语法点。
Screenshot 2025-02-17 at 00.10.38

目前我知道两个工具,但都不太便利:

  1. https://jastudy.net
    缺点是不能在原句中高亮。最大的问题是,只能在网页中查询,没有API,也不能监控剪切板,所以很难自动化。
  2. Yomitan Search页,只安装语法词典。
    缺点是只能用空格分词,不明显,且必须鼠标放上去才能查询

如有更好的工具敬请告知!

2 个赞

除了查的不对以外,我发现更难受的是辞典简明易懂,大部分时候几秒钟就找的能理解的释义;而AI需要token的反应时间外(与goldendict对比),输出东西太长太多,效率上大打折扣。

1 个赞

我也觉得用 AI 查词条不是很合适,其他问题可以让 AI 避免输出过长的文本,比如 "请用不超过 100 个字回答: … "。

1 个赞

我也没找到其他提供了可以调用的 API的工具,所以才打算自己搞一个(笑

另外,感谢分享,第一个工具公开了论文,我有空读读。

至于 Youmichan, 我怀疑它所谓的语法识别其实还是只处理了动词活用。但我之前也只是简单读了下源码和单元测试,我后面也抽空看看它的语法识别效果到底怎么样吧。

1 个赞

我看过,Yomitan 只处理了活用形。

1 个赞

yomichan确实只处理活用形。
识别语法点的功能实际上来自于语法词典作者的精心设计。

将词组分开提高了查得率。但也说不上精确。肯定是方法一更专业。

2 个赞