📝

日本語入力システムSumibiの開発 part4:同音異義語の問題を解決した

2023/10/13に公開

ChatGPTは同音異義語のリストアップは苦手

前回からの続きです。
この記事のために、前の記事を読む必要は特にありません。
記事の最後に前の記事のリンクを置いています。

私はOpenAI API(ChatCompletion API)を利用した日本語入力システム"Sumibi"を開発しています。
SumibiはGPT-3.5/GPT-4のプロンプトだけを使って日本語入力システムを実装しており、一般的な日本語入力システムのような辞書は持っていませんでした。
そのため、プロンプトをいくら工夫しても同音異義語をうまくリストアップすることができませんでした。
今回は、この課題を解決するために結局ローカルに同音異義語辞書を持つようにしたという記事です。

同音異義語のリストアップに失敗する様子

  • 例えば、kanseiという単語を変換する場合、ChatCompletion APIに以下のようなプロンプトを渡しています。
role content
system あなたは漢字が与えられると、ひらがなとカタカナとその漢字の同音異義語を返すアシスタントです。
user ひらがなとカタカナと同音異義語をなるべく多く列挙してください。 : 東西南北
assistant とうざいなんぼく トウザイナンボク 東西南北
user ひらがなとカタカナと同音異義語をなるべく多く列挙してください。 : 漢字
assistant かんじ カンジ 漢字 感じ 幹事 監事 寛二
user ひらがなとカタカナと同音異義語をなるべく多く列挙してください。 : kansei
  • これに対して、次の結果が返ってきます。同音異義語としては3つリストアップしていますが、全部『完成』となってしまいます。これはかなり残念な結果です。
完成
完成
完成
かんせい
カンセイ

本来は『感性』、『歓声』など、他にいくつも候補が考えられますので、それらが出て欲しいのですが、汎用のLLMのモデルの特性上難しいようです。

Sumibiでの解決策

Sumibiでは、ローカルに辞書を保持することで解決しました。
ChatCompletion APIの結果の中には、必ずひらがな候補を入れるよう指示していますので、かなり高確率でひらなが候補も存在します。
具体的にはプロンプトで ひらがなとカタカナと同音異義語をなるべく多く列挙してください。 と指示しています。

上の例では、 かんせい が含まれているので、かんせい をローカル辞書からリストアップして、候補の最後に追加します。
Sumibiでは、ローカル辞書sumibi-localdic.elに以下の項目がありますので、これらすべてが追加されます。

("かんせい" ("完成"
	     "感性"
	     "歓声"
	     "閑静"
	     "管制"
	     "慣性"
	     "寛政"
	     "官製"
	     "乾性"
	     "陥穽"
	     "官制"
	     "間性"
	     "喚声"
	     "甘精"
	     "甘井"
	     "喊声"
	     "監製"
	     "感声"
	     "乾生"
	     "関西"))

結果、めでたく次のような変換結果が得られるようになりました。
cap_jinmei.png

これまで難しかった名字や名前の候補も出せるようになりました。
scap1.png

まとめ

LLMを使ったシステムを開発する際、プロンプトだけでは実現が困難な場面が出てきます。
今回は、結局ローカルに辞書を搭載することできれいに解決できました。
LLMを使ったシステムを構築する際はLLM単独ではなく、別のシステムを組み合わせる必要が出てくるでしょう。
この記事が何かのヒントになれば幸いです。

関連リンク

https://zenn.dev/kiyoka/articles/japanese-input-method-sumibi-1
https://zenn.dev/kiyoka/articles/japanese-input-method-sumibi-2
https://zenn.dev/kiyoka/articles/japanese-input-method-sumibi-3

Discussion