提高工作效率: AWS Gen AI 在几秒钟内总结会议记录

        欢迎来到雲闪世界。全面介绍如何利用 AWS Lambda、Bedrock 和 S3 创建总结会议记录的工作流程

免责声明:本文中使用的会议记录纯属虚构,仅用于作为本文说明和教育目的。它并不反映任何实际的对话、事件或个人。任何与实际人物或事件的相似之处纯属巧合。本文概述的项目涉及使用多种 Amazon Web Services (AWS),具体来说包括 Amazon S3、Amazon API Gateway、AWS Lambda 和 Amazon Bedrock。

您是否曾在工作场所参加过看似多余甚至毫无意义的会议?对于我们大多数企业员工来说,答案无疑是肯定的。我每周都会参加至少一次这样的会议。有些星期,我的日程安排得满满的,几乎没有时间完成任务。最后,我只能在静音状态下开始处理任务。偶尔,我会错过一些与我有关的重要事情,所以我不得不重新开始全神贯注。这可能会让人非常沮丧,因为在整整一个小时内,可能只有几秒钟的对话与您有关。

随着生成式 AI 应用程序的出现,我再也不用担心自己会陷入这些情况了!在本文中,我将引导读者了解如何利用 AWS Bedrock、AWS Lambda、AWS API Gateway 和 AWS S3 构建可扩展的管道,利用生成式 AI 产品来总结会议记录。

为什么选择 AWS

假设您熟悉 ChatGPT 等生成式 AI 应用程序。既然您可以将文字记录复制并粘贴到 ChatGPT 中并在几秒钟内生成摘要,为什么还要使用 AWS?此外,一些应用程序已经可以做到这一点,如果没有包含在内,您可以将其添加到桌面。这样做的原因有很多,但我将重点介绍其中最重要的两个:可扩展性安全性

可扩展性

作为一个云平台,AWS 允许用户、企业、实体等大规模构建应用程序和存储数据。对于我们在本文中讨论的用例,AWS 中的会议记录摘要应用程序可以扩展为在公司内拥有几乎无限数量的最终用户,从会议记录的来源处直接输入到 AWS 的内部管道,并优化记录和生成的摘要的存储成本和容量。此外,您可以自定义提示、输出令牌和许多其他参数。

安全

之前,我提到过,人们可以通过复制和粘贴文字记录来使用 ChatGPT 生成摘要;这会违反许多安全最佳实践,如果关键数据泄露,你甚至可能在某些情况下承担责任。借助 AWS,可以设置必要的权限和防护措施,这样人们就可以充分利用生成式 AI 应用程序,而不必担心公司内部数据穿越公共网络。现在,事不宜迟,让我们直接进入这个项目。

第 1 部分:创建 S3 存储桶

我们将从创建 S3 存储桶开始。S3 是 AWS 提供的对象存储服务,允许用户快速大规模存储数据。它还可以与 AWS 的许多其他服务和第三方应用程序集成。

要导航到 S3,请在搜索栏中搜索它,单击旁边的服务菜单,或者如果您以前使用过它,请在最近访问的部分中找到它。

进入 S3 页面后,单击创建存储桶。

为存储桶命名,其他选项保持不变。如上图所示,我将存储桶命名为bedrock-text-summarization。请注意,所有存储桶名称都必须是全局唯一的,这意味着任何 AWS 账户中都不能有两个存储桶具有相同的名称。

第 2 部分:创建 boto3 层

截至撰写本文时,AWS Lambda 还没有最新版本的 boto3(适用于 Python 的 AWS SDK)。因此,我们必须创建一个 boto3 层并将其上传到 AWS。这确保我们拥有适当的库来调用 AWS Bedrock。这个过程相对简单;但是,如果您从未使用过 Windows 命令提示符,则可能需要一些时间。请注意,以下命令不适用于 Linux 系统。

首先,打开 Windows 命令提示符并分别运行以下命令。如果这是您第一次这样做,安装 boto3 包可能需要一些时间。

