【腾讯云云上实验室】用向量数据库在金融信用数据库分析中的实战运用

一、前言

这篇文章将带领读者探索数据库的多样化解决方案及其演进历程,特别关注向量数据库的重要性和在实际项目中的应用。

通过深入剖析腾讯云向量数据库及其在金融信用数据库分析中的实战运用,为读者提供全面而实用的指南,帮助他们理解、应用和掌握这一技术领域的关键要点。

二、数据库的分类种类

现代数据库发展呈现多样化趋势,从传统的关系型和NoSQL数据库到云数据库、云原生数据库和向量数据库,每种都针对特定需求提供定制化解决方案。随着技术不断进步,数据库领域持续创新,满足不断变化的需求。

2.1 演进中的数据库:多样化解决方案应对不断变化的需求

当谈到数据库时,我们可以看到不断的演变和创新。传统自建数据库常常是基于关系型数据库(如MySQL、PostgreSQL)或者NoSQL数据库(比如MongoDB、Cassandra)构建的。这些数据库早期主要用于存储结构化数据,并且在企业和应用程序中广泛使用。

随着云计算的兴起,云数据库应运而生,它们为用户提供了更灵活、可扩展和易管理的解决方案。云数据库包括各种服务,例如Amazon RDS、Google Cloud SQL和Azure Database,它们可以自动化管理和调整数据库的容量和性能,并且提供了高可用性和灾难恢复功能。

而云原生数据库则更专注于在云原生环境下构建和部署的数据库解决方案。这些数据库通常是容器化的,利用了云原生技术(如Kubernetes)来实现更高的弹性、可扩展性和可靠性。

另一个重要的趋势是向量数据库的兴起。这些数据库专注于高维度和复杂数据的处理,比如图像、文本和音频等数据。向量数据库(如Milvus、Faiss)采用向量索引技术,可以更高效地处理和查询大规模的向量数据,这在人工智能、机器学习和大数据分析领域有着广泛的应用。

2.2 什么是向量数据库

(需要更加完善一下,更具体一点)

向量数据库是一种专门用于处理高维度向量数据的数据库类型。它们设计用于存储、索引和高效查询包含向量信息的数据集。这些向量可能代表文本、图像、音频等非结构化或半结构化数据,也可能是从机器学习和深度学习模型中提取的特征。

向量数据库通常采用特定的向量索引结构和算法,以便高效地存储和检索向量数据。它们的设计目标是使得在高维空间中进行相似度搜索或者聚类等操作更加高效,并且能够应对大规模的向量数据集。

这些数据库在人工智能、推荐系统、图像识别、自然语言处理等领域有着广泛的应用。它们可以加速相似向量的快速搜索,从而支持诸如推荐算法、相似图片搜索、文本相似度匹配等应用。 Milvus 和 Faiss 是一些知名的向量数据库。

矢量数据库的重要性源于它们处理大规模高维数据集和执行快速相似性搜索的能力。传统的关系数据库由于结构不灵活且缺乏针对相似性搜索而定制的专门索引技术,因此不适合此类数据。

相比之下,矢量数据库采用一系列专门设计的索引结构和算法,旨在有效处理高维数据并实现快速的最近邻搜索。

2.3 为什么向量数据库如此重要呢?

首先,开发人员能够将生成的嵌入向量索引到向量数据库中。这一举措使得通过查询相似向量来找到相关资产成为可能。

此外,向量数据库提供了一种使嵌入模型高效运行的途径。它利用了复杂的查询语言,整合了资源管理、安全控制、可扩展性、容错能力以及高效信息检索等数据库功能,从而提升了应用程序开发的效率。

更重要的是,向量数据库对于开发人员创造独特的应用体验至关重要。举例来说,用户可以通过在智能手机上拍摄照片来搜索相似的图像,这得益于向量数据库的支持。

此外,开发人员能够利用其他类型的机器学习模型,从图像和扫描文档等内容中自动提取元数据。他们可以将这些元数据与向量一同编入索引,以实现对关键字和向量的混合搜索。而通过将语义理解纳入相关性排名中,也能够改善搜索结果。

