AI系统性学习05—向量数据库

文章目录

  • 1、Chroma向量数据库
    • 1.1 安装Chroma
    • 1.2 初始化Chroma客户端
    • 1.3 创建一个合集
    • 1.4 添加数据
    • 1.5 查询数据
    • 1.6 持久化数据
    • 1.7 集合操作
      • 1.7.1 创建集合
      • 1.7.2 获取集合
      • 1.7.3 删除集合
      • 1.7.4 其他操作
      • 1.8 向集合添加数据
      • 1.9 查询集合数据
      • 1.10 更新集合数据
      • 1.11 删除集合数据
      • 1.12 向量计算
  • 2、Qdrant向量数据库
    • 2.1 什么是Qdrant?
    • 2.2 什么是向量数据库?⭐️⭐️⭐️
    • 2.3 为什么需要向量数据库?
    • 2.4 Qdrant快速入门
    • 2.5 QDrant集合(Collections)
    • 2.6 Qdrant向量数据(Points)
    • 2.7 Qdrant关联数据(Payload)
    • 2.8 Qdrant搜索⭐️⭐️⭐️

1、Chroma向量数据库

Chroma是一款开源的向量数据库,它使用向量相似度搜索技术,可以快速有效地存储和检索大规模高维向量数据。它的应用场景包括推荐系统、图像和视频搜索、自然语言处理等领域,可以帮助用户快速地找到相似的数据和信息。

Chroma是一款应用嵌入式数据库,以包的形式嵌入到我们的代码,Chroma的优点就是简单,如果你在开发LLM应用需要一个向量数据库实现LLM记忆功能,需要支持文本相似语言搜索,又不想安装独立的向量数据库,Chroma是不错的选择。

1.1 安装Chroma

pip install chromadb

1.2 初始化Chroma客户端

import chromadb
chroma_client = chromadb.client()

1.3 创建一个合集

合集(collection)在chroma数据库中的作用就类似表,存储向量数据(包括文档和其他源数据)的地方,下面创建一个集合:

# 创建集合
collection = chroma_client.create_collection(name="test")

1.4 添加数据

Chroma会存储我们的数据,并根据文本数据的向量创建专门的向量索引方便后面查询。

  • 使用内置的嵌入模型计算向量
# 假设这里是需要存储的文本
text1 = "This is a document"
text2 = "This is another document"

# 使用内置的嵌入模型计算向量
collection.add(
    documents=[text1,text2],
    metadatas=[{"source": "my_source"}, {"source": "my_source"}],
    ids=["id1", "id2"]
)
  1. documents参数就是需要写入的文本数据数组,支持一次插入多条数据
  2. metadatas是每条写入的数据关联的一些属性
  3. ids 是每条写入数据的id
  • 添加数据的时候指定向量值
# 指定向量值
collection.add(
    embeddings=[[1.2, 2.3, 4.5], [6.7, 8.2, 9.2]],
    documents=[text1, text2],
    metadatas=[{"source": "my_source"}, {"source": "my_source"}],
    ids=["id1", "id2"]
)

1.5 查询数据

results = collection.query(
    query_texts=["This is a query document"],
    n_results=2
)

其中n为n个最相似的结果。默认情况下,Chroma中的数据是存储在内存中,重启程序数据就丢了,当然你可以设置Chroma的数据持久化到硬盘,这样程序启动的时候会去加载磁盘中的数据。

1.6 持久化数据

client = chromadb.PersistentClient(path="/data/tizi365.db")

客户端对象一些常用的函数

client.reset() # 清空并完全重置数据库

1.7 集合操作

前面提到过,chromadb中的集合类似mysql中的数据表,因此其命名本身也存在一些限制:

  • 名称长度必须介于3到63个字符之间。
  • 名称必须以小写字母或数字开头和结尾,中间可以包含点、破折号和下划线。
  • 名称不能包含两个连续的点。
  • 名称不能是有效的IP地址。
    创建集合,需要指定集合名称和一个可选的向量计算函数(也叫embedding嵌入函数)。如果提供了嵌入函数,则必须在每次获取集合时提供它。需要注意的是,如果你在创建时候指定了向量计算函数,则获取集合时也应该提供向量计算函数

1.7.1 创建集合

# 通过embedding_function参数指定向量计算函数,不指定则使用内置的函数
collection = client.create_collection(name="my_collection", embedding_function=emb_fn)