## 为您的 boto3 层创建一个新目录
mkdir boto3_layer ## 将其设置为主目录
cd boto3_layer ## 创建一个名为“python”的目录
mkdir python ## 在 python 目录中创建一个虚拟环境
python3 -m venv venv ## 激活虚拟环境
venv/bin/activate ## 将 boto3 安装到环境中
pip install boto3 -t ./python ## 停用虚拟环境
deactivate

完成后,我选择按照以下步骤手动压缩 Python 文件:

1. 打开文件资源管理器并导航到包含要压缩的文件夹的目录(在本例中,是我们创建的 boto3_layer 内的 python 文件夹)。

2. 右键单击​​要压缩的 python 文件夹。

3.从上下文菜单中选择“发送到” 。

4. 点击“压缩文件夹”

获得压缩文件夹后,导航到 Lambda 主页并单击左侧菜单中的“层” 。

您必须命名您的层并从此时上传您的压缩文件夹。此外,请确保选择正确的兼容运行时。在本例中,我将选择最新版本的 Python;但是,如果您计划在脚本中包含早期版本的 Python 中的库/函数/等,您还必须确保已启用它们。

图片由作者提供

第 3 部分:请求 Bedrock 访问权限

Bedrock 是 AWS 内的一个独特服务。简而言之,它是一个 API,允许用户连接到来自领先 AI 公司的许多基础模型。要使用其中任何模型,您都需要请求访问权限。导航到 Bedrock 主页并选择左下角的“模型访问” :

进入模型访问页面后,您必须单击要访问的特定模型。在这个项目中,我们使用Anthropic 的Claude 。导航到此部分,在 Anthropic 提供的每个产品旁边,您应该会看到一个链接,上面写着:可供请求。请注意,在下面的屏幕截图中,我已经拥有访问权限,因此您的屏幕可能看起来不是这样的。单击此处并完成必要的步骤。实际的批准过程只需要几分钟。我建议通读您使用的任何模型的文档和定价。出于我们的目的以及在撰写本文时,我们将使用的 Claude 版本每 1,000 个输入令牌花费 0.008 美元,每 1,000 个输出令牌花费 0.024 美元。我们的整个工作流程一次使用最多只需几美分,但要知道,如果不小心,任何重复使用都可能很快增加成本。

图片由作者提供

第 4 部分:创建 Lambda 函数

AWS Lambda 是 AWS 提供的无服务器计算服务。它与 AWS 的许多其他服务集成在一起。我将其视为 AWS 的集中式编排工具。例如,每当将新数据上传到特定的 AWS S3 存储桶(云存储服务) 时,您都可以配置 lambda 函数以将训练作业发送到 AWS SageMaker(机器学习训练和模型托管服务)以启动模型训练作业。这只是 AWS Lambda 无数可能性之一。

对于这个项目,我们将使用 Lambda 向 AWS Bedrock 发送一个带有会议摘要记录的提示,该提示将生成会议摘要以及记录中分配给特定利益相关者的后续行动。然后,Lambda 会将生成的摘要发送到我们之前创建的 S3 存储桶。我将在本节末尾发布完整的 Lambda 函数代码。

首先,导航到 Lambda 函数页面并单击“函数”。从那里,您只需命名您的函数并选择必要的运行时,在我们的例子中,它将是最新版本的 Python。

图片由作者提供

您的屏幕现在应该如下图所示:

接下来,我们将添加 boto3 层。导航到页面底部查看“层”部分。单击“添加层”。这将带您进入以下页面:

从这里,选择自定义层,然后选择我们上传的 boto3 层。您还将看到另一个下拉菜单,指定哪个版本;选择1,然后单击添加按钮。

现在我们已经添加了层,您可以导航到代码源窗口开始编写我们的函数。我将在本文末尾链接完整 Lambda 函数的 GitHub 要点;但是,我将在这里逐一分解。

讽刺的是,我们的 Lambda 函数将结合一系列较小的函数来协调我们的完整工作流程。我们的第一个函数将从文档中提取纯文本。换句话说,任何可读的文本都将从文档中提取。这是必要的,因为文档可能充斥着我们不一定需要的噪音。

