展示如何在 RAG 中集成细粒度权限控制(FGA)实现企业级数据隐私。对构建商用 AI 系统的开发者有实用参考。
几分钟内测试完,数天内上线。
构建企业级 LLM 应用已成为当下业务环境的必然需求。虽然模型和 API 的可访问性在不断改善,但一个重大挑战依然存在:确保它们的安全性并有效管理其权限。
为了解决这个问题,细粒度授权(Fine-Grained Authorization,FGA)和检索增强生成(Retrieval Augmented Generation,RAG)是构建安全、上下文感知且保持严格访问控制的 AI 应用的有效策略。在这篇文章中,我们将探讨如何在医疗保健环境中应用 FGA 和 RAG,同时保护敏感数据。
我们将通过指导你使用三个工具——AstraDB、Langflow 和 Permit.io——实现支持实时更新的基于关系的访问控制(Relationship-Based Access Control,ReBAC)授权系统。
为了更好地理解 LLM 应用中授权的复杂性,以及 FGA 和 RAG 提供的解决方案,我们可以看一下数字医疗保健领域——它是一个完美的例子,既需要 AI 能力,也需要严格的安全措施。医疗保健提供者越来越希望利用 LLM 来简化工作流程、改进决策制定并提供更好的患者护理。医生和患者都希望通过直观的 AI 界面(如聊天机器人)轻松访问医疗记录。
然而,医疗数据高度敏感,应该受到仔细管制。虽然 LLM 可以提供智能见解,但我们必须确保它们只访问和透露用户有权看到的信息。例如,医生应该只能看到来自其分配的医疗中心的诊断,患者应该只能访问自己的记录。
继续使用数字医疗保健示例,让我们看一个医疗应用的例子。
该应用由多个资源、几个角色以及这些实体之间的关系组成:
资源类型:
角色:
关系:
正如你所看到的,我们资源的分层关系意味着实现传统的基于角色的访问控制(其中权限直接分配)将是不充分的。
这个应用的授权复杂性将要求我们使用更细粒度的授权(FGA)解决方案——在本例中是基于关系的访问控制(ReBAC)。
ReBAC 是一种受 Google Zanzibar 论文启发的授权模型,从系统中实体之间的关系推导权限——不同于传统的基于角色的访问控制(RBAC),其中权限是直接分配的。
ReBAC 的强大之处在于权限如何通过这些关系派生。让我们看一个我们示例的可视化表示:
在上面的例子中,巴托什医生对病毒诊断的访问权限不是因为直接授予的权限,而是因为他被分配到华沙医疗中心,该中心包含下午就诊,而该就诊包含该诊断。因此,这些资源之间的关系形成了一条链,使我们能够推导访问权限。
使用这种方法有明显的好处:
但挑战还不止于此——由于我们正在构建一个需要与 LLM 一起工作的系统,它需要能够实时评估这些关系链。在下一部分中,我们将学习如何创建一个允许这样做的实现。
在我们继续之前,让我们快速回顾一下我们想要确保到位的授权规则:
这些需求可以通过使用检索增强生成(RAG)来实现。
RAG(检索增强生成)是一种通过结合两个关键步骤来增强 LLM 输出的技术:首先从知识库检索相关信息,然后使用该信息来增强 LLM 的上下文以获得更准确的生成。虽然 RAG 可以与传统数据库或文档存储一起工作,但向量数据库对此特别强大,因为它们可以执行语义相似性搜索,即使精确关键字不匹配,也能找到概念相关的信息。
在实践中,这意味着当用户询问有关"心脏问题"时,系统可以检索关于"心脏病"或"心血管疾病"的相关文档,使 LLM 的响应既更准确又更全面。"生成"部分随后涉及 LLM 将检索到的上下文与其预训练知识合成,以产生与你的特定数据相关的、有事实依据的相关响应。
对于我们的实现,我们将使用 AstraDB 作为我们的向量数据库。AstraDB 提供以下好处:
为了实现我们的 RAG 管道,我们还将使用 LangFlow,一个开源框架,通过其可视化界面使构建这些系统变得直观。LangFlow 系统可以在本地运行的 Python 环境中开发,也可以在云托管的 DataStax 平台中开发。在我们的情况下,我们通过在 https://astra.datastax.com 下创建无服务器(向量)AstraDB 数据库来选择第二个选项。
在我们的实现中,授权检查应该在一个关键时刻进行——在从向量数据库检索数据之后,但在将其提供给 LLM 作为上下文之前。这样,我们通过首先找到所有相关信息,然后在未授权数据到达 LLM 之前将其过滤掉来维持搜索效率。LLM 只能使用和透露用户有权查看的信息。
这些安全检查使用 Permit.io 实现,它提供了用于实时评估复杂关系链的基础设施。随着你的数据增长和关系变得更加复杂,系统继续确保每条信息只能被有适当授权的人访问。
要开始使用 Permit,你可以通过访问网站 https://app.permit.io 轻松创建一个免费账户。一旦创建了免费账户,你将能够访问 Permit 的仪表板,在那里你可以设置授权策略、管理用户和角色,并将 Permit 集成到你的应用中。免费层提供了所有必要的功能来创建一个具有基于关系的访问控制(ReBAC)的数字医疗保健示例。
LangFlow 和 Permit 都提供免费账户来开始工作,所以你不必付费就能构建这样的系统并看到它如何工作。
在我们深入实现细节之前,了解我们将使用的工具——Langflow 是很重要的。Langflow 建立在 LangChain 之上,是一个开源框架,通过可视化界面简化了复杂 LLM 应用的创建。LangChain 通过为常见 LLM 操作(如文本分割、嵌入生成和思维链提示)提供标准化组件来提供强大的基础。这些组件可以组装成强大的管道,处理从数据摄入到响应生成的所有工作。
使 Langflow 对我们的用例特别有价值的是其可视化构建器界面,它允许我们通过图形化连接组件来构建这些管道——类似于你可能绘制流程图的方式。这种可视化方法使得更容易理解和修改数据通过我们应用的流动,从初始用户输入到最终授权响应。此外,Langflow 的开源性质意味着它既免费使用,也可以用自定义组件扩展,这对于实现我们的授权检查至关重要。
我们的 Langflow 解决方案利用两个不同但相互关联的流来提供对医疗信息的安全访问:
摄入流负责将诊断及其各自的嵌入加载到 AstraDB 中。我们使用 MistralAI 为每个诊断生成嵌入,这使得稍后可以对诊断数据进行语义搜索。此流中涉及的关键组件是:
聊天流负责与用户交互并为他们提供所需的诊断数据。下面的图像应该从左到右阅读(第一个图像的右侧继续为第二个图像的左侧):
💡 注意:*有一个额外的 "*Pip Install" 组件仅执行一次以安装 permit 模块。这是因为我们在 DataStax 低代码平台上实现 LangFlow。这一步等价于在本地执行 pip install permit。
聊天流中操作的顺序如下:
用户输入: 用户通过键入查询启动交互。示例:"Do we have any patients with diabetes diagnosis?"
检索诊断: 根据用户的输入查询 AstraDB 以获取相关诊断。示例搜索结果(在流图像中标记为 1):
基于权限过滤数据: 在将响应发送到下一个处理组件之前,创建用于 LLM 响应初始查询的上下文,我们使用自定义 PermitFilter 组件过滤检索到的诊断,以确保用户有权查看每个诊断。示例过滤结果(在流图像中标记为 2):
生成响应: 过滤后,被允许的诊断用作上下文,使用 MistralAI 为用户提示生成响应。示例带有通过授权步骤过滤的上下文的提示:
Seasonal Migraine
Flu virus with high fever
---
You are a doctor's assistant and help to retrieve information about patients' diagnoses.
Given the patients' diagnoses above, answer the question as best as possible.
The retrieved diagnoses may belong to multiple patients.
Question: list all the recent diagnoses
Answer:
要运行 PermitFilter 组件(在我们的实现中发挥至关重要的作用),我们需要一个运行中的 Permit 策略决策点(Policy Decision Point,PDP)实例。PDP 负责评估策略并决定给定的操作对特定用户和资源是否被允许。通过在上下文到达语言模型之前强制执行此权限检查,我们防止了敏感信息的泄露,并确保了访问控制策略的执行。
完整实现可在我们的 GitHub 存储库中获得,你会找到:
要开始与实现了授权检查的 AI 助手交互,我们可以简单地启动 LangFlow 游乐场。在下面的例子中,我以 bartosz@health.app 的身份进行身份验证,这意味着我只能访问 Afternoon-Visit 和 Evening-Visit,不能访问 Morning-Visit with Diabetes。这意味着 LLM 在其上下文中没有关于糖尿病的信息。
在保护敏感医疗保健数据的访问的同时利用 LLM 功能既是优先事项,也是挑战。通过结合 RAG 和细粒度授权,我们可以构建既智能又安全的 AI 应用。关键好处是:
使用 LangFlow 和 Permit.io 等工具,医疗保健提供者可以实现基于关系的访问控制系统,这些系统动态响应角色和关系的更改,确保数据仅对授权人员可访问。通过集成这些解决方案,医疗保健组织可以有效地利用 AI 改进患者护理,同时不损害安全性。
Web Security Dev Academy 的创建者。拥有 CS 学位和 10+ 年全栈经验的资深软件工程师。潜水爱好者和骑行爱好者。