举个例子,像ChatGPT这样的新模型属于生成式人工智能的创新范畴。这些模型不仅可以生成文本,还能够管理复杂的人类对话。有些模型甚至可以在多种模式下运行,比如有些模型可以根据用户描述的场景生成符合描述内容的图像。

然而,生成式模型容易造成幻觉,这可能会导致聊天机器人向用户传递错误信息。这时,向量数据库就可以弥补生成式人工智能模型的这一缺陷。它为生成式人工智能聊天机器人提供了外部知识库,确保它们提供的信息是可信赖的。

2.4 向量数据库是如何工作的?

我们都大致了解传统数据库是如何工作的——它们将字符串、数字和其他类型的标量数据存储在行和列中。然而,向量数据库则基于向量操作,因此它的优化和查询方式有着很大的不同。

在传统数据库中,通常我们会查询数据库中数值与我们查询条件完全匹配的行。而在向量数据库中,我们会应用相似度度量来寻找与我们查询条件最相似的向量。

向量数据库采用了一系列不同的算法,这些算法都参与了近似最近邻(ANN)搜索。这些算法通过哈希、量化或基于图的搜索来优化搜索过程。

这些算法被组装成一个流水线,能够快速准确地检索查询向量的邻居。由于向量数据库提供的是近似结果,我们需要权衡的主要是准确性和速度。结果越准确,查询速度就越慢。然而,一个良好的系统可以在几乎完美的准确性下提供超快速的搜索。

以下是向量数据库的常见流程:

向量数据库流程

  1. 索引: 向量数据库使用诸如 PQ、LSH 或 HNSW 等算法对向量进行索引。这一步将向量映射到数据结构,以加速搜索过程。
  2. 查询: 向量数据库将索引的查询向量与数据集中的索引向量进行比较,通过特定索引使用的相似性度量来确定最近的邻居。
  3. 后处理: 在某些情况下,向量数据库从数据集中检索最终的最近邻居,并对其进行后处理以返回最终结果。此步骤可能包括使用不同的相似性度量对最近邻居进行重新排序。

三、腾讯云向量数据库

3.1 什么是腾讯云向量数据库

腾讯云向量数据库(Tencent Cloud VectorDB)是一款全托管的自研企业级分布式数据库服务,专用于存储、检索、分析多维向量数据。该数据库支持多种索引类型和相似度计算方法,单索引支持10亿级向量规模,可支持百万级 QPS 及毫秒级查询延迟

腾讯云向量数据库不仅能为大模型提供外部知识库,提高大模型回答的准确性,还可广泛应用于推荐系统、NLP 服务、计算机视觉、智能客服等 AI 领域。

3.2 腾讯云向量数据库优势

腾讯云向量数据库(Tencent Cloud VectorDB)作为一种专门存储和检索向量数据的服务提供给用户, 在高性能、高可用、大规模、低成本、简单易用、稳定可靠等方面体现出显著优势。

为了更加言简意赅,可以直接看我做成的脑图,更加直观的感受腾讯云向量数据库优势:

  • 高性能
    向量数据库单索引支持10亿级向量数据规模,可支持百万级 QPS 及毫秒级查询延迟。
  • 高可用
    向量数据库提供多副本高可用特性,其多可用区和三节点的架构可用性可达99.99%,显著提高系统的可靠性和容错性,确保数据库在面临节点故障和负载变化等挑战时仍能正常运行。
    大规模
    向量数据库架构支持水平扩展,单实例可支持百万级 QPS,轻松满足 AI 场景下的向量存储与检索需求。
  • 低成本
    只需在管理控制台按照指引,简单操作几个步骤,即可快速创建向量数据库实例,全流程平台托管,无需进行任何安装、部署和运维操作,有效减少机器成本、运维成本和人力成本开销。
  • 简单易用
    支持丰富的向量检索能力。用户通过 HTTP API 或者 SDK 接口即可快速操作数据库,开发效率高。同时控制台提供了完善的数据管理和监控能力,操作简单便捷。
  • 稳定可靠
    向量数据库源自腾讯集团自研的向量检索引擎 OLAMA,近40个业务线上稳定运行,日均处理的搜索请求高达千亿次,服务连续性、稳定性有保障。
  • Embedding 功能
    向量数据库的 Embedding 功能会自动将原始文本进行转换,生成对应的向量数据并插入数据库或进行相似性检索,实现了文本到向量数据的一体化转换,减少了用户的操作步骤,极大降低了使用门槛。

