DLAI 文档人工智能笔记(二)
Amazon S3是AWS提供的可扩展对象存储服务,适用于任何类型和大小的文件。可以把它想象成一个无限的数字文件柜,可以从互联网任何地方访问。无论你添加多少文件,它永远不会耗尽空间。这将作为你数据的中央存储库。
以下是S3的使用方式:
你将原始输入数据(如PDF、图像或文本文件)存储在专用的S3桶中。
然后,你将AI处理的结果(摘要、解析后的文档、转换后的数据)保存回这些桶内有组织的文件夹中。
快速说明:桶是你在S3中创建用于组织文件的顶级容器,类似于你电脑上的主文件夹。
2. AWS Lambda
https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dlai-docai/img/4905a7ede5e314fe0b334ceb2cf2a275_13.png
AWS Lambda是一项无服务器计算服务,无需你管理任何服务器即可运行代码。可以把它想象成一个兼职的机器人助手,或一个按需函数,它并非一直运行,只在需要时才启动行动。
Lambda执行小段代码以响应特定事件,如S3上传、API调用或计划触发器。在你的案例中,当文档上传到S3时,Lambda将自动运行你的ADdeE解析逻辑。你只需为消耗的计算时间付费(以毫秒计)。因此,如果你的Lambda函数只运行了2毫秒,你只需支付那2毫秒的计算费用。
为了让Lambda访问其他AWS服务(如从S3读取),它需要适当的权限。这就是IAM(身份和访问管理)的用武之地。IAM是控制谁或什么可以访问你AWS资源的安全框架。
当你创建Lambda函数时,需要设置两样东西:一个IAM角色和一个IAM策略。让我解释一下区别:
角色代表“谁”可以访问。可以把角色想象成一个工牌或职位头衔。它是你的Lambda函数在运行时承担的身份。角色向其他AWS服务证明:“我是S3到Bedrock处理器函数”或“我是文档解析器”。像Lambda这样的服务没有用户名或密码,相反,它们承担角色来向其他AWS服务证明其身份。
IAM策略则规定“它能做什么”。角色本身并不保证任何权限,这就是策略的作用。可以把策略看作写在该工牌上的规则列表。它精确指定了该角色被允许执行的操作。策略是一个JSON文档,定义了诸如
s3:GetObject(意味着你可以从S3读取文件)或s3:PutObject(意味着你可以写入文件到S3)等操作。
总结一下:当你创建Lambda函数时,你必须创建一个IAM角色(身份/工牌),将一个IAM策略(规则)附加到该角色,并将该角色分配给你的Lambda函数。关键要点是:角色定义它是谁,策略规定它能做什么。
3. Amazon Bedrock
https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dlai-docai/img/4905a7ede5e314fe0b334ceb2cf2a275_15.png
Amazon Bedrock是一项完全托管的服务,通过单一API提供对基础模型(如AWS的Claude或Nova等大语言模型)以及嵌入模型的访问。可以把它看作一个预训练AI模型的菜单,你无需从头开始训练和托管自己的模型,只需选择需要的模型并使用它。
Amazon Bedrock为你架构的三个关键部分提供支持:
知识库:这是你的解析文档被自动嵌入并存储为向量的地方。Bedrock处理嵌入(将文本转换为数值表示)并提供语义搜索能力,以便你的智能体可以检索相关信息。
智能体运行时:Bedrock为你的智能体的推理和响应提供支持的基础模型。当你的智能体收到查询时,它使用Bedrock的LLM生成智能、有根据的答案。
Agent Core Memory (智能体核心内存):这是存储你智能体内存的地方,包括对话历史、用户偏好和语义事实。它允许你的智能体记住跨交互的上下文,使其感觉更像一个真正的助手。
请记住,Bedrock本质上是无服务器的,因此它会自动扩展,并且你只需为实际使用量付费。
智能体组件:Strands Agent 🤖
https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dlai-docai/img/4905a7ede5e314fe0b334ceb2cf2a275_17.png
现在,让我们来看看你架构中的智能体组件:Strands Agent。它是一个开源SDK。
Strands Agent是一个AWS开源框架,专门设计用于在笔记本和生产环境中构建智能体。它有助于简化编排:
无缝集成:Strands Agent与AWS资源(如S3、Bedrock和其他工具)无缝集成,无需复杂的手动编码。
简化配置:它有助于创建智能体定义。使用Strands Agent,你可以指定使用哪些Bedrock模型、你的智能体可以访问哪些工具以及内存如何工作。这使得你的智能体配置清晰、可维护且易于修改。
企业就绪:最后但同样重要的是,它是企业就绪的。Strands Agent是生产级的,它内置了用于跟踪和日志记录、性能监控和错误处理的工具,并且支持灵活的部署模式。
端到端流程演练 🔄
https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dlai-docai/img/4905a7ede5e314fe0b334ceb2cf2a275_19.png
现在让我们看看所有这些组件如何协同工作。让我们一步步走过这个过程。
步骤1:上传文档
在实验中,你将处理医学研究论文。你将一个PDF上传到S3的input/medical文件夹。S3上传事件触发你的Lambda函数。Lambda运行ADdeE解析器来解析和结构化内容。解析后的输出以两种格式上传回S3的output/medical文件夹:一个用于解析内容的Markdown文件,以及一个包含用于视觉定位的块信息(如块类型和边界框坐标)的JSON文件。这一切都是自动发生的。你只需上传文件,事件驱动架构会处理其余部分。
步骤2:将解析后的文档摄取到知识库
你开始将Markdown文件从S3的output/medical文件夹摄取到知识库中。Amazon Bedrock读取文件,为每个文本块生成嵌入,并将它们存储在向量数据库中。一旦摄取完成,你的知识库就变得可搜索了。智能体可以查询这个知识库来检索相关信息。请注意,你也可以为实现从S3到知识库的自动摄取任务实现一个单独的Lambda函数,但在实验中,为简化起见,我们只实现一个用于解析的Lambda函数。
步骤3:创建基于知识的搜索工具
这个工具将你的智能体连接到知识库。当智能体需要从你的文档中获取信息时,它会调用这个工具,该工具查询向量数据库并返回最相关的内容。这使你的智能体能够基于你上传的文档回答问题。
步骤4:设置智能体内存
Amazon Bedrock Agent Core Memory提供三种类型的长期内存:
用户偏好:存储喜好、厌恶和个人背景。
语义内存:存储事实、实体和关系。
摘要内存:存储对话摘要和关键点。
重要的是,内存会在会话间持久化,因此你的智能体可以记住过去的交互并提供个性化的响应。
步骤5:构建智能体本身
你将配置系统提示(关于智能体应如何行为的指令)、你创建的基于知识的搜索工具、由Agent Core Memory启用的内存,以及托管在Bedrock上的LLM模型。一旦一切配置完成,你的智能体就可以与用户交互了。
步骤6:与你的智能体聊天
这是一个例子。用户可能会说:“我喜欢金枪鱼寿司。”智能体可能回应:“明白了。我记住了这个偏好。”在以后的会话中,你可能会问:“我今天午餐应该吃什么?”智能体可能回应:“寿司怎么样?你提到过你喜欢金枪鱼。”关键特性是智能体记住了你。它不仅仅是在一个会话中回答孤立的问题,而是在构建上下文并随时间了解你的偏好。
总结
本节课中,我们一起学习了如何在AWS上构建一个完整的、基于智能体化文档抽取的RAG管道。我们了解了如何利用Amazon S3进行文档存储,使用AWS Lambda实现事件驱动的无服务器计算来自动解析文档,并借助Amazon Bedrock的知识库、LLM和智能体内存功能,通过Strands Agent框架构建一个能够记忆上下文、进行个性化交互的智能体。这套架构结合了无服务器的弹性伸缩、事件驱动的自动化以及智能体的上下文感知能力,为构建生产级的文档智能应用提供了强大而灵活的解决方案。
https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dlai-docai/img/4905a7ede5e314fe0b334ceb2cf2a275_21.png
https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dlai-docai/img/4905a7ede5e314fe0b334ceb2cf2a275_22.png
https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dlai-docai/img/4905a7ede5e314fe0b334ceb2cf2a275_24.png
现在,是时候切换到实验笔记本,开始动手构建了!
014:使用Strands Agents构建研究论文聊天机器人
概述
在本实验中,我们将构建一个完整的文档智能处理流水线。该流水线部署在AWS上,结合了Landing AI的自动化文档解析功能与对话式AI智能体。我们将学习如何设置Lambda函数、配置S3触发器、将文档索引到知识库,并最终创建一个具备记忆和视觉溯源能力的智能聊天机器人。
实验架构与数据流回顾
在上一节中,我们介绍了系统的整体架构。本节中,我们来详细看看数据在系统中的流动过程。
用户将PDF文件上传到S3存储桶的
input文件夹。当新文件到达时,S3会自动触发一个Lambda函数。
Lambda函数使用Landing AI API将PDF解析为结构化的Markdown文本。
解析后的Markdown、视觉溯源数据以及独立的文本块(chunk)被保存到S3的
output文件夹。Bedrock知识库为文档建立索引,以支持语义搜索。
用户向具备记忆功能的Strands Agent提问,以维持对话上下文。
实验前提条件
本实验假设您已具备一个包含input和output文件夹的S3存储桶,以及一个连接到S3output/medical_chunks文件夹的Bedrock知识库。如果您希望亲自尝试本实验,我们将提供相关链接,指导您如何创建AWS账户、设置这些资源并学习AWS基础知识。
第一步:安装所需软件包
以下是本实验将用到的核心Python包及其作用:
boto3:官方的AWS Python SDK,用于以编程方式与AWS服务交互。python-dotenv:从.env文件加载敏感配置信息。pymupdf:用于为PDF页面添加高亮注释,实现视觉溯源。Pillow:将PDF页面渲染为图像。bedrock-agent-core:为智能体提供记忆管理功能。strands-agent:一个用于构建AI智能体的框架。
安装命令如下:
pipinstallboto3 python-dotenv pymupdf Pillow bedrock-agent-core strands-agent第二步:配置环境变量与AWS客户端
为了安全地管理凭证,我们将从.env文件加载环境变量,而不是将其硬编码在笔记本中。
以下是一个.env文件的示例模板:
AWS_ACCESS_KEY_ID=your_access_key AWS_SECRET_ACCESS_KEY=your_secret_key AWS_REGION=us-east-1 LANDINGAI_API_KEY=your_landingai_key环境配置完成后,我们需要建立与所需AWS服务的连接。boto3库通过创建“客户端”来实现这一点。
我们将为以下服务创建客户端:
S3客户端:用于上传PDF、下载输出文件和管理存储桶。
Lambda客户端:用于部署Lambda函数、更新代码和配置触发器。
IAM客户端:用于为Lambda函数创建具有适当权限的角色。
Logs客户端:用于通过CloudWatch日志监控Lambda执行和调试错误。
Bedrock Agent Runtime客户端:用于查询知识库以进行文档搜索。
Bedrock Runtime客户端:用于直接调用云端模型。
第三步:构建完整流水线路线图
我们的AWS客户端已准备就绪,现在可以开始构建完整的流水线。以下是我们的实现路线图:
第一部分:设置Lambda函数(步骤3-5)
我们将分三步设置Lambda函数:
打包代码:将Python文件及其依赖项捆绑到一个zip文件夹中。
创建角色:定义允许Lambda访问S3以下载和上传文件的权限。
部署函数:将打包好的代码上传到AWS Lambda。
第二部分:设置触发器(步骤6)
接下来,我们将配置S3,使其在上传新文件到input文件夹时自动调用我们的Lambda函数。
第三部分:构建智能体(步骤7-12)
最后,我们将上传医学研究论文PDF,将解析后的文档索引到Bedrock知识库,并使用Strands Agent构建一个智能体。
为了保持本教程专注于核心概念,我们已在lambda_helpers.py中创建了辅助函数来处理底层的AWS操作。我们将在实验过程中解释每个辅助函数的逻辑。
第四步:创建部署包(步骤3)
什么是Lambda部署包?要创建AWS Lambda函数,您需要将源代码及其所有依赖项捆绑到一个zip文件中。这个包包含了Lambda运行代码所需的一切。
部署包包含:
您的源代码:
ade_s3_handler.py,其中包含Lambda函数被调用时执行的ADE解析逻辑。安装的依赖项:您的源代码导入的所有pip包。
以下是部署包的结构示例:
deployment_package.zip ├── ade_s3_handler.py ├── landingai/ ├── boto3/ └── ...其他依赖项我们将使用create_deployment_package辅助函数来构建此包。该函数在后台执行以下操作:创建一个临时目录,使用pip将包安装到该目录,将您的源代码文件复制到临时目录,从该目录中的所有内容创建zip文件,并清理临时目录。
在进入下一步之前,让我们了解一下在Lambda内部运行的代码逻辑。下图展示了完整的流程:
https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dlai-docai/img/e926649fb95c303339cafd221d4e02cf_1.png
以下是逐步发生的情况:
接收事件:当PDF文件上传到S3的
input文件夹时,S3事件会触发Lambda函数。ADE处理函数:从事件中提取文件键(key)。
检查与验证:处理函数检查是否为PDF文件、跳过文件夹,并验证输出是否已存在。
下载PDF:将PDF下载到Lambda的临时目录。
调用ADE API:将PDF发送到ADE API进行解析,返回Markdown文本和文本块。
上传结果:将结果以三种格式上传到S3的
output文件夹:一个Markdown文件,用于存储解析后的内容。
一个包含所有文本块信息(用于视觉溯源)的JSON文件。
独立的文本块JSON文件,用于优化知识库索引。
为了帮助您理解每个输出文件的内容,假设您上传了input/medical_research_paper.pdf,在ADE处理完成后,S3的output文件夹中将包含:
markdown/:包含完整文档的可读格式,其中包含链接文本到块ID的锚点标签。grounding_json/:一个包含所有文本块及其边界框坐标等元数据的单一文件。medical_chunks/:每个文本块一个文件,针对向量数据库索引进行了优化。每个文件都自包含文本、位置和源元数据。
由于我们正在实现一个RAG(检索增强生成)流水线,我们将专注于仅使用output/medical_chunks文件夹进行Bedrock知识库索引和生成注释图像。其他文件夹可用于不同的实验和下游用例。
第五步:创建IAM角色(步骤4)
什么是IAM角色?Lambda函数在默认没有任何权限的隔离容器中运行。IAM角色授予函数使用临时凭证访问特定AWS服务的权限。
我们将使用create_or_update_lambda_role辅助函数来创建一个具有Lambda函数所需权限的角色。该角色包括以下权限:
S3权限:
GetObject(从输入文件夹读取PDF)、PutObject(将Markdown文件写入输出文件夹)、HeadObject(检查输出文件夹是否已存在)。日志权限:
CreateLogGroup(为此函数创建CloudWatch日志组)、CreateLogStream(为每次执行创建日志流)、PutLogEvents(写入日志条目以进行调试)。
第六步:部署Lambda函数(步骤5)
现在我们已经拥有了所需的两部分:部署包(我们的代码)和IAM角色(我们的权限)。让我们使用deploy_lambda_function辅助函数来部署Lambda函数。
部署还包括一些重要的配置选项:
环境变量:我们的代码在运行时可以访问的配置值。
超时:最大执行时间设置为900秒(15分钟),用于处理较大的PDF。
内存大小:分配的RAM量,我们将设置为1024 MB。
第七步:设置S3触发器(步骤6)
我们的Lambda函数已部署,但还不会自动运行。我们需要告诉S3在文件上传时触发Lambda函数。S3可以在对象被创建、修改或删除时向Lambda发送事件。我们将配置为当文件上传到input文件夹时调用我们的函数。setup_s3_trigger辅助函数处理此配置。
第八步:上传文档进行处理(步骤7)
基础设施现已准备就绪。现在,让我们上传我们的医学PDF文档,并观察流水线的运行。下图展示了PDF文件如何从您本地的medical文件夹流向S3输入存储桶,被自动触发的Lambda函数使用ADE处理,并产生三种类型的输出文件。
https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dlai-docai/img/e926649fb95c303339cafd221d4e02cf_3.png
我们将使用upload_folder_to_s3辅助函数上传本地文档。当Lambda函数处理我们的文档时,我们可以实时监控其进度。此辅助函数监视CloudWatch日志以显示处理状态。Lambda会自动写入日志,我们只需要读取它们。要停止监控,请按Esc键,然后双击I。您可以选择显示所有输出文件,但在本视频中,我们直接按Note。
第九步:连接到Bedrock知识库(步骤8)
我们的文档现已解析并存储在S3中。下一步是通过将它们摄取到Bedrock知识库中使其可搜索。知识库是一个支持语义搜索的向量数据库。
首先,让我们验证我们的知识库是否可用且配置正确。我们使用Bedrock Agent客户端列出所有知识库及其数据源。请注意,知识库已在AWS控制台中预先配置,指向我们的S3output/medical_chunks文件夹作为数据源,使用Amazon Titan创建向量嵌入,并将向量存储在OpenSearch Serverless中以进行快速相似性搜索。此信息未在此处打印,但我想让您了解我们在本实验中使用的配置。
第十步:将文档摄取到知识库(步骤9)
现在,让我们将解析后的文档从S3同步到知识库中。这个过程称为“摄取”。
摄取过程中会发生什么?
知识库读取S3
output/medical_chunks文件夹中所有新的或修改过的JSON文件。它为每个文本块创建向量嵌入。
这些向量被存储在数据库中,以便进行快速相似性搜索。
摄取完成后,我们可以用自然语言问题查询知识库,并找到最相关的文档部分。start_ingestion_jobAPI启动异步处理,它立即返回作业ID,实际工作在后台进行。
第十一步:创建具备视觉溯源的搜索工具(步骤10)
我们的文档已在知识库中建立索引,现在可以为我们的智能体创建一个搜索工具。但我们要添加一些特别的东西:Landing AI的视觉溯源功能。
下图展示了我们搜索工具的代码逻辑:
https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dlai-docai/img/e926649fb95c303339cafd221d4e02cf_5.png
https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dlai-docai/img/e926649fb95c303339cafd221d4e02cf_1.png
让我带您了解这个逻辑。该工具遵循以下模式:
当用户提交一个查询(例如“什么有助于缓解感冒症状?”)时:
检索:通过查询知识库(使用混合搜索,结合关键词匹配和语义相似性)来检索相关结果。
检查:对于每个结果,检查它是否来自
medical_chunks文件夹的块JSON文件。解析:解析块JSON以获取元数据,如块ID、块类型、页码和边界框。
生成图像:动态生成裁剪后的块图像,并将其上传到S3,返回一个预签名URL。
格式化响应:智能体将格式化响应,为您提供来源、块ID、页码、块类型、裁剪图像URL和内容。
在创建智能体之前,让我们验证一下我们的搜索工具是否正常工作。一个简单的测试查询知识库并显示第一个结果。让我们搜索“common cold symptoms”。您可以看到知识库搜索工作正常。我们现在可以打印这些测试结果。当您点击预签名URL时,您可以看到为可追溯性和可审计性动态创建的块图像。对于受严格监管的组织和高风险操作,这可以整合到您的RAG系统或任何下游应用程序中。
https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dlai-docai/img/e926649fb95c303339cafd221d4e02cf_3.png
第十二步:为智能体创建记忆(步骤11)
我们的搜索工具正在工作。现在,让我们为智能体创建记忆,以便它能记住对话并随着时间学习用户偏好。AWS Bedrock Agent Core提供了三种记忆策略,每种服务于不同的目的:
会话摘要:总结过去的会话。
用户偏好:随着时间学习用户偏好。
语义记忆:提取和存储事实。
我们将配置所有三种策略,为智能体提供全面的记忆能力。我们将首先检查是否已为智能体创建了记忆,否则将创建一个新的记忆。创建记忆后,我们需要设置一个会话管理器,为每次对话组织信息。每次对话需要两个标识符:
参与者ID:谁在使用智能体,这支持跨会话的个性化。
会话ID:此特定对话的唯一标识符。
第十三步:创建Strands智能体(步骤12)
我们现在已准备好所有组件:一个具备视觉溯源的搜索工具,以及用于在对话间维护上下文的记忆。让我们将所有内容整合到一个Strands智能体中。
智能体配置如下:
模型:使用Claude via Bedrock作为底层的LLM。
系统提示:定义智能体个性和行为的指令。
会话管理器:用于记住偏好、历史摘要和事实的记忆。
工具:我们之前创建的搜索知识库函数。
请注意,系统提示明确指示智能体在其响应中包含视觉溯源信息,如页码、位置坐标和注释图像。
第十四步:交互式聊天(步骤13)
您的医学文档智能体现在已准备就绪。让我们启动一个交互式聊天会话。让我们从“维生素C治疗感冒的效果如何?”开始。这里显示它使用了search_knowledge_base工具,并返回了一个症状列表。以及信息源,我们可以在其中找到注释图像。
我现在告诉它我更喜欢简短的回答,然后退出。让我们再次运行它并问同样的问题。您可以看到,它根据我之前的偏好返回了更简洁的答案。要退出,请输入exit、quit或bye。
总结
恭喜您完成本实验!您已经构建了一个完整的、可用于生产的文档智能处理流水线,其中包含以下关键组件:
自动化文档处理:当PDF上传到S3时自动解析的Lambda函数。
语义搜索:用于智能文档检索的Bedrock知识库。
视觉溯源:提供精确页码位置和高亮图像的可追溯答案。
对话记忆:能记住偏好和对话历史的智能体。
独立文本块存储:为更好的知识库索引而优化的块文件。
您现在可以扩展此流水线以处理其他文档类型(如Excel、PowerPoint甚至图像),为智能体添加更多工具,或随着需求增长与其他AWS服务集成。
https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dlai-docai/img/e926649fb95c303339cafd221d4e02cf_5.png
感谢您付出的时间、展现的好奇心和参与的热情。我们非常期待看到您接下来将创造什么。下次见!😊
015:总结 🎯
在本课程中,我们学习了如何构建一个智能体化的文档处理系统,使你能够解析和提取PDF等文件中的信息。
https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dlai-docai/img/8c2f0fc9bddc280a37b7f9b9ac7eae66_0.png
课程内容回顾 📚
上一节我们探讨了如何将应用迁移到云端并使其事件驱动。现在,让我们对整个课程的核心内容进行总结。
以下是我们在本课程中学习的关键步骤与技术:
从图像到文本的转换:你学习了如何通过**OCR(光学字符识别)**技术将图像文件转换为可处理的文本。
# 示例:使用OCR库提取文本text=ocr_engine.extract_text(image_file)布局分析与逻辑排序:你探索了如何使用**边界框(Bounding Boxes)**分析文档的物理布局,并将识别出的文本块按逻辑顺序进行重组。
视觉语言模型的应用:你使用了**视觉语言模型(VLMs)**来理解文本及其在文档中的上下文关系。
智能体化文档理解:你采用了**ADE(一种“视觉优先”的智能体生成方法)**来处理复杂文档,该方法优先考虑视觉结构。
构建检索增强生成应用:你基于以上技术,构建了一个**RAG(检索增强生成)**应用程序,用于回答关于非结构化文档的问题。
云端部署与事件驱动:最后,你探索了如何将应用程序迁移到云端,并将其改造为事件驱动的架构,以提高可扩展性和响应能力。
总结与展望 🌟
本节课中,我们一起学习了从基础的OCR文本提取,到利用智能体进行高级文档理解和构建问答应用的完整流程。你掌握了处理非结构化文档并将其转化为可查询知识的核心技能。
我期待看到你运用这些知识,构建出属于自己的创新应用。🚀