创建时候,还可以指定向量计算方法,类似如下:

collection = client.create_collection(
        name="collection_name",
        metadata={"hnsw:space": "cosine"} # l2 是默认的计算方法
    )

1.7.2 获取集合

# 如果创建集合的使用指定了向量计算函数,引用集合的时候也要指定向量计算函数
collection = client.get_collection(name="my_collection", embedding_function=emb_fn)

1.7.3 删除集合

# 删除指定集合
client.delete_collection(name="my_collection")

1.7.4 其他操作

collection.peek() # 返回集合中前 10 个数据的列表
collection.count() # 返回集合中的数据总数
collection.modify(name="new_name") # 重命名集合

1.8 向集合添加数据

使用.add方法将数据添加到Chroma,类似如下:

collection.add(
    documents=["lorem ipsum...", "doc2", "doc3", ...],
    metadatas=[{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}, ...],
    ids=["id1", "id2", "id3", ...]
)

如果 Chroma 收到一个文档列表(documents),它会自动使用集合的嵌入函数对文档进行向量计算(如果创建集合时未提供嵌入函数,则使用默认值)。Chroma 还会存储文档本身。如果文档太大,无法使用所选的嵌入函数计算,则会出现异常。

每个文件都必须有一个唯一的ID(ids)。两次添加相同的 ID 会导致只存储初始值。可以为每个文档提供一个可选的元数据字典(metadatas)列表,以存储更多信息,用于支持查询的时候筛选数据。

或者,你也可以直接提供文档相关向量数据的列表,Chroma直接使用你填写的向量数据,而不会自动计算向量。(但是需要注意的是提供的向量维度(长度)与集合的维度不一致),则会出现异常。
你也可以将文档存储在其他地方,只需向 Chroma 提供向量数据和元数据列表即可。你可以使用 ids 将向量与存储在其他地方的文档关联起来。

collection.add(
    embeddings=[[1.1, 2.3, 3.2], [4.5, 6.9, 4.4], [1.1, 2.3, 3.2], ...],
    metadatas=[{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}, ...],
    ids=["id1", "id2", "id3", ...]
)

需要注意的是,向量数据库的核心功能是基于向量数据的语义搜索,为减小向量数据库的大小,提高效率,我们可以选择在向量数据库存储向量数据和一些需要筛选的属性条件就行,其他数据,例如文章内容等数据,存储到其他专门的数据库中,只要通过id关联起来就可以了。

1.9 查询集合数据

collection.query(
    query_embeddings=[[11.1, 12.1, 13.1],[1.1, 2.3, 3.2], ...],
    n_results=10,
    where={"metadata_field": "is_equal_to_this"},
    where_document={"$contains":"search_string"}
)

查询将按顺序返回与每个查询向量(query_embedding)最匹配的 n_results 个结果。可以提供一个可选的 where 过滤字典,根据与每个文档相关的元数据过滤结果。此外,还可提供一个可选的 where_document 过滤字典,用于根据文档内容过滤结果。

如果提供的 query_embeddings 与集合的维度不一致,则会出现异常,为了确保向量维度一致,统一使用同一个文本嵌入模型计算向量就行。

你也可以通过一组查询文本进行查询。Chroma 会首先使用集合的嵌入函数计算每一个查询文本的向量,然后使用生成的文本向量执行查询。

# 直接通过文本查询,相似的内容,这里chroma会使用默认嵌入模型计算向量
collection.query(
    query_texts=["doc10", "thus spake zarathustra", ...],
    n_results=10,
    where={"metadata_field": "is_equal_to_this"},
    where_document={"$contains":"search_string"}
)

另外可以使用.get从集合中按照id查询数据

collection.get(
    ids=["id1", "id2", "id3", ...],
    where={"style": "style1"}
)

.get 还支持 where 和 where_document 筛选器。如果没有提供 id,它将返回集合中符合 where 和 where_document 筛选器的所有项目。

1.10 更新集合数据

# 根据id批量更新数据
collection.update(
    ids=["id1", "id2", "id3", ...],
    embeddings=[[1.1, 2.3, 3.2], [4.5, 6.9, 4.4], [1.1, 2.3, 3.2], ...],
    metadatas=[{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}, ...],
    documents=["doc1", "doc2", "doc3", ...],
)

