使用元数据过滤对矢量存储进行访问控制:Amazon Bedrock 知识库 机器学习博客
Amazon Bedrock知识库中的向量存储访问控制与元数据过滤
关键要点
本文介绍了如何在Amazon Bedrock知识库中实施元数据过滤来实现向量存储的访问控制。通过定义和使用元数据字段,可以确保在检索相关上下文时,使用的源数据仅限于特定用户或应用程序具有访问权限的信息。进一步介绍了在医疗领域中的安全应用实例,以及如何通过AWS服务实现高效的访问控制和数据隐私。
在2023年11月,我们宣布Amazon Bedrock知识库正式推出,帮助用户充分利用检索增强生成RAG的潜力。知识库使得用户可以将公司数据无缝集成到语言模型生成过程中,确保生成的响应符合特定领域知识、法规和业务要求。
知识库有效地填补了基础模型所包含的广泛知识与企业所拥有的专业领域信息之间的鸿沟,从而实现真正定制且具有价值的生成式人工智能AI体验。
通过Amazon Bedrock知识库中的元数据过滤功能,用户可以定义和使用元数据字段来过滤用于检索相关上下文的源数据。例如,如果您的数据包含来自不同产品、部门或时间段的文档,您可以使用元数据过滤将检索限制为针对特定查询或对话最相关的数据子集。这有助于提高检索上下文的相关性和质量,同时减少因无关数据而可能产生的错误或噪音。元数据过滤使您对RAG过程拥有更多控制权,从而获得更适合具体用例需求的结果。
在本文中,我们将讨论如何在Amazon Bedrock知识库中实施元数据过滤,以实现访问控制并确保RAG应用程序中的数据隐私和安全。
元数据过滤的访问控制
知识库中的元数据过滤功能使数据的访问控制成为可能。通过根据用户角色、部门或数据敏感性级别等属性定义元数据字段,您可以确保检索的内容仅包含特定用户或应用程序被授权访问的信息。这有助于维护数据隐私和安全,防止敏感或受限信息在生成响应时被无意间显示或使用。凭借这种访问控制能力,您可以安全地在不同用户组或场景中使用检索,同时遵循公司特定的数据治理政策和法规。
在检索上下文相关的片段时,元数据过滤为返回给LLM的向量增加了一层额外的选择。此外,元数据过滤消耗的计算资源更少,从而提高整体性能并减少与搜索关联的成本。
下面是一些在Amazon Bedrock知识库中实施元数据过滤的实际应用示例:
应用场景描述HR聊天机器人一家公司使用聊天机器人帮助人力资源人员管理员工文件。通过基于访问ID的元数据过滤,用户只能访问和对话与其访问ID关联的文档。B2B平台一个B2B平台允许企业的终端用户访问所有上传的文档,并进行对话式搜索。通过元数据过滤,确保终端用户只能与其数据进行交互。工作协作应用一个工作组织应用具有对话式搜索功能,可对文档、看板等进行搜索。通过元数据过滤确保用户根据权限水平进行个性化的数据访问。医疗领域中的访问控制和元数据过滤
为了演示元数据过滤在知识库中所启用的访问控制功能,我们考虑一个医疗服务提供者的用例,其中知识库包含医生与患者之间对话的记录。在这种情况下,确保每位医生只能访问他们自己的患者交互记录至关重要,而无法访问其他医生的记录。
通过为patientid定义元数据字段,并将每个记录与相应的患者标识符关联,医疗服务提供者可以在搜索应用中实施访问控制。当医生开始对话时,知识库可以过滤向量存储,仅检索与其patientid元数据匹配的转录记录。这样,生成的响应将仅包含由该医生的过往患者交互生成的信息,从而维护患者的隐私和机密性。
这种访问控制方法可以扩展到其他相关的元数据字段,例如年份或部门,进一步细化每个用户或应用程序可以访问的数据子集。通过在知识库中使用元数据过滤,医疗服务提供者能够遵守数据治理政策和法规,同时使医生能够进行个性化的、与其特定患者历史和需求相关的对话。
解决方案概述
下面是实施Amazon Bedrock知识库访问控制的高层步骤。以下GitHub repository提供了一个指南Notebook,您可以根据其中的指导在自己的账户中部署此示例。
以下图示显示了解决方案架构。
解决方案工作流如下:
医生与Streamlit前端互动,该前端作为应用接口。用户身份验证和访问控制由Amazon Cognito处理,确保只有授权的医生才能访问应用程序。在生产环境中,建议使用更强大的前端框架,例如AWS Amplify,提供一整套工具和服务,用于构建可扩展和安全的Web应用程序。医生成功登录后,应用程序从Amazon DynamoDB数据库中检索与其ID关联的患者列表。随后,医生可以选择一个或多个患者以过滤其搜索。当医生与Streamlit前端互动时,应用程序向AWS Lambda函数发送请求,该函数作为应用程序后端。请求包括医生的ID、要过滤的患者ID列表以及文本查询。在查询知识库之前,Lambda函数从DynamoDB数据库中检索数据,以验证医生是否有权访问请求的患者或患者列表信息。如果验证成功,Lambda函数将使用提供的患者ID或患者ID列表查询知识库。知识库预先填充了存储在Amazon S3中的转录和元数据文件。知识库返回相关结果,然后将其返回给Streamlit应用程序并显示给医生。使用Amazon Cognito进行用户身份验证
为了为医疗服务提供者用例实施访问控制解决方案,可以使用Amazon Cognito用户池来管理医生的身份验证和用户身份。
西游加速服务器官网首先,您将创建一个Amazon Cognito用户池,用于存储医生用户帐户。在用户池设置期间,您需要定义每位医生的必要属性,包括姓名和唯一标识符sub或自定义属性。患者的标识符将用于作为patientid元数据字段。在元数据过滤过程中,该唯一标识符将与每个患者的帐户关联。
DynamoDB中的医生和患者关联
为了便于基于医生和患者关系的访问控制机制,医疗服务提供者可以创建一个DynamoDB表来存储这些关联。此表将作为中心存储库,允许在知识库搜索过程中有效检索与每位认证医生关联的患者ID。当医生通过Amazon Cognito进行身份验证时,可以使用其唯一标识符查询doctorpatientlistassociations表,并检索与该医生关联的patientid值列表。
这种方法提供了灵活性来管理医生与患者的关联。如果医生的关系发生变化,只需更新DynamoDB表中的相应条目,而无须修改转录的元数据文件本身。
现在您已经设置好了医生和患者的关系,让我们检查有效的元数据过滤所需的数据集格式。
数据集格式
在使用Amazon Bedrock知识库时,数据集格式在提供无缝集成和有效的元数据过滤方面起着至关重要的作用。该示例使用一系列PDF文件,其中包含医生与患者对话的转录记录。
这些文件需要上传到S3桶以便处理。为了使用元数据过滤,您需要为每个转录文件创建一个单独的元数据JSON文件。元数据文件应与相应的PDF文件共享相同的名称包括扩展名。例如,如果转录文件名为transcript001pdf,则元数据文件应命名为transcript001pdfmetadatajson。这种命名规范对于知识库在导入过程中识别特定文件的元数据至关重要。
元数据JSON文件将包含表示转录相关元数据字段的键值对。在医疗服务提供者用例中,最重要的元数据字段是patientid,将用来实施访问控制。您可以通过将来自Amazon Cognito用户池的唯一标识符包括在元数据文件的patientid字段中,将每个转录分配给特定患者,如下示例所示:
json{metadataAttributes {patientid 669}}

