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に変換する
①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の実装方法を解説します。
環境構築
必要なライブラリをインストールします。
環境変数(API キーや、Azure OpenAI Service のエンドポイント等)の設定をします。
.env ファイルを作成して、各パラメータを設定し、同一ディレクトリに格納してください。
! 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で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)))