著者 | 崔昊 レビュー | Chonglou まとめこの記事では、情報検索とテキスト生成の最新の進歩について探り、特に OpenAI の RAG モデルとそのテキスト コンテンツ検索への応用に焦点を当てます。この記事では、構造化検索から非構造化検索への大きな転換を示し、画像、表、テキストなどのマルチモーダル情報を効果的に処理および解釈できる GPT-4-vision-preview モデルについて詳しく説明します。この記事では、実際のケース分析を通じて、これらのテクノロジーをエンタープライズ ドキュメント管理、学術研究、メディア コンテンツ分析に使用する方法を示し、これらの高度なテクノロジーをマルチモーダル データ処理に適用する方法について読者に詳細な情報を提供します。 導入人工知能の分野では、情報検索とテキスト生成は常に 2 つの重要な研究方向でした。 OpenAI の RAG (Retrieval-Augmented Generation) モデルは、この分野における画期的な成果として、ニューラル ネットワークのテキスト生成能力と大規模データ セットの検索機能をうまく組み合わせています。この革新により、テキスト生成モデルの精度と情報の豊富さが向上するだけでなく、複雑なクエリを処理する際の従来のモデルの限界も解消されます。 RAG モデルの主流のアプリケーションは、エンタープライズ ナレッジ ベースの検索など、テキスト コンテンツの検索に反映されます。テキストの読み込み、切り取り、埋め込み、インデックス作成などの方法を通じて入力とターゲットの相関関係が確立され、最終的に検索結果がユーザーに表示されます。しかし、情報の種類が多様化するにつれ、従来のテキスト検索ではすべてのニーズを満たすことができなくなりました。 当時、OpenAI は gpt-4-vision-preview モデルを発表しました。これは大きな技術的飛躍であっただけでなく、構造化検索から非構造化検索への重要な転換を示しました。このモデルは、画像、表、テキストなど、マルチモーダル情報を処理および解釈する機能を備えており、効果的に要約および検索できます。この進歩により、RAG 機能の範囲が大幅に拡大し、マルチモーダル データ処理の新たな道が開かれました。 たとえば、エンタープライズ ドキュメント管理の観点では、gpt-4-vision-preview は契約書やレポートなどのグラフやテキストを含む PDF ドキュメントを分析して、正確な要約を提供し、重要な情報を抽出できます。学術研究の分野では、この技術により学術論文内のデータや画像を自動的に整理・分析することができ、研究効率が大幅に向上します。メディア コンテンツ分析では、ニュース レポート内の画像とテキスト コンテンツを統合して分析し、メディア従事者にさらに深い洞察を提供します。 今日は、この記事を通じて、マルチモーダル PDF を分析および検索する方法を段階的に説明します。 シナリオ分析さて、本日の主役が登場します。下図に示すように、この PDF ファイルは、リッチテキスト、チャート、データを含む典型的な金融市場分析レポートです。 金融市場分析レポート このレポートには、市場動向の分析や予測などの詳細なテキスト説明だけでなく、株式市場指数、債券商品の利回り、主要金利などの多数のチャートとデータも含まれています。これらのチャートとデータは、市場全体のシナリオを理解する上で重要な役割を果たします。 ただし、このようなマルチモーダル PDF ファイルを手動で処理すると、時間がかかり、労力もかかります。アナリストは、テキストを注意深く読み、チャートとデータを解釈し、この情報を統合して完全な市場見解を形成する必要があります。このプロセスは時間がかかるだけでなく、特に大量の複雑なデータを扱う場合にはエラーが発生しやすくなります。 従来の RAG モデルでは、このようなマルチモーダル PDF ファイルに対応できません。 RAG はテキストベースの情報の処理と生成には優れていますが、主にテキスト コンテンツの検索と生成を行い、グラフやデータなどの非テキスト要素の処理機能は限られています。つまり、情報検索に RAG モデルを使用する場合、テキスト以外の要素を含む複雑な PDF ファイルでは、ファイル内のすべての情報を完全に理解して利用できない可能性があります。 したがって、このようなビジネス シナリオでは、OpenAI が開始したマルチモーダル処理方法を使用し、GPT -4-Vision-Previewモデルを使用してテキスト、グラフ、データを処理し、より包括的で正確な分析を提供する必要があります。これにより、分析の効率が向上し、手動処理によるエラーによるリスクが軽減されます。 テクニカル分析マルチモーダル PDF ドキュメント処理における主な課題は、画像、表、テキストなど、ドキュメント内の非構造化情報を識別することです。ここでは、PDF、HTML、Word 文書などの画像やテキスト文書を取り込んで前処理するためのオープンソース コンポーネントを提供する非構造化ライブラリを使用する必要があります。その主な目的は、大規模言語モデル (LLM) のデータ処理ワークフローを簡素化し、最適化することです。 Unstructured のモジュール機能とコネクタは、データの取り込みと前処理を簡素化し、さまざまなプラットフォームに適応させ、非構造化データを構造化出力に効果的に変換する一貫したシステムを形成します。 さらに、PDF ドキュメントをより適切に処理するために、画像とテキストを抽出するために使用される poppler-utils ツールも導入しました。特に、pdfimages ツールと pdftotext ツールは、それぞれ PDF に埋め込まれた画像とすべてのテキストを抽出するために使用され、マルチモーダル PDF の分析に不可欠です。 注: Poppler は、レンダリングに Cairo と Splash という 2 つのバックエンドを使用できる PDF ドキュメント レンダリング ライブラリです。 2 つのバックエンドには異なる特性があり、Poppler の機能も使用するバックエンドによって異なる場合があります。 Qt4 ベースの描画フレームワーク「Arthur」のバックエンドもありますが、このバックエンドは不完全であり、廃止されています。 Poppler は、Poppler バックエンドへのインターフェイスを提供する Glib および Qt5 のバインディングを提供しますが、Qt5 バインディングは Splash および Arthur バックエンドのみをサポートします。 Cairo バックエンドは、ベクター グラフィックスのアンチエイリアシングと透明オブジェクトをサポートしていますが、スキャンされたドキュメントなどのビットマップ イメージのスムージングはサポートしておらず、X ウィンドウ システムに依存しないため、Poppler は Wayland、Windows、macOS などのプラットフォームで実行できます。 Splash バックエンドはビットマップの縮小フィルタリングをサポートしています。 Poppler には、コマンドライン ツール pdftotext 経由で呼び出すことができるテキスト レンダリング バックエンドも付属しており、たとえば grep ツールを使用して、コマンドラインから PDF 内の文字列を検索できます。 画像、表、質問の抽出の問題を解決した後、Tesseract-OCR ツールは、画像と表のコンテンツを分析可能なテキスト形式に変換する上で重要な役割を果たしました。 Tesseract は PDF ファイルを直接処理することはできませんが、.tiff 形式に変換された PDF ファイル内の画像をテキストに変換できます。このプロセスは、マルチモーダル PDF を処理する際の重要なステップであり、これにより、元々画像や表の形式であった情報をテキスト形式に変換してさらに分析できるようになります。 もちろん、PDF 要素を識別して分離するための上記のテクニックに加えて、ベクター ストレージやベクター インデクサーなどのテクニックも使用されます。 でよく使われるので、ここでは詳しくは説明しません。 コードの実装シナリオと技術分析を行った後、PDF に対してマルチモーダル分析とクエリを実行する必要がある場合は、まず PDF 内の画像、表、テキストを識別する必要があることに気付きました。ここでは、非構造化、Poppler ライブラリ、Tesseract-OCR ツールを紹介します。これらのツールのサポートにより、コーディング プロセスはさらに強力になります。 ライブラリとツールのインストール
上記にはこれまで触れられていないライブラリがいくつかあるので、ここで説明しておきます。
PDF情報を抽出するツールの準備ができたので、次のステップはPDFを処理することです。 コードの内容は次のとおりです。 この Python コードは、pydantic ライブラリと unstructured ライブラリを使用して PDF ファイルを処理します。以下にコードの行ごとの説明を示します。 images_path = "./images": PDF から抽出した画像を保存するための変数 images_path を設定します。 次に、PDF ファイルを処理し、そこから要素を抽出するために使用されるpartition_pdf関数を呼び出します。
コマンドを通じて PDF 画像の情報を取得できます。上記のコードを通じて画像は images ディレクトリに保存されるため、次のコードを通じて画像が表示されます。 PDFから抽出した画像情報 画像情報の要約を生成する次のコードは、画像コンテンツの概要情報を生成するために使用される ImageSummarizer というクラスを定義します。 コードの詳細な説明は次のとおりです。 1. ライブラリをインポートする イメージエンコードとオペレーティング システム関連の機能用の base64 および os ライブラリをインポートします。 Langchain パッケージから ChatOpenAI クラスと HumanMessage モジュールをインポートします。これらは、OpenAI のチャット モデルと対話するために使用されます。 2. 画像要約クラスImageSummarizerを定義する __init__ メソッドは、画像パスとサマリー生成のプロンプトを初期化します。 base64_encode_image メソッドは、画像ファイルを読み取り、base64 エンコードに変換します。このエンコード形式は、ネットワーク上で画像を送信するのに適しており、画像情報と GPT モデル間のやり取りを容易にします。 3. 要約関数を定義する base64_encode_image メソッドを使用して、画像の base64 エンコードされたデータを取得します。 ChatOpenAI オブジェクトを作成し、gpt-4-vision-preview モデルの使用を指定し、画像要約タスクのトークンの最大数を 1000 に設定します。 chat.invoke メソッドを使用して、テキスト プロンプトと画像データを含むメッセージをモデルに送信します。テキストプロンプトは、モデルが画像の概要を生成するようにガイドするために使用されます。 要約関数を作成する目的は、画像の概要を生成することであり、次のステップは関数を呼び出すことです。次のコードは、画像データと画像の概要のリストを作成し、指定されたパス内のすべてのファイルを反復処理してこの情報を生成します。 コードの説明: 1. 初期化リスト イメージの base64 でエンコードされたデータと対応するイメージの概要を格納するために、image_data_list と image_summary_list の 2 つのリストが作成されます。 2. 指定されたパスの下にあるすべてのファイルを走査する os.listdir(images_path) を使用して、指定されたパス (images_path) の下にあるすべてのファイルを一覧表示し、sorted 関数を使用してファイル名を並べ替えます。 3. 各ファイルを確認して処理する img_file.endswith(".jpg") かどうかをチェックして、ファイル拡張子が .jpg であることを確認し、画像ファイルのみが処理されるようにします。 各 .jpg ファイルに対して、イメージへの完全なパスを渡して ImageSummarizer オブジェクトを作成します。 画像の要約を生成するには、summary メソッドを呼び出します。 返された base64 でエンコードされた画像データを image_data_list リストに追加します。 返された画像の概要を image_summary_list リストに追加します。 最後に、2 つのリストが生成されます。1 つには画像ファイルの base64 エンコードされたデータが含まれ、もう 1 つには対応する画像ダイジェストが含まれます。この情報は、画像の取得やその他の処理に使用できます。 画像の概要情報を表示するには次のコードを使用します
出力は次のようになります。 [このグラフには、各業界のホリデーシーズンの売上成長、前週比、および年初来(YTD)のパフォーマンス比較に関するデータを示す 3 つの異なるグラフが含まれています。 \n\n最初のグラフは、「ホリデーシーズンの売上成長はパンデミック前のペースに戻る見込み」というタイトルの棒グラフで、2010年から2023年までの11月と12月の前年比売上成長の実績と予測を示しています。青い列は実際のデータ、縞模様の列は予測データ、青い点線は 2010 年から 2019 年までの平均成長率、緑の点線は 2020 年から 2022 年までの平均成長率を表しています。 \n\n2 番目のグラフは、2 つの部分に分かれたカラー ブロック グラフで、「V」、「B」、「G」の 1 週間および年初来 (YTD) のパフォーマンスをさまざまなスケール (大、中、小) で表示します。数値はカラーブロック内に白いテキストで表示されます。 \n\n3 番目のグラフは、1 週間と年初来 (YTD) のさまざまなセクターのパフォーマンスをそれぞれ示す 2 つの横並びの棒グラフです。左側の青いバーは週ごとの変化を示し、右側の緑のバーは年初からの現在までの変化を示しています。グラフの Y 軸はパーセンテージの変化を表し、X 軸にはさまざまな業界がリストされます。 \n\n概要: パンデミック前のレベルに戻ると予想されるホリデーシーズンの売上成長率、さまざまな市場規模 (大規模、中規模、小規模) の 1 週間および年初来のパフォーマンス、さまざまな業界の 1 週間および年初来のパフォーマンス データを示す 3 つのグラフ。 '] 結果から、GPT -4- Vision - Preview このモデルは画像を認識し、いくつかの詳細を制御することができます。 表とテキスト情報を認識するPDF のコンテンツ全体は、画像、表、テキスト情報で構成されています。画像情報を識別した後、表とテキスト情報から始める必要があります。 次のコードは、PDF ドキュメント要素を処理するプロセスを定義します。 コードの説明は次のとおりです。 1. 要素の基本モデルを定義する pydantic の BaseModel を使用して、ドキュメント要素のタイプ (テーブルやテキストなど) とテキスト コンテンツを格納するための Element というクラスが定義されます。このクラスは、型注釈 str と Any を使用して、type (要素型) と text (要素コンテンツ) の 2 つのプロパティを定義します。 2. テーブルとテキスト要素を格納するための空のリストを作成する table_elements と text_elements は、それぞれテーブル情報とテキスト情報を格納するために使用されます。 3. PDF内の要素を走査する PDF ファイルから分割された各要素 (raw_pdf_elements 内) について、コードは要素のタイプを判別して分類します。 要素がテーブル ( unstructured.documents.elements.Table ) の場合は、タイプを「table」に設定し、テキスト コンテンツを要素の文字列表現に設定した Element オブジェクトを作成し、このオブジェクトを table_elements リストに追加します。 要素が複合要素 (unstructured.documents.elements.CompositeElement) である場合、同様に処理され、そのタイプは「text」に設定され、text_elements リストに追加されます。 PDF ドキュメント内のさまざまな要素を分類して保存した後、次のステップでは、それらを処理し、表とテキストを要約します。コードは次のとおりです。 このコードは、LangChain と GPT-3.5 モデルを使用して、テーブルとテキスト ブロックの要約を生成するために使用されます。 1. モジュールをインポートする LangChain の ChatOpenAI、ChatPromptTemplate、および StrOutputParser モジュールをインポートします。 2. 要約を生成するためのプロンプトテキストを定義する モデルの概要テーブルまたはテキスト ブロックをガイドするために使用されるプロンプト テキスト テンプレートを定義します。 3. プロンプトと要約の連鎖を作成する ChatPromptTemplate.from_template を使用して、定義されたプロンプト テキストに基づいてプロンプトを作成します。 プロンプト、GPT-3.5 モデル (サマリーを生成する機能には GPT -4 は必要ないため、トークンを保存するには GPT -3.5が使用されます)、および文字列出力パーサー (StrOutputParser) を組み合わせた、summary_chain という名前のサマリー チェーンを作成します。 4. 表とテキスト要素の処理 table_elements からテーブル テキストを抽出し、summary_chain.batch メソッドを使用してテキストをバッチ処理します。同時ユーザーの最大数は 5 に設定されています。 最大同時実行数を 5 に設定して、バッチ処理に summary_chain.batch も使用して、text_elements からテキスト ブロックのテキストを抽出します。 要約を次のように出力します。 表とテキストの要約情報 インデクサーを作成するさて、ここまでで、PDF 内の画像、表、テキスト情報を一つずつ抽出し、その後の検索を容易にするためにこれらの情報の要約を生成しました。この一連の準備ができたら、インデクサーを配置する必要があります。名前が示すように、インデクサーは検索を容易にするために検索対象の情報にインデックスを追加します。 次のコードは、テキスト、テーブル、および画像データを保存および取得するためのマルチベクトル リトリーバーを作成します。 コードの説明: 1. マルチベクトルサーチャーを初期化する Chroma をベクター ストレージとして使用し、OpenAI 埋め込み方式を利用してドキュメントをベクター形式に変換します。 ドキュメントをメモリに保存する方法である InMemoryStore をドキュメント ストレージとして使用します。 id_key をドキュメントの一意の識別子に設定します。 2. テキストデータの処理 各テキストに一意の識別子 (UUID) を作成します。 テキスト サマリーを Document オブジェクトとしてカプセル化し、ベクター ストレージとドキュメント ストレージに追加します。 3. 表形式データの処理 同様に、各テーブルの UUID を作成します。 テーブル サマリーを Document オブジェクトとしてカプセル化し、ベクター ストレージとドキュメント ストレージに追加します。 4. 画像データの処理 各イメージの UUID を作成します。 画像サマリーを Document オブジェクトとしてカプセル化し、ベクター ストレージとドキュメント ストレージに追加します。 このコードは、各ドキュメントを管理するために一意の識別子を使用して、テキスト、表、画像など、複数の種類のドキュメント データを保存および取得できるシステムを構築します。これは、大量の複雑なデータを処理および整理するのに非常に役立ちます。 マルチモーダルクエリプロンプトを生成する次のコードには、画像とテキスト データを処理および表示するためのいくつかの関数が含まれています。 コードの説明: 1. base64でエンコードされた画像を表示する(plt_img_base64) この関数の目的は、base64 でエンコードされた画像を表示することです。 2. base64データが画像であるかどうかを確認する (is_image_data) base64 でエンコードされたデータの先頭が一般的な画像形式 (JPEG、PNG、GIF、WEBP など) の署名と一致するかどうかを確認して、データが画像かどうかを判断します。 3. base64でエンコードされた画像とテキストを分離する(split_image_text_types) この関数はドキュメント コレクションを反復処理し、is_image_data 関数を使用してどれが画像データでどれがテキストかを区別し、それぞれ 2 つのリストに格納します。 4. データに基づいてプロンプト情報を生成する (img_prompt_func) この関数は、LangChain ビッグモデルに渡すメッセージを生成します。各画像に対して、画像の URL を含むメッセージを作成します。テキスト データの場合は、プロンプト テキストと質問を含むメッセージを作成します。 「テキスト」は特別に説明する必要があります。これはメッセージの特定のテキスト コンテンツを定義します。 まず、ユーザーの役割が次のように示されます:「あなたは財務アナリストです。」 次に、タスクの種類とデータ形式について説明します。「通常はチャートやグラフなどのテキスト、表、画像が混在して提供されます。」 ヒント: この情報を使用して、財務に関するユーザーの質問に回答します。 {data_dict['question']}: {} 内の部分は Python 文字列形式のプレースホルダーで、変数 data_dict の 'question' キーに対応する値、つまりユーザーが尋ねた質問を挿入するために使用されます。 「テキストおよび/または表:\n」: 後続のコンテンツがテキストおよび/または表であることを示すプロンプト テキスト。 f"{formatted_texts}": 文字列フォーマットを再度使用して、変数 formatted_texts (フォーマットされたテキスト データ) をメッセージに挿入します。 財務分析クエリの実装これで準備が整いましたので、GPT -4- Vision - Preview モデルを使用して推論を開始できます。インデクサーに質問して、結果を確認してみましょう。 次のコードは、RAG (Retrieval Augmented Generation) モデルに基づくクエリ処理パイプラインを実装します。 コードの説明: 1. ChatOpenAIモデルインスタンスを作成する ChatOpenAI クラスを使用してモデル インスタンスを作成し、温度パラメータを 0 に設定し、gpt-4-vision-preview モデルを使用して、トークンの最大数を 1024 に設定します。 2. RAGパイプライン(チェーン)を構築する リトリーバー | RunnableLambda(split_image_text_types): まずリトリーバーを使用してコンテンツを取得し、次に RunnableLambda を通じて split_image_text_types 関数を呼び出して画像とテキストを分離します。 RunnablePassthrough(): クエリの質問を直接渡すために使用されます。 RunnableLambda(img_prompt_func): 取得した画像とテキストに基づいてプロンプト情報を生成します。 モデル: 構成された ChatOpenAI モデルを使用して、生成されたプロンプト情報に基づいて回答を生成します。 StrOutputParser(): モデルによって出力された文字列を解析します。 3. クエリを定義する 文字列クエリをクエリの質問として定義します。例: 「休日の売上成長率が最も高かったのはどの年ですか?」 4. クエリを実行する (chain.invoke(query)) チェーンの呼び出しメソッドを呼び出すと、クエリが実行され、質問と取得された情報に基づいて回答が生成されます。 全体として、このコード スニペットは、コンテンツの取得、データの分離、プロンプトの生成、モデル回答を組み合わせて、テキストと画像データに基づいて複雑な質問を処理して回答する、洗練されたクエリ処理パイプラインを構築します。 出力を表示するには: 提供されたグラフによると、ホリデーシーズンの売上成長率が最も高かったのは 2021 年で、成長率は 12.7% でした。これは、「実際」セクションの棒グラフで最も高いバーで示されており、11 月と 12 月の売上の実際の前年比成長率を表しています。 これを中国語に翻訳すると次のようになります。 提供されたグラフによると、2021年のホリデーシーズンの売上高は12.7%と過去最高の伸びを記録しました。これは、棒グラフの「実線」部分の最も高い棒からわかります。これは、11 月と 12 月の前年比成長率を表しています。 PDFのチャート部分と大規模モデル応答の比較 大規模なモデルの応答を通じて、ホリデーセールスの成長率を説明するPDFのバーチャートと比較することで、 2021年の成長率が12.7 %で最も高く、「ソリッド」カラムの説明も正しいことが明確にわかります。 Openaiが提供するマルチモーダル機能は機能したようです。 要約する分析と例のデモンストレーションを通じて、この記事は、Multimodalデータ処理におけるOpenaiの最新技術の潜在的およびアプリケーションの見通しを明確に示しています。構造化されていないライブラリ、ポップラーツール、およびTesseract-OCCツールの詳細な紹介とコードの実装を通じて、この記事は読者に理論的知識を提供するだけでなく、これらのツールを実際に操作および適用する方法をガイドします。この記事の結論は、分析の効率を改善し、人的エラーを減らす際のGPT-4-Vision-Previewモデルの価値を強調しています。 著者について51CTO コミュニティ エディター兼シニア アーキテクトの Cui Hao 氏は、ソフトウェア開発とアーキテクチャで 18 年の経験があり、分散アーキテクチャでは 10 年の経験があります。 |
>>: 年末ですね!ファーウェイクラウド開発者デーと2023イノベーションサミットが成功裏に開催されました
今後 25 年間は、既存の制御可能かつプログラム可能ないわゆる「人工知能」を活用して、人類が生物学の...
人間とロボットが協力して協働ロボットを作る[[321860]]協働ロボットは人間と対話し、協働するよ...
先週金曜日、知会君は微博で「来週は良いものがリリースされる」と発表した。 「来週」になって間もなく、...
2019年WeChatオープンクラスPROで、WeChat AIチームが開発したインテリジェント対話...
最近、国務院は貨物物流の円滑な流れを確保するために関連業務を展開するよう通知し、各地域と関連部門に主...
序文前回の記事では列挙型の最適化について説明しました。今回は時刻形式である DateTime の最適...
著者 | Pier Paolo Ippolito、データ サイエンティスト翻訳者 | 陸新王校正 |...