omusubi techblog

This website is my technical memo (Mobile/Wireless)

3GPP会合寄書を一挙に要約してくれるGPTsを作った


はじめに

以前、下記記事でChatGPTを用いた3GPP仕様書の解説をお試ししました。

ChatGPTに3GPP仕様を解説してもらった - omusubi techblog

その後のVerUPにより、GPTsという自分好みにカスタマイズ可能な機能が追加され、回答のベースとなる資料のアップロード(但し、数や容量に制約あり)や、回答方法を予め設定可能となりました。今回の記事では、GPTsを使って、3GPP会合の膨大な量の寄書を一挙に要約させる試みについて紹介します。

 

ちなみに、今回作成した下記GPTsは公開しています(ChatGPTplusで利用可能です)

実現したいこと

何度か紹介したことがありますが、3GPP会合の寄書は一般公開されていて、誰でも読むことができます。例えば、RAN2#124会合の寄書は下記からDLできます。

https://www.3gpp.org/ftp/tsg_ran/WG2_RL2/TSGR2_124/Docs

ご覧の通り、採番されたzipファイルが数百個格納されています。これらを一つ一つDLして、展開して、内容を確認していく作業は想像するだけでも嫌になりそうです。

ということで、これらの手間を省けるだけ省き、下記のような要約した表をGPTに作ってもらう、というのが今回実現したいことになります。

こんな感じの表を簡単に出力したい
準備(寄書ファイル取得)

当初、ChatGPT経由で寄書一覧のWebサイトからファイルをDL→展開→要約を試みていたのですが、そこまでは対応できませんでした。

従って、正攻法のftpで寄書は取得しました(数が少なければhttpサイト経由でも良いですが、DLに失敗することも多いので、ftpで一挙に取得する方がおすすめです)

 

ftpで寄書をDLする(Windowsの場合)

RAN2だとここから取得する

zipのままChatGPTにアップロードしても対応可能ですが、処理時間がやや増えるのと、中に複数ファイルが含まれている場合にやや煩雑になりがちなので、できれば全て展開して1フォルダに入れておくのがおすすめです。

ちなみに、DLした大量のZipファイルを一つのフォルダに全て展開するのも、今回はChatGPTにpythonのコードを書いてもらい、こちらを利用しました。

import os
import zipfile
def extract_zip_files(zip_folder, destination_folder):
    # ディレクトリが存在しない場合は作成する
    if not os.path.exists(destination_folder):
        os.makedirs(destination_folder)
    # ZIPファイルの一覧を取得する
    zip_files = [f for f in os.listdir(zip_folder) if f.endswith('.zip')]
    # 各ZIPファイルを展開して目的のフォルダにコピーする
    for zip_file in zip_files:
        with zipfile.ZipFile(os.path.join(zip_folder, zip_file), 'r') as zip_ref:
            zip_ref.extractall(destination_folder)
            print(f"{zip_file} を展開しました。")
if __name__ == "__main__":
    # 展開元のZIPファイルがあるフォルダ
    zip_folder ="DLしたfilepathを書く"
    # 中身を格納するフォルダ
    destination_folder ="展開先のfilepathを書く"
    extract_zip_files(zip_folder, destination_folder)

実際に使ってみる

現状のChatGPTは、一度にアップロード可能なファイル数に制限があり、かつ一挙に大量にアップロードすると、途中で生成がストップする可能性があるので、Tdoc一覧のエクセルから、興味のあるWIなどを抽出したうえで、1プロンプトにつき4~5ファイル位がおすすめです。

この辺のサマリを手間かけず知りたい

今回は上記4つの寄書で試してみます。雑に放り込んでEnterでOKです。

雑に放り込んでEnter

解析が無事終わり、「このまま表形式にして」、と指示しても上手く過去の自身の出力をバッファに格納できていないのか、上手くいきません。したがって、いったん今回の出力をコピーします。出力結果は左下のコピーボタンを押下すると、クリップボードにコピーされます。

ポチっとコピー

各ファイルの要約は'---'で区切って出力されていて、冒頭にファイル名、本文タイトル、作者名を付与するようにしています。あとはこの出力を煮るなり焼くなりお好きな形に成型していただければ要約表の完成です。

コツとしては、「表形式にして」等のザックリとした指示だと、勝手に省略したり、一部分しか実行しなかったりと、なかなか痒いところに手が届かないので、具体的に指示する必要があります。ChatGPTの性質上、実施するたびに若干異なる出力になるので、一概には言えませんが、下記のようにすると上手くいくかもしれません。

(これも勝手に省略される場合があるので、何度か再生成してみると良いです)

以下の文章をCSSとHTMLを用いて体裁を整えて、表形式にして下さい。 列の項目は、ファイル名、本文タイトル、作成者、内容の4つです。 行の区切りは'---'です。内容は省略せずコピーペーストしてください。すべての文章に適用し、ひとつの表にしてください。

(以下要約出力をコピペして実行)

いい感じの粒度の要約表ができた

要約自体の出力粒度はあまりぶれませんが、表形式にしたり、見栄えを整えようとすると、プロンプトや生成毎にブレがあるのでやや注意です。ぜひ色々とお試ししてみてください。

オマケ

ChatGPTではBingを用いたWebBrowingが標準機能としてありますが、ある特定のWebサイトを指定してナレッジとして用いることはできませんでした。

それを解決する手段として、gpt-crawlerが登場しました。

GitHub - BuilderIO/gpt-crawler: Crawl a site to generate knowledge files to create your own custom GPT from a URL

これは、特定のサイトをクローリングして、jsonファイルとして出力してくれるもので、これをGPTsに読み込ませることで、回答のベースにすることができます。
冒頭の下記は、4G/5G解説で有名なSharetechnoteサイトの記事をナレッジとして読み込ませたGPTsになります。したがって、かなりニッチな質問にも回答してもらえます。

ChatGPT - Mobile Expert