Microsoft

LlamaIndexでOneDrive for Businessに保存したファイルをベクトル検索する ~RAGによる検索の拡張~

こんにちは。jinnaiです。

最近当社では、LlamaIndexやAzure AI Search(旧称:Azure Cognitive Search)を活用したファイル検索の技術を応用する機会が多くなってきました。そこでMicrosoft のOneDrive(法人向けではOneDrive for Business)に格納されたドキュメントをうまくコネクトできれば、生成AIにも応用が実現できるのではないかと思います。

[toc]

LlamaHubとは

LlamaHubは、LlamaIndexやLangChainを活用したデータローダーのリポジトリであり、独自データを取り込むためのデータコネクタが多数公開されています。このデータコネクタを活用すれば、カスタムデータソースを大規模言語モデル(LLM)に接続することが可能になります​​。

つまり、効率的でシームレスなデータアクセスを提供し、LLMアプリケーションの開発を容易にする便利なOSSです。
今回はこのLlamaHubに公開されているMicrosoft OneDrive Loaderを使って検証していきたいと思います。

Microsoft OneDrive Loaderの概要

利用できるOneDriveの種類

このデーターローダーでは、コンシューマ向け(個人型)と法人向けそれぞれでサポートされているようです。
Microsoft 365を利用している企業様や官公庁様も増えてきているので今回実現したかったことでもある、OneDrive for businessに格納されたドキュメントに接続し、テキスト生成をやってみたいと思います。

サブフォルダの参照

デフォルトでは、指定したフォルダ配下はすべて検索対象になるようですが、シナリオによってはサブフォルダを検索させたくない場合も想定してスイッチが用意されているようです。

Authenticatonの設定

Microsoft OneDrive Loderでは、以下2つのMSAL 認証がサポートされています。

ユーザー認証

ブラウザベースでユーザーが対話型で認証する方式です。ユーザーがブラウザを通じて直接認証を行います。法人向けのOneDrive for business(Microsoft 365)を利用している場合、組織のMicrosoft Entraで認証を行うため、アプリ登録が必要となります。この時、必要となるAPI権限はFiles.Read.Allです。

コンシューマ向け(個人型)のOneDriveの場合は、ブラウザ認証を行うことで完結すると思います。(多分)

アプリ認証

クライアントIDとクライアントシークレットベースの認証で行います。上記の手動による認証が難しい場合に選択する手段になると思われます。クライアントIDとシークレットキーを用いることでサイレント認証を実現できるため、バックグラウンドプロセスやデーモンアプリケーションでの利用に最適です。

APIの権限は、サイレント認証を行うこともあって管理者権限が必要となります。(Microsoft Entraの仕組みとしても必要)

残念ながら、このアプリ認証はコンシューマ向け(個人型)のOneDriveでは実装不可になります。

やってみる

今回はアプリ認証にて実装してみます。

アプリ登録

以下Entraにログインしてアプリ登録を行います。

APIアクセス許可の登録で[アプリケーションの認可]を選択します。

必要な権限を登録した後、管理者の同意を与えます。

[証明書とシークレット]にて、新しいクライアントシークレットを作成します。有効期限があり、Max 24か月になります。

検証フォルダと資料の準備

検証用フォルダを用意します。「08_Develop」というフォルダを作成して配下に当社の紹介資料を格納しておきます。
今回の実装方法としては、フォルダパスを指定する方法で実装するために用意します。

一応、サブフォルダの資料も取得できているかを確認するために、サブフォルダ配下にも資料を確認しておきます。
わかりやすいように、当社事業の柱でもある、「デジタルツイン」の紹介資料を入れておきます。

コードの実装

LlamaHubにも記載の通り、すでにOneDriveのデータを取得するコードは公開されています。以下ざっくりした解説です。

登録したアプリの情報を登録

クライアントIDとシークレットキーの情報を以下に設定する必要があります。
以下のコードはLlamaHubに記載されている情報をそのまま張り付けているので、改修してください。

loader = OneDriveReader(client_id = "82ee706e-2439-47fa-877a-95048ead9318" , tenant_id = "02ee706f-2439-47fa-877a-95048ead9318", client_secret="YOUR_SECRET")

ドキュメントロードの設定

最もシンプルなフォルダパスを指定するコードです。
いずれの手法においても、UserPrincipalNameの指定は必要のようです。

# フォルダパスを指定してデータを読み込む
docs = loader.load_data(folder_path = "08_Develop", userprincipalname = "j-jinnai@atd-net.com")

後は、LlamaHub情報の通りです。

実行結果

バックエンドのシステムでクエリを投げてみると、適切な回答が返ってきていることがわかります。
また、デジタルツインに関する回答および、参照した資料もサブフォルダ配下に用意した資料なのでばっちりですね!

まとめ

このLlamaHubとLlamaIndexを活用すれば、今後OneDrive for Businessに格納された貴重なドキュメントを容易にコネクトでき、社内ChatBotシステムや、その他業務効率化のアプリ開発にも活用できると思います。
LlamaHubは今後もOSSが活発になると想定されますので、ウォッチが必要です。

当社、ATD InnoSolutionsでは、Microsoft製品や生成AI、デジタルツイン等の最新技術を活用してご支援を行っています。
IT技術の進化が著しい中、皆様と一緒に成長していけるようなビジネスを築いていきたいです。
ぜひとも、開発相談、協業に関しては是非お気軽にHPへお問合せください。

それではまた。

神内 惇一郎 (Founder.)

神内 惇一郎 (Founder.)

Microsoft 365 / Azureを活用したクラウド導入やシステム開発による自動化で企業のDXを推進。その後当社を創業し、現在はAIや機械学習を使った製品開発や事業企画に注力しています。 新しい事を考えて企画することが得意で、挑戦することが自身の原動力です。

TOP