どこにでもいるSEの備忘録

たぶん動くと思うからリリースしようぜ

"ローカルで"LLM sherpaを使ったPDFの視覚的構造解析をする

この前こんなんをやってました。

www.nogawanogawa.work

この中でLLM sherpaを使用していましたが、こちらのgithubをよく読んでみると解析部分もOSSになってることが分かりました。 つまり、視覚的構造解析が完全にローカル環境で実装できるということになります。

せっかくやりかけたので、ローカル環境でやってみたので今回はそのメモです。

LLM Sherpa

改めてLLM Sherpaについて紹介です。

RAGにおいて、PDFを始めとする文書ファイルを使用する際にはある程度トークン数が長いことがあります。 これをチャンク分割する際にはなるべく意味的なつながりを保ったまま分割することでLLMがコンテキストを認識しやすくなり、タスクの精度が高くなるメリットがあります。

PDFなどは人間から見えている文の構造と、内部で保存しているテキスト情報の構造が一致しているとは限らず、内部構造のテキストをそのまま抽出すると、人間が表現した文の構造とは異なるものになっていることがあります。 このような状況では、人間が自然に理解するように文構造を適宜解釈しつつ文を抽出することが望ましいと考えられます。

そういった目的で使用されるツールがLLM Sherpaです。

www.llamaindex.ai

Introducing LayoutPDFReader for “Context-aware” chunking. LayoutPDFReader can act as the most important tool in your RAG arsenal by parsing PDFs along with hierarchical layout information such as:

  1. Identifying sections and subsections, along with their respective hierarchy levels.
  2. Merging lines into coherent paragraphs.
  3. Establishing connections between sections and paragraphs.
  4. Recognizing tables and associating them with their corresponding sections.
  5. Handling lists and nested list structures with precision.

LLM sherpaを使用するとPDFファイルのセクション構造・階層を考慮してチャンク分割を行なってくれます。

github.com

裏側:nlm-ingestor

READMEをよく読んでみると、LLM Sherpaの裏側はこちらになってました。

github.com

nlm-ingestorでは、ルールベースで取得した座標付きテキストデータとグラフィック・フォントデータを用いたOCRを組み合わせて解析を行います。

また、ここではPDFの分割を対象に取り上げていますが、PDF以外の形式であっても使用できるようです。(参考)

完全ローカル環境で使ってみる

nlm-ingestorはDocker Imageも公開されており、これを呼び出すことでLLM Sherpaの裏側の実装はローカルでも実装することが可能になります。 今回は、完全にローカル環境にDockerコンテナを作ってそのうえでLLM Sherpaを使用してみます。

jupyter notebookの環境とつなげるようにしたdocker-compose.yamlはこんな感じでしょうか。

version: '3.8'
name: llmsherpa

services:
  llmsherpa:
    image: "ghcr.io/nlmatics/nlm-ingestor:latest"
  jupyter-lab:
    image: gcr.io/kaggle-images/python
    command: jupyter lab --no-browser --ip="0.0.0.0" --notebook-dir=/tmp/working --allow-root
    volumes:
      - .:/tmp/working
    ports:
      - "8888:8888"
    working_dir: /tmp/working
    environment:
      - JUPYTER_ENABLE_LAB=yes
    restart: unless-stopped

これで準備完了です、あとは使ってみます。 使ってみるとこんな感じでchunk分割されました。

chunk分割されたテキストは下から2つ目のセルになります。

chunk分割の質はともかく、視覚的構造解析をローカルで動かせることはわかりました。 精度が悪ければ、nlm-ingestorの精度を改善させれば良いので、更に突っ込んだことをしていく感じになりそうですね。

感想

以上、前回ちょっと嘘書いてしまったので、LLM Sherpaに関してちゃんとローカルで動かしてみた記事です。

それ以上でもそれ以下でもありませんが、まあ便利に使えるんじゃないでしょうか。