ユニット 6 / 11

アクセス制御、プロンプトテンプレート、会話管理

利益:

  • ユーザー権限に基づいて取得をフィルタリングするアクセス制御 (ACL) を設定する
  • コンテキストとユーザーの質問を適切に配置する堅固なプロンプト テンプレートを作成する
  • 複数ラウンドの会話における質問の独立性と履歴管理を練習する

私たちはアーキテクチャを確立しました。次に、安全で一貫性があり、会話可能なものにしましょう。この単元には 3 つの重要なトピックがあります: (1) ユーザーの権限に基づいて検索をフィルタリングするアクセス制御、(2) コンテキストと質問を正しく配置する堅牢なプロンプト テンプレート、(3) マルチラウンド チャットでの質問の独立性と会話履歴の管理。これら 3 つがなければ、アシスタントはデータを漏洩したり、一貫性のない回答をしたり、フォローアップの質問で失敗したりすることになります。

アクセス制御: 不正なデータは決して到着しないようにする

企業最大のリスク: ユーザーが見るべきではない文書が応答に漏洩する。非常によくある初心者の間違いは、「プロンプトで「非表示のドキュメントを表示」するようにモデルに指示する」ことです。これは安全ではありません。モデルは指示を忘れたり、すぐに注入することで指示を回避したりする可能性があります。正しい場所は回収段階です。許可されていない作品は決して持ち込まれるべきではありません。

これを行う方法は、検索中にフィルターとして各部分に配置した権限メタデータ (部門、役割、プライバシー レベル) を適用することです。アプリケーション層でユーザーが誰であるか (ID とロール) を安全に判断し、ACL (アクセス コントロール リスト) フィルターを呼び出しに追加します。

# 権限取得によってフィルタリング (概念的)user =authenticate(session) # 信頼できるソースから認証 = user.roles + ["everyone"] # 例: ["HR", "admin"]result = vektor_db.search( vektor=embed(question), top_k=20, filter={"permission_group": {"in": allowed}, # 許可される部分のみ "privacy": {"lte": user.level}} # 以下のレベル)

注意: モデルに権限を求めたり、プロンプトに頼ったりしないでください。 ID と権限はアプリケーションの信頼された層で決定されます。取得フィルターは必須であり、プロンプト指示は追加レイヤーにすぎません。 「プロンプトに書いた」というのはセキュリティではありません。

ソリッドプロンプトテンプレート

プロンプト テンプレートは、取得からのコンテキスト、ユーザーの質問、および動作の指示をまとめたスケルトンです。優れたテンプレートの一部: 役割/タスクの説明、行動規則 (グラウンディング、許可がわかりません、リソースの要求、口調)、コンテキスト、質問。

あなたは企業の人事アシスタントです。あなたの仕事は、次の文脈にのみ基づいて従業員の質問に答えることです。ルール:- 答えが文脈の中で明確でない場合は、「ドキュメントでこれに関する情報が見つかりませんでした。人事チームに確認してください」と書きます。推測したり、でっち上げたりしないでください。- 文脈内の情報源が矛盾する場合は、公式ポリシーを根拠として矛盾を述べてください。- 各主張の最後に、信頼する情報源を [出典: ファイル、セクション] として追加してください。- 短く、明確で、専門的な言葉で答えてください。コンテキスト:{numbered_parts}質問: {user_question}

コンテキスト部分 ([1]、[2]、...) に番号を付けると、モデルを引用しやすくなります。また、モデルが正しく引用できるように、各作品の冒頭に出典を記載します。

ヒント: プロンプト テンプレートを一定に保ち、変数 (コンテキスト、質問) を常に同じ場所に配置します。固定テンプレートは、一部のシステムでは即時にキャッシュされるため、テスト容易性が向上し、コストが削減されます。

背景:[1] (出典: ik_el_kitabi.pdf、セクション 5.2) 年次有給休暇は 14 日です...[2] (出典: ik_el_kitabi.pdf、セクション 5.4) 勤続 5 年以上の人の休暇は 20 日間です...

弱いプロンプト / 強いプロンプト

弱い (根拠なし、ソースなし、アイデンティティが混在している):

これらの文書を使用して質問に答えてください: {parts}ユーザー: {question}# 問題: モデルが文脈から外れ、でっちあげ、出典を引用せず、# 矛盾した勝手な動作をします。

強力 (ロール + ルール + 番号付きコンテキスト + ソース必須):

あなたは... CONTEXT に頼ってください。それ以外の場合は、「わかりません」と言ってください。矛盾がある場合は、公式のポリシーを選択してください。各主張に [出典: ...] を追加します。文脈: [1]... [2]... 質問: {質問}# 結果: 文脈に忠実で、出典が示され、矛盾を正しく管理した回答。

マルチツアーの会話管理

実際のユーザーは、質問を 1 つもせずに放置することはありません。話す。 「年次休暇は何日ありますか?」 →「入社6年目は?」 →「どうやって申請すればいいの?」 2 番目と 3 番目の質問だけでは意味がありません。前のコンテキストによって異なります。

