【腾讯云云上实验室-向量数据库】Tencent Cloud VectorDB为非结构化数据查询插上飞翔的翅膀——以企业知识库为例

news2024/9/24 9:18:05

前言

以前我曾疑惑,对于非结构化的内容,如一张图片或一段视频,如何实现搜索呢?图片或视频作为二进制文件,我们如何将其转化为可搜索的数据并存储起来,然后在搜索时将其还原呢?

后来我发现,实际上我们可以将非结构化的内容转化为结构化的内容,然后进行存储。这样,我们就可以对其进行搜索了。如何实现这一转化呢?向量化是非结构化内容转化为结构化内容的关键。

向量在数学和物理中表示大小和方向。它由一组有序的数值组成,比如[0.2123, 0.23, 0.213]。这些数值代表了向量在每个坐标轴上的分量。在AI中,向量可以用来表示任何事物,如图像、视频、音频、文本等。向量是数据科学中最重要的概念之一,它帮助我们将非结构化数据转换为结构化数据,以便进行分析和处理。

我们可以使用多维度向量来表述某个对象或事物的属性或特征,然后再借助一些向量检索的方法,如内积(IP),欧式距离(L2)或者余弦相似度(COSINE)算法来进行搜索。常用的图片搜索、短视频搜索以及推荐系统都是基于向量进行的。那么这些向量是如何存储的呢?存储向量的数据库与传统的数据库有什么区别呢?今天我要给大家介绍的是一款存储向量的数据库——腾讯云向量数据库(Tencent Cloud VectorDB)。

向量数据库

向量数据库是一种专门用于存储和检索高维向量的数据库,适用于处理图像、视频、音频、文本等非结构化数据。随着非结构化数据搜索需求的不断增长,向量数据库在近年来得到了广泛应用。腾讯云向量数据库(Tencent Cloud VectorDB)是一种全托管的自研企业级分布式数据库服务,专为存储、检索、分析多维向量数据而设计。

与传统数据库不同,向量数据库借助向量检索技术,通过计算向量间的相似度来进行数据检索。这种检索方式在处理非结构化数据时具有显著的优势,可以更加准确地匹配用户的查询需求。腾讯云向量数据库(Tencent Cloud VectorDB)采用了先进的向量检索技术,并针对多维向量数据进行了优化,以提供高效、准确的检索服务。下面让我们详细了解一下它的组成和特征。

逻辑层级

要了解Tencent Cloud VectorDB,就要先了解它的逻辑层级,逻辑层级代表了它存储数据的结构,它具有三个逻辑层级,分别是Database、Collection、Document。一个数据库实例可以存在多个database,这一点与传统的数据库一致,一个database可以存在多个collection, 这里的collection你可以简单理解为mysql中的中一张表,由于向量数据库不属于SQL数据库,在创建表时,自然也与传统SQL数据库不一样,下面会讲解如何创建collection。 一个collection可以存在多个document,document就类似是一张表的多条记录,行。
下面的图片解释了Tencent Cloud VectorDB的逻辑层级。
在这里插入图片描述

索引

逻辑层级代表了数据的层级结构,而向量索引则是用于快速搜索的基础。
Tencent Cloud VectorDB目前支持多种索引类型,分别是用于快速查找特定行的主键索引Primary Key Index,和用于快速查找相似向量的向量索引Vector Index(向量索引又分为FLATHNSWIVF 系列,详情描述可以查阅官方文档),以及建立在标量字段的Filter索引 Filter Index。

基于向量的相似度算法

逻辑层级是数据的存储层级,而索引是为了加快数据的搜索,那么对于向量的搜索Tencent Cloud VectorDB又支持那些算法那?
目前支持了比较主流的三种算法分别是内积(IP),欧式距离(L2),余弦相似度(COSINE)
(注意:在创建 Collection 时,就需指定向量的索引类型(如 HNSW 等)与 相似度计算方法,而不是搜索时。)

内积(IP):
全称为 Inner Product,内积也称点积,计算结果是一个数。它计算两个向量之间的点积(内积),其计算公式如下所示:
在这里插入图片描述
欧式距离(L2):
欧式距离(L2)全称为 Euclidean distance,指欧几里得距离。它计算两个向量点在空间中的直线距离。其计算公式如下所示:
在这里插入图片描述
余弦相似度(COSINE):
余弦相似度(Cosine Similarity)算法,是一种常用的文本相似度计算方法。它通过计算两个向量在多维空间中的夹角余弦值来衡量它们的相似程度。其计算公式如下所示:
在这里插入图片描述

