サイト内検索

前回の記事では、VAST InsightEngineでシンプルなリアルタイムRAGアプリケーションを作成しました。
一方で、実ユースケースを想定すると、企業や組織単位でユーザーやグループごとのアクセス制限が必要となります。
例えば、個人の評価など担当レベルが見てはいけないデータ、マネージャーしか見えないデータなどがあります。
RAGアプリケーションを作る際には、このデータをしっかりと権限分けする必要があります。(担当が、他の人の人事評価は?と聞いて表示されたり、インターンの方が社内の機密情報にアクセスできたら大問題です)

権限設定によるアプリケーションの複雑化

この権限分けを従来のシステムで実現するには複雑な設計が必要となります。権限分離をRAGシステムで実現するためには以下のようなパターンが考えられます。

 1. テナントごとにベクトルDBを作成して、ユーザー or 所属組織においてアクセス設計を作成する。

 2. 単一のベクトルDBにテナント情報を入れて、ベクトル検索の際にフィルタリングを行う。 

 
テナントごとにベクトルDBを作成して、ユーザー or 所属組織においてアクセス設計を作成する。

このような権限構成をとる時は以下のような構成になります。テナントごとにベクトルDBのschemaを作成してテナントごとにアクセスする設計をおこないます。

この手法は、schemaごとにデータを管理しているのでアプリケーション側での実装は比較的簡単に実装することが可能です。また、データベースが分離しているので運用に関しても非常に扱いやすいです。

しかしながら、テナント数が多くなるとschema管理が煩雑化するというデメリットがあります。さらに、あるテナント内でのユーザーごとにアクセス権限を付けようと考えるとさらに構成は複雑化します。また、テナント横断の検索を実行する点でも実装が複雑になります。

 

単一のベクトルDBにテナント情報を入れて、ベクトル検索の際にフィルタリングを行う。
このような構成をとる時は、ベクトル検索をおこなう際にテナント情報でフィルタリングをかけ、アクセス制限を実現します。
そのため、ベクトルDBは単一schemaのみで構成され、管理は非常に楽になります。しかしながら、動的に権限の変更ができないため、テナント数が大規模になるとIndex管理が複雑になります。例えば、新年度でチームの合体や分離が発生するとそのたびにschema内の情報を書き換える必要があります。

VAST DataによるベクトルDBに対する権限設定

VAST InsightEngineでは、VAST Data内でベクトルDBを作成・使用しているので、VAST Data内でベクトルDBに対して権限設定をおこなうことが可能です。さらに、VAST Dataはテーブルデータに対して、VAST S3バケットの権限に基づいた列ベースの権限設定を加えることができます。
すなわち、生データを基に作成したベクトルデータに対して、その生データと同じアクセス権限を設定することができるようになります。元データ自体の権限設定はVAST Data側から動的に行うことができるため、動的にベクトルの権限を変更することが可能になります。

この機能は、単一schemaでのデータ管理ができる、動的にベクトルDBの権利を変更できる、というメリットがあり従来のRAG構築の手間を大幅に削減し、運用の手間を減らすことができるようになります。

 

今回は、この方法を用いてVAST DataのベクトルDBを構築します。構築方法はシンプルで、テーブルにvastdb_s3_path_authというカラムを加えるだけです。この名前のカラムはVAST Dataの方ですでに予約列として登録されております。ここにS3バケットに保存されているデータのパス(S3バケット/キー)を入力すればそのパスに応じたアクセス制限がおこなわれます。
ここでは、実際に以下の文章を使用します。 

general_info.txt

株式会社マクニカ(英: MACNICA, Inc.)は、神奈川県横浜市港北区に本社を置く、半導体やサイバーセキュリティなどを扱うVAD事業と、サイバーフィジカルシステムソリューション事業の2つの事業を行う会社である。一般的に専門商社に分類される。

company_info.txt

