Box Llama-Index Reader: 優れた機能

Yuko Taniguchi
Box Developer Japan Blog
25 min readAug 30, 2024

前回の記事では、従来のBox Llama-Index Readerについて説明したほか、Boxのサービスを使用してインテリジェントコンテンツクラウドからデータを抽出する他のreaderが存在することも示しました。

Boxは、組み込みのサービスを利用できるという点で、従来のクラウドストレージプロバイダとは異なります。組み込みのサービスには、テキスト抽出、汎用的なAIプロンプト、特殊な構造化データのAIによる抽出があります。

  • Box Text Extraction — Boxのテキストレプリゼンテーションを使用して、ドキュメントから直接テキストを抽出
  • Box AI Prompt — Box AIを使用して、ドキュメントからコンテキストを抽出
  • Box AI Extraction — Box AIを使用して、ドキュメントから構造化データを抽出

Box Text Extraction

BoxReaderTextExtractionは、Boxファイルから直接テキストコンテンツを読み込む際に使用されるLLamaIndex readerクラスです。

このクラスは、BoxReaderBaseクラスを継承し、Boxファイルからプレーンテキストのコンテンツを抽出することに特化しています。指定されたBoxClientオブジェクトを使用してBox APIを操作し、ファイルのテキストレプリゼンテーションを取得します。

ヒント: 詳細については、Boxのテキストレプリゼンテーションに関するドキュメントを参照してください。

使用方法

readerをインスタンス化するために必要なのは、BoxClientオブジェクトだけです。

# Using CCG authentication
from llama_index.readers.box import BoxReaderTextExtraction
from box_sdk_gen import CCGConfig, BoxCCGAuth, BoxClient

ccg_conf = CCGConfig(
client_id="your_client_id",
client_secret="your_client_secret",
enterprise_id="your_enterprise_id",
user_id="your_ccg_user_id", # optional
)
auth = BoxCCGAuth(ccg_conf)
client = BoxClient(auth)
reader = BoxReaderTextExtraction(box_client=client)

データの読み込み

load_dataメソッドは、Boxファイルからテキストコンテンツを抽出し、LlamaIndexのDocumentオブジェクトを作成します。

このメソッドは、Box APIを使用して、指定されたBoxファイルのテキストレプリゼンテーションを取得します (可能な場合)。その後、抽出したテキストとファイルのメタデータを含むDocumentオブジェクトを作成します。

  • file_ids (Optional[List[str]])、省略可: テキストの抽出元となるBoxファイルIDのリスト。指定した場合、folder_idは無視されます。デフォルトではNoneになっています。
  • folder_id (Optional[str])、省略可: テキストの抽出元となるBoxフォルダのID。指定した場合、合わせてis_recursiveTrueに設定すると、サブフォルダからもデータを取得します。デフォルトではNoneになっています。
  • is_recursive (bool)、省略可: Trueに設定し、folder_idを指定した場合、指定したフォルダ内のサブフォルダからテキストを抽出します。デフォルトではFalseになっています。

使用方法:

#### Using folder id
documents = reader.load_data(folder_id="folder_id")

#### Using file ids
documents = reader.load_data(file_ids=["file_id1", "file_id2"])

その他のメソッド

その他のメソッドは、Box Readerとまったく同じように機能します。

  • リソースの読み込み — 特定のリソースからデータを読み込みます。
  • リソースのリスト取得 — 指定したフォルダIDまたはファイルIDに基づいて、BoxファイルのIDのリストを取得します。
  • ファイルコンテンツの読み取り — ファイルのバイナリコンテンツを返します。
  • リソースの検索 — 指定された条件に基づいてBoxのリソースを検索し、そのIDのリストを返します。
  • メタデータによるリソースの検索 — メタデータに基づいてBoxのリソースを検索し、そのIDのリストを返します。
  • リソース情報の取得 — 特定のリソースに関する情報を取得します。

Box AI Prompt

BoxReaderAIPromptは、カスタムAIプロンプトを使用してBoxファイルからデータを読み込むためのLlamaIndex readerクラスです。

このクラスは、BoxReaderBaseクラスを継承し、データの抽出にカスタムAIプロンプトを指定できるようにします。また、指定されたBoxClientオブジェクトを使用してBox APIを操作し、プロンプトに基づいてデータを抽出します。

Box AI機能を利用できるのは、Enterprise Plusをご利用のお客様のみです。

使用方法

readerをインスタンス化するために必要なのは、BoxClientオブジェクトだけです。

# Using CCG authentication

from llama_index.readers.box import BoxReaderAIPrompt
from box_sdk_gen import CCGConfig, BoxCCGAuth, BoxClient