需要注意的是 向量索引与相似算法是 影响搜索结果的准确性的两大因素,我们在Collection时要根据具体的数据和业务选择合适的索引和算法。

腾讯云向量数据库的申请,实例管理

通过上面的概念介绍和名称解释,你是不是已经迫不及待地想要体验一下Tencent Cloud VectorDB。那么下面就跟着我一起来体验一下Tencent Cloud VectorDB的功能吧。

申请使用

你可以官方的内测申请,来申请使用Tencent Cloud VectorDB。试用期间费用都是免费的,包括数据存储,Embedding Token的消耗,外网访问。内测期间,免费试用时长1个月。
内测资格发放后,登录腾讯云控制台,进入向量数据库实例列表

你会看到有一条实例已经创建。
在这里插入图片描述
如果没有的话,尝试切换其他区域。
使用的实例,规格是:基础型 1 核 1 GB,总磁盘容量20GB。默认不开启外网。
如要开启外网功能,点击实例列表中的 外网:开启按钮。然后填入0.0.0.0/0。注意生产环境不建议这样填。
在这里插入图片描述

实例监控

点击实例ID或者名,除了可以查看实例的详情,还会看到实例的实时监控。
如下:在这里插入图片描述
监控的类型有很多,CPU使用率,内存使用率,硬盘空间使用率,磁盘空间使用量,
网络监控包括网络流入浏览,网络流出流量。
请求监控,响应监控。
在这里插入图片描述
监控的还是比较全面的。

数据库可视化管理,DMC的使用

Tencent Cloud VectorDB是使用DMC 向量数据库客户端进行可视化管理,它提供链接数据库实例,创建Database,创建Collection,以及增删改查Document等一系列常规操作。
你可以实例详情的 登录按钮进入到DMC的登录页面
在这里插入图片描述
进入登录页面后,你需要正确选择数据库实例所在的区域,并填入账号和密码。
在这里插入图片描述
账号与密码从 秘钥管理 处可以获取。如下图:使用API时也需要使用这两个参数,请妥善保管,谨防泄露。
在这里插入图片描述
登录DMC可以查看到数据库实例下的 Database与Collection,如下图:(默认是空的)在这里插入图片描述
点击以下图标可以进行新建database。
在这里插入图片描述

在新建database时,需要输入database的名称。
点击database旁边的加号,进行新建集合
在这里插入图片描述
在新建集合时,需要特别注意是的开启Embedding选项,在开启Embedding选项后,会必须填入一个原始文本字段,该字段在存入数据时会使用用户选择的Embedding 模型进行向量化(但用户看到的还是原始文本)。如下图:
在这里插入图片描述
由于Collection相当于一张表,那么这个代表着一张表,只有一个字段可以使用Embedding 模型进行向量化。

另外值得注意的是,在创建索引时,向量索引只能创建一个,而且默认已经创建好,用户可以修改索引类型,相似性方法。
在这里插入图片描述
在创建Collection时,只需要创建索引字段即可,非索引字段可以不用创建。类mysql的数据库,在创建表时,需要定义表中存在的字段和类型。但是Tencent Cloud VectorDB不需要,
向量数据库字段(Field)具备 Schemaless 特性。即不需要预先定义模式,便可以将任意数量和类型的字段添加到Document 中。使用时,仅需关注需要构建索引的字段。字段的类型也有随意变更。

执行查询任务时,直接点击某一个Collection在这里插入图片描述
在精确查询时,直接点击执行,可以查询出10条记录。

要使用相似度查询的话,需要输如一个文本,该文本将从被Embedding 的字段中搜索。使用匹配的相似度算法。
在这里插入图片描述

数据的插入和更新

在DMC中插入数据需要点击某个集合,打开操作窗,并选中插入/替换

这是一个插入的示例

{
    "database": "fizz1120",
    "collection": "product_article",
    "buildIndex": true,
    "documents": [
        {
            "id": "f001",
            "name": "tom"
        },
        {
            "id": "f002",
            "name": "fizz"
        }
    ]
}

json中需要包含database,collection和documents 三个重要是属性。
插入数据、如果 ID 已存在会覆盖原始数据,此外在插入数据时,如果你在创建collection时打开了Embedding ,那么documents中的每个记录都需要配置该字段,否则无法插入成功。如下图:
在这里插入图片描述
配置text字段后,就能够正常插入值
在这里插入图片描述
由于document中字段是不必一直的,所以你可以配置成这样子