def  extract_text_from_multipart (数据): msg = message_from_bytes(数据) text_content = ""如果msg.is_multipart():对于msg.walk()中的一部分:如果part.get_content_type() == "text/plain" : text_content += part.get_payload(decode= True ).decode( 'utf-8' ) + "\n"其他:如果msg.get_content_type() == "text/plain" : text_content = msg.get_payload(decode= True ).decode( 'utf-8' )如果text_content则返回text_content.strip()否则无 

接下来,我们将创建一个函数来发送文本和调用 AWS bedrock 的提示。对于实际模型,我们将使用 Anthropic 的 Claude V2。请注意,您可以轻松编辑提示文本以满足您的特定需求。记下字典主体在这里我们可以为调用的 AI 模型指定参数。不熟悉这些参数?别担心!我将在下面分解它们:

  1. max_tokens_to_sample:这是应用程序将采样的最大标记数,或者更实际地说,这是模型将读取的最大单个单词和/或数字数。
  2. top_k:对于模型生成的每个标记,它会考虑最有可能的“下一个”标记列表。较低的值将缩小标记的选择范围,而较高的值将允许模型考虑更广泛的选择范围。
  3. top_p:与 top_k 非常相似;但是,它使用概率分布逻辑。例如,如果我们选择 0.1,模型将考虑最有可能的前 10% 个标记。
  4. stop_sequences:本质上是模型的停止点。如果模型遇到您指定的停止点,它将在该序列之后停止生成。

您还可以在此处查看正式文档!

def  generate_summary_from_bedrock ( content:str ) -> str:prompt_text = f“”“Human:总结以下会议记录并列出具体的后续行动以及谁应该采取这些行动:{content}Assistant:“”“body = { “prompt”:prompt_text,“max_tokens_to_sample”:5000,“top_k”:250,“top_p”:0.2,“stop_sequences”:[ “\n\nHuman:” ] } try:bedrock = boto3.client(“bedrock-runtime”,region_name = “us-east-1”,config = botocore.config.Config(read_timeout = 300,retries = { 'max_attempts':3 }))response = bedrock.invoke_model(body=json.dumps(body),modelId= "anthropic.claude-v2:1" ) response_content = response.get( 'body' ).read().decode( 'utf-8' ) response_data = json.loads(response_content) summary = response_data[ "completion" ].strip() return summary except Exception as e: print ( f"生成摘要时出错:{e} " ) return  ""

我们调用的模型的响应需要一个位置来发送会议摘要。因此,我们将构建一个将其发送到 S3 存储桶的函数。

## 将输出保存到给定的 S3 存储桶
def  save_summary_to_s3_bucket ( summary, s3_bucket, s3_key ): s3 = boto3.client( 's3' ) try : s3.put_object(Bucket = s3_bucket, Key = s3_key, Body = summary) print ( "摘要已保存到 s3" ) except Exception as e: print ( "将摘要保存到 s3 时出错" )

最后,我们将创建Lambda Handler函数,它是 Lambda 函数的核心。Lambda Handler充当调用 Lambda 函数时的入口点;因此,我们将利用我们在处理程序中创建的所有函数。

def  lambda_handler(event,context):decoded_body = base64.b64decode(event [ 'body' ])text_content = extract_text_from_multipart(decoded_body)if  not text_content:return { 'statusCode':400,'body':json.dumps(“无法提取内容”)} summary = generate_summary_from_bedrock(text_content)if summary:current_time = datetime.now()。strftime('%H%M%S')#UTC 时间,不一定是您的时区s3_key = f'summary-output/ {current_time} .txt's3_bucket= 'bedrock-text-summarization'save_summary_to_s3_bucket(summary,s3_bucket,s3_key)else:print(“无摘要已生成”)return { 'statusCode' : 200,'body' :json.dumps(“摘要生成完成”)}

