搜文解字
词典增强生成框架 | 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个单词。
坛友的第一反应可能是:用正则表达式来提取提问里的英语单词,然后做词形还原。
但这种方法其实是治标不治本:
- 很容易提取错(各位可以看下自己和 AI 的聊天记录)
- 如果用户是以『这句「A B C D」里的「C」是什么意思』的格式提问,用正则提取其实是会把ABCD 都提取出来
- 无法推广到其他语言—之前有坛友吐槽 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。