3.3 腾讯云向量数据库现阶段落地项目

当下,腾讯云向量数据库成为腾讯企业内外广泛采用的首选。内部各应用产品纷纷依托腾讯云向量数据库,实现高效数据管理与应用,助力业务发展。外部行业也不例外,大量产品纷纷选择腾讯云向量数据库,充分利用其优势。这种趋势呈现出愈发增长的态势,已经成为当今技术发展中的一大亮点,体现了腾讯云向量数据库在业界的卓越地位。

腾讯云向量数据库现阶段腾讯集团内部 40+业务接入, 1600亿次请求/天; 1000+外部用户接入。

四、腾讯云向量数据库实战(金融信用数据库分析)

金融分析案例(重要)

4.1 前期准备

4.1.1 采购腾讯云向量数据库

在腾讯云产品页面,搜索向量数据库或者直接点击新产品中的向量数据库。

进入到腾讯云向量数据库首页后,点击立即体验:

在进入创建实例页面中,依次选择配置的地域信息,规格等信息。

详细的信息参照下图,如果没有创建的一些配置,可以根据下图的提示进行提前创建。

注意:所申请的免费体验实例,最长使用时间为1个月,1个月到期后会被回收。

4.1.2 登陆腾讯云向量数据库

根据自身情况,开启外网访问权限,如果是生产环境不建议开启,只需要自己使用内网即可,本文为了测试演示,开启了外网访问权限。

开启外网访问权限后,点击实例ID进入详情页面,如下图,点击登录按钮。

进入到向量数据库登录界面,如图需要账号和密码账号默认是root,密码是向量数据库配置(上图)中的密钥

4.1.3 腾讯云向量数据库 SDK 准备

我们以 Python 环境为案例,执行如下命令,可直接安装最新版本。

pip install tcvectordb

执行如下图所示:

4.2 案例数据库开发流程

4.2.1 创建数据库

使用如下的代码进行创建数据库:

import tcvectordb
from tcvectordb.model.enum import FieldType, IndexType, MetricType, ReadConsistency

# 创建数据库连接对象
client = tcvectordb.VectorDBClient(url='http://lb-*******.ap-guangzhou.tencentclb.com:50000', username='root', key='G283v2GaQRJG3vk******', read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)

# 创建数据库
db = client.create_database(database_name='t_vectordb_demo_01')

print(db.database_name)

4.2.2 创建集合

# 第一步,设计索引
index = Index(
            FilterIndex(name='id', field_type=FieldType.String, index_type=IndexType.PRIMARY_KEY),
            VectorIndex(name='vector', dimension=768, index_type=IndexType.HNSW,
              metric_type=MetricType.COSINE, params=HNSWParams(m=16, efconstruction=200)),

)

ebd = Embedding(vector_field='vector', field='text', model=EmbeddingModel.BGE_BASE_ZH)

# 第二步:创建 Collection
coll = db.create_collection(
            name='loan_data_analysis',
            shard=1,
            replicas=0,
            description='this is a collection of test embedding',
            embedding=ebd,
            index=index
        )
print(vars(coll))

4.2.3 导入数据

import tcvectordb
from tcvectordb.model.enum import FieldType, IndexType, MetricType, ReadConsistency
from tcvectordb.model.enum import FieldType, IndexType, MetricType, EmbeddingModel
from tcvectordb.model.index import Index, VectorIndex, FilterIndex, HNSWParams
from tcvectordb.model.collection import Embedding, UpdateQuery
from tcvectordb.model.enum import FieldType, IndexType, MetricType, ReadConsistency
from tcvectordb.model.document import Document, Filter, SearchParams

