書籍抽出作業をChatGPTにお願いしたら完全に人間で驚いた。【Penmark教科書ができるまで】
はじめまして。Penmarkの河村です。
Penmarkでは大学生向けの時間割アプリを開発していますが、履修している授業に必要な教科書を簡単に購入できる「Penmark教科書」をリリースしました。
このサービスを立ち上げる際に、教授がフリーフォーマットで記述した文章から、書籍を特定しなければならないという難題が存在したのですが、ChatGPTにお願いしたら人間並みの脅威の解釈力で解決してくれました。
この記事では、OpenAIのChatGPTを用いて、膨大な非構造化情報から書籍の構造データを抽出する作業をシステム化した事例を紹介します。
1.Penmark教科書サービスで発生した課題
まず、Penmark教科書で実現したかった機能を説明し、そのために考えた方法とぶつかった課題についてご説明します。
1.1. 背景-「Penmark教科書」とは
Penmarkでは大学生が利用する時間割アプリを開発しています。時間割登録の手間を削減するため、大学が公開しているWebシラバスの情報を取り込んでおり、ワンタップで授業名、曜日時限、教師名、クラスなどを取り込めます。
この機能に加え、履修している授業に必要な教科書を簡単に購入できる「Penmark教科書」というサービスをローンチしました。履修している授業に必要な書籍がリストアップされ、ワンタップで購入サイトに飛ぶことが可能になります。
1.2. 書籍を特定するために考えた方法
このサービスを開始するためには「授業に必要な教科書を特定すること」が必要になります。インプットとして利用可能なのは、Webシラバスに記載されている教科書情報です。例えばこのような情報が記載されています。
このような情報をもとに、書籍を特定する。具体的にはISBNコードを特定する必要がありました。
書籍を特定する方法として、まず、国内のあらゆる書籍を格納した書籍DBを構築しました。このDBのなかから書籍を検索すればOKなのですが、教授が書いた教科書情報は、フリーフォーマットで書かれています。なので、タイトル、出版社、著者など、何がどういう順番で書かれているかは、教授次第という状況です。
そのような状況の中、まず考えた方法は、全文検索エンジンを用いて教科書情報全文をまるっと検索条件として検索する方法です。イメージとしては、Google検索で試してみるとわかりやすいのですが、「麻生良文『マクロ経済学入門』ミネルヴァ書房,2009年」という検索キーワードでGoogle検索をすると、この書籍がトップに引っかかってきます。
この方式はかなり高い精度で拾い上げてくれるのですが、実際に色々試したところ2つの問題がありました。
複数の書籍情報が含まれている文章の場合に極端に精度が落ちる。
一冊も書籍情報が含まれていない場合にも書籍を抽出してしまう。
複数の書籍情報が含まれている場合というのは、例えば本AとBの2冊が含まれている文章をそのまま入力して検索するとします。もし、書籍Aの出版社が書籍Bと同じタイトルの書籍を出版していたりするとその書籍もかなりの高スコアで引っかかってしまいます。複数の書籍をまぜこぜにすると、全く関係ない別の書籍が引っかかってしまうことがあり、これを除外することがとても難しいです。
一冊も書籍情報が含まれていない場合というのは、例えば「教科書は初回授業で提示します」のような、文章の場合です。検索エンジンは少しでも合致するとヒットすると判定してしまうので、非常に遠い書籍を抽出してしまいます。先程の文章をGoogle検索すると「本当は使える算数教科書」という書籍が引っかかってしまいます。
いずれも、このままだと買う必要のない書籍を売りつけてしまう結果になるため、なんとしても解決しなければなりません。
1.3. 解決したい課題
今考えている全文検索を用いる方法は、検索条件に与える文章が一冊分の情報であればかなり有効に機能します。ですので、元の文章を書籍一冊ごとに分解できれば全文検索方式でうまくいきそうです。
ただ、教授が書く文章はタイトル、著者、出版社、年度、ISBNコードなどの様々な属性について、何をどの順番で書かれるかは人次第で全く固定されていません。このような文章を本1冊ごとに分解するプログラムを作成するのはかなり難しく、人が判断しない限り真っ当な品質は得られなさそう。と考えていました。ですので、この部分については、人海戦術で対応するしかなさそうです。対応大学が数百になると授業の数も百万件近くになりますので、これを人海戦術でやるのは大変だな….と考えていました。
2. ChatGPTを試してみる。
こういう自然文の解釈はChatGPTが得意なのではと思い、ちょっと試してみました。
課題1) 複数の書籍データが含まれている場合
すごいですね。3冊の情報を3行に分割して抽出してくれています。
また、「次の書籍を準備しておくこと」というような書籍情報がない部分はきれいに除外できています。
課題2) 書籍データが一冊も含まれていない場合
すごいですね。場合によっては、「-,-,-,-,-」のような空データを返してくれるときもありましたが、ない場合は書籍データは返さないのがすごいです。検索エンジンだとものすごく遠いものでもとにかく何か引っかかって来てしまうので。
この他にもフォーマットの並びが違うパターンなど色々試してみたのですが、ほぼ正確に分割してくれました。人名か出版社名かわかりにくい文字列が入っている場合など、人がやっても間違えそうなケースでは間違えていましたが、人が行うのと同等レベルの作業をやってくれそうです。
人手作業無しで行けると思った瞬間でした。
3. システム化した際の課題と解決策
以下は、実際にシステムに組み込んでみて、発生した課題と解決策です。
3.1. 課題:息を吐くように嘘をつく.
2.の「魔法少女まどか☆マギカ」はどっから出てきたのだろうか…
調べてみましたがこのような書籍は出版されておらず、完全に架空の書籍でした。
プロンプトに「入力文に含まれない文字列は返してはいけません」と念押ししてみたのですが、確率は減ったように思いましたが、それでもたまに発生しました。「嘘をつかれることはある。」という前提で対処を考えるしか無いかなと思います。
今回の処理は、元の文章からデータを抽出するという処理ですので、"抽出したデータの「書籍名」が元の文章に含まれるかを確認する”という「逆照合」を行って、合致しないものは除外するという処理を入れることで対処しました。
3.2. 課題:レスポンスフォーマットは結構崩れる.
プロンプトで「"連番,書籍名,著者名,出版社名,出版年度"というCSVフォーマットで抽出してください。」と明示していますが、幾つか項目が足りないケースは結構ありました。また、「『書籍名』となるように二重括弧で囲んで出力してください。」というフォーマット指定を行っていますが、二重括弧でく組まれてないケースは結構有りました。
書籍がない場合の返却も結構バラバラです。「書籍はありませんでした。」という文章で返却されることもあれば、「1,-,-,-,-,-」と中身がないCSVフォーマットで返却される場合もあります。
ChatGPTの場合、同じ質問をしても結果が異なる場合もありますので、正直なところ、どういうケースがあるか想定しきれないです。プロンプト自体の工夫も行いますが、100%解決することは難しく、「戻りのフォーマットが異なる場合はスキップする」という対応を行いました。
4. 「完全に人間で驚いた!」ChatGPTの解釈力の凄さがわかる実例紹介
システムに組み込んで、膨大な教科書データを処理させたのですが、その際に実際に行った処理結果をみて、完全に人間じゃないかと感心してしまった例がたくさんありましたので紹介します。
いずれも、ChatGPTへの依頼内容はこれまでのものと同じなので詳細なプロンプトは前述したものですが、ざっというと「入力文から、タイトル、著者、出版社、年度を書籍一冊が一行になるように抽出して」という依頼内容です。
4.1. 感心した点:「同」や「以上」を解釈して補完してくれた.
3行目に「同」という記載がありますが、これを前の行の著者と同じという意味だと解釈して補完してくれています。すごいですね。
「以上、東京大学出版会」という記述がありますが、それより前に書かれている2冊の書籍に係ると判断しています。すごいですね…
4.2. 感心した点:「上下巻」という記述を複数冊に分解してくれた.
「上下巻」「前後編」など、巻号情報をひとまとめにして一行に書くことってよくあると思うのですが、このような場合に2冊に分解してくれました。すごいですね……
4.3. すごくないですか?完全に人間で驚いた。
すごいですねばかり言ってますが、いずれも機械とは思えない人のような解釈ができるという事実にただただ驚きでした。こんな処理ができるプログラム、自分では絶対書けないです。すごくないですか?
「非構造化データから構造データを抽出する。」という作業は人が介さないとまともな品質は得られない。というのがこれまでの常識だったと思うのですが、ChatGPTによって大きく変わったと感じました。
従来であれば、人手作業が必ず必要となるレベルの作業だと思います。このタイミングでシステム的には待ち状態となり、人による作業データを受け取って後続処理を再開する。というシステムになるのが普通だと思いますが、ChatGPTのAPI呼び出しをシステムに組み込む事によって、人手処理なしの完全システム化が実現できました。
5. まとめ
いかがだったでしょうか。
Penmark教科書のサービス開始に当たり、本年度(2023)は269校について対応ができました。
Penmark教科書は、抽出した書籍を購入してもらうサービスなので、誤検知はできる限りしたくないです。なので、困ったときの対応は「疑わしい場合は抽出しない。」という方針にしています。この方針のため、「検出できなかった。」というケースは結構ありますが、誤検出はかなり低い確率に抑えられていると思います。
269校の合計授業数は約66万件で、そのうち約30万件の授業は一冊以上の書籍が抽出できたのですが、これらの処理を人による検証作業なしの完全にシステム化した形でデータ作成を行いました。
ChatGPTへのリクエスト数も相当な回数となり、全データが作成できるまでに1週間程度かかりましたが、人手を挟まないので、動かしたら待ってるだけです。
Penmark教科書は、すでにサービス提供を開始しています。実際にどんなデータになってるか確認してみたい人はぜひアプリを使ってみてください!Penmarkは学生向けサービスですが、授業登録と教科書機能は会員登録なしでも試せます。
Penmarkアプリをインストールして起動します。
「(サービス規約に)同意してはじめる」を選択後、適当な大学を選ぶと時間割画面が表示されます。
適当なコマをタップするか、右上の「+」ボタンを押すと、授業検索ができますので、適当な授業を登録してください。なお、授業の詳細情報に教科書情報が記載されてる授業でないと動作しないので念のため。
いくつか授業を登録した後に、画面下部にあるタブバーの「学割タブ」をタップします。画面上部に「すべて」「学割」「ストア」「教科書」というメニューがあるのでこの「教科書」をタップすると、冒頭で紹介したような教科書画面が表示されます。
授業名が網掛けになっている場合は、教科書がもともとないか抽出できなかったということです。
なお、4.の学割タブを表示したときに教科書メニューが表示されない場合は対応できていない大学です。ごめんなさい。
使い方はこちらのヘルプページを見てもらっても良いかもしれません。
一緒に働いてくれる人募集中!
株式会社ペンマークは『大学生活を、テクノロジーで変革する。』をテーマに、学生のプラットフォーム『Penmark』を主軸として複数の学生向けサービスを運営しているITスタートアップ企業です。
学生の属性・行動データを駆使して、学生の一生に関わるあらゆる領域に挑戦し、更なる事業展開を目指しています。
エンジニア積極採用中です!
急成長するプロダクトを一緒に開発して頂けるエンジニアを積極採用中です。ペンマークのエンジニアは様々なバックグラウンドを持った魅力的な仲間が多いのが特徴です。ペンマークに興味を持ってくださる方は、是非一度お話しましょう🔥
アプリのダウンロードはこちらから
アプリHP:https://penmark.jp
AppStore(iOS):https://bit.ly/3NrsKNN
GooglePlay(Android):https://bit.ly/3LrDQSq