DLAI 文档人工智能笔记(二)

DLAI 文档人工智能笔记(二)
Amazon S3是AWS提供的可扩展对象存储服务适用于任何类型和大小的文件。可以把它想象成一个无限的数字文件柜可以从互联网任何地方访问。无论你添加多少文件它永远不会耗尽空间。这将作为你数据的中央存储库。以下是S3的使用方式你将原始输入数据如PDF、图像或文本文件存储在专用的S3桶中。然后你将AI处理的结果摘要、解析后的文档、转换后的数据保存回这些桶内有组织的文件夹中。快速说明桶是你在S3中创建用于组织文件的顶级容器类似于你电脑上的主文件夹。2. AWS Lambdahttps://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dlai-docai/img/4905a7ede5e314fe0b334ceb2cf2a275_13.pngAWS 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 Bedrockhttps://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dlai-docai/img/4905a7ede5e314fe0b334ceb2cf2a275_15.pngAmazon 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.pnghttps://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dlai-docai/img/4905a7ede5e314fe0b334ceb2cf2a275_22.pnghttps://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_IDyour_access_key AWS_SECRET_ACCESS_KEYyour_secret_key AWS_REGIONus-east-1 LANDINGAI_API_KEYyour_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同步到知识库中。这个过程称为“摄取”。摄取过程中会发生什么知识库读取S3output/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.pnghttps://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库提取文本textocr_engine.extract_text(image_file)布局分析与逻辑排序你探索了如何使用**边界框Bounding Boxes**分析文档的物理布局并将识别出的文本块按逻辑顺序进行重组。视觉语言模型的应用你使用了**视觉语言模型VLMs**来理解文本及其在文档中的上下文关系。智能体化文档理解你采用了**ADE一种“视觉优先”的智能体生成方法**来处理复杂文档该方法优先考虑视觉结构。构建检索增强生成应用你基于以上技术构建了一个**RAG检索增强生成**应用程序用于回答关于非结构化文档的问题。云端部署与事件驱动最后你探索了如何将应用程序迁移到云端并将其改造为事件驱动的架构以提高可扩展性和响应能力。总结与展望 本节课中我们一起学习了从基础的OCR文本提取到利用智能体进行高级文档理解和构建问答应用的完整流程。你掌握了处理非结构化文档并将其转化为可查询知识的核心技能。我期待看到你运用这些知识构建出属于自己的创新应用。