# # 创建数据库连接对象
client = tcvectordb.VectorDBClient(url='http://lb-******.clb.ap-guangzhou.tencentclb.com:50000', username='root', key='G283v2******', read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)


# 指定写入原始文本的数据库与集合
db = client.database('t_vectordb_demo_01')
coll = db.collection('loan_data_analysis')


# 写入数据,可能存在一定延迟
# 1. 支持动态 Schema,除了 id、text 字段必须写入,可以写入其他任意字段,text 字段为创建集合时,设置的文本字段名
# 2. upsert 会执行覆盖写,若文档id已存在,则新数据会直接覆盖原有数据(删除原有数据,再插入新数据)
# 3. 参数 build_index 为 True,指写入数据同时重新创建索引。
res = coll.upsert(
    documents=[
        Document(
            id='1077501',
            text="1077501:10+ years",
            author='RENT',
            bookName='5000',
            page=36,
            funded_amnt=5000,
            funded_amnt_inv=4975,
            int_rate=10.65,
            installment=162.87,
            grade='B',
            sub_grade='B2',
            emp_title='',
            emp_length='10+ years',
            home_ownership='RENT'
        ),
        Document(
            id='1077430',
            text="1314167:< 1 year",
            author='RENT',
            bookName='2500',
            page=60,
            funded_amnt=2500,
            funded_amnt_inv=2500,
            int_rate=15.27,
            installment=59.83,
            grade='C',
            sub_grade='C4',
            emp_title='Ryder',
            emp_length='< 1 year',
            home_ownership='RENT'
        )
    ],
    build_index=True
)
注意:
1. 支持动态 Schema,除了 id、text 字段必须写入,可以写入其他任意字段,text 字段为创建集合时,设置的文本字段名
2. upsert 会执行覆盖写,若文档id已存在,则新数据会直接覆盖原有数据(删除原有数据,再插入新数据)
3. 参数 build_index 为 True,指写入数据同时重新创建索引。

插入测试数据后,我们返回到腾讯云向量数据库中,查看数据如下图所示:

我们可以批量导入下面类似的数据库进入数据库

4.2.3 读取数据

读取数据我们使用的是query的方法功能

基于精确匹配的查询方式,query()用于精确查找与查询条件完全匹配的向量,具体支持如下功能。
支持根据主键 id(Document ID),搭配自定义的标量字段的 Filter 表达式一并检索。
支持指定查询起始位置 offset 和返回数量 limit,实现数据 SCAN 能力。

# Set filter
filter_param=Filter(Filter.In("text",["year", "years"]))


# query
doc_list = coll.query(document_ids=['1077501','1077430'], retrieve_vector=True, filter=filter_param, limit=2, offset=0, output_fields=['text','author'])


for doc in doc_list:
          print(doc)

取出的向量数据如下:

4.2.4 数据分析

将变量转换为其适当的数据类型

某些变量不是其适当的数据类型,需要进行预处理以转换为正确的格式。我们定义了一些函数来帮助自动化这个过程。用于将变量转换为其适当数据类型的函数如下所示。

# 将术语列转换为数字数据类型

def term_numeric(df, column):
    df[column] = pd.to_numeric(df[column].str.replace(' months', ''))
    
term_numeric(data, 'term')

#converting emp-length to numeric datatype
def emp_length_convert(df, column):
    df[column] = df[column].str.replace('\+ years', '')
    df[column] = df[column].str.replace('< 1 year', str(0))
    df[column] = df[column].str.replace(' years', '')
    df[column] = df[column].str.replace(' year', '')
    df[column] = pd.to_numeric(df[column])
    df[column].fillna(value = 0, inplace = True)
   

# 预处理日期列

