見出し画像

AI司書を作ろうとして、結局「本の中身を知らないAI」にぶつかった話

「自然が美しい絵本を探したい」

そう思って、AIを使った絵本検索の仕組みを考えていました。

最近のLLMは、こちらの曖昧な言葉をかなり上手に受け取ってくれます。
「自然が美しい」と言えば、森、海、季節、草花、静けさ、余白、やさしい色合い……といった要素を、なんとなく汲み取ってくれる。

だったら、AI司書のようなものが作れるのではないか。

そんなことを考えました。

普通にLLMへ聞くと、存在しない本が出てくる

最初の問題は、LLMにそのまま本を聞くと、存在しない本を薦めてしまうことがある、という点でした。

たとえば、

「自然が美しい絵本を教えて」

と聞くと、いかにもありそうなタイトルや、もっともらしい著者名を出してくることがあります。
説明文も自然で、「ああ、良さそう」と思ってしまう。

でも、調べてみると存在しない。

これは本探しではかなり致命的です。
本を探している人にとって、「その本が実在するか」は最低条件だからです。

そこでまず考えたのは、LLMに本を直接答えさせるのではなく、外部の書籍データベースと連携することでした。

最初に考えた構成

最初に考えた構成は、かなりシンプルです。

Custom GPT
  ↓
Google Books API
  ↓
実在する本だけを候補として表示

Custom GPT側では、ユーザーの意図を解釈します。

たとえば「自然が美しい絵本」と言われたら、

  • 絵本を探している

  • 自然がテーマになっている

  • 絵や雰囲気の美しさを重視している

  • 静かで詩的なものを求めている可能性がある

と解釈する。

そのうえで、Google Books APIに投げる検索クエリを作ります。

たとえば、

絵本 自然
絵本 森
絵本 季節
自然 美しい 絵本

のように複数の検索語に分解して、実在する本を取得する。

そして、LLMはGoogle Books APIから返ってきた本だけを推薦する。
API結果にない本は絶対に出さない。

この構成なら、少なくとも「存在しない本を薦める」問題はかなり抑えられそうでした。

中継APIも検討した

途中で、中継APIを置く案も考えました。

Custom GPT
  ↓
中継API
  ↓
Google Books / openBD / NDL など

中継APIというのは、Custom GPTと書籍APIの間に置く、自分で制御できる処理場所です。

ここで、

  • Google Booksの検索結果を整形する

  • ISBNを正規化する

  • 同じ本の別版をまとめる

  • openBDやNDLで書誌情報を補完する

  • 絵本っぽくない本を除外する

  • APIキーを隠す

といった処理ができます。

最初は「できれば中継APIなしで、Custom GPT ActionsからGoogle Books APIを直接叩けると楽だな」と思っていました。

自分でWebサービスを作ると、チャット画面、ログイン、エラーハンドリング、変な入力への対応など、本題ではない部分が増えます。
それが嫌だったので、なるべくChatGPTの画面をそのまま使い、裏側のAPI連携だけで済ませたかった。

この方針自体は、今でも悪くないと思っています。

ただ、別の問題が見えてきました。

Google Booksの情報だけでは、本の雰囲気がわからない

Google Books APIからは、タイトル、著者、出版社、出版年、ISBN、説明文、カテゴリ、書影などが返ってきます。

存在確認には十分便利です。

でも、実際に見てみると、descriptionがかなり簡潔なことが多い。
本によっては説明文がほとんどなかったり、判断材料として弱かったりする。

ここで気づきました。

自分が探したいのは、単に「自然」という単語が含まれる本ではありませんでした。

探したかったのは、

  • 自然の描写が美しい

  • 絵に余白がある

  • 静かな読後感がある

  • 寝る前に読めそう

  • 怖がりな子でも大丈夫

  • 親が読んでもしみじみする

といった、本の雰囲気そのものです。

でも、そういう情報は、普通の書誌データにはあまり入っていません。

「自然が美しい絵本」を探すには、タイトルや短い説明文だけでは足りない。
絵を見たり、本文のリズムを読んだり、読後感を知ったりする必要があります。

つまり、AIはその絵本を読んでいなかった。

AI司書に必要なのは、会話力だけではなかった

LLMは、ユーザーの意図を把握するのは得意です。