如果在集合中找不到 id,将记录错误并忽略更新。如果提供的文档没有相应的向量,将使用集合的嵌入函数计算向量。

1.11 删除集合数据

Chroma 支持使用 .delete 按 id 从集合中删除数据。与每个数据相关的向量、文档和元数据都将被删除。

collection.delete(
    ids=["id1", "id2", "id3",...],
    where={"chapter": "20"}
)

1.12 向量计算

默认情况下,Chroma 使用 Sentence Transformers的 all-MiniLM-L6-v2 模型计算向量。该嵌入模型可以创建句子和文档向量。该嵌入模型功能在本地计算机上运行,需要下载模型文件(这是自动完成的)。
前面的代码都是使用默认嵌入实现的,现在使用OpenAI提供的接口来完成嵌入并存入数据库中。

import chromadb
from chromadb.utils import embedding_functions
from chromadb.api.types import Documents, EmbeddingFunction, Embeddings

# 初始化客户端
chroma_client = chromadb.Client()

# 使用openai的嵌入接口
openai_ef = embedding_functions.OpenAIEmbeddingFunction(
    api_key="REPLACE BY YOUR KEY",
    model_name="text-embedding-ada-002"
)


class MyEmbeddingFunction(EmbeddingFunction):
    def __call__(self, texts: Documents) -> Embeddings:
        return openai_ef.embed_with_retries(texts)


# 创建集合
collection = chroma_client.create_collection(name="test", embedding_function=MyEmbeddingFunction())

2、Qdrant向量数据库

2.1 什么是Qdrant?

Qdrant是一个开源向量数据库,专为下一代AI应用程序设计。它是面向云原生的,并提供RESTful和gRPC API以管理嵌入。Qdrant的特性强大,支持图像、语音和视频搜索,以及与AI引擎的集成。

2.2 什么是向量数据库?⭐️⭐️⭐️

在这里插入图片描述

向量数据库是一种专门设计用于高效存储和查询高维向量的数据库。在传统的OLTP和OLAP数据库中(如上图所示),数据以行和列的方式组织(这些被称为表),查询是基于这些列中的值进行的。然后,在某些应用中,如图像识别、自然语言处理和推荐系统,数据通常以高维空间中的向量表示,这些向量加上一个id和有效负载,就是我们存储在类似于Qdrant的向量数据库中的元素。

在这个背景下,向量是对象或数据点(point)的数学表示,向量的每个元素对于对象的某个特征或者属性。例如,在图像识别系统中,向量可以表示为一个图像,向量的每个元素代表像素值或该像素特征/描述符。在音乐推荐系统中,每个向量代表一首歌曲,向量的每个元素代表歌曲的每个特征,比如节奏、流派、歌词等。

向量数据库针对高维向量的高效存储和查询进行了优化,通常使用了专门的数据结构和索引技术,如层次式可导航小世界(HNSW,用于实现近似最近邻搜索)和乘积量化等。这些数据库能够在允许用户按照某个距离度量标准,找到与给定查询向量最接近的向量的同时,实现快速相似性和语义搜索。最常用的距离度量标准有欧式距离、余弦相似度和点积,在Qdrant中这三种度量标准得到了完全的支持。

以下是对这三种向量相似度算法的简要介绍:

  • 余弦相似度(Cosine Similarity) - 余弦相似度是一种衡量两个事物相似程度的方式。可以将其视为一把标尺,用于测量两个点之间的距离,但与其测量距离不同,它测量的是两个事物之间的相似程度。它常用于文本中比较两个文档或句子之间的相似程度。余弦相似度的输出范围从0到1,其中0表示两个事物完全不相似,1表示两个事物完全相同。这是一种简单而有效的比较两个事物的方法!
  • 点积(Dot Product) - 点积相似度度量是另一种衡量两个事物相似程度的方式,类似于余弦相似度。在处理数字时,它通常用于机器学习和数据科学中。点积相似度通过将两组数字中的值相乘,然后将这些乘积加起来来计算得到。和越高的总和意味着两组数字越相似。它就像一个衡量两组数字彼此匹配程度的比例尺。
  • 欧式距离(Euclidean Distance) - 欧式距离是一种测量空间中两点之间距离的方式,类似于我们在地图上测量两个地方之间距离的方式。它的计算方式是找到两点坐标之间差值的平方和的平方根。这种距离度量方式通常在机器学习中用于衡量两个数据点的相似性或差异性,换句话说,用于了解它们之间有多远。