{
    "database": "fizz1120",
    "collection": "product_article",
    "buildIndex": true,
    "documents": [
        {
            "id": "f001",
            "name": "tom",
            "text": "白日依山尽",
            "time": "2023年11月21日09:56:38",
            "updatetime": "2023年11月21日09:56:38",
            "address": "中国深圳",
        },
        {
            "id": "f002",
            "name": "fizz",
            "text": "黄河入海流"
        }
    ]
}

性能测试,测试腾讯向量数据库的查询处理能力

为了验证腾讯腾讯云向量数据库(Tencent Cloud VectorDB)的查询能力,我们使用开源工具 ann-benchmark 对腾讯向量数据库进行了性能测试后,得到了很多详细的数据。
衡量一个数据库的查询能力,一个重要的指标就是吞吐量QPS,它是指系统在单位时间内能够处理的查询请求数量,是衡量系统查询处理能力的重要指标。我们测试了不同维度的 QPS 数据、不同召回率下的 QPS 数据、不同数据规模的 QPS 数据。
最终得出的测试结论:
数据集128维与768维某开源向量数据库与腾讯云向量数据库的 QPS 对比测试数据,如下所示。通过如下对比视图,可看出腾讯云的 QPS 性能具有显著优势。通过该项测试,可得出如下结论:

  • 在不同维度的数据集下,HNSW 索引都可以达到99%以上的召回率。
  • 在数据量相同的情况下,随着向量维度的增加,检索时资源开销增加,腾讯云向量数据库 QPS 会有所降低。
  • 同一数据集,与某开源自建向量数据库对比,腾讯云向量数据库的 QPS 有36%到279%的提升。对比视图,如下所示。

    针对不同召回率下的 QPS 对比,测试结果是
  • 同一数据集,召回率要求越高,即 ef 参数(指定寻找节点邻居遍历的范围)设置越大时,QPS越低。 不同召回率 QPS 的对比视图,如下所示。
  • 同一数据集,在其他配置不变的情况下,若需提高召回率,可适当增加查询参数 ef。
    在这里插入图片描述

向量数据库如何增强企业知识库搜索?

上面介绍完腾讯云向量数据库(Tencent Cloud VectorDB)的性能后,相信大家一定迫不及待想要在实践一下,看下它在日常搜索中的表现。那么下面我就带领大家以企业知识库的场景实践一下。
在腾讯云向量数据库的产品资料中有关于大模型知识库的场景方案,这里也给大家简单介绍一下。
腾讯云向量数据库可以和大语言模型 LLM 配合使用。企业的私域数据在经过文本分割、向量化后,可以存储在腾讯云向量数据库中,构建起企业专属的外部知识库,从而在后续的检索任务中,为大模型提供提示信息,辅助大模型生成更加准确的答案。
在这里插入图片描述
流程比较复杂,我简单描述一下使用神经网络将知识库分割,一条条的记录。然后使用向量化模型进行向量化,存入到向量数据库中。最后通过API来向外提供检索,查询。

知识库处理

本次实践我们暂未使用大模型语言LLM,更加注重向量数据库的使用。
使用的知识库就是 腾讯云向量数据库的知识文档。
为了降低难度和节约时间,我们只解析一页文档。即腾讯云向量数据库的介绍
在这里插入图片描述

数据库建模,创建Collection,创建索引,指定搜索算法

我们先创建相应的集合用于保存文档数据。集合配置参数如下:在这里插入图片描述
需要向量化的字段为text,主键为id。使用的向量化模型为bge-base-zh,这也是推荐使用的模型。另外相似算法使用的是COSINE。

建好模后,我们来处理知识库的原始数据,将我们知识库的文本内容以txt文件保存下来(目前图片无法进行向量化保存),保存下来后,我们需要将内容进行拆分,分割成一小段,一小段,可以以逗号,句号,和换行符进行分割。最后我们组装成这样的数据结构。