2 つの問題を解決する必要があります。 1 つ目は検索用です。フォローアップの質問を独立させます (質問の書き換え)。 「6年目の社員はどうですか?」 →「勤続6年目の従業員は何日の年次有給休暇を取得できますか?」この独立した質問で検索します。 2 つ目は実稼働用です。会話履歴もモデルに提供して、一貫して継続できるようにします。

# 2 ステップ: 独立化 → 検索 → 履歴を使用して生成 (概念的) Individual = model.uret( "会話履歴を使用して、質問をそれ自体で理解できるようにします:\nHistory: {history}\nQuestion: {follow_question}") context = retrieval(independent) # 独立した質問で検索answer = model.uret(prompt(context,history,follow_question))

履歴が大きくなるにつれて (会話が長くなり)、一度にすべてを送信するとコストが高くなり、コンテキスト ウィンドウがいっぱいになってしまいます。解決策: 以前のラウンドを要約するか、最後の N ラウンドを保持して以前のラウンドを要約に減らします。したがって、コストは常に管理され、一貫性が維持されます。

ステータス

問題

解決策

フォローアップの質問には文脈がありません

検索検索は無意味

質問を独立させる(書き直す)

長いおしゃべり

コストと窓口の膨張

過去のツアーまとめ

ユーザーがトピックを変更しました

古いコンテキストが感染する

新しいトピックに対する過去の影響を軽減する

権限はツアーによって異なる場合があります

漏洩の危険性

ラウンドごとに ACL フィルターを再適用する

ミニケース3個

ケース 1 — プロンプトに関する「セキュリティ」の誤り。ある企業はアシスタントに誰でも質問できる機密の給与文書を置いたが、その案内には「給与情報を提供しないでください」としか書かれていなかった。ユーザーが遠回しに質問すると、モデルは給与範囲を漏らした。 ACL フィルターを検索に追加すると (給与部分は HR ロールのみ)、リークは完全に閉じられました。その部品はもう持ち込まれないからです。

ケース 2 — 文脈のないストーキング。サポート アシスタントで、ユーザーは「返品期間は?」と尋ねます。 →「壊れた商品はどうなりますか?」システムは「壊れた製品」に関係のない部品を持ち込んできました。質問に独立性を追加した場合 (「壊れた製品の返品期間はどれくらいですか?」)、正答率は 44% から 90% に増加しました。

ケース 3 — 膨らんだ過去。アシスタントとの 30 回のチャットで、各通話で履歴全体が送信されました。コストはラウンドごとに 3 回増加し、応答は遅くなっていました。過去 6 ラウンドを保持し、以前のラウンドを要約する構造に切り替えたところ、トークンコストが 62% 低下し、一貫性が維持されました。

よくある間違い

  • プロンプトに権限を残す: モデルは忘れるかバイパスします。 ACL フィルタは取得時に必須です。
  • コンテキストを列挙していない: モデルは正しい出典を引用できません。
  • フォローアップの質問を独立させていない: 検索は無意味に検索します。
  • すべての履歴をブラインドで送信すると、コストと遅延が爆発的に増加します。要約します。
  • 矛盾ルールを書かない: モデルは信頼性の低い情報源を公式として提示する可能性があります。

要約すると

  • アクセス制御は、取得フェーズ中にメタデータ フィルターを使用して実装されます。許可されていない部品は絶対に持ち込まないでください。
  • ID と権限は信頼できるアプリケーション層で決定されます。迅速な指示は、単なる追加の防御層にすぎません。
  • 堅牢なプロンプト テンプレートには、役割、行動規則 (グラウンディング、許可が不明、ソース、競合)、番号付きのコンテキスト、および質問が含まれています。
  • 複数ラウンドの会話では、フォローアップの質問は分離され、モデルは履歴と一貫した回答を生成します。
  • 長い歴史を要約することで、コストとコンテキスト ウィンドウを制御できます。 ACL はラウンドごとに再適用されます。

アプリケーションタスク

(1) 自分のアシスタント用に少なくとも 3 つの権限グループ (全員、部門、マネージャーなど) を定義し、どのドキュメント タイプがどのグループに対して公開されるかを表に書き込みます。 (2) 自分の役割とトーンに応じて、上記のプロンプト テンプレートを調整して作成します。コンテキストに番号を付け、ソースを指定します。 (3) 3 ラウンドの現実的な会話シナリオ (質問 → フォローアップ → フォローアップ) を作成し、各フォローアップの質問の独立したバージョンを手動で生成します。 (4) このシナリオでラウンドごとに ACL フィルターを再適用する必要がある理由を 1 文で説明してください。

チェックリスト

  • [ ] 私は取得フィルターを使用してアクセス制御を実装していますが、プロンプトには依存していません。
  • [ ] プロンプト テンプレートに根拠を追加しますが、許可、ソース、競合ルールがわかりません。
  • [ ] コンテキスト部分に番号と参照を付けます。
  • [ ] 検索前にフォローアップの質問を独立させます。
  • [ ] 長い会話履歴をまとめてコストや窓口を管理しています。