2.3 为什么需要向量数据库?

使用向量数据库的其他好处包括:

  • 高维数据的高效存储和索引。
  • 能够处理数十亿个数据点的大规模数据集。
  • 支持实时分析和查询。
  • 能够处理来自图像、视频和自然语言文本等复杂数据类型所导出的向量。
  • 提高机器学习和人工智能应用的性能并减少延迟。
  • 与构建自定义解决方案相比,减少开发和部署时间和成本。

2.4 Qdrant快速入门

  • 使用docker安装Qdrant
docker pull qdrant/qdrant
docker run -p 6333:6333 -p 6334:6334 -v ~/data:/qdrant.storage:z qdrant/qdrant
  • 访问WebUI:localhost:6333
    在这里插入图片描述
  • 创建集合(collections)
    Qdrant向量数据库的集合概念可以类比MYSQL的表结构,用于统一存储同一类向量数据,集合中存储的每一条数据,在Qdrant中称为点(points),这里的点有数学几何空间的点类似的意思,代表向量在几何空间中的表示(你就当成一条数据看待就行)。
PUT /collections/{collection_name}
{
    "vectors": {
      "size": 300,
      "distance": "Cosine"
    }
}

参数说明:

  • collection_name 集合名字(必填)
  • vectors 参数定义
    • size:向量的长度(也叫维度)
  • distance:向量相似度算法,主要有“Cosine”、“Euclid”、"Dot"三种算法。
  • 添加向量 (Points)
    创建好集合之后,我们可以向集合添加向量数据,在Qdrant中向量数据使用point表示,一条point数据包括三部分idpayload(关联数据)向量数据(vector)三部分。
PUT /collections/{collection_name}/points
{
    "points": [
        {
            "id": "5c56c793-69f3-4fbf-87e6-c4bf54c28c26", // id
            "payload": {"color": "red"}, // 关联的属性数据,通常业务这里可以关联业务的属性,例如:订单ID、商品ID、标题等等属性
            "vector": [0.9, 0.1, 0.1] // 向量数据,代表当前业务数据的特征
        }
    ]
}
  • 向量搜索
    添加向量数据之后,我们可以通过向量进行语义相似度搜索。
POST /collections/{collection_name}/points/search
{
    "vector": [0.2, 0.1, 0.9, 0.7], // 向量参数
    "limit": 3 // 返回相似度最高的3条数据
}

需要将你搜索的内容,先转换为向量,然后再根据该向量在向量数量数据库中搜索。

  • 属性过滤
// collection_name - 集合名字
POST /collections/{collection_name}/points/search
{
    "filter": { // 这里主要用于过滤payload的关联属性,整体语法格式类似elasticsearch语法,这个参数是可选的
        "must": [ //筛选color=red的point数据
            {
                "key": "color",
                "match": {
                    "value": "red"
                }
            }
        ]
    },
    "vector": [0.2, 0.1, 0.9, 0.7], // 向量参数
    "limit": 3
}

2.5 QDrant集合(Collections)

同一集合内每个点的向量都必须具有相同的维度,并通过单一度量进行比较。命名向量可用于在单个点中包含多个向量,每个向量都可以有自己的维度和度量要求。

距离度量用于衡量向量之间的相似性。度量的选择取决于向量获取的方式,特别是神经网络编码器训练的方法。

  • 设置多租户

    • 应该创建多少个集合?
      大多数情况下,只需要使用一个带有基于有效负载的分区的集合。这种方法称为多租户。对于大多数用户来说,这是高效的,但是需要额外配置。
    • 何时应该创建多个集合?
      当您有有限的用户数并且需要隔离时。这种方法更灵活,但可能更加昂贵,因为创建大量集合可能会导致资源开销。此外,您需要确保它们不以任何方式相互影响,包括性能方面。
  • 创建集合

PUT /collections/{collection_name}

{
    "vectors": {
      "size": 300,
      "distance": "Cosine"
    }
}
  • 删除集合
DELETE /collections/{collection_name}
  • 更新集合
    向量都存储在内存中以便快速访问。针对每个向量,可以将on_disk设置为ture,以便始终将所有向量存储在磁盘上。这将启用内存映射,适用于摄取大量数据。以下命令为存储了超过10000k向量段启用索引。
