7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ChatGPT と Google Books APIs で書籍検索レコメンドアプリを作ってみた

Posted at

前に作ったテンプレートアプリをベースに、ChatGPT と Google Books APIs を組み合わせて、読みたい内容を伝えたら本の一覧とそれに対するコメントが出てくるサイトを作ってみました。

「色々な遭難事故の本を読みたい」みたいに入力したら、該当する一覧と、最後にどうおススメなのかが返ってくる Web アプリです。(下の画像)
image.png

やっていることは下図の形です。ユーザの読みたいという思いを、ChatGPT と Google Books APIs という AI たちが解決してくれる感じです。(検索を広義の AI ととらえれば…)

image.png

検索クエリの生成

システム連携するために ChatGPT への入力は自然言語、出力はクエリ配列というプロンプトを実装します。ポイントとしては、出力フォーマットの指定と、出力例をいれていることです。

このプロンプトを用いた ChatGPT の回答を、JSON.parse(answer)することで、javascript の配列を取得します。

検索クエリ生成のためのプロンプト
あなたは本の検索クエリ作成マシーンです。
ユーザからのリクエストに対して、その内容が含まれていそうな本のタイトルに含まれていそうな単語を2個から5個、
以下のフォーマットに従って回答してください。なお、順序は関連度順です。

出力フォーマット)
["単語1","単語2","単語3","単語4","単語5"]

例えば、
ユーザ)エベレストで遭難する話
あなた)["エベレスト","遭難","登山"]

本の検索

ここは Google Books APIs をつかって書籍のデータをとってくる実装をしました。
公式のパラメータ を参考に、以下のようなURLを生成しました。
大量にとれても処理が大変なので、5件取得。日本語の書籍に限定。という感じです。

Google Books APIs への GET URL
    const googlebooksapi_URL = "https://www.googleapis.com/books/v1/volumes?q=" 
    + {上述の検索クエリ配列を"+"でつないだ文字列}
    + "&maxResults=5&printType=books&langRestrict=ja"

また本の注釈がないものや、短いものは除外しつつ、必要な情報だけを以下のように取得します。

  let items = searchResult.data.items.map((item) => {

    //注釈が無い場合、また注釈が10文字未満の場合は除外する。
    if(item.volumeInfo.description && item.volumeInfo.description.length > 10){
      return {
        title: item.volumeInfo.title,
        authors: item.volumeInfo.authors,
        description: item.volumeInfo.description,
        image: item.volumeInfo.imageLinks?.thumbnail,
        link: item.volumeInfo.infoLink,
      };
    }
  });

コメント生成

取得した本のリストを入れて、その中から当初の要望とマッチしているものをリコメンドするコメントを生成させます。

ポイントとしては、ユーザからの当初の入力を動的に入れ込んでいることと、入力フォーマットの例示をしていること、ならびにこの検索結果リスト以外の情報をつかってはならない、という指定をしていることです。

コメント生成するプロンプト
const book_master = `あなたは本のコンシェルジュです。
ユーザからは「${user_request}」という内容の本を読みたいと要望をうけていました。
その上で、ユーザから以下のフォーマットで書籍の検索結果データを受け取ります。

### 検索結果フォーマット
[{title: "本1のタイトル", authors: ["著者1", "著者2"], description: "本1の説明"}, {title: "本2のタイトル", authors: ["著者1", "著者2"], description: "本2の説明"}, ..., {title: "本Nのタイトル", authors: ["著者1", "著者2"], description: "本Nの説明"}]

それぞれの本がユーザの要望とどうマッチしているのか、descriptionの内容をまとめて、ユーザが読みたくなるような推薦文書を書いてください。
**検索結果フォーマットのデータ以外の情報は使用してはなりません。**
`

まとめ

再度「世界旅行しながら色々な人と交流していく物語」を聞いてみました。
なんか、とても面白そうな本を紹介してくれますね。

image.png

サービスとしても中々面白くできましたし、ChatGPT と外部のAPI(今回はGoogle Books APIs)を組み合わせたアプリの実現もできたので、ひとまず大満足です。

一方でさらなる実装としては、

  1. リコメンドに対して、さらに深堀る質問を重ねたい
  2. プロンプトインジェクション対策

あたりでしょうか。いずれも入力のカテゴライズをする何らかの処理を加えないといけないところですが、ここは ChatGPT よりも 旧LUIS などの自然言語処理サービスの方が安定性やコストの観点でも向いているかもなと思います。

プラグインも気になるところですが、ひとまずテンプレート Web アプリを拡張して実際に使えそうなものを作ってみたので、今回の記事は以上となります。

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?