マクニカクラビスカンパニーは、NVIDIA、VAST Data、Texas Instruments、Renesasを主に扱っています。
マクニカアルティマカンパニーは、Intel、Alteraを主に取り扱っている。
マクニカネットワークスカンパニーは、CrowdStrike、Box、Exabeamなどのセキュリティ商品を扱っている。

権限付きのベクトルDBをVAST Dataで作成する

general_info.txtはマクニカ全体の一般的な情報が入ったmacnicaバケットに、company_info.txtは社内メンバーのみ見ることができるmacnica-tecバケットに保存しています。
今、こちらのデータを保存するDBを作成します。
ベクトルDBのカラムは、テキストのベクトル(vecカラム)、テキスト(sentenceカラム)、vastdb_s3_path_authとなっております。

このベクトルDBにデータを挿入するのサンプルコードを添付します。
実際RAGシステムでは、お手持ちの内容に準じた、文章の準備とそのベクトル化が必要となります。

import pyarrow as pa
import vastdb
DB_ENDPOINT = "http://10.0.50.70"
DB_ACCESS_KEY = "バケットのアクセスキー"
DB_SECRET_KEY= "バケットのシークレットキー"
DB_BUCKET_NAME = "DBのバケット名"
SCHEMA_NAME = "SCHEMA名"
TABLE_NAME ="TABLE名"
##DBと接続を取る
session = vastdb.connect
    (
    endpoint=DB_ENDPOINT,
    access=DB_ACCESS_KEY,
    secret=DB_SECRET_KEY
    )
#insertするデータの形式を規定
#2048次元ベクトルとその文章を入れるデータ形式
##ベクトルデータをvecとして、文章データをsentenceとして保存
dimension = 2048
columns = pa.schema([
                    ("vec", pa.list_(pa.field(name="item", type=pa.float32(), nullable=False), dimension)),
                    ('sentence', pa.string()),
                    ('vastdb_s3_path_auth',pa.string())
                    ])
#インサートするデータを作成
#ベクトルデータ二つのダミーデータ
vector = [[0.1]*2048,[0.2]*2048]
 #文章二つのダミーデータ
sentence = ["Hello VAST!","Hello, InsightEnigne!"]
#S3バケットとそのキー。ダブルクォーテーションマークまで入れる。
s3_path = ['"macnice/general_info.txt"','"macnica-tec/company_info.txt"']
#DBに挿入するデータを作成
data = [vector,sentence,s3_path]
datas = pa.table(schema=columns,data=data)
#実際に繋いでベクトルを挿入
with session.transaction() as tx:
    bucket = tx.bucket(BUCKET_NAME)
    #新規schema作成
    schema = bucket.create_schema(SCHEMA_NAME)
    #新規table作成
    table = schema.create_table(TABLE_NAME,columns)
    table.insert(datas)

実際にRAGを試す

この権限ルールで作成したRAGを実際に試してみます。
VAST Data内でmacnicaバケットのみとmacnica-tecとmacnicaバケットの両方にアクセスできるような、ポリシーを作成します(それぞれ、query_policyとquery_policy_allという名前です)。次に、macnicaバケットのみにアクセスできるポリシーをNormalグループに適用して、macnica-tecとmacnicaバケットの両方にアクセスできるポリシーをmacnicaグループに適用します。

query_policy

query_policy_all

グループ情報

この状態で実際に、グループを切り替えてRAGの質問を投げます。query_policyが適用されている場合general_info.txtのみの情報が反映されてquery_policy_allが適用されている場合company_info.txtの情報も適用されます。

VAST InsightEngineによるRAGシステム構築のメリット

全3回の記事で、VAST InsightEngineによるRAGシステムの構築を解説しました。VAST InsightEngineは従来のRAGアプリケーションに必要なシステムを全て備えております。特に、アプリケーションの一番の詰まりどころである権限回りもVAST InsightEngineでカバーすることができます。この機能を用いることで、RAGアプリケーションの開発を加速化し、使用していないデータをさらに再利用することができるようになります。

お問い合わせはこちら