通过将转录PDF文件与其相应的元数据JSON文件结构化,您可以有效利用Amazon Bedrock知识库的元数据过滤能力。这种方法使您能够实施访问控制,使每位医生在检索过程中只能获取和使用来自其自身患者转录的信息。对于处理成千上万文件的客户,使用Lambda函数或类似解决方案自动生成元数据文件可能是更高效的扩展方法。
知识库创建
在数据集正确构建和组织后,您现在可以在Amazon Bedrock中创建知识库。此过程非常简单,因为AWS管理控制台提供了友好的界面和逐步指导。有关创建新知识库、上传数据集和配置必要设置以获得最佳性能的说明,请参见知识库现已向Amazon Bedrock提供完全管理的RAG体验。或者,您可以使用AWS SDK、API或AWS CloudFormation模板创建知识库,这些提供了以编程和自动化方式设置和管理知识库的方法。
创建知识库并与您的数据集同步后,您可以立即体验元数据过滤的强大功能。
在测试面板中,导航到设置部分,并找到过滤器选项。在此,您可以通过指定patientid字段及您希望测试的患者的唯一ID或标识符列表来定义特定的过滤条件。通过应用此过滤器,检索过程将仅提取和结合与指定患者或患者相关的转录中的相关上下文。基于过滤的检索方法意味着生成的响应专门针对医生与其个人患者的交互,维护数据隐私和机密性。
以编程方式查询知识库
您已经看到了如何通过控制台实施访问控制与元数据过滤,但如果您希望将知识库直接集成到应用程序中呢?AWS提供了SDK,使您可以以编程方式与Amazon Bedrock功能进行交互,包括知识库。
下面的代码片段演示了如何使用Python中的Boto3库调用retrieveandgenerate API。它包含元数据过滤功能,在vectorSearchConfiguration中,您可以添加过滤条件。在此特定用例中,您首先需要从DynamoDB表中检索与医生关联的patientids列表。这使您能够根据已认证用户的身份过滤搜索结果。
pythonimport boto3import json
bedrockagent = boto3client(bedrockagentruntime)
调用retrieveandgenerate API
response = bedrockagentretrieveandgenerate( input={ text 谁是Kelly } retrieveAndGenerateConfiguration={ type KNOWLEDGEBASE knowledgeBaseConfiguration { knowledgeBaseId ltgt modelArn arnawsbedrockuswest2foundationmodel/anthropicclaudev21 retrievalConfiguration { vectorSearchConfiguration { numberOfResults 5 filter { in { key patientid value ltgt # 一旦医生被认证的Amazon Cognito Id } } } } } })
print(response[output][text] end=n2)
您可以创建一个Lambda函数,作为应用程序的后端。此Lambda函数使用Boto3库与Amazon Bedrock进行交互,特别是使用retrieveandgenerate API检索知识库中的相关信息。
现在,架构组件都已到位,您可以创建一个可视化界面以显示结果。
Streamlit示例应用
为了展示医生与知识库之间的互动,我们开发了一个用户友好的Web应用,使用Streamlit,这是一个流行的开源Python库,用于构建互动数据应用。Streamlit提供了一种简单且直观的方式,创建可以与此解决方案中所涉及的各大AWS服务无缝集成的自定义界面。
Streamlit应用作为医生发起对话和与知识库进行交互的前端。它使用Amazon Cognito进行用户身份验证,因此只有授权的医生可以访问应用和相应的患者数据。在成功进行身份验证后,该应用与Lambda交互,以使用Amazon Cognito用户ID处理RAG工作流。
清理
对在本解决方案部署过程中创建的资源进行清理和删除非常重要,以避免不必要的费用。在提供的GitHub库中,您会找到一个位于Notebook末尾的部分,专门负责删除作为本解决方案一部分创建的所有资源,以确保您不会因不再需要的资源产生持续费用。
总结
本文展示了在Amazon Bedrock知识库中,通过实施访问控制和确保数据隐私与安全来实现元数据过滤的强大能力。通过使用元数据字段,组织可以精确控制RAG过程中不同用户或应用程序可访问的数据子集,同时提高检索的相关性和性能。
开始使用Amazon Bedrock知识库,并在评论区和我们分享您的想法。
关于作者
Dani Mitchell是Amazon Web ServicesAWS的生成AI专家解决方案架构师,专注于计算机视觉用例,帮助EMEA区域的客户加速其机器学习之旅。
Chris Pecora是Amazon Web ServicesAWS的生成AI数据科学家,他热衷于构建创新的产品和解决方案,并专注于以客户为中心的科学。在进行实验和跟进生成AI最新动态之余,他喜欢与孩子们共度时光。
Kshitiz Agarwal是Amazon Web ServicesAWS的工程负责人,领导Amazon Bedrock知识库的发展。身为2012年加入Amazon的员工,Kshitiz在云计算领域积累了深厚的洞察能力。他热衷于与客户互动,理解他们如何利用AWS推动商业成功。通过他的工作,Kshitiz希望为AWS服务的持续改进做出贡献,使客户能够释放云的全部潜力。
发表评论