Azure AI Document Intelligenceを活用したLangChainとの連携によるRAG(Retrieval-Augmented Generation)の具体的な手順を解説します。本記事では、AI Document IntelligenceによるドキュメントのMarkdown変換と、LangChainを用いたチャンク分割の方法を中心にご紹介します。

Azure AI Document Intelligenceとは

Azure Document Inteligenceとは、pdf や画像ファイルから情報抽出するOCRサービスです。取得可能な情報として、テキスト、テーブル、段落、座標、レイアウト情報を抽出できます。一般的な文章の文字起こしや、領収書や請求書などの読み取りなど様々なデータの処理が可能です。

様々な事前学習済みのモデルが提供されており、例えばLayoutモデルを用いると、文書構造(レイアウト情報)を保ったまま、Markdown の形式で抽出することが可能です。
Markdown の形式で抽出し、#、##等の見出しで分割することで、セマンティックチャンキングが可能となります。

Azure AI Document Intelligenceの主な機能

Azure AI Document Intelligenceには、主な以下の機能があります。

フォーム認識

フォームや請求書、領収書などの定型文書からフィールドデータを自動的に抽出します。構造化データ(表やチェックボックスなど)も解析可能です。

ドキュメントレイアウト解析

文書全体のレイアウトを解析し、テキスト、表、図表、見出しなどの要素を識別します。文書の構造を理解し、情報を適切に分類します。

エンティティ抽出

特定の情報(例えば、名前、日付、金額など)を文書から自動的に抽出します。カスタマイズ可能なモデルを使用して、特定の業界や用途に特化したエンティティを抽出します。

カスタムモデルのトレーニング

特定のフォーマットやレイアウトに合わせてカスタムモデルをトレーニングすることが可能です。自社の文書に特化したモデルを作成し、精度を向上します。

LangChainとAI Document IntelligenceでのRAGの手順

LangChainとAzure AI Document Intelligenceを用いたRAGの手順は以下の通りです。

①AI Document IntelligenceでドキュメントをMarkdownに変換する
②LangChainでMarkdownを見出し位置でチャンク分割する(セマンティックチャンク)
③チャンク化した内容をベクトル化し、Azure AI Searchに登録する
④ユーザーからの質問を受けて、Azure AI Searchを検索する
⑤検索結果をLLMに入力して回答を生成する

本記事では、①と②を解説します。

LangChainでのRAGの実装方法

LangChainのモジュールは、Azure AI Document Intelligenceに対応しているため、LangChainからAzure AI Document Intelligenceの操作が可能です。RAGの実装方法を解説します。

環境構築

必要なライブラリをインストールします。
! pip install python-dotenv langchain langchain-community langchain-openai langchainhub openai tiktoken azure-ai-documentintelligence azure-identity azure-search-documents==11.6.0b3

環境変数(API キーや、Azure OpenAI Service のエンドポイント等)の設定をします。
.env ファイルを作成して、各パラメータを設定し、同一ディレクトリに格納してください。
import os
from dotenv import load_dotenv

# .envファイルの内容を読み込む
load_dotenv()
# os.environを用いて環境変数を設定 os.environ["AZURE_OPENAI_ENDPOINT"] = os.getenv("AZURE_OPENAI_ENDPOINT") os.environ["AZURE_OPENAI_API_KEY"] = os.getenv("AZURE_OPENAI_API_KEY") doc_intelligence_endpoint = os.getenv("AZURE_DOCUMENT_INTELLIGENCE_ENDPOINT") doc_intelligence_key = os.getenv("AZURE_DOCUMENT_INTELLIGENCE_KEY")

①AI Document IntelligenceでドキュメントをMarkdownに変換する

LangChainのAzureAIDocumentIntelligenceLoader関数で、ドキュメントをMarkdown形式で読み取ります。
from langchain_community.document_loaders import AzureAIDocumentIntelligenceLoader
from langchain.text_splitter import MarkdownHeaderTextSplitter

# Initiate Azure AI Document Intelligence to load the document. You can either specify file_path or url_path to load the document. loader = AzureAIDocumentIntelligenceLoader(file_path="", api_key = doc_intelligence_key, api_endpoint = doc_intelligence_endpoint, api_model="prebuilt-layout", mode="markdown") docs = loader.load()
※なおLangChainではなく、AzureのPython SDKでも同様の実装が可能です(というよりそちらが公式です)。DocumentIntelligenceClientbegin_analyze_documen関数で、入力ドキュメントを分析するための操作も可能です。"prebuilt-layout"を引数に指定すると、文書のレイアウト情報が抽出できます。

②LangChainでMarkdownを見出し位置でチャンク分割する(セマンティックチャンク)

次に、langchainのMarkdownHeaderTextSplitter関数で、Markdown形式のファイルを、#, ##, ###のタグでチャンキングします。
# Split the document into chunks base on markdown headers.
headers_to_split_on = [
    ("#", "Header 1"),
    ("##", "Header 2"),
    ("###", "Header 3"),
]
text_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)

docs_string = docs[0].page_content #DocumentIntelligenceでMarkdown化したコンテンツ
splits = text_splitter.split_text(docs_string) #設定したsplitterで分割を行う

print("Length of splits: " + str(len(splits)))