[
  {
    "id" : "001",
    "time": "2023-10-27",
    "author": "腾讯云",
    "link": "https://cloud.tencent.com/document/product/1709/94945",
    "text": "本页面旨在通过回答几个问题来让您大致了解腾讯云向量数据库(Tencent Cloud VectorDB)"
  },
  {
    "id" : "002",
    "time": "2023-10-27",
    "author": "腾讯云",
    "link": "https://cloud.tencent.com/document/product/1709/94945",
    "text": "读完本页后,您将了解腾讯云向量数据库是什么、它是如何工作的、关键概念、为什么使用腾讯云向量数据库、支持的索引和指标、架构和相关连接方式"
  },
  {
    "id" : "003",
    "time": "2023-10-27",
    "author": "腾讯云",
    "link": "https://cloud.tencent.com/document/product/1709/94945#54308cd9-4ab5-433c-b6dc-bdacd59183e7",
    "text": "腾讯云向量数据库是什么?"
  },
  {
    "id" : "004",
    "time": "2023-10-27",
    "author": "腾讯云",
    "link": "https://cloud.tencent.com/document/product/1709/94945#54308cd9-4ab5-433c-b6dc-bdacd59183e7",
    "text": "腾讯云向量数据库是一款全托管的自研企业级分布式数据库服务,专用于存储、检索、分析多维向量数据。"
  },
  {
    "id" : "005",
    "time": "2023-10-27",
    "author": "腾讯云",
    "link": "https://cloud.tencent.com/document/product/1709/94945#54308cd9-4ab5-433c-b6dc-bdacd59183e7",
    "text": "该数据库支持多种索引类型和相似度计算方法,单索引支持10亿级向量规模,可支持百万级 QPS 及毫秒级查询延迟。"
  },
  {
    "id" : "006",
    "time": "2023-10-27",
    "author": "腾讯云",
    "link": "https://cloud.tencent.com/document/product/1709/94945#54308cd9-4ab5-433c-b6dc-bdacd59183e7",
    "text": "腾讯云向量数据库不仅能为大模型提供外部知识库,提高大模型回答的准确性,还可广泛应用于推荐系统、NLP 服务、计算机视觉、智能客服等 AI 领域"
  }
]
  • id 主键
  • time 文档撰写时间
  • author 作者
  • link 文档片段的锚点
  • text 需要向量化的原始文档文本

插入数据

一篇文章我们大概能够分割出100多条记录。然后将这些记录,一次性插入到向量数据库中。
本次实践我们使用 HTTP 协议进行数据写入和查询等操作,编程语言是用Nodejs。

以下是向向量数据库批量插入文档的核心代码

批量插入文档

const axios = require('axios')
const documents = require('./documents') // 存放记录的js文件
const account = '' // 数据库账号
const apiKey = '' // 数据库秘钥
const databaseLink = '' // 数据库外网地址
const headers = {
  Authorization: `Bearer account=${account}&api_key=${apiKey}`,
}

async function insertDoc(documents) {
  try {
    const sendData = {
      database: 'fizz1120',
      collection: 'product_article',
      buildIndex: true,
      documents,
    }
    const response = await axios.post(`${databaseLink}/document/upsert`, sendData, headers)
    console.log('插入成功', response.statusText)
  } catch (error) {
    console.error(`请求遇到问题: ${error.message}`)
  }
}

insertDoc(documents)

脚本运行成功后,控制台会打印出插入成功的字样。
然后我们在DMC中对某个集合查看详情,
在这里插入图片描述
可以看到,文档已经被插入了数据库,目前文档数位101。
在这里插入图片描述

数据查询

数据查询我们使用的是相似度匹配的查询方式,接口为/document/search ,用于查找与给定查询向量相似的向量。
有几个必填参数,
database: 指定要查询的Database名称。
collection: 指定要查询的Collection名称。

如果有个关键词,你可以这个传入

"search": {
  "embeddingItems": [
       "腾讯云向量数据库是什么?"
   ],
   "limit": 3,
}

下面是搜索的核心代码

// 检索方法
async function searchDom(keyword) {
  const sendData = {
    database: 'fizz1120',
    collection: 'product_article',
    search: {
      embeddingItems: [keyword],
      limit: 5,
      retrieveVector: false,
    },
  }

  try {
    const { data } = await axios({
      method: 'post',
      url: `${databaseLink}/document/search`,
      data: sendData,
      headers,
    })
    console.log(data.documents)
  } catch (error) {
    console.log(error.message, '111')
  }
}

searchDom('腾讯云向量数据库是什么?')

