Microsoft MarkItDownの深い体験
Min-jun Kim
Dev Intern · Leapcell

MarkItDownとは?
MarkItDownは、Microsoftが開発したPythonライブラリで、さまざまなファイル形式をMarkdownに変換します。
リリース以来、急速に人気を集め、わずか2週間でGitHubで25,000以上のスターを獲得しました! 🤯
MarkItDownが非常に人気がある理由
MarkItDownは、次のような幅広いファイルタイプをサポートしています。
- オフィスドキュメント:PowerPoint、Word、Excel
- リッチメディアファイル:画像(EXIFと画像の説明付き)、オーディオ(トランスクリプション付き)
- Webおよび構造化データ:HTML、CSV、JSON、XML
- アーカイブ:ZIPファイル
WordやExcelのような一般的な形式を処理できるだけでなく、OCRや音声認識を活用してコンテンツを抽出することで、マルチモーダルファイルもサポートしています。
あらゆるものをMarkdownに変換できるため、MarkItDownはLLMトレーニングに最適なツールです。ドメイン固有のドキュメントを処理することで、LLMを活用したアプリケーションでより正確で関連性の高い応答を生成するための豊富なコンテキストを提供します。
MarkItDownの使い方
MarkItDownの使用は非常に簡単で、わずか4行のコードです。
from markitdown import MarkItDown md = MarkItDown() result = md.convert("test.xlsx") print(result.text_content)
MarkItDownのいくつかの使用例を以下に示します。
Wordファイルを変換すると、正確なMarkdown出力が得られます。
複数のシートを持つExcelファイルも簡単です。
また、ZIPファイルを処理することもでき、ZIPアーカイブ内のすべてのコンテンツが再帰的に解析されます。
画像からコンテンツを抽出しようとすると、何も返されません。
何も返されないのはなぜでしょうか? MarkItDownは、画像ファイルをサポートするように設計されているからです!
問題は、画像の説明を抽出するためにLLMが必要なことです。次のように、互換性のあるLLMクライアントをMarkItDownと統合します。
from openai import OpenAI client = OpenAI(api_key="i-am-not-an-api-key") md = MarkItDown(llm_client=client, llm_model="gpt-4o")
構成が完了すると、画像コンテンツは正常に変換されます。
注:LLMは画像でのみ機能します。PDFからコンテンツを抽出するには、PDFがOCRで事前に処理されていることを確認してください。
ただし、PDFから抽出されたテキストはすべてのフォーマットを失い、見出しと通常のテキストが区別されなくなります。
MarkItDownの制限事項
上記に示すように、MarkItDownにはいくつかの制限があります。
- OCR処理されていないPDFは処理できません。
- PDFから抽出する場合、フォーマットは利用できません。
MarkItDownはオープンソースツールであるため、拡張性が高くなっています。その整然としたコードベースにより、開発者は新しい機能を簡単に追加できます。
MarkItDownの仕組み
MarkItDownのアーキテクチャはシンプルでクリーンであり、そのコア実装は1つのファイルにのみ含まれています。
コードベースでは、DocumentConverter
クラスがconvert()
メソッドで定義されています。
class DocumentConverter: """Abstract superclass of all DocumentConverters.""" def convert( self, local_path: str, **kwargs: Any ) -> Union[None, DocumentConverterResult]: raise NotImplementedError()
さまざまなコンバーターがこの基本クラスから継承し、初期化時に登録されます。
self.register_page_converter(PlainTextConverter()) self.register_page_converter(HtmlConverter()) self.register_page_converter(DocxConverter()) self.register_page_converter(XlsxConverter()) self.register_page_converter(Mp3Converter()) self.register_page_converter(ImageConverter()) # ...
このモジュール式の設計により、MarkItDownは非常に拡張性が高く、開発者は必要に応じて独自のコンバーターを作成できます。
さまざまなファイルタイプの変換方法
オフィスファイル
オフィスファイルは、まずmammoth
、pandas
、pptx
などのライブラリを使用してHTMLに変換され、次にBeautifulSoup
を使用してMarkdownに解析されます。
オーディオファイル
オーディオファイルは、GoogleのAPIをトランスクリプションに活用するspeech_recognition
ライブラリを使用して処理されます。
(Microsoft、あなたはまだAzureに忠実なのですね、…そうだよね? 💔)
画像
画像はプロンプト"この画像の詳細なキャプションを書いてください。"
を使用してLLMを呼び出すことによって処理されます。
PDFはpdfminer
ライブラリを使用して解析されます。ただし、OCRは組み込まれていないため、PDFコンテンツが事前に抽出可能であることを確認する必要があります。
MarkItDownをAPIとして使用する(そして無料でホストする)
MarkItDownはローカルで実行できますが、APIとしてホストすることで、Zapier、n8n、またはファイル変換サービスを提供する独自のWebサイトなどのワークフローに簡単に統合できる柔軟性が向上します。
FastAPI
を使用してMarkItDownをAPIとしてホストする方法の簡単な例を次に示します。
import shutil from markitdown import MarkItDown from fastapi import FastAPI, UploadFile from uuid import uuid4 md = MarkItDown() app = FastAPI() @app.post("/convert") async def convert_markdown(file: UploadFile): hash = uuid4() folder_path = f"./tmp/{hash}" shutil.os.makedirs(folder_path, exist_ok=True) file_path = f"{folder_path}/{file.filename}" with open(file_path, "wb") as f: shutil.copyfileobj(file.file, f) result = md.convert(file_path) text = result.text_content shutil.rmtree(folder_path) return {"result": text}
次のようにAPIを呼び出すことができます。
const formData = new FormData(); formData.append('file', file); const response = await fetch('http://localhost:8000/convert', { method: 'POST', body: formData, });
APIを無料でホストする
Python APIのホストは難しい場合があります。AWS EC2やDigitalOceanのような従来のサービスでは、常にコストがかかるサーバ全体をレンタルする必要があります。
しかし、今ではLeapcellを使用できます。
これは、サーバレス方式でPythonコードベースをホストできるプラットフォームです。API呼び出しごとにのみ課金され、寛大な無料枠の使用量があります。
GitHubリポジトリを接続し、ビルドコマンドと開始コマンドを定義するだけで、準備完了です。
クラウドでホストされ、ワークフローに統合できるMarkItDown APIができました。そして最も重要なことは、実際に呼び出された場合にのみ課金されることです。
今すぐLeapcellで独自のMarkItDown APIの構築を開始してください! 😎