【ITニュース解説】How to Connect Microsoft Agent Framework to Alfresco in C# - RAG Without a Vector Database
2026年10月21日に「Dev.to」が公開したITニュース「How to Connect Microsoft Agent Framework to Alfresco in C# - RAG Without a Vector Database」について初心者にもわかりやすく解説しています。
ITニュース概要
C#のMicrosoft Agent Framework(MAF)でAIアシスタントを作る際、文書管理システムAlfrescoの情報を活用し、質問に引用付きで答える方法を解説する。ベクトルデータベースを使わず、MAFのTextSearchProviderを介してOpenDMAと連携し、Alfresco内の既存データインデックスを直接検索する。初期構築が簡素化され、常に最新情報を参照できる。
ITニュース解説
このニュース記事は、Microsoft Agent Framework (MAF) を使用して、企業内のドキュメント管理システムであるAlfrescoに保存された情報から、質問に回答し、その情報源を引用するAIアシスタントをC#で構築する方法について解説している。特に、AIアシスタントを構築する際に一般的に用いられる「ベクターデータベース」を、このアーキテクチャでは使用しない点が特徴だ。システムエンジニアを目指す初心者でも理解できるよう、その背景と具体的な仕組みを説明する。
まず、AIアシスタントが企業内の特定の情報に答えるためには、「RAG (Retrieval Augmented Generation)」と呼ばれる手法がよく使われる。これは、AIが回答を生成する前に、関連する情報を外部の知識ベースから「検索(Retrieval)」し、その情報を使ってより正確な回答を「生成(Generation)」するというものだ。このRAGを実現する一般的な方法として、企業内の全てのドキュメントを読み込み、テキストを小さな塊(チャンク)に分割し、それぞれのチャンクを「埋め込みベクトル」という数値の並びに変換して「ベクターデータベース」に保存するという手法がある。そして、ユーザーの質問もベクトルに変換し、意味的に近いドキュメントのチャンクをベクターデータベースから探し出す、というプロセスを経る。しかし、この方法では、ドキュメントが更新されるたびにベクターデータベースも同期する必要があり、管理が複雑になるという課題がある。
本記事で提案されているのは、このベクターデータベースを使わない、よりシンプルなRAGのアーキテクチャだ。このアプローチでは、Alfrescoが元々持っている全文検索機能とインデックス(検索用の目録)を直接利用する。中心となるのは、以下の3つの要素である。
- Microsoft Agent Framework (MAF): これは、C#というプログラミング言語でAIエージェント(AIアシスタントの頭脳)を構築するためのフレームワークだ。MAFには、
TextSearchProviderという機能がある。これは、AIエージェントが外部から情報を検索するための「拡張ポイント」であり、どのような検索システムとでも連携できる柔軟性を持つ。 - Alfresco: これは、企業内で文書やファイルを管理するためのドキュメント管理システムだ。既に全文検索機能とそれに伴うインデックスを持っている。
- OpenDMA: これは、Alfrescoのような多様な企業ドキュメント管理システム(ECMシステム)と、アプリケーションとの間に立つ「通訳」のような役割を果たすミドルウェアだ。OpenDMAを使用することで、MAFアプリケーションはAlfresco固有の複雑なAPI(プログラムの命令セット)を直接呼び出すことなく、共通の簡単な方法でドキュメントの検索や読み取りができるようになる。
この新しいアーキテクチャにおける具体的な情報の流れは以下のようになる。
まず、ユーザーがAIアシスタントに質問をする。例えば「Project Apolloのサプライヤー遅延と予算リスクについて教えて。使用したドキュメントも引用して。」といった質問だ。AIアシスタント(MAFのChatClientAgent)は、質問全体をそのまま検索するのではなく、TextSearchProviderの機能と連携し、質問の中から「サプライヤー遅延」「予算リスク」といった集中した検索キーワードを賢く選び出す。
次に、これらの検索キーワードは、C#アプリケーション内部にある検索コールバック関数に渡される。この関数は、受け取ったキーワードを、Alfresco独自の全文検索クエリ言語である**AFTS(Alfresco Full-Text Search)**の形式に変換する。この変換の際には、AIが生成したキーワードをより正確な検索に適した形に整形し、また「Project Apolloサイト内のみを検索する」といった制約(サイトスコープ)も自動で追加する。これは、AIが生成したキーワードが必ずしも完璧ではないため、安全かつ正確な検索を行うための重要な工夫だ。
変換されたAFTSクエリは、C#アプリケーションからOpenDMA C# RESTクライアントを通じて、OpenDMAのREST APIに送信される。OpenDMAは、このクエリをAlfrescoが理解できる形に変換し、Alfrescoアダプターを介してAlfrescoに検索を指示する。
Alfrescoは、自身の既存のインデックスを使って関連するドキュメントを検索し、その結果をOpenDMAに返す。OpenDMAからC#アプリケーションに検索結果が戻ってくると、検索コールバック関数は、取得したドキュメントの中から、質問に関連する短いテキストスニペットを抽出する。さらに、そのスニペットが含まれるドキュメントのタイトル(SourceName)、Alfrescoへのリンク(SourceLink)、その他の必要なメタデータ(RawRepresentation)を整理し、TextSearchProvider.TextSearchResultという形式でAIアシスタントに返す。
最終的に、AIアシスタントはTextSearchProviderから受け取ったこれらのテキストスニペットを「情報源」として利用し、ユーザーの質問に対して回答を生成する。この際、SourceNameやSourceLinkの情報を使って、どのドキュメントから情報を得たかを引用付きで示すことができるのだ。
このアーキテクチャの最大の利点は、企業内のドキュメントを別のデータベースにコピーしたり、同期したりする手間が不要になることだ。ドキュメントは常にAlfrescoという本来の場所に保管され、必要なときにリアルタイムで検索される。企業環境ではドキュメントの内容、アクセス権限、サイトのメンバーシップなどが頻繁に変わるため、ベクターデータベースを常に最新の状態に保つのは大変な作業となる。このアプローチならば、そのような同期の問題を回避し、常に最新かつ正確な情報に基づいて回答を生成できる。また、実装が比較的シンプルであるため、まずは小規模にAIアシスタントを構築したい場合に非常に有効だ。特に、プロジェクト名や契約番号、製品コードなど、正確なキーワード検索が重要なエンタープライズ系の質問には非常に適していると言える。
しかし、この方法にも限界がある。この手法はAlfrescoの全文検索を利用するため、ユーザーの質問に使われた単語が、関連するドキュメント内に直接含まれていない場合、適切な情報を見つけられないことがある。例えば、「幸福」という単語で検索しても、ドキュメントに「幸せ」と書かれていた場合、見つけられない可能性がある。これは、単語の意味的な類似性(セマンティック検索)を重視するベクター検索とは異なる点だ。ただし、AIエージェントが検索キーワードを工夫することで、ある程度は補完できる場合もある。
また、AIが生成する検索キーワードや、検索結果として得られたドキュメントの内容は、常に慎重に扱う必要がある。AIが不適切なキーワードを生成したり、ドキュメントの内容が「指示」のように見えても、AIアシスタントの挙動を直接制御する「命令」として扱わないよう、開発者が適切な指示をAIに与えておくことが重要だ。
OpenDMAを使うことには、戦略的な意味合いも大きい。OpenDMAは、MAFアプリケーションを特定のECMシステム(Alfresco)から独立させる役割を果たす。これにより、将来的にAlfresco以外のドキュメント管理システムに切り替える必要が生じても、AIアシスタントのコードを大きく変更することなく対応できる可能性が高まる。また、OpenDMAを介することで、監査ログの取得、ユーザーの権限管理(RBAC)、セキュリティ情報イベント管理(SIEM)との連携など、エンタープライズレベルで必要とされる様々な機能を一元的に追加・管理できる基盤を提供できる。
このニュース記事は、ベクターデータベースを使わずに、既存の企業ドキュメント管理システムの検索機能を活用することで、よりシンプルで保守しやすいAIアシスタントを構築する現実的な方法を提示している。まずは、テキスト検索と引用付き回答が必要なシンプルなユースケースからAIアシスタントをスタートさせたい、と考えているシステムエンジニアの初心者にとって、非常に参考になるアプローチである。
文字数: 1918文字