返回结果如下:
在这里插入图片描述
由于我们查询参数limit设置了5,所以结果返回了5条。
除了limit,还有一些参数可以控制我们的查询结果

  • vectors 表示要查询的向量列表。
  • documentIds 待查询的文档 ID 列表。数组元素数量最大为20
  • embeddingItems 输入文本信息,用于检索与该文本信息相似的数据。注意 vectors 、 documentIds、embeddingItems 三个字段,只需配置其中一个即可
  • params 索引类型不同,检索时,所需配置的参数不同。
  • filter 使用创建 Collection 指定的 Filter 索引的字段设置查询过滤表达式
  • retrieveVector 标识是否需要返回检索结果的向量值。
  • outputFields 指定需要输出的字段。若不设置,将返回所有字段。

至此,我们的企业知识库的文档处理,批量插入,相似度查询,就全部做完了。

总结

目前腾讯云向量数据库(Tencent Cloud VectorDB)只支持文本向量化写入,对于音视频和图片等非文本,非结构化数据还不支持。但从目前的情况来看在查询和使用上,它已经是一款非常优秀的产品。无论是配套的API支持,还是产品概念,文档。抑或是使用的便捷,都做的非常好。
腾讯云向量数据库作为一种专门存储和检索向量数据的服务提供给用户, 在高性能、高可用、大规模、低成本、简单易用、稳定可靠、智能运维等方面体现出显著优势。

产品建议和意见

1:使用DMC时,在使用插入时,如果该集合开启了embedding,并填写了一个字段,那么在插入时必须要有这个字段,需要在插入时给出的示例能够包含该字段。
在这里插入图片描述

2:在DMC中,希望能够提供一个查看所有Document的的视图
类似下图
在这里插入图片描述

3:建议数据库权限划分更加细一下,能够将读写的权限分离。目前一个密钥能够完成所有的增删改查。
在这里插入图片描述

4:创建集合的页面不太美观,第一次使用该功能,非常的迷茫,不清楚填入的
在这里插入图片描述

相关链接

腾讯云向量数据库
DMC数据库管理

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【链表之练习题】

文章目录 翻转链表找到链表的中间节点返回倒数第k个节点合并两个有序链表判断链表是否回文注意 翻转链表 //反转链表//实质上是把每一个节点头插法,原本第一个节点变成最后一个节点public ListNode reverseList(){//链表为空if (head null){return null;}//链表只有一个节点if…

【腾讯云云上实验室】向量数据库与数据挖掘分析的黄金组合指南

前言: 在当今信息化时代,掌握对数据进行挖掘和分析的能力变得愈发关键。根据需求精准处理数据不仅仅是一项技能,更是对未来决策和操作的至关重要的支持。除了熟练运用适当的算法模型对大数据进行挖掘和分析外,合理高效存储和处理大…

文件批量重命名技巧:图片文件名太长怎么办?告别手动改名方法

在日常生活中,常常会遇到文件名过长导致的问题。尤其是在处理大量图片文件时,过长的文件名可能会使得文件管理变得混乱不堪。现在来看下云炫文件管理器如何批量重命名,让图片文件名变得更简洁,提高工作效率。 操作1、在云炫文件…

Nginx模块开发之http handler实现流量统计(2)

文章目录 一、概述二、Nginx handler模块开发2.1、代码实现2.2、编写config文件2.3、编译模块到Nginx源码中2.4、修改conf文件2.5、执行效果 总结 一、概述 上一篇【Nginx模块开发之http handler实现流量统计(1)】使用数组在单进程实现了IP的流量统计&a…

698. 划分为k个相等的子集

