📖

技術メモPDFから学習させるGPTの作り方

2024/02/06に公開

目的

去年の11月頃にOpenAIからカスタマイズ可能なChatGPTである,「GPTs」が発表された.特定の処理だけをさせるものを作ることができる.これはChatGPT Plusユーザーなら無料で作成・使用が出来る.
また何か開発する際などには技術的メモを残すものだが,それを時間が経って見返すときになかなか見つからないときがある.
そこで今回は今までWeb上にメモしたドキュメントをPDF化してそれをGPTに学習させることで,対話形式で技術的メモを引き出せるようにする.
ちなみにデータサイズが小さいという理由で,一度htmlファイルを学習させたがhtmlのコードが多く学習されたため,GPTが英語で話すようになり,まともに学習させた知識を引き出せなかったのでPDFを学習させることにした.

この記事を読む前の注意

この記事は正直あまり多くの人の参考になるものではないかもしれない.というのも主にスクレイピングを用いたドキュメントのPDF化に焦点を当てていて,今回のスクレイピングコードは汎用性の高いものではないからである.
もしGPTsの作り方だけを知りたい方は,途中は飛ばしてもらって構わない.なんなら私が参考にした「【決定版】GPTs開発の教科書」を見ていただく方がいいと思う.

PDF化の手順

スクレイピングによるWebページのPDF化

今回はPythonのSeleniumによるスクレイピングを行う.流れとしてはPDF化したいサイトにアクセスし,jsを用いてそのサイトをPDFとして印刷する.
また先ほども記述したが,スクレイピングコードは汎用性が低いので,使えそうなところだけ記述する.個人用全コード「WebGet.py

WebGet.py
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import time
import urllib.request
import os
import json

# 印刷用の設定----------------------------------------------
appState = {
    "recentDestinations": [
        {
            "id": "Save as PDF",
            "origin": "local",
            "account": ""
        }
    ],
    "selectedDestinationId": "Save as PDF",
    "version": 2
}

profile = {'printing.print_preview_sticky_settings.appState': json.dumps(appState),
           'savefile.default_directory': '~/Downloads/'} # ここでデフォルトの保存先を設定

options = webdriver.ChromeOptions()
options.add_experimental_option('prefs', profile)
options.add_argument('--kiosk-printing')  # 印刷用のプロンプトが表示された時、自動的に印刷ボタンが押される
#options.add_argument('--headless')#ヘッドレスモード,オンにしてもよい

#URLにアクセスして,PDFとして保存する---------------------------
url_list = ["https://www.google.co.jp/", "https://www.yahoo.co.jp/", ......]#PDF化したいURLリスト
for i in range(len(url_list)):
    url = last_url_list[i]# 対象となるURL
    driver.get(url)#アクセス
    time.sleep(1)
    driver.execute_script('window.print();')  # javascriptを実行して印刷用のプロンプトを表示
    time.sleep(9)#ここを長くしないと,巨大なpdfは印刷されないことになってしまう
    
print("書き込みが完了しました")

参考:SeleniumでWebサイトをPDFとして保存するとき、デフォルトの保存先を変更する方法(chromedirver)(Python)

PDFの連結

GPTsは20個しかファイルをアップロードできないので,膨大な数のPDFがある場合は連結させて学習させる方が良い(連結させても問題なく知識を引き出せた).しかしGPTsは500MB以上のファイルはアップロードできないので注意が必要である.PDFの連結にもPythonを使って行う.このコードは「Python, pypdfでPDFを結合・分割(ファイル全体・個別ページ)」を参考にさせていただいた.

ConnectionPDF.py
import pypdf
import glob
import os

def merge_pdf_in_dir(dir_path, dst_path):
    l = glob.glob(os.path.join(dir_path, '*.pdf'))
    l.sort()

    merger = pypdf.PdfWriter()
    for p in l:
        if not pypdf.PdfReader(p).is_encrypted:
            merger.append(p)

    merger.write(dst_path)
    merger.close()

merge_pdf_in_dir('./pdf', './sample_merge.pdf')

参考:Python, pypdfでPDFを結合・分割(ファイル全体・個別ページ)

GPTsの学習手順

PDFが準備できたのでいよいよ学習させていく.「GPTを探索する」をクリックして,「+GPTを作成する」をクリックする.

すると以下のような画像の画面になる.左の画面で作りたいGPTの内容を送る.最初は左の画面のGPTと対話する形で作りたいGPTの内容を伝えていく.ある程度伝えたらPDFをアップロードする.この時なぜかPDFのアップロードに失敗するときがある.ファイルサイズが問題なわけではないことがわかっているが,原因の特定には至っていない.時間帯によるものかもしれないしネットの調子によるものかもしれない.うまくいかないときは時間帯を変えてやってみるとよい.全てアップロードできたら完成である.ここで左のGPTに「質問された時,必ずアップロードしたPDFから情報を検索するようにしてください」と命令を出しておくとPDFから情報を引き出しやすくなる.

Discussion