def date_columns(df, column):
    # store current month
    today_date = pd.to_datetime('2020-08-01')
    # convert to datetime format
    df[column] = pd.to_datetime(df[column], format = "%b-%y")
    # calculate the difference in months and add to a new column
    df['mths_since_' + column] = round(pd.to_numeric((today_date - df[column]) / np.timedelta64(1, 'M')))
    # make any resulting -ve values to be equal to the max date
    df['mths_since_' + column] = df['mths_since_' + column].apply(lambda x: df['mths_since_' + column].max() if x < 0 else x)
    # drop the original date column
    df.drop(columns = [column], inplace = True)

目标列的预处理

我们数据集中的目标列是贷款状态,其中包含不同的唯一值。这些值将需要转换为二进制。即,对于不良借款人为0,对于良好借款人为1。在我们的案例中,不良借款人的定义是指在我们的目标列中属于以下情况的人员:已冲销,违约,逾期(31-120天),不符合信用政策的状态:已冲销。其余被分类为良好借款人。

# 基于loan_status列创建一个新列,这将是我们的目标变量
data['good_bad'] = np.where(data.loc[:, 'loan_status'].isin(['Charged Off', 'Default', 'Late (31-120 days)',
                                                                       'Does not meet the credit policy. Status:Charged Off']), 0, 1)
# Drop the original 'loan_status' column
data.drop(columns = ['loan_status'], inplace = True)

分析获取证据权重(WOE)和信息价值

信用风险模型通常需要是可解释和易于理解的。为了实现这一点,所有独立变量都必须是分类的。由于一些变量是连续的,我们将采用证据权重(Weight of Evidence)的概念。

证据权重将帮助我们将连续变量转换为分类特征。连续变量被分为不同区间,并基于它们的证据权重创建新的变量。此外,信息价值帮助我们确定哪个特征在预测中是有用的。下面列出了独立变量的信息价值。信息价值小于0.02的变量将不会被包含在模型中,因为它们没有预测能力

Information value of term is 0.035478
Information value of int_rate is 0.347724
Information value of grade is 0.281145
Information value of emp_length is 0.007174
Information value of home_ownership is 0.017952
Information value of annual_inc is 0.037998
Information value of verification_status is 0.033377
Information value of pymnt_plan is 0.000309
Information value of purpose is 0.028333
Information value of addr_state is 0.010291
Information value of dti is 0.041026
Information value of delinq_2yrs is 0.001039
Information value of inq_last_6mths is 0.040454
Information value of mths_since_last_delinq is 0.002487
Information value of open_acc is 0.004499
Information value of pub_rec is 0.000504
Information value of revol_util is 0.008858
Information value of initial_list_status is 0.011513
Information value of out_prncp is 0.703375
Information value of total_pymnt is 0.515794
Information value of total_rec_int is 0.011108
Information value of last_pymnt_amnt is 1.491828

我们训练集中目标列的类别标签存在不平衡,正如下面的条形图所示。使用这种不平衡的数据来训练我们的模型会导致其偏向于预测具有大多数标签的类别。为了防止这种情况,我使用了随机过采样来增加目标列中少数类别的观察数量。需要注意的是,这个过程仅在训练数据上执行。

从上述图中,我们可以清晰的看出:对于不良借款人为0,对于良好借款人为1的最终结果。

五、文末总结

这篇文章提供了对数据库分类和腾讯云向量数据库的深入了解。它探讨了向量数据库的重要性以及其在不断变化的需求下的应用。
通过介绍腾讯云向量数据库的优势和实际项目落地情况,文章展示了其在金融信用数据库分析中的实战应用。

这篇文章全面介绍了腾讯云向量数据库的重要性、工作原理以及在实际项目中的应用,为读者提供了深入了解和实际操作的指导。

六、推荐参考文献

AIGC 时代的数据管理 - 向量数据库,扫码即可阅读!

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

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

相关文章

Node——Node.js简介