PATCH /collections/{collection_name}
{
    "optimizers_config": {
        "indexing_threshold": 10000
    }
}
  • 获取集合信息
GET /collections/{collection_name}

2.6 Qdrant向量数据(Points)

点(points)是Qdrant操作的核心实体。一个点是由向量(vector)和可选载荷(payload)组成的记录。

您可以根据向量(矢量)相似性搜索在一个集合中分组的点。更详细的过程描述在搜索和过滤部分中。

本节介绍如何创建和管理矢量(向量)。

任何点(point)的修改操作都是异步的,并且分为两个步骤。在第一阶段,操作将被写入预写日志中。

此刻开始,即使机器供电中断,服务也不会丢失数据。

  • 点ID
    Qdrant支持使用64位无符号整数和UUID作为点的标识符。
    这意味着在每个请求中,可以使用UUID字符串来替代数字ID
PUT /collections/{collection_name}/points
{
    "points": [
        {
            "id": "5c56c793-69f3-4fbf-87e6-c4bf54c28c26",
            "payload": {"color": "red"},
            "vector": [0.9, 0.1, 0.1]
        }
    ]
}
  • 上传数据
    为了优化性能,Qdrant支持批量加载数据点。也就是说,您可以在一次API调用中加载多个数据点到服务中。批量加载可以最大程度地减少网络连接的开销。

Qdrant API支持两种批量创建方式 - 记录导向和列导向。在内部,这些选项没有区别,只是为了方便交互。

PUT /collections/{collection_name}/points

{
    "points": [
        {
            "id": 1,
            "payload": {"color": "red"},
            "vector": [0.9, 0.1, 0.1]
        },
        {
            "id": 2,
            "payload": {"color": "green"},
            "vector": [0.1, 0.9, 0.1]
        },
        {
            "id": 3,
            "payload": {"color": "blue"},
            "vector": [0.1, 0.1, 0.9]
        }
    ]
}
  • 更新数据点
    未指定的向量将保持不变。所有给定的点都必须存在。
PUT /collections/{collection_name}/points/vectors

{
    "points": [
        {
            "id": 1,
            "vector": {
                "image": [0.1, 0.2, 0.3, 0.4]
            }
        },
        {
            "id": 2,
            "vector": {
                "text": [0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2]
            }
        }
    ]
}
  • 删除向量
    该方法仅从给定点中删除指定的向量。其他向量将保持不变。不会删除点。
POST /collections/{collection_name}/points/vectors/delete

{
    "points": [0, 3, 100],
    "vectors": ["text", "image"]
}

2.7 Qdrant关联数据(Payload)

Qdrant的一个重要特性之一是能够在向量之外存储附加信息(存储管理业务属性)。在Qdrant术语中,这些附加信息被称为“负载”。

Qdrant允许您存储任何可以使用JSON表示的信息。

  • payload 类型
    除了存储负载外,Qdrant还允许您基于某些特定类型的值进行搜索。这个特性实现为搜索过程中的附加过滤器,并且可以让您在语义相似性之上嵌入自定义逻辑。

在过滤过程中,Qdrant将检查那些符合过滤条件的值的条件。如果存储的值类型不符合过滤条件,则被认为是未满足条件的。
简单来说,你可以提前设想好,存放哪些数据到json格式的数据中,然后将这个数据设置为对应向量的payload

  • 负载索引
    为了更有效地进行过滤搜索,Qdrant允许您通过指定字段的名称和类型来为负载字段创建索引。

    索引字段也会影响向量索引。

    在实践中,我们建议在那些可能最多限制结果的字段上创建索引。例如,使用对象ID的索引将比使用颜色的索引更高效,因为对象ID对于每个记录是唯一的,而颜色只有几个可能的值。

    在涉及多个字段的复合查询中,Qdrant将尝试首先使用最具限制性的索引。

    要为字段创建索引,可以使用以下内容:

    PUT /collections/{collection_name}/index
    {
        "field_name": "要创建索引的字段名称",
        "field_schema": "keyword"
    }
    