我们的函数可能已经完成;但是,我们必须进行一些小配置。当我们调用我们的基岩模型时,可能需要几秒钟甚至一分钟才能生成摘要,具体取决于我们发送的成绩单的大小。因此,我们将 Lambda 函数的超时设置为最多四分钟,以确保我们的函数不会超时。为此,请导航到底部的配置菜单,单击左侧的常规配置,然后单击窗口中的编辑。之后,您应该会看到如下所示的屏幕。确保超时设置为四分钟。

图片由作者提供

第 5 部分:创建 API

正如AWS API Gateway 主页上所述,我们将在这里构建会议记录摘要生成器的前门。使用 API Gateway,我们将构建一个具有 POST 方法的 API,允许我们将数据发送到 Lambda 函数。

首先,导航到 AWS API Gateway 主页并单击创建 API。

接下来,单击HTTP API窗口中的“构建”,因为这种类型的 API 最适合我们的特定用例。

命名并单击“下一步”。

继续单击下一步,直到进入“查看和创建”页面。单击“创建”。您现在应该位于“路线”页面,该页面应如下所示。单击左侧窗口中的“创建” 。

我们将在这里创建 POST 路由,以便我们使用 API 将数据发送到我们的应用程序。从下拉列表中选择 POST 并为其命名。

现在您应该回到“路线”页面。单击右上角的“部署” 。将出现如下所示的弹出窗口。单击“创建新阶段”,以蓝色突出显示。

我们将在此创建开发阶段。请注意,我们不一定需要执行此步骤;这只是一个实际项目。但是,在开发生命周期中为应用程序部署设置不同的阶段是一种很好的做法。在应用程序面向客户之前,这些阶段充当制衡系统。将此阶段命名为dev(或您喜欢的任何名称),并确保未启用自动部署。

创建开发阶段后,我们还没有完成。您应该在Stages页面上。在单击部署之前,我们仍然需要集成我们的 Lambda 函数。单击左侧窗口中的Integrations 。

单击“POST”,然后单击“创建并附加集成”。

图片由作者提供

在集成类型下选择Lambda 函数,然后在下一个下拉菜单中选择我们的 Lambda 函数。确保 AWS 区域与您的 Lambda 函数相同,否则您在调用 API 时会遇到错误。

现在,单击右上角的部署,然后在弹出窗口中选择开发。此时,API 已正式部署,并带有我们可以调用的 URL。单击左侧菜单中开发部分上方的链接,它将导航到我们可以找到调用 URL 的页面。请注意,这些 URL 是实时的,因此只要有 URL,任何人都可以使用它们,并且我们没有添加任何需要附加的权限/令牌(因此,我在发布本文之前删除了我的 URL)。话虽如此,我还是要谨慎,因为它会调用需要花钱的服务。

第 6 部分:将所有内容整合在一起!

现在到了简单而又令人兴奋的部分!是时候将我们的项目付诸实践了。我们只需调用一次 API 即可获得会议摘要。要调用我们的应用程序,我们将使用Postman。请注意,我们可以使用许多技术来调用我们的 API,但我发现 Postman 最适合我们的目的。这在现实世界中可能会通过与贵公司的会议软件无缝集成的前端应用程序来完成。

在 Postman 主页上,点击Workspaces并创建一个新的工作区。当您看到下面的下拉窗口时,选择HTTP 。

您现在应该看到一个如下图所示的窗口。

我们正在使用 API 发送数据;因此,我们必须选择GET旁边的下拉菜单并将其更改为POST。要获取 API 的 URL,请导航回我们创建开发阶段 API 后进入的页面。复制并粘贴我们开发阶段的调用 URL,然后将其粘贴到 Postman 工作区中的 POST 旁边以下屏幕截图可作为获取 URL 的参考:

除了复制粘贴我们的 API 之外,我们还需要添加我们之前创建的会议摘要路由。在我们的 Postman 工作区中,将 /meeting-summary 添加到 URL 末尾。以下屏幕截图供参考:

