Liferay DXPでは2026Q1からセマンティック検索がサポートされるようになりました。
とはいえ、テキスト埋め込みプロバイダーとしてベクトル化してKNN(k
近傍法)検索するものです。
お手軽にセマンティック検索が利用できるようになるので、これはかなり興味深いです。
とはいえ、一般的にベクトル化する際はコンテンツの文字数が大きくなるとベクトルの精度が下がります。
Liferayのセマンティック検索でも最大文字数やテキスト切り捨て戦略などの設定が推奨されています。
ですので、マニュアルなどの長文のコンテンツで、コンテンツの数も多いシステムの場合はあまりマッチしない可能性もありそうです。
おそらく、こういうお客様には今回紹介するArticul8を使った方が効果は感じられると思います。
Articul8ってなに?
Articul8はアメリカ生まれの生成AIでエンタープライズなユースケースで利用されることを想定して作られていまして、弊社で取り扱っている製品の一つです。
こちらでも紹介していますのでよかったら見てみてください。
Articul8のナレッジグラフはRAGのようなベクトル情報だけではなく関連付けの為のメタデータをグラフデータで管理しているのでデータがスケールしても関連性を見失わないのが大きなポイントです。
他にも個人的にArticul8がLiferayと親和性が高いと思っているのは以下のポイントです。
- SaaSや自社VPC、オンプレミスなど稼働させる環境の自由度が高い
- 1契約(テナント)内に複数のグループを作れる
- コンテンツをベクトル化だけではなくグラフ化したナレッジグラフで関連性を管理
- 取り込んだナレッジから回答を生成するのでハルシネーション起きない
とくに2点目のグループはIngestするデータをグループごとに分割することができます。
通常、生成AIにコンテンツをIngestするとRAGなど関連性を持った形で保存され、生成AIモデルが認識しやすくなります。
ただ、この状態でLiferayの権限管理を生成AIの回答にも適用させることはとても難しいです。
LiferayをMCPサーバー化してAPIの認証で権限を適用させることはできるものの、あくまでもMCPサーバー上のデータで生成AIのナレッジではないので、どこまでセマンティックなアクセスができるのかは個人的には懐疑的です。
で、Articul8だとグループという概念でIngestしたデータのスペースを分離できるので、Liferayのロールとグループを紐づけて、各ロールでアクセスできるコンテンツが適切にグループに振り分けることができます。
あとはAPIなどリクエストの際にどのグループ(複数指定可能)に対して検索を行うか。を指定することでシンプルな運用で権限制御ができるようになります。
実際に連携させてみる
Articul8はIngestや検索などUIで操作できる処理はAPIからもアクセス可能です。
APIの利用には以下の情報が必要です。
- プラットフォームで発行する認可トークン
- 契約したテナント情報
- アクセスするグループ情報
APIを利用する事で、連携はすごく簡単に実現できます。
今回使ったAPI
ファイルのIngest
LiferayからArticul8にファイルをIngestするときに使うAPIのエンドポイントはこちらです。
/v1/search/mgmt/files
ServiceWrapperを使ったカスタマイズで、ファイルをアップロードするとこのAPIを実行するようにすることでLiferayにアップロードされたファイルを自動的にArticul8に連携することができます。
セマンティック検索
Articul8ではエージェント機能などナレッジを利用して検索を行う機能はいくつかあります。
今回はその中でもArticul8の特徴的なマルチモデルをオーケストレーションしながら回答を生成するModelMesh APIを利用しています。
/v1/modelmesh-api/sse
これを独自のウィジェット(Portlet)の検索フォームから実行することで、上記のIngest APIで同期したファイルから生成されたナレッジグラフに対して問い合わせをして、目的のファイルだけでなくそのファイルの要約まで生成してくれるので、これまでの以下の操作が1アクションで実行できるので業務がよりスムーズになります。
- 検索する
- ファイル見つける
- ファイルをダウンロードする
- ファイル開く
- ファイルの中身を確認する
エンドポイントにSSEとあるようにREST APIのSSE(Server-Sent Events)になっています。
GraphQLのAPIもありますが、今回はRESTを使っています。
(GraphQLだとWebSocketの実装も必要なのでJavaだとちょっとめんどい)
できたもの
Ingestの同期
LiferayにアップロードするとArticul8に自動的にIngestしてます。
アップロードしたのはLiferayの事例などの資料です。
ちなみにチャットの回答に引用元の情報としてファイルのURLが返ってくるけど、Articul8上のURLになっています。(そりゃそうだ)
でもLiferayのUIを見せてる場合はLiferay上のファイルのURLにしたいというお客様が大半だと思います。
IngestのAPIのレスポンスの中にArticul8のファイルのIDが返ってくるので、それをLiferayのexternalReferenceCodeにセットすることでLiferayとArticul8のファイル情報を紐づけています。
この中にAllianz 社の事例が含まれているので、これを検索してみようと思います。

チャットフォーム
チャットのフォームに「アリアンツってどういう風に使ってるの?」とキーワードには引っかからないような自然言語を入れてみます。

体感で1分ほどするとArticul8からの回答が返ってきます。
目的のファイルに自然言語でヒットして、そのファイルを引用しながら要約を返してくれています。
あえて「Liferayの事例」と入力していませんが、Ingestした中にはLiferayに関連する情報しか含まれていないので、アリアンツ社のLiferay以外の事例は含まれません。
この部分がArticul8がIngestしたデータから回答を生成する。という点に由来します。
お客様のデータからのみ回答を生成するので生成AIでよく問題が起こるハルシネーションの問題が起きにくくなります。
(もちろんインターネット上の情報も含めて生成するようにもできます)

まとめ
いかがでしたでしょうか。
このように軽くカスタマイズして、LiferayとArticul8の連携ができました。
Articul8ではチャット以外にもデジタルツインやコンプライアンスマネージャー、他にもドメイン特化のアプリケーションを構築することもできます。
例えば、LiferayとArticul8の連携で行くとワークフローで申請する際にAIにプレ申請を行う事で、承認フェーズの負荷を下げたり承認までの効率を上げるようなこともできると思います。
OxygenDesignではLiferayのコンサルテーション以外にもArticul8の導入支援も行っています。
ご興味があればぜひお問い合わせください!
まつもとでした!