2.8 Qdrant搜索⭐️⭐️⭐️

  • 相似度搜索
    在许多表示学习应用程序中,搜索最近的向量是核心要素。现代神经网络被训练成将对象转化为向量,使得在向量空间中相近的物体在现实世界中也相近。例如,具有相似含义的文本、视觉上相似的图片,或是属于相同流派的歌曲。
    在这里插入图片描述
  • 相似度度量
    有许多方法来评估向量之间的相似度。在Qdrant中,这些方法被称为相似度度量。选择哪种度量取决于向量的获取方式,尤其是神经网络编码器训练的方法。
    Qdrant支持以下最常见的度量类型:
  • 点积:Dot
  • 余弦相似度:Cosine
  • 欧几里得距离:Euclid
    在这里插入图片描述
    Qdrant通过两个步骤计算该度量,从而实现更高的搜索速度。第一步是在将向量添加到集合时进行向量归一化。这只对每个向量进行一次。

第二步是向量比较。在这种情况下,它等同于点积运算-由于SIMD的快速操作。

POST /collections/{collection_name}/points/search

{
    "filter": {
        "must": [
            {
                "key": "city",
                "match": {
                    "value": "伦敦"
                }
            }
        ]
    },
    "params": {
        "hnsw_ef": 128,
        "exact": false
    },
    "vector": [0.2, 0.1, 0.9, 0.7],
    "limit": 3
}
  • 分页
    搜索和推荐API允许跳过搜索结果的前几个结果,并仅返回从某个特定偏移量开始的结果。
POST /collections/{collection_name}/points/search