Node.js是一个基于Chrome V8引擎的JavaScript运行时环境&#xff0c;它能够让JavaScript脚本运行在服务端&#xff0c;这使得JavaScript成为与PHP、Python等服务端语言平起平坐的脚本语言。 1、认识Node.js Node.js是当今网站开发中非常流行的一种技术&#xff0c;它以简单易…

什么是 dropblock

大家好啊&#xff0c;我是董董灿。 之前介绍过 dropout 算法&#xff0c;它在训练神经网络中&#xff0c;可以随机丢弃神经元&#xff0c;是一种防止网络过拟合的方法。 但是在卷积神经网络中&#xff0c;dropout 的表现却不是很好&#xff0c;于是研究人员又搞了一个“结构化…

Drool 7 SpreadSheet Decision Template 笔记

1 Excel Decision table 1.1 很棒的示意图&#xff0c;来自https://blog.csdn.net/justlpf/article/details/128109731 1.2 参考URL 1.2.1 https://blog.csdn.net/justlpf/article/details/128109731 1.3 多sheet 模式 默认是用第一个sheet如果要支持多sheet&#xff0c;需…

Java核心知识点整理大全17-笔记

Java核心知识点整理大全-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全2-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全3-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全4-笔记-CSDN博客 Java核心知识点整理大全5-笔记-CSDN博客 Java核心知识点整理大全6…

基于SpringBoot+Vue的蛋糕商城【源码好优多】

简介 蛋糕商城首页、注册、登录、浏览商品、购物车、下单、收藏商品、个人中心、管理员登录、角色管理、日志管理、菜单管理、轮播图管理、商品类别管理、商品管理、用户管理、订单管理、收货地址管理等功能模块。 项目目录 数据库 首页 用户注册 登录 商品详情 个人信息 购物车…

Pytorch项目的文件结构一般都是怎么组织的?

如果是从一些比较典型的论文里弄下来的源码&#xff0c;你会发现它们的论文结构往往都非常复杂。不同的模型、不同的论文&#xff0c;可能代码结构组织的方式都不一样。但它们都不外乎就是经历这几个方面&#xff1a; 1、模型和结构模块定义&#xff1b; 2、数据集获取与处理…

从源码重新真正认识RateLimiter(SmoothBursty实现)

前言 相信大家对于谷歌RateLimiter一定并不陌生,在项目中应该也经常拿来进行限流&#xff0c;但是对于其实现原理并不一定能用熟于心&#xff0c;本文带大家从源码探究RateLimiter的设计与具体实现。 RateLimiter的组成 从源码可以看到&#xff0c;RateLimiter由stopwatch与m…

Codeforces Round 911 (Div. 2)(C~E)(DFS、数论(容斥)、SCC缩点 + DAG图上DP)

​​​​​​1900C - Anjis Binary Tree 题意&#xff1a; 凯克西奇一直被安吉冷落。通过一个共同的朋友&#xff0c;他发现安吉非常喜欢二叉树&#xff0c;于是决定解决她的问题&#xff0c;以引起她的注意。Anji 给了 Keksic 一棵有 n个顶点的二叉树。顶点 1 是根&#xff…

[Spring] 字节一面~Spring 如何解决循环依赖问题 以及 @resource 与 @autowire 同时存在时谁生效

文章目录 Spring 如何解决循环依赖问题resource 与 autowire 同时存在时谁生效 Spring 如何解决循环依赖问题 Spring在实例化一个bean的时候&#xff0c;是首先递归实例化其所依赖的所有bean&#xff0c;直到某个bean没有依赖其他bean&#xff0c;此时就会将该实例返回&#x…

基于Java SSM框架+Vue实现大学生兼职信息网站项目【项目源码+论文说明】

基于java的SSM框架Vue实现大学生兼职信息网站演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认…

【GD32307E-START】开发板开箱、开发环境建立及工程模板测试

01-GD32F307E-START开箱、开发环境建立及工程模板测试&#xff08;Keil-MDK GCC Template&#xff09; 兆易GD32307E-START开发板搭载GD32 ARM Cortex-M4微控制器主流芯片GD32F307。 开箱 板子的做工还是非常精良小巧的。有两颗按键&#xff0c;一颗是复位&#xff0c;一颗是…