「自然が美しい絵本」と言われたときに、それが単なる自然科学の本ではなく、情緒や絵の雰囲気を求めているのだろう、と推測することはできます。

でも、問題はその次です。

その意図に合う本を選ぶには、各本についての詳しい情報が必要です。

たとえば、1冊ごとにこんなメタデータがあれば、検索はかなりしやすくなります。

{
  "themes": ["自然", "森", "季節", "親子"],
  "visual_mood": ["静か", "やわらかい", "余白が多い"],
  "story_mood": ["穏やか", "安心感", "少し切ない"],
  "age_range": "3-5歳",
  "text_amount": "少なめ",
  "scary_level": 1,
  "bedtime_score": 5,
  "nature_score": 5
}

こういう情報があれば、

「自然が美しくて、寝る前に読める静かな絵本」

という検索にもかなり答えやすくなります。

でも、現実には、多くの本についてこのような詳細データはありません。

Google Booksのような書誌APIは、本が実在するかを確認するには便利です。
ただし、「その本がどんな読後感を持っているか」「絵がどんな雰囲気か」「怖がりな3歳に合うか」までは、十分にはわかりません。

本当に必要だったもの

今回考えてみて、AI司書に必要なのは、LLMそのものというより、各本についての詳細な意味データベースなのだと思いました。

たとえば、

  • 書誌情報

  • 公式紹介文

  • 表紙画像

  • 本文の一部

  • 読書メモ

  • レビュー

  • 対象年齢

  • 怖さ

  • 静けさ

  • 文章量

  • 絵の雰囲気

  • 読み聞かせしやすさ

こうした情報を本ごとに持っていて、それを検索できる状態にする。

そのうえでLLMが、

「この人は、自然科学の本ではなく、静かで美しい絵本を探しているのだな」

と意図を解釈し、データベースから合いそうな本を探す。

この形なら、かなり理想に近づきそうです。

逆に言うと、LLMだけでAI司書を作ろうとすると、どうしても限界があります。
LLMは会話がうまい。
でも、その本を実際に知っているわけではない。

いったん諦めた

というわけで、今回のAI司書づくりはいったん保留にしました。

理由はシンプルで、各本の詳細データが足りないからです。

最初は、Custom GPTとGoogle Books APIをつなげれば、そこそこ良いものができるのではないかと思っていました。

でも、実際には、

「存在する本だけを出す」

ところまではできても、

「その人の曖昧な感覚に合った本を選ぶ」

ところには、もう一段深いデータが必要でした。

特に絵本は、本文だけでなく、絵、余白、色、ページをめくるリズム、親子で読んだときの空気感まで含めて体験ができています。

その情報なしに、「自然が美しい絵本」を選ぶのは難しい。

でも方向性は見えた

ただ、諦めたと言っても、完全に無理だと思ったわけではありません。

むしろ、方向性は少し見えました。

AI司書を作るなら、いきなり巨大な検索サービスを作るより、まずは小さくて濃い絵本データベースを作るのがよさそうです。

たとえば、自分が読んだ絵本を100冊、300冊と登録していく。

そのたびに、

  • どんなテーマか

  • どんな絵か

  • 何歳くらいに合いそうか

  • 怖さはどのくらいか

  • 寝る前に向いているか

  • 親が読んでどう感じるか

をメモしていく。

そこにLLMを使ってタグを付ける。
検索するときには、ユーザーの曖昧な希望をLLMが解釈し、そのタグ付きデータベースから候補を探す。

それなら、Google Booksの短いdescriptionだけに頼るより、ずっと良い選書ができるかもしれません。

結論

今回わかったのは、AI司書の難しさは、AIの会話力ではなく、本のデータの薄さにある、ということでした。

LLMは、こちらの意図をかなり上手に汲み取ってくれます。
でも、その意図に合う本を選ぶには、その本について深く知っている必要があります。

本を読んでいないAIに、本当の意味で本を選ばせるのは難しい。

だから、AI司書を作るなら、まず必要なのは「賢いチャット画面」ではなく、「本ごとの豊かな記憶」なのかもしれません。

今回はいったん諦めました。
でも、もし次にやるなら、AI司書を作るのではなく、まずはAIが読める絵本メモ帳を作るところから始めたいと思います。

いいなと思ったら応援しよう!