698. 划分为k个相等的子集 Java:回溯 class Solution {boolean[] used;int target;private boolean backtracking(int[] nums, int k, int sum, int start) {if (k 0) {return true; // 找到:立即中断栈!并返回值}if (sum target) { // 构…

中国企业500强的排名也在不断变化。面对不确定性的挑战,企业如何应对?

随着全球经济的不断发展和变化,中国企业500强的排名也在不断变化。面对不确定性的挑战,企业如何应对?在本文中,挖数据平台将提供数据源探讨中国企业500强在应对不确定性方面的突围与变革。 一、数据挖掘与分析 从2006年到2023年&…

【电子通识】为什么说做产品不是简单的将不同的技术进行搭积木?

很多人说做产品的硬件工程师,其实就是将专项技术工程师已经调好的模块进行拼接。类似于小孩将积木搭成一个房子的形状,虽然不同人搭的房子风格迥异,但所使用的原材料却都是一样的。 首先我并不同意这种看法,原因是产品工程师是需要…

搞笑的客服日常,今天遇到的晒白客服,你遇到过吗?

大家看看这个 https://blog.csdn.net/a871923942/article/details/129778391?utm_mediumdistribute.pc_feed_404.none-task-blog-2 今天遇到傻逼审核 开头第一句就使用快捷话术 客服感觉自己发错了 然后就撤回消息 第二次继续发话术,说违规,审核不通过…

STM32入门--CAN

目录 一、bxCan简介 二、bxCAN总体描述 2.1概述 2.2CAN框图 三、bxCA的工作模式 3.1初始化模式 3.2正常模式 3.3睡眠模式(低功耗) 四、测试模式 4.1静默模式 4.2环回模式 五、bxCAN功能描述 5.1 发送处理 ​编辑 5.2接收管理 5.2.1 标识符过…

基于食肉植物算法优化概率神经网络PNN的分类预测 - 附代码

基于食肉植物算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于食肉植物算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于食肉植物优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神…

CAN实验

CAN 寄存器 HAL库函数 代码 #include "./BSP/CAN/can.h"CAN_HandleTypeDef g_can1_handle; CAN_TxHeaderTypeDef g_can1_txheader; CAN_RxHeaderTypeDef g_can1_rxheader;/* STM32F103 TS1 8 TS2 7 BRP 3 波特率:36000 / [(9 8 1) * 4] 500Kbps …

甲烷产生及氧化

温室气体排放被认为是加速气候变化的重要因素,甲烷(CH4)是仅次于二氧化碳(CO2)的重要温室气体,其百年温室效应潜势是CO2的28倍[1-2]。湿地中的CH4由产甲烷古菌在水体底部或沉积层严格厌氧环境下产生并释放进入水体,产生的CH4向上覆水运输过程…

【沐风老师】在3dMax中如何把对象随机散布在表面上?

在3dMax中如何把对象随机散布在表面上? 在这个教程中,给大家讲解在3dMax中如何把对象随机散布到另一个对象的表面上。有不少3dMax的初学者在将对象分布在随机表面上时感到手足无措。如果,将每个对象手动放置在表面上并花时间调整每个对象根本…

卷积神经网络(Inception V3)识别手语

文章目录 一、前言二、前期工作1. 设置GPU(如果使用的是CPU可以忽略这步)2. 导入数据3. 查看数据 二、数据预处理1. 加载数据2. 可视化数据3. 再次检查数据4. 配置数据集 三、构建Inception V3网络模型1.自己搭建2.官方模型 五、编译六、训练模型七、模型…

C++模拟如何实现vector的方法

任意位置插入,insert的返回值为新插入的第一个元素位置的迭代器;因为插入可能会进行扩容,导致start的值改变,所以先定义一个变量保存pos与start的相对位置;判断是否需要扩容;从插入位置开始,将所…

Qt学习(2)

1.QObject 只有继承了QObject类的类,才具有信号槽的能力。所以,为了使用信号槽,必须继承QObject。凡是QObject类(不管是直接子类还是间接子类),都应该在第一行代码写上Q_OBJECT。不管是不是使用信号槽&…

dom api

dom的全称为Document Object Model,即文档对象模型.所谓文档就是html页面,对象就是js里的对象,通过这个模型把页面上的元素和js里的对象关联起来. 下面是关于dom api的一些常用方法 1.获取元素 使用querySelector()方法获取一个元素 使用querySelectorAll()方法获取所有元素 当…

MediaCodec详解

MediaCodec 是Android平台提供的一个API,用于对音频和视频数据进行编码(转换为不同的格式)和解码(从一种格式转换回原始数据)。它是Android 4.1(API级别16)及以上版本的一部分,允许开…

【C语言】函数(四):函数递归与迭代,二者有什么区别

目录 前言递归定义递归的两个必要条件接受一个整型值(无符号),按照顺序打印它的每一位使用函数不允许创建临时变量,求字符串“abcd”的长度求n的阶乘求第n个斐波那契数 迭代总结递归与迭代的主要区别用法不同结构不同时间开销不同…

【Python】实现一个简单的区块链系统

本文章利用 Python 实现一个简单的功能较为完善的区块链系统(包括区块链结构、账户、钱包、转账),采用的共识机制是 POW。 一、区块与区块链结构 Block.py import hashlib from datetime import datetimeclass Block:"""区…