{
    "vector": [0.2, 0.1, 0.9, 0.7],
    "with_vectors": true,
    "with_payload": true,
    "limit": 10,
    "offset": 100
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[CISCN2019 华北赛区 Day1 Web5]CyberPunk --不会编程的崽

继续sql,哈哈。我按照我的思路来讲。 四个功能,提交,查找,修改,删除。多半是sql注入,而且又有修改,查找功能。多半还是二次注入。昨天那个修改密码的,也是二次注入。这里需要先找到注入点 姓名 …

STM32CubeMX学习笔记24---FreeRTOS(消息队列)

一. 队列简介 队列是为了任务与任务、任务与中断之间的通信而准备的,可以在任务与任务、任务与中 断之间传递消息,队列中可以存储有限的、大小固定的数据项目。任务与任务、任务与中断之 间要交流的数据保存在队列中,叫做队列项目。队列…

SLAM 求解IPC算法

基础知识:方差,协方差,协方差矩阵 方差:描述了一组随机变量的离散程度 方差 每个样本值 与 全部样本的平均值 相差的平方和 再求平均数,记作: 例如:计算数字1-5的方差,如下 去中心化…

Vulnhub靶机渗透:DC-7打靶记录

前言 自信自强,来自于不怕苦、不怕难的积淀。宝剑锋从磨砺出,梅花香自苦寒来;任何美好理想,都离不开筚路蓝缕、手胼足胝的艰苦奋斗! 靶场介绍 DC-7是一个初中级的靶场,需要具备以下前置知识:…

【开源】SpringBoot框架开发不良邮件过滤系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统用户模块2.2 收件箱模块2.3 发件箱模块2.4 垃圾箱模块2.5 回收站模块2.6 邮箱过滤设置模块 三、实体类设计3.1 系统用户3.2 邮件3.3 其他实体 四、系统展示五、核心代码5.1 查询收件箱档案5.2 查询回收站档案5.3 新…

[Qt项目实战]Qt实现美松标签打印机标签二维码打印(QR混排模式+页打印模式)

1、硬件信息、环境参数及配套资料 1.1 打印机信息及开发环境 打印机 美松标签打印机串口/USB通讯Qt5.9 64位程序 1.2 打印机配套开发资料 打印机主要配套测试工具、开发SDK及驱动等,均由厂家提供。 开发Demo及动态库:MsPrintSDK-DLL-V2.2.2.5 链接&…

3、java虚拟机-类的生命周期-初始化阶段(与程序员有关)

一 、静态代码块执行顺序和字节码文件中的执行顺序以及什么赋值。 类的生命周期-初始化阶段-被static所修饰的常量才会被赋予值 初始化阶段-代码中静态代码块和静态变量的顺序和字节码中的执行顺序是一致的。 二、4种情况下,类会被初始化。 1、怎样查看类是…

阿里云部署MySQL、Redis、RocketMQ、Nacos集群

文章目录 🔊博主介绍🥤本文内容MySQL集群配置云服务器选购CPU选择内存选择云盘选择ESSD AutoPL云盘块存储性能(ESSD) 镜像选择带宽选择密码配置注意事项 搭建宝塔面板方便管理云服务器云服务器的安全组安装docker和docker-compose…

Go语言学习13-常见软件架构的实现

Go语言学习13-常见软件架构的实现 架构模式 An architectural pattern is a general, reusable solution to a commonly occurring problem in software architectural within a given context. ——wikipedia Pipe-Filter 架构 Pipe-Filter 模式 非常适合于数据处理及数据分…

taro之Picker,PickerView基础用法

1.Picker 直接上代码 import Taro,{Component} from "tarojs/taro"; import {View,Picker} from tarojs/components import { AtIcon } from taro-ui import { putKey } from /src/utils/storage-utilsclass AgriculturePolicy extends Component{constructor (prop…

su: authentication failure 解决方法

产生问题的原因:使用su和sudo是有区别的,root的密码可能是原始的密码,你现在用户的密码大概率是更改过的 解决办法: 在Linux上切换root时,密码正确。。但提示:su: authentication failure ->sudo pa…

统计学基础概念和在AI中的应用

基本概念 统计学是一门研究数据收集、分析、解释和展示的科学,它提供了一套方法论,用于理解数据并从数据中得出结论。统计学在各个领域都有应用,包括经济学、医学、工程学、社会科学等。以下是统计学的一些基本概念: 描述性统计…

wireshark数据捕获实验简述

Wireshark是一款开源的网络协议分析工具,它可以用于捕获和分析网络数据包。是一款很受欢迎的“网络显微镜”。 实验拓扑图: 实验基础配置: 服务器: ip:172.16.1.88 mask:255.255.255.0 r1: sys sysname r1 undo info enable in…

B站python爬虫课程笔记(Q16-)

下面是学习的网址: ​​​​​​【Python爬虫】 16、捕捉异常try&except语句的一些问题 1)一些常见的异常类型 IndexError索引错误ZeroDivisionError除零错误FileNotFindError找不到文件错误TypeError类型错误KeyError键错误ValueError值错误Ind…

代理IP品质对Tik Tok代理的重要性

随着Tik Tok的迅速崛起,越来越多的人开始关注如何透过Tik Tok进行行销和推广。其中,使用Tik Tok代理程式是常见的方法。 然而,在选择和使用代理时,IP品质是一个不可忽视的因素。本文将探讨IP品质对Tik Tok代理的重要性&#xff0…

【征稿进行时|见刊、检索快速稳定】2024年区块链、物联网与复合材料与国际学术会议 (ICBITC 2024)

【征稿进行时|见刊、检索快速稳定】2024年区块链、物联网与复合材料与国际学术会议 (ICBITC 2024) 大会主题: (主题包括但不限于, 更多主题请咨询会务组苏老师) 区块链: 区块链技术和系统 分布式一致性算法和协议 块链性能 信息储存系统 区块链可扩展性 区块…

Springboot笔记-04

1.PropertySource&ImportResource&Bean PropertySource:加载指定的配置文件,只能用于properties文件,不支持yml文件; 以person为例子: ConfigurationProperties:告诉springboot将本类中所有属性和配制文件相关的配制进行…

docker入门(一)—— docker概述

docker 概述 docker 官网:http://www.docker.com 官网文档: https://docs.docker.com/get-docker/ Docker Hub官网:https://hub.docker.com (仓库) 什么是 docker docker 是一个开源的容器化平台,可以…

ARM Cortex-R82处理器在压缩SSD场景的应用

ScaleFlux公司宣布在其下一代企业级SSD控制器产品线中采用Arm公司的Cortex-R82处理器。这一决策旨在应对企业环境中对高带宽存储解决方案日益增长的需求,并通过提升数据传输速度和效率来满足市场期待。 Arm Cortex-R82处理器是Arm公司迄今为止性能最强的实时处理器…

maven手动上传的第三方包 打包项目报错 Could not find xxx in central 解决办法

背景: 在Maven私服手动上传了第三方的jar包, 只有jar包, 没有pom文件, 项目在ide中可以正常编译启动,但打包报错无法找到jar包 解决办法: 上传jar包的时候, 点击生成pom. 则打包的时候不会报错
最新文章