ccg_conf = CCGConfig(
client_id="your_client_id",
client_secret="your_client_secret",
enterprise_id="your_enterprise_id",
user_id="your_ccg_user_id", # optional
)
auth = BoxCCGAuth(ccg_conf)
client = BoxClient(auth)

reader = BoxReaderAIPrompt(box_client=client)

データの読み込み

load_dataメソッドは、カスタムAIプロンプトを使用してBoxファイルからデータを抽出し、Documentオブジェクトを作成します。

このメソッドは、ユーザーが指定したAIプロンプトを使用して、Boxファイルからデータを抽出し、抽出したデータとファイルのメタデータを含むDocumentオブジェクトを作成します。

  • ai_prompt (str): ファイルから抽出するデータを指定するカスタムAIプロンプト
  • file_ids (Optional[List[str]]): データの抽出元となるBoxファイルIDのリスト。指定した場合、folder_idは無視されます。デフォルトではNoneになっています。
  • folder_id (Optional[str]): データの抽出元となるBoxフォルダのID。指定した場合、合わせてis_recursiveTrueに設定すると、サブフォルダからもデータを取得します。デフォルトではNoneになっています。
  • is_recursive (bool): Trueに設定し、folder_idを指定した場合、指定したフォルダ内のサブフォルダからデータを抽出します。デフォルトではFalseになっています。
  • individual_document_prompt (bool = True): Trueに設定した場合、指定したAIプロンプトが各ドキュメントに個別に適用されます。Falseに設定した場合、すべてのドキュメントが回答のコンテキストに使用されます。デフォルトではTrueになっています。

使用方法:

#### Using folder id
documents = reader.load_data(
folder_id="folder_id", ai_prompt="summarize this document"
)

#### Using file ids
documents = reader.load_data(
file_ids=["file_id1", "file_id2"], ai_prompt="summarize this document"
)

注意事項:

AIプロンプトは、Box AIを使用してテキストを生成するのに役立つツールで、テキストの生成、質問への回答などに使用できます。

Box AIは、デフォルトで、1つのドキュメントのコンテキスト (individual_document_prompt=True) を使用しますが、複数ドキュメントのコンテキストを参照して質問に回答することもできます。

たとえば、複数のサポートリクエストからAIプロンプトを使用するとします。

individual_document_prompt=Trueを指定してサポートリクエストのリストを渡すと、AI Prompt readerによってリクエストごとに回答が生成されます。

一方、顧客別にグループ化されたサポートリクエストから回答を取得したい場合は、individual_document_prompt=Falseを指定して特定の顧客からのサポートリクエストのリストを渡すと、AI Prompt readerによってその顧客に対する1つの回答が生成されます。

リソースの読み込み

load_resourceメソッドは、特定のリソースからデータを読み込みます。

  • resource (str): リソース識別子
  • ai_prompt (str): ファイルから抽出するデータを指定するカスタムAIプロンプト

使用方法:

resource_id = test_data["test_txt_invoice_id"]
docs = reader.load_resource(resource_id, ai_prompt="summarize this document")

その他のメソッド

その他のメソッドは、Box Readerとまったく同じように機能します。

  • リソースのリスト取得 — 指定したフォルダIDまたはファイルIDに基づいて、BoxファイルのIDのリストを取得します。
  • ファイルコンテンツの読み取り — ファイルのバイナリコンテンツを返します。
  • リソースの検索 — 指定された条件に基づいてBoxのリソースを検索し、そのIDのリストを返します。
  • メタデータによるリソースの検索 — メタデータに基づいてBoxのリソースを検索し、そのIDのリストを返します。
  • リソース情報の取得 — 特定のリソースに関する情報を取得します。

Box AI Extraction

BoxReaderAIExtractは、Box AIによる抽出を使用してBoxファイルからデータを読み込むためのLlamaIndex readerクラスです。

このクラスは、BoxReaderBaseクラスを継承し、Box AIによる抽出を使用したBoxファイルのデータ処理に特化しています。また、指定されたBoxClientオブジェクトを使用してBox APIを操作し、指定されたAIプロンプトに基づいてデータを抽出します。

Box AI機能を利用できるのは、Enterprise Plusをご利用のお客様のみです。

注: Box AI Extractionは現在ベータ版であり、実装内容は変更される可能性があります。

使用方法

readerをインスタンス化するために必要なのは、BoxClientオブジェクトだけです。

# Using CCG authentication

from llama_index.readers.box import BoxReaderAIExtract
from box_sdk_gen import CCGConfig, BoxCCGAuth, BoxClient

