【メモ】RAGシステムの救世主となるか?MarkItDownの可能性を探る

前回はDoclingというドキュメントコンバートツールを紹介しました。その後、他の変換ツールを探していた所、MicrosoftさんGitHubMarkItDownというツールがある事がわかりました。用途はDoclingと大きく変わりませんが、対応フォーマットが特殊ものもあり、こちらも見逃せないなということでメモを取っています。

MarkItDownは、様々なファイルをMarkdownに変換するユーティリティで、インデックス作成、テキスト分析などにも対応しているようです。

github.com

インデックス作成機能により、RAGでの検索への活用も期待できます。また、対応するファイルフォーマットも以下のように多様なのですが、このなかで便利そうなのがAudioXMLZIPファイルでしょうか。Audioファイルの箇所にspeech transcriptionと記載されているので、かなり守備範囲が広いなと思います。

(注)🥲XMLとAudioファイル(wav、mp3)は試してみましたが未対応というエラーが発生しました😫

対応するファイル形式

  • PDF
  • PowerPoint
  • Word
  • Excel
  • Images (EXIF metadata and OCR)
  • Audio (EXIF metadata and speech transcription)😫
  • HTML
  • Text-based formats (CSV, JSON, XML😫)
  • ZIP files (iterates over contents)

つづいてMarkItDownの使い方をみていきます。

インストール方法

インストールはpipコマンドで行います。Doclingとは異なりGPU向けのライブラリ関係をインストール行わない分インストールサイズは小さいようです。Ubuntu24.04などではPEP668エラーが発生する可能性があります。

# pipでのインストール
$ pip install markitdown
# PEP668エラーが発生した場合
$ pip install --break-system-packages --user markitdown

コマンドラインからの実行

インストールが完了したら、コマンドラインから実行してみます。そのままmarkitdownコマンドを実行すると標準入力待ち状態になるので、--helpオプションを使用して実行すると以下の様に表示が行われます。

MarkItDownオプションを調べる

$ markitdown --help
usage: SYNTAX:

    markitdown <OPTIONAL: FILENAME>
    If FILENAME is empty, markitdown reads from stdin.

EXAMPLE:

    markitdown example.pdf

    OR

    cat example.pdf | markitdown

    OR

    markitdown < example.pdf

Convert various file formats to markdown.

positional arguments:
  filename

options:
  -h, --help  show this help message and exit

この--help表示にもあるように3つのパターンで実行ができるとのことでしたが、GitHubのREADMEにある-oオプションは使用できませんでした🙄(実質2パターンとなると思ったほうがよい?)

コマンドライン的な機能が多いのでツールというよりもツールチェーン的な位置づけになっているのかもしれません。

リダイレクトで変換結果をファイルを保存する方法

$ markitdown path-to-file.pdf > document.md

パイプを使用して標準出力を使って変換する方法

$ cat path-to-file.pdf | markitdown

pdfファイルを変換する

MarkItDownはコンバータなので、Webからデータを取得する機能はありません。あらかじめダウンロードして変換する。

$ markitdown 2206.01062v1.pdf > 2206.01062v1.md

URL指定ができるとちょっと楽なのになという点は残念です。この用途では、以下のようにコマンドを組み合わせてURL先のファイルを取得し変換します。以下の例ではcurlコマンドで組み合わせています。

$ curl https://arxiv.org/pdf/2206.01062 --output - | markitdown > 2206.01062v1.md

元のpdfファイル

MarkItDownの変換結果

ドキュメント内のテキストの読み取りに関しては問題はありません。 ただ、気になったのは、一部画像がmarkdownデータに含まれていない箇所があったところ、テーブル構造の再現性にやや課題があるところでしょうか。

ローカルにあるDOCXファイルのコンバート

続いてはMicrosoft Wordのファイル形式であるDOCXファイルmarkdown形式に変換してみます。

$ markitdown test.docx > test.md

こちらも概ね問題なさそうです。pdfのときに感じたテーブルの構造に関しては、DOCXの方が再現率は高そうです。

ローカルにあるZIPファイルのトランスポート

Doclingには無かった機能です。ZIP形式で固められたファイルを1つのmdファイルにしてくれます。各ファイル形式に関しては単独処理と大きく変化はありませんが、1つのファイルにまとめるためファイル名の区切り(## File: test.xlsxといった表記)が含まれます。メールのマルチパートみたいな印象でしょうか。

$ markitdown test_files.zip > test_files.md

ソースコードなどを一式まとめてMarkdown形式にしてLLMの入力とするときには便利そうな機能です。

Pythonのコード内から変換を行う

Pythonのコード内から変換処理を行ってみます。MarkItDownconvert関数にファイル名を与えることで変換が簡単に行えます。ファイルに保存する場合には戻り値をファイルに格納が必要です。

from markitdown import MarkItDown

md = MarkItDown()
result = md.convert("test.xlsx")
print(result.text_content)

おわりに

今回はMarkItDownというドキュメント変換ツールについて調べてみました。対応フォーマットの豊富さや、ZIPファイルの一括変換など、独自の特徴を持つツールだなという印象です。また、更に対応フォーマットを増やそうとする意気込みは感じます。一方で、現時点ではドキュメントの整備が十分とは言えず、一部の機能(XMLAudioファイルの変換)が未実装という課題も見られます。

RAGシステム構築のためのツールの選択肢として、DoclingMarkItDownの特徴を理解した上で、用途に応じて使い分けていくのが良さそうです。今後のアップデートにも期待したいと思います。

/* -----codeの行番号----- */