見出し画像

PDFをMarkdownにしてからNotebookLMに読んでもらったら想像より良かった

NotebookLMに自炊したPDFを読んでもらいたかったのですが、イマイチ回答精度が低く使い物にならず。試しにMarkdown(マークダウン)にしてから読んでもらったら良い感じに使えるようになりました。
※自炊したPDFを利用しているので以降の作業は個人の環境で行っています。



OCRなしのPDFは読み込み精度が低い

GoogleのNotebookLMに自炊したPDF(OCRなし)を読み込ませていろいろ質問してみたのですが、それっぽい事を言いつつも提示されたソースに話している内容が含まれておらず、回答精度にイマイチ納得がいきませんでした。

そこで、PDFをAIが理解しやすいとされるMarkdownにしてからNotebookLMに読み込ませてみることにしました。


Document intelligenceでPDFを読み込む

PDFをMarkdownにするためにAzureのAIサービス「Document intelligence」を利用します。


初期設定

まずリソースを作成します。下記料金ページを見ると無料プランでも500ページまで取り込めると書いてあるのですが、無料の場合は1つのドキュメントにつき2ページまでしか読んでくれないので、S0でリソースを作成します。

また、今回はMarkdownにして出力したいという要件があるので、プレビューバージョンが利用できるリージョン(East US、West US2、West Europe、North Central USのいずれか)を選択します。

リソースが作成されたら、「Go to Document Intelligence Studio」からDocument Intelligence Studioに進み、次の画面で「Layout」を選択します。


初回アクセス時にMicrosoftアカウントでのログインを要求され、サービスリソースの構成を求めるウィンドウが表示されるので、先ほど作成したリソースを選択します。


Document Intelligence Studioの画面が表示されたらバージョンを確認します。初期設定だと最新のプレビュー版である2024-7-31(Preview)になっていました。

「Analyze options」からオプションの設定を行います。Markdownで出力したいので、「Output format style」を「Markdown」にしておきます。

また、200ページほどの文書を取り込ませる想定ですが、意図しないところで課金が発生してコストが跳ね上がるなんてことがあったら困るので、最初は読み込むページの範囲を20ページ程度に指定しておきます。


PDFを読み込む

オプション設定が済んだらPDFをアップロードし、「Run analysis」を押すとMarkdownへの変換が始まります。23ページが20秒位で読み込み終わったので、1ページ1秒ほどで読んでしまうようです。早いですね。

画像はモザイク全開ですが、GUIで眺める限り結果はかなり良好。ざっと見る限りは誤字等なく読み込めていました。


ただ、Markdownの結果を出力したいと思ったのですが、出力項目がありません。「Result」タブを見るとJSONのダウンロードは可能だったのですが、これは解析情報で欲しいものではありませんでした(26万行に及ぶJSONでした)。

GUIからでは結果をMarkdown形式でダウンロードできなさそうなので、API経由で処理することにします。


Pythonで処理する

本来であれば、BLOBストレージにアップロード→OCR→Markdownとして出力→AIのRAGで利用する、までをワンストップで行う使い方が想定されますが、現時点ではそこまでやらないのでGoogle Colabを利用してPythonでコードを書いて出力を確認してみることにします。


サンプルでMarkdownの出力を試す

下記のサンプルコードを試します。

Google Colabを開いたらサンプルコードをコピペします。追加で、pipでライブラリをインストールするために、先頭に下記コードを貼り付けておきます。

!pip install python-dotenv
!pip install azure-ai-documentintelligence

コピペしたコード内に下記エンドポイントとキーを入れる変数が用意されているので、それぞれ自環境のものを入力しておきます。

endpoint = os.environ["DOCUMENTINTELLIGENCE_ENDPOINT"]
key = os.environ["DOCUMENTINTELLIGENCE_API_KEY"]

また、サンプルコードで参照されているPDFがシンプル過ぎるので、サンプルのURLを下記の別のサンプルに変更して出力して実行します。

https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf

Here's the full content in format markdown:

# UNITED STATES SECURITIES AND EXCHANGE COMMISSION Washington, D.C. 20549

## FORM 10-Q

☐
☒
☒
QUARTERLY REPORT PURSUANT TO SECTION 13 OR 15(d) OF THE SECURITIES EXCHANGE ACT OF
1934
For the Quarterly Period Ended March 31, 2020
ORTRANSITION REPORT PURSUANT TO SECTION 13 OR 15(d) OF THE SECURITIES EXCHANGE ACT OF
1934
For the Transition Period From
to

Commission File Number 001-37845

## MICROSOFT CORPORATION

WASHINGTON
(STATE OF INCORPORATION)
ONE MICROSOFT WAY, REDMOND, WASHINGTON 98052-6399
(425) 882-8080
www.microsoft.com/investor

91-1144442
(I.R.S. ID)

Securities registered pursuant to Section 12(b) of the Act:

<table>
<tr>
<th>Title of each class</th>
<th>Trading Symbol</th>
<th>Name of exchange on which registered</th>
</tr>
<tr>
<td>Common stock, $0.00000625 par value per share</td>
<td>MSFT</td>
<td>NASDAQ</td>
</tr>
<tr>
<td>2.125% Notes due 2021</td>
<td>MSFT</td>
<td>NASDAQ</td>
</tr>
<tr>
<td>3.125% Notes due 2028</td>
<td>MSFT</td>
<td>NASDAQ</td>
</tr>
<tr>
<td>2.625% Notes due 2033</td>
<td>MSFT</td>
<td>NASDAQ</td>
</tr>
</table>