时间序列预测 — LSTM实现单变量风电滚动预测(Keras)

目录 1 数据处理 1.1 数据集简介 1.2 数据集处理 2 模型训练与预测 2.1 模型训练 2.2 模型滚动预测 2.3 结果可视化 1 数据处理 1.1 数据集简介 实验数据集采用数据集5&#xff1a;风电机组运行数据集&#xff08;下载链接&#xff09;&#xff0c;包括风速、风向、温…

纯新手发布鸿蒙的第一个java应用

第一个java开发鸿蒙应用 1.下载和安装华为自己的app开发软件DevEco Studio HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 2.打开IDE新建工程&#xff08;当前用的IDEA 3.1.1 Release&#xff09; 选择第一个&#xff0c;其他的默认只能用(API9)版本&#xff0c;…

居家适老化设计第三十二条---卫生间之扶手

以上产品图片均来源于淘宝 侵权联系删除 居家适老化中的扶手是指在家居环境中&#xff0c;为老年人提供支撑和帮助的装置&#xff0c;通常安装在家中的各个需要扶抓的位置&#xff0c;如楼梯、卫生间、浴室、厨房等处。扶手的设计应考虑老年人的体力、平衡和安全需求&#xf…

顶级Mac数据恢复工具—— 13个 Mac 数据恢复程序榜单

如果您点击此博客&#xff0c;首先可能是您不小心格式化了外部或内部存储&#xff0c;无论是 SD卡还是硬盘&#xff0c;其次&#xff0c;您收到了一些错误消息&#xff0c;表明您丢失了所有内容&#xff0c;现在您已经精疲力竭了的形状。原因可能有多种&#xff1a;您不小心删除…

探索 Linux vim/vi 编辑器:介绍、模式以及基本操作演示

&#x1f490;作者&#xff1a;insist-- &#x1f490;个人主页&#xff1a;insist-- 的个人主页 理想主义的花&#xff0c;最终会盛开在浪漫主义的土壤里&#xff0c;我们的热情永远不会熄灭&#xff0c;在现实平凡中&#xff0c;我们终将上岸&#xff0c;阳光万里 ❤️欢迎点…

Slf4j使用Logback时,Logback如何初始化

前言 Slf4j SLF4J&#xff0c;全称 Simple Logging Facade for Java&#xff0c;是一个用于Java编程语言的日志系统抽象层。它为多种现有日志框架&#xff08;例如Log4j、java.util.logging等&#xff09;提供了统一的接口, 但自身并不实现日志功能。 SLF4J 允许用户在部署时…

校园导游程序及通信线路设计(结尾附着总源码)

校园导游程序及通信线路设计 摘  要 新生或来访客人刚到校园&#xff0c;对校园的环境不熟悉。就需要一个导游介绍景点&#xff0c;推荐到下一个景点的最佳路径等。随着科技的发展&#xff0c;社会的进步&#xff0c;人们对便捷的追求也越来越高。为了减少人力和时间。针对对…

一起学docker系列之十一使用 Docker 安装 Redis 并配置持久化存储

目录 前言1 基本安装步骤安装Redis镜像&#xff1a;查看已下载的Redis镜像&#xff1a;运行Redis容器&#xff1a;进入Redis容器&#xff1a;使用Redis CLI进行基本操作&#xff1a; 2 配置文件同步准备配置文件&#xff1a;修改Redis配置文件 /app/redis/redis.conf&#xff1…

Project DESFT 白皮书中文版——应用于普惠金融的可信数字凭证解决方案

1. 概述 Project DESFT 是由 Solv 基金会与 zCloak Network 联合设计孵化&#xff0c;以跨境贸易和金融服务为场景的分布式可信数字凭证解决方案&#xff08;Distributed Trusted Digital Credential Solution&#xff09;&#xff0c;项目获得新加坡金管局&#xff08;Monetar…