ccg_conf = CCGConfig(
client_id="your_client_id",
client_secret="your_client_secret",
enterprise_id="your_enterprise_id",
user_id="your_ccg_user_id", # optional
)
auth = BoxCCGAuth(ccg_conf)
client = BoxClient(auth)

reader = BoxReaderAIExtract(box_client=client)

データの読み込み

load_dataメソッドは、Box AIを使用してBoxファイルからデータを抽出し、Documentオブジェクトを作成します。

このメソッドは、Box AIによる抽出機能を使用して、指定されたAIプロンプトに基づき、指定されたBoxファイルからデータを抽出し、抽出したデータとファイルのメタデータを含むDocumentオブジェクトを作成します。

  • ai_prompt (str): ファイルから抽出するデータを指定するAIプロンプト
  • file_ids (Optional[List[str]]): データの抽出元となるBoxファイルIDのリスト。指定した場合、folder_idは無視されます。デフォルトではNoneになっています。
  • folder_id (Optional[str]): データの抽出元となるBoxフォルダのID。指定した場合、合わせてis_recursiveTrueに設定すると、サブフォルダからもデータを取得します。デフォルトではNoneになっています。
  • is_recursive (bool): Trueに設定し、folder_idを指定した場合、指定したフォルダ内のサブフォルダからデータを抽出します。デフォルトではFalseになっています。

使用方法:

#### Using folder id
documents = reader.load_data(
folder_id="folder_id",
ai_prompt='{"doc_type","date","total","vendor","invoice_number","purchase_order_number"}',
)

#### Using file ids
documents = reader.load_data(
file_ids=["file_id1", "file_id2"],
ai_prompt='{"doc_type","date","total","vendor","invoice_number","purchase_order_number"}',
)

注意事項:

ai_promptでは、ドキュメントから抽出されるデータの構造を定義します。これには、辞書型文字列を指定できます。

{
"doc_type",
"date",
"total",
"vendor",
"invoice_number",
"purchase_order_number",
}

JSON文字列は以下のようになります。

{
"fields": [
{
"key": "vendor",
"displayName": "Vendor",
"type": "string",
"description": "Vendor name",
},
{
"key": "documentType",
"displayName": "Type",
"type": "string",
"description": "",
},
]
}

また、会話形式のテキスト (英語) も指定できます。

"find the document type (invoice or po), vendor, total, and po number"

リソースの読み込み

特定のリソースからデータを読み込みます。

  • resource (str): リソース識別子 (file_id)
  • ai_prompt (str): ファイルから抽出するデータを指定するAIプロンプト

使用方法:

AI_PROMPT = '{"doc_type","date","total","vendor","invoice_number","purchase_order_number"}'
resource_id = test_data["test_txt_invoice_id"]
docs = reader.load_resource(resource_id, ai_prompt=AI_PROMPT)

その他のメソッド

その他のメソッドは、Box Readerとまったく同じように機能します。

  • リソースのリスト取得 — 指定したフォルダIDまたはファイルIDに基づいて、BoxファイルのIDのリストを取得します。
  • ファイルコンテンツの読み取り — ファイルのバイナリコンテンツを返します。
  • リソースの検索 — 指定された条件に基づいてBoxのリソースを検索し、そのIDのリストを返します。
  • メタデータによるリソースの検索 — メタデータに基づいてBoxのリソースを検索し、そのIDのリストを返します。
  • リソース情報の取得 — 特定のリソースに関する情報を取得します。

実践的な例

次のコードを考えてみましょう。

import os
from typing import List
import dotenv

from box_sdk_gen import CCGConfig, BoxCCGAuth, BoxClient, File
from llama_index.readers.box import (
BoxReader,
BoxReaderTextExtraction,
BoxReaderAIPrompt,
BoxReaderAIExtract,
)
from llama_index.core.schema import Document

def get_box_client() -> BoxClient:
dotenv.load_dotenv()

# Common configurations
client_id = os.getenv("BOX_CLIENT_ID", "YOUR_BOX_CLIENT_ID")
client_secret = os.getenv("BOX_CLIENT_SECRET", "YOUR_BOX_CLIENT_SECRET")

# CCG configurations
enterprise_id = os.getenv("BOX_ENTERPRISE_ID", "YOUR_BOX_ENTERPRISE_ID")
ccg_user_id = os.getenv("BOX_USER_ID")

config = CCGConfig(
client_id=client_id,
client_secret=client_secret,
enterprise_id=enterprise_id,
user_id=ccg_user_id,
)

auth = BoxCCGAuth(config)
if config.user_id:
auth.with_user_subject(config.user_id)

