社内文書をAIに探させるとき、その利用者が見てよい文書だけを対象にする必要があります。ここで問題になるのが、どの段階で絞るかです。
実際に測ったところ、絞らない構成では延べ24件が見てはいけない相手に返りました。検索の後で絞ると漏れは0件ですが、4人全員が10件に届きません。
文書400件・利用者4人で実際に測りました。絞らないと延べ24件が漏れ、後で絞ると全員が件数不足になります。
権限考慮検索で絞る場所を変えると何が起きるのかを、実際に測りました。用意したのは4部署にまたがる文書400件と、部署の違う利用者4人です。
検索も判定も本当に実行しています。文書ごとの閲覧範囲と、検索の点の付け方はコードに書いてあり、そこを変えれば結果も変わります。
const visible = (doc, user) => doc.open || doc.dept === user; // 1) 絞らない const none = ranked.slice(0, K2); // 2) 検索の後に絞る(上位K件を取ってから落とす) const after = ranked.slice(0, K2).filter((d) => visible(d, u)); // 3) 検索の前に絞る(見える文書だけを対象にする) const before = ranked.filter((d) => visible(d, u)).slice(0, K2);
絞る場所 利用者 返した件数 見えてはいけない件数 絞らない 営業 10件 5件 検索の後に絞る 営業 5件 0件 検索の前に絞る 営業 10件 0件 絞らない 人事 10件 7件 検索の後に絞る 人事 3件 0件 検索の前に絞る 人事 10件 0件 絞らない場合の、見えてはいけない文書の延べ件数: 24件 検索の後に絞った場合に、10件に足りなかった利用者: 4 / 4人
人事の行が分かりやすいはずです。絞らないと10件中7件が見てはいけない文書で、後で絞ると残るのは3件になります。
延べ24件という数字は、4人ぶんの合計です。1人あたり平均6件が、見てはいけない相手に返っています。
検索としては成功しています。エラーも出ません。返ってきた10件をその人が見てよいかは、検索の結果には表れません。
後で絞れば漏れは止まります。ところが4人全員が10件に届きませんでした。3件から5件です。
しかも足りない度合いは人によって違います。見える文書が少ない人ほど、残る件数も少なくなります。同じ構造の話はフィルタ付き検索の記事で扱っています。
3行目が答えです。見える文書だけを対象にして上位10件を取れば、漏れ0件で件数もそろいます。
ただし、これには利用者ごとに検索の対象を変える仕組みが要ります。pgvectorでも、近似の索引では絞り込みが索引を走査した後に当てられるため、結果が少なくなりうると明記されています。
漏れを止めるか、件数をそろえるか。絞る場所で決まる。
With approximate indexes, queries with filtering can return less results since filtering is applied after the index is scanned.原文pgvector/pgvector README この内容の有効期限2027-02-18
検索の対象を、利用者ごとに見える範囲へ限る構成です。文書側に閲覧範囲の情報を持たせるところから始まります。
権限考慮検索は、その利用者が見てよい文書だけを検索の対象にする構成です。誰が引いているかによって結果が変わります。
4番目に注意してください。「見てよい文書だけを使え」と指示に書いても、渡してしまった文書は取り消せません。
検索の前に絞るには、索引側の対応が要ります。pgvectorでも、条件付きの検索に索引を効かせる方法はいくつかあるとされ、絞り込む列に索引を作る、条件を含んだ索引を作る、値で分割する、といった選択肢が挙げられています。
部署が4つなら、部署ごとに索引を持てます。利用者ごとに範囲が違う構成では、分割のほうが現実的になります。
実装の前に決めることがあります。閲覧範囲を部署で決めるのか、役職で決めるのか、文書ごとの指定で決めるのかです。
この設計は検索の話ではありません。組織の話です。権限を引き継がない構成で何が起きるかはCopilot Studioの記事で扱っています。
確かめ方は簡単です。部署の違う2人で、まったく同じ問いを投げて結果を比べる。答えが同じなら、権限が効いていません。導入前に1度やっておけば済みます。
There are a few ways to index nearest neighbor queries with a WHERE clause.原文pgvector/pgvector README この内容の有効期限2027-02-18
返した件数を利用者ごとに記録します。足りない状態はエラーにならないので、数えないと分かりません。
権限考慮検索を入れた後に見るべきなのは、返した件数が要求どおりだったかです。前の節では、後で絞る構成で4人全員が不足しました。
足りない状態はエラーになりません。10件要求して3件返っても、検索としては成功です。
しかも足りる人と足りない人が混ざります。全体の平均で見ると、見える文書の多い人に薄められます。利用者ごとに記録してください。
製品側の対処もあります。pgvectorでは、行が足りない場合に索引をさらに走査する繰り返しの走査を有効にできるとされています。
十分な件数が集まるまで走査を続ける形です。見える文書が少ない利用者ほど、走査が長くなります。応答時間が人によって変わる点は押さえておいてください。
運用で見落とされやすいのが、権限そのものが変わることです。異動があれば、その人に見える文書の範囲が変わります。
索引に権限を焼き込んでいる構成では、変更のたびに作り直しが要ります。誰がいつ反映するかを決めておかないと、古い権限で引き続けます。
件数が足りなくてもエラーにならない。数えないと分からない。
For more rows, enable iterative index scans , which will automatically scan more of the index when needed.原文pgvector/pgvector README この内容の有効期限2027-02-18
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る