Securities registered pursuant to Section 12(g) of the Act:
NONE

Indicate by check mark whether the registrant (1) has filed all reports required to be filed by Section 13 or 15(d) of the Securities Exchange
Act of 1934 during the preceding 12 months (or for such shorter period that the registrant was required to file such reports), and (2) has
been subject to such filing requirements for the past 90 days. YesNoIndicate by check mark whether the registrant has submitted electronically every Interactive Data File required to be submitted pursuant to Rule
405 of Regulation S-T (§232.405 of this chapter) during the preceding 12 months (or for such shorter period that the registrant was required to
submit such files).
☒
YesNo

Indicate by check mark whether the registrant is a large accelerated filer, an accelerated filer, a non-accelerated filer, a smaller reporting
company, or an emerging growth company. See the definitions of "large accelerated filer," "accelerated filer," "smaller reporting company,"
and "emerging growth company" in Rule 12b-2 of the Exchange Act.

☒
Large accelerated filer
Non-accelerated filer
☐

☐
Accelerated filer
Smaller reporting company
Emerging growth company
☐

☐

If an emerging growth company, indicate by check mark if the registrant has elected not to use the extended transition period for complying
with any new or revised financial accounting standards provided pursuant to Section 13(a) of the Exchange Act.
☐

Indicate by check mark whether the registrant is a shell company (as defined in Rule 12b-2 of the Exchange Act). YesNoIndicate the number of shares outstanding of each of the issuer's classes of common stock, as of the latest practicable date.

<table>
<tr>
<th>Class</th>
<th>Outstanding as of April 24, 2020</th>
</tr>
<tr>
<td>Common Stock, $0.00000625 par value per share</td>
<td>7,583,440,247 shares</td>
</tr>
</table>

Markdownの結果が出力できました。ちなみに、一部HTMLが含まれていますが、2024-07-31-preview以降はテーブルがHTMLで表現される仕様になっているようです。


実際に取り込みたいPDFを処理する

次は実際に取り込みたいPDFを参照して実行します。一旦十数ページ程度のデータで試します。API経由だとページ範囲を指定して処理ができない様子なので、一部だけを処理したい場合は予め分割しておきます。

BLOBストレージにPDFをアップロードし、SASのURLを取得してソースに貼り付けてAPIを実行します。すると下記のような形で出力されました。
※文言は全部hogeに変換しています。

<!-- PageHeader="12、 hogehoge" -->

# 3.1 hogehoge

hogehogehogehoge〜

# ■用語 【hogehoge】

hogehogehogehoge〜

12\\) hogehogehogehoge〜

<!-- PageNumber="9" -->
<!-- PageBreak -->

<!-- PageHeader="hogehogeとは" -->

<figure>
<figcaption>図表 1.1 hogehogeの種類</figcaption>

hogehogeの対象
hogehogeなど

</figure>

## 3.4 hogehoge

hogehoge〜

## ■用語【hogehoge】

hogehoge〜

<!-- PageNumber="10" -->

出力を見た感じだと、ページの区切りや図に関しては下記のように処理されるようです。

  • <!-- PageHeader="*****" -->:ヘッダの文言が入る

  • <!-- PageNumber="*****" -→:ページ数が入る

  • <!-- PageBreak -->:ページの区切りの部分に入る

  • <figure>:図のタイトル

  • <figcaption>:図中に書かれている文章


読み取り精度は十分で問題ありません。ただ、ページ下部にコラム等が入るタイプの書籍だと、文の途中で急に違う話が入る形のテキストが出力されてしまうので、最終的にAIに内容を解釈させた場合に認識の齟齬が出てくるかもしれません。

APIを利用した場合、230PほどのPDFを1分くらいで処理してくれました。うっかりMarkdownファイルで出力する処理を実装しそこねて結果が全部コンソールに出てしまったので(Pythonで書いた意味無し)、Google ColabのログからGoogleドキュメントにコピペして、GoogleドキュメントからMarkdownでエクスポートしたのはナイショです。


NotebookLMに読んでもらう

出来上がったMarkdownをNotebookLMに読んでもらったところ、同じプロンプトでもOCRなしのPDFとMarkdownでは出てくる情報の精度が雲泥の差でした。

Markdown作成のために若干のコストはかかりますが、結果を考慮すると十分に処理した価値があったと思います。OCRありのPDFなら元からうまく読んでくれるのかもしれませんが・・・。

これで既読の本の要約などしてもらえば、読み直さなくても振り返りしやすくなりそうです。


コストについて

PDF→Markdownの処理のコストを確認してみると、23ページで35円かかっていたので、公式の価格通り1ページあたり1.5円程度かかるようです。それ以外の想定外のコストは見受けられませんでした。

ちなみに、リソースの「概要」 > 「Monitoring」でどれくらいのページを処理したか確認可能です。


比較的コストも安価、かつ簡単で高速に処理してくれるので、PDFをMarkdownをにする方法としてDocument intelligenceはおすすめできそうです。

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