接下来,单击Body,然后选择form-data。在 Key下键入document,然后在键入document 的位置右侧的下拉菜单中选择file。然后,您将在此处上传会议记录。对于这个项目,我决定找点乐子,让 Chat GPT 生成一份关于一家 AI 公司的虚假会议记录,该公司的 Gen AI 应用程序具有自我意识。点击发送之前,我们的 Postman 工作区应该是什么样子的屏幕截图,以及我们发送的记录的简要预览如下!

现在是时候点击发送了!如果我们的申请成功,我们应该在 Postman 中看到以下响应:

关于调试 Lambda 函数的说明

当我最初构建此应用程序时,第一次运行失败了。您的应用程序很可能在第一次尝试时失败,所以如果是这种情况,请不要担心。我还没有遇到过在第一次测试运行时就构建成功的模型、产品、应用程序等的开发人员或数据科学家。

如果存在问题,它很可能会在 Lambda 函数中显示出来。要调试它,请导航到 AWS Cloudwatch,单击日志组,然后单击我们的 Lambda 函数。导航到日志流部分,它将显示我们 Lambda 函数的任何运行的响应。这是错误处理派上用场的地方。我在第一次运行时遇到的一些问题包括我的代码中的小拼写错误以及 API、Lambda 和 S3 之间的不匹配区域。如果您有任何问题,它们可能与我的不同;但是,这些可能是值得注意的良好起点。下面的屏幕截图供参考:

图片由作者提供

成功运行应用程序后,您的 S3 存储桶中应该会有一个 txt 文件。导航到 S3,选择我们最初创建的存储桶,然后单击以查看新生成的文件。选择下载并查看输出!以下是我生成的内容,供参考:

令人印象深刻!你不这么认为吗?几秒钟内,该应用程序就生成了一份摘要和具体后续行动,并分配了关键利益相关者。我知道这是一份假的会议记录,但想象一下,使用这样的应用程序可以节省多少时间。

结论

我必须大力感谢 Patrik Szepesi 和他的Udemy 课程,该课程介绍了 AWS 中的生成式 AI,它激励我继续这个项目并撰写了这篇文章。它还激励我开始研究一些个人用例,我希望这篇文章可以鼓励读者也这样做!我希望您发现这些内容对您的 AI 工程之旅很有价值。如果您有任何问题或想给我发送反馈,请随时发表评论!

下面是完整的 Lambda 函数


import boto3
import botocore.config
import json
import base64
from datetime import datetime
from email import message_from_bytes## Extract text of text/plain type from the given document and decode it 
def extract_text_from_multipart(data):msg = message_from_bytes(data)text_content = ""if msg.is_multipart():for part in msg.walk():if part.get_content_type() == "text/plain":text_content += part.get_payload(decode=True).decode('utf-8') + "\n"else:if msg.get_content_type() == "text/plain":text_content = msg.get_payload(decode=True).decode('utf-8')return text_content.strip() if text_content else None## Calls on AWS bedrock with a given prompt and parameters and returns the output from bedrock. Note that the function expect a string and returns a string
def generate_summary_from_bedrock(content:str) ->str:prompt_text = f"""Human: Summarize the following meeting transcript and list the specific follow up actions along with who should take those actions: {content}Assistant:"""body = {"prompt":prompt_text,"max_tokens_to_sample":5000,"top_k":250,"top_p":0.2,"stop_sequences": ["\n\nHuman:"]}try:bedrock = boto3.client("bedrock-runtime",region_name="us-east-1",config = botocore.config.Config(read_timeout=300, retries = {'max_attempts':3}))response = bedrock.invoke_model(body=json.dumps(body),modelId="anthropic.claude-v2:1")response_content = response.get('body').read().decode('utf-8')response_data = json.loads(response_content)summary = response_data["completion"].strip()return summaryexcept Exception as e:print(f"Error generating the summary: {e}")return ""## Saves the output to a given S3 bucket
def save_summary_to_s3_bucket(summary, s3_bucket, s3_key):s3 = boto3.client('s3')try:s3.put_object(Bucket = s3_bucket, Key = s3_key, Body = summary)print("Summary saved to s3")except Exception as e:print("Error when saving the summary to s3")def lambda_handler(event,context):decoded_body = base64.b64decode(event['body'])text_content = extract_text_from_multipart(decoded_body)*******
*******
*******
*******
*******
*******
完整代码可联系博主