return BoxClient(auth)

def get_testing_data() -> dict:
return {
"disable_folder_tests": True,
"test_folder_id": "273980493541",
"test_doc_id": "1584054722303",
"test_ppt_id": "1584056661506",
"test_xls_id": "1584048916472",
"test_pdf_id": "1584049890463",
"test_json_id": "1584058432468",
"test_csv_id": "1584054196674",
"test_txt_waiver_id": "1514587167701",
"test_folder_invoice_po_id": "261452450320",
"test_folder_purchase_order_id": "261457585224",
"test_txt_invoice_id": "1517629086517",
"test_txt_po_id": "1517628697289",
}

def print_docs(label: str, docs: List[Document]):
print("------------------------------")
print(f"{label}: {len(docs)} document(s)")

for doc in docs:
print("------------------------------")
file = File.from_dict(doc.extra_info)
print(f"File ID: {file.id}\nName: {file.name}\nSize: {file.size} bytes")
# print("------------------------------")
print(f"Text: {doc.text[:100]} ...")
print("------------------------------\n\n\n")

def main():
box_client = get_box_client()
test_data = get_testing_data()

# Text extraction
reader = BoxReaderTextExtraction(box_client=box_client)
docs = reader.load_data(file_ids=[test_data["test_txt_waiver_id"]])
print_docs("BoxReader Text Extraction", docs)

# AI prompt
reader = BoxReaderAIPrompt(box_client=box_client)
docs = reader.load_data(
file_ids=[test_data["test_txt_waiver_id"]], ai_prompt="summarize this document"
)
print_docs("Box Reader AI Prompt", docs)

# Ai extract
reader = BoxReaderAIExtract(box_client=box_client)
docs = reader.load_data(
file_ids=[test_data["test_txt_invoice_id"]],
ai_prompt='{"doc_type","date","total","vendor","invoice_number","purchase_order_number"}',
)
print_docs("BoxReader AI Extract", docs)

docs = reader.load_data(
folder_id=test_data["test_folder_purchase_order_id"],
ai_prompt='{"doc_type","date","total","vendor","invoice_number","purchase_order_number"}',
is_recursive=True,
)
print_docs("BoxReader AI Extract", docs)

if __name__ == "__main__":
main()

結果は次のとおりです。

------------------------------
BoxReader Text Extraction: 1 document(s)
------------------------------
File ID: 1514587167701
Name: Box-Dive-Waiver.docx
Size: 7409 bytes
Text: YOU MUST BE ABLE TO SWIM TO PARTICIPATE IN ANY IN WATER ACTIVITIES.

YOU MUST BE IN HEALTHY AND GOO ...
------------------------------

------------------------------
Box Reader AI Prompt: 1 document(s)
------------------------------
File ID: 1514587167701
Name: Box-Dive-Waiver.docx
Size: 7409 bytes
Text: The document is a liability release form for participants in water
activities, specifically scuba di ...
------------------------------

------------------------------
BoxReader AI Extract: 1 document(s)
------------------------------
File ID: 1517629086517
Name: Invoice-Q2468.txt
Size: 176 bytes
Text: {"doc_type": "Invoice", "date": "August 2, 2024", "total": "$1,050",
"vendor": "Quasar Innovations", ...
------------------------------

------------------------------
BoxReader AI Extract: 5 document(s)
------------------------------
File ID: 1517628618684
Name: PO-001.txt
Size: 212 bytes
Text: {"Purchase Order Number": "001", "Date": "February 13, 2024",
"Total": "$575", "Vendor": "Galactic G ...
------------------------------
File ID: 1517626773559
Name: PO-002.txt
Size: 229 bytes
Text: {"purchase_order_number": "002", "date": "February 13, 2024",
"total": "$230", "vendor": "Cosmic Con ...
------------------------------
File ID: 1517628291707
Name: PO-003.txt
Size: 222 bytes
Text: {"purchase_order_number": "003", "date": "February 13, 2024",
"total": "$1,050", "vendor": "Quasar I ...
------------------------------
File ID: 1517625894126
Name: PO-004.txt
Size: 217 bytes
Text: {"purchase_order_number": "004", "date": "February 13, 2024",
"total": "$920", "vendor": "AstroTech ...
------------------------------
File ID: 1517628697289
Name: PO-005.txt
Size: 211 bytes
Text: {"purchase_order_number": "005", "date": "February 13, 2024",
"total": "$45", "vendor": "Quantum Qui ...
------------------------------

アイデア、コメント、フィードバックがある場合は、コミュニティフォーラム (英語のみ) にコメントをお送りください。

--

--