感谢关注雲闪世界。(Aws解决方案架构师vs开发人员&GCP解决方案架构师vs开发人员)

 订阅频道(https://t.me/awsgoogvps_Host)
 TG交流群(t.me/awsgoogvpsHost)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/393561.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么网站要使用HTTPS访问

网站使用HTTPS访问的原因有很多,主要可以归纳为以下几个关键点: 1、数据安全性:HTTPS使用SSL/TLS协议对通信过程进行加密,确保信息在传输过程中不被窃取、篡改或冒充。对于涉及敏感信息(如个人身份、信用卡号等&#x…

数字人解决方案——音频驱动机器人

音频集成 机器人 标志着 人工智能(AI)。 想象一下,机器人可以通过视觉和听觉导航并与周围环境互动。音频驱动的机器人使这成为可能,提高了它们更高效、更直观地执行任务的能力。这一发展可能会影响到各个领域,包括家庭…

github技巧和bug解决方法短篇收集

有一些几句话就可以说明白的观点或者解决的的问题,小虎单独收集到这里。 Commits没有算入每天的activity fork的仓库是不算的。 Commits made in a fork will not count toward your contributions. 参考: Contribution activity not shown for github…

鸿蒙HarmonyOS开发:如何使用第三方库,加速应用开发

文章目录 一、如何安装 ohpm-cli二、如何安装三方库1、在 oh-package.json5 文件中声明三方库,以 ohos/crypto-js 为例:2、安装指定名称 pacakge_name 的三方库,执行以下命令,将自动在当前目录下的 oh-package.json5 文件中自动添…

C# 中引用类型的探讨

引用类型的变量不直接包含其数据;它包含对其数据的引用。 如果按值传递引用类型参数,则可能更改属于所引 用对象的数据,例如类成员的值。 但是,不能更改引用本身的值;例如,不能使用相同引用为新对象分配内存…

QuanTide-weekly第1期

本周Po文 这周我们共发表5篇文章。《基于 XGBoost 的组合策略…》等两篇详细讲解了机器学习构建组合策略的框架和常见问题。 文章要点与结论: 通过两阶段式方案实现多因子、多资产的组合策略构建。第一阶段基于XGBoost构建多个多因子单标的模型,第二阶…

electron-updater实现electron全量更新和增量更新——渲染进程交互部分

同学们可以私信我加入学习群! 正文开始 前言更新功能所有文章汇总一、监听页面渲染完毕1.1 myApi.handleCheckPcUpdate检查更新1.2myApi.onPcUpdateProgress接收下载信息1.3myApi.onPcDownloaded监听下载完毕事件 二、立即更新三、跳过更新四、打开更新模块总结 前言…

vtkConnectivityFilter提取连通区域中的问题

直接使用vtkConnectivityFilter提取连通区域&#xff0c;渲染上没问题&#xff0c;但是打印出polydata中的点数&#xff0c;发现跟原始数据是一致的。 for (int i 0; i < numRegions; i){vtkSmartPointer<vtkConnectivityFilter> connectivityFilter vtkSmartPointe…

Unknown input format pdf Pandoc can convert to PDF, but not from PDF.解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

口碑好的可视耳勺:四款口碑超好产品种草分享

随着科技的进步&#xff0c;越来越多人使用可视耳勺&#xff0c;因为它能够清晰地看到耳道内的状况&#xff0c;从而实现更精准、更安全的清洁。 然而&#xff0c;如今可视耳勺市场产品参差不齐&#xff0c;产品的评价褒贬参半。有的产品声称有超高像素&#xff0c;可实际到手画…

谷歌25亿美金收购Character AI的幕后故事

在科技领域中&#xff0c;并购交易无疑是推动技术发展的重要手段之一。最近&#xff0c;谷歌以25亿美金的对价收购了Character AI&#xff0c;这一交易的方式和细节引起了广泛关注。本文将详细解析谷歌这一奇葩交易方式&#xff0c;探讨其背后的动机和影响。 一、交易背景 1.…

程序员短视频上瘾综合症

一、是你疯了还是面试官疯了&#xff1f; ​ 最近有两个学员咨询问题&#xff0c;把我给整得苦笑不得。大家来看看&#xff0c;你有没有同样的症状。 ​ 第一个学员说去一家公司面试&#xff0c;第一轮面试聊得挺好的。第二轮面试自我感觉良好&#xff0c;但是被面试官给Diss…

《计算机组成原理》(第3版)第3章 系统总线 复习笔记

第3章 系统总线 一、总线的基本概念 总线是连接多个部件的信息传输线&#xff0c;是各部件共享的传输介质&#xff0c;如图3-1所示。 图3-1 面向CPU的双总线结构框图 倘若将CPU、主存和I/O设备都挂到一组总线上&#xff0c;便形成单总线结构的计算机&#xff0c;如图3-2所示…

【Linux 驱动】IMX6ULL input驱动

1. input子系统介绍 input 子系统分为 input 驱动层、input 核心层、input 事件处理层&#xff0c;最终给用户空间提供可访问的设备节点。 驱动层&#xff1a;输入设备的具体驱动程序&#xff0c;比如按键驱动程序&#xff0c;向内核层报告输入内容核心层&#xff1a;承上启下…

OpenCV图像滤波(5)二维卷积滤波函数filter2D()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::filter2D() 函数用于对图像应用二维卷积滤波器。这个函数可以用来实现多种图像处理操作&#xff0c;如模糊、锐化、边缘检测等。它通过将一个…

stm32应用、项目、调试

主要记录实际使用中的一些注意点。 1.LCD1602 电路图&#xff1a; 看手册&#xff1a;电源和背光可以使用5v或者3.3v&#xff0c;数据和控制引脚直接和单片机引脚连接即可。 单片机型号&#xff1a;stm32c031c6t6 可以直接使用推完输出连接D0--D7,RS,EN,RW引脚&#xff0c;3…

Linux--网络层IP

IP协议 IP协议&#xff0c;全称Internet Protocol&#xff08;互联网协议&#xff09;&#xff0c;是TCP/IP协议族中的核心协议之一&#xff0c;用于在互联网络上进行数据的传输。IP协议的主要功能是确保数据从一个网络节点&#xff08;如计算机、服务器、路由器等&#xff09…

OpenDataLab:人工智能开放数据平台

作者&#xff1a;CSDN _养乐多_ 本文将介绍一个人工智能开放数据平台&#xff0c;OpenDataLab。 文章目录 一、OpenDataLab介绍二、下载 一、OpenDataLab介绍 官网链接&#xff1a; OpenDataLab&#xff1a;https://opendatalab.com/ 这里面有很多数据集&#xff0c;包括计…

CCIA2024“网络安全优秀创新成果大赛-哈尔滨分站赛”优胜奖,花落谁家?

近日&#xff0c;“2024 年网络安全优秀创新成果大赛 - 哈尔滨分站赛”评选结果正式公布。此次大赛由黑龙江省委网信办指导&#xff0c;中国网络安全产业联盟主办&#xff0c;哈尔滨工业大学网络空间安全学院承办。开源网安代码审核平台 CodeSec 凭借在 AI 方向的创新能力和极高…

JavaEE: 进程和线程

文章目录 进程线程的概念和区别总结如何创建线程1.继承Thread重写run2.实现Runnable重写run3.继承Thread重写run,通过匿名内部类来实现4. 实现Runnable重写run,通过匿名内部类来实现5.基于lambda表达式来创建 虚拟线程 并发编程: 通过写特殊的代码&#xff0c;把多个CPU核心都利…