AI 时代的向量数据库、关系型数据库与 Serverless 技术丨TiDB Hackathon 2023 随想

TiDB Hackathon 2023 刚刚结束,我仔细地审阅了所有的项目。 在并未强调项目必须使用人工智能(AI)相关技术的情况下,引人注目的项目几乎一致地都使用了 AI 来构建自己的应用。 大规模语言模型(LLM)的问世使得个人开发者能够在短短 5 分钟内为程序赋予推理能力,而这在以往,几乎只有超大型团队才能胜任。 从应用开发者的角度来看,AI 时代也已经到来了。

在这些 AI 应用中,向量数据库的身影是无处不在的。尽管这些项目大多仍在使用关系型数据库,但它们似乎不再发挥一个显而易见的作用。关系型数据库究竟还值不值得获得应用开发者们的关注呢?

为了解答清楚这个问题,我们需要了解一下向量数据库到底跟传统的关系型数据库有什么不同。

什么是向量数据库?

为了搞清楚这个问题,我花了一些时间研究了一下向量数据库。接下来我讲用最简单的语言来解释什么是向量数据库。

这个世界上的大多数事情都是多特征的,比如你描述一个人可以用身高、体重、性格、性别、穿衣风格、兴趣爱好等等多种不同类型的维度。通常如果你愿意的话,你可以无限扩展这个维度或者特征去描述一个物体,维度或者特征越多,对于一个物体或者事件的描述就是越准确的。

现在,假如开始用一个维度来表达 Emoji 表情的话,0 代表快乐,1 代表悲伤。从 0 - 1 的数字大小就可以表达对应表情的悲欢程度,如下 x 轴所示:

但是你会发现,如果只有一个维度来描述情绪 Emoji 的话,这是笼统的,也是不够准确的。例如开心,会有很多种类型的 Emoji 可以表达。那么这个时候我们通常是加入新的维度来更好地描述它。例如我们在这里加入 Y 轴,通过 0 表示黄色,1 表示白色。加入之后表达每个表情在坐标轴上的点变成了 (x, y) 的元组形式。

聪明的你一定发现了,即使我们加入 Y 轴这个新的描述维度,依然还有 Emoji 我们是没办法区分开的。比如

那么怎么办呢?解决这个办法依然很简单,再加一个维度。在坐标系中就是加入 z 轴。我们把新的维度简单设置为是否戴帽子(注意这里每个维度的取值尽可能地简单是为了阐述,不代表真实世界也如此简单)。用 0 表示没戴,1 表示戴了。所以我们现在就得到了一个 (x, y, z) 的三维坐标点来描述一个 Emoji 了。

当然在现实世界中,一个事物的性质不会那么少,所以我们需要通过增加很多个维度来描述它,所以就出现了类似高维数组这样的描述 (0.123, 0.295, 0.358, 0.222 ...)。到这里我们已经非常接近向量数据库中的 “向量” 了,其实向量数据库中存的就是这样的一些数组,用以表示各种各样的数据,包括图片、视频、文字等等。这些事物都是经过我们上述这种转换的方式,把它们变成了一个个高维的数组,然后保存下来。

可能说到这里你还不理解向量数据库有什么作用:为什么我们要把事物变成这样的形式?

简单来讲,这是因为变成向量以后,我们就有办法去量化世界上任意两种事物之间的关联性和相似性了。通过我们刚才的演示,各个维度上越接近的事物,就会在空间中越接近。通过计算两个点之间的距离,就可以判断两者的相似度。

那么如果我们有一个之前从未出现过的一个 Emoji,我们通过上面的方式,可以把这个 Emoji 变成向量(0.01, 1, 0)。

通过计算跟库中的已经存储的向量,就可以找出来最接近的 Emoji 是

次之距离接近的就是

作为佐证,可以看看 PineCone Query Data ( https://docs.pinecone.io/docs/query-data#sending-a-query ) 获取数据的例子(Score 可以简单被认为是相似度):

index.query(vector=[0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3],top_k=3,include_values=True
)
​
# Returns:
# {'matches': [{'id': 'C',
#               'score': -1.76717265e-07,
#               'values': [0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3]},
#                   {'id': 'B',
#                    'score': 0.080000028,
#                    'values': [0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2]},
#                   {'id': 'D',
#                    'score': 0.0800001323,
#                    'values': [0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4]}],
#               'namespace': ''}

Values 中就是找回来的向量(在我们这个例子中可以被认为是对应的 Emoji)。这意味着我们可以通过向量化所有的查询条件,找到最 “接近” 我们要求的东西。如果把 Emoji 替换成文本的话,我们就可以实现 “语义” 搜索。如果把 Emoji 替换成图片或者视频的话,就可以实现图片或者视频相似性推荐。

为什么Al应用常常需要依赖于向量数据库?

通过一句话来解释的话就是:“大模型” 能记住的事情有限。

这非常类似于我们的大脑。在交流的过程中,我们不可能把自己所有的知识都在对话中交给对方,通常我们只能通过有限的上下文来做一定的 “推理”。那么在现在的 AI 应用中,推理能力是由 LLM 提供的,而从你的大脑中把需要表达的最相关的上下文找出来。所以类比来看,向量数据库类似于 LLM 的记忆或者知识库。所以完成一个 AI 相关的功能,如果没有向量数据库的帮助,通常 AI 大模型能完成的功能以及准确度就很有限。

沿着这个思路往下看,除了一些不那么精确的模糊匹配以外,其实在现实生活中也存在很多需要非常精确和确定性的搜索/索引。这个就类似于我们通常会把一些重要信息记录在笔记本里面,需要的时候再通过索引把它精确找回来。

所以向量数据库和关系型数据库最大的不同是对于数据的存储方式和索引查询方式。而正是由于关系型数据库当中存在的精确索引,所以它能在毫秒级别获取到对应的信息。对应于业务系统中需要高速访问的例如账号、商品和订单信息等等,目前依然是需要由它来完成。

下面以这次 Hackathon 获奖的应用 Heuristic AI ( https://devpost.com/software/cx-8lh7ps ) 作为例子给大家展示一下,在一个真实的项目中,分别是怎么使用这两种类型的数据库的。

日常生活中,当我们使用的电子产品出现故障的时候,通常需要翻阅复杂的使用手册才能获取到相关的解决方案,并且需要花费大量的时间学习。这个项目完成了以下事情:

  1. 把所有产品手册导入到向量数据库里面
  2. 把遇到的问题用自然语言描述,通过语义搜索,在向量数据库中找到最相关的上下文
  3. 把上下文打包成 Prompt 发送给 OpenAI,生成对应的解决方案

大致的技术实现如下:

如果这个软件到此为止了,那基本上也就是一个玩具。通常还需要为系统加入用户认证与管理系统,另外通常在后台还需要加上对业务数据的分析系统,比如多少在线用户使用了产品,使用频率如何等等维度。而这些功能,就需要使用传统的数据库来实现了:

当然作为一个 Hackathon 项目,这个软件其实已经相对比较完整了。但是如果它要进一步产品化,需要考虑以下的方面:

○ 用户数据量暴增,系统的可扩展性和稳定性

○ 多数据中心和灾难情况下的数据备份和恢复

这些都不酷,甚至有些痛苦,但是这依然是我们需要慎重且认真对待的领域。好在从这次 Hackathon 中,可以肉眼观察到的另一个趋势:Serverless ,在帮助开发者们不断减轻产品化一个应用的技术难度。

基础软件 Serverless 化带来的效率提升

可以观察到的:独立开发者在项目开发中发挥的作用日益突出。独立开发者在项目开发中发挥的作用日益突出。相较于过去,不再需要庞大的 3-4 人团队合作,现在的优秀项目往往由 1-2 名开发者,甚至是个别人单独完成。

这一趋势的背后,Serverless 化的浪潮充当了重要的推动力。借助 Serverless,开发者能够专注于业务逻辑,而不必纠结于底层基础设施的细节。这次没有再看到有开发者会利用本地部署实现自己的应用了,前端和业务代码部署使用 Vercel,后端组件,比如 Vector 数据库用 Qrdrant ( https://qdrant.tech/ ),或者 Pinecone ( https://www.pinecone.io/ ),关系型数据库使用 TiDB Cloud Serverless ( https://bit.ly/3PsYJle ),用上这一套,基本上一个工程师就能完成 Demo 级别的应用了。

这个时代下也并非只有 AI 领域一枝独秀,其他的传统技术,其实也在为开发者们提供越来越方便的使用体验,也在随着浪潮不断递进迭代。

只要关注回到开发者本身,大家都有光明的未来。

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

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

相关文章

linux内核——进程

Processes and threads 进程是正在运行的程序,包括下列部分的抽象: (独立的)地址空间一个或者多个线程打开的文件(以描述符fd的形式呈现)套接字信号量Semaphore共享的内存区域定时器信号句柄signal handl…

avi怎么转换成视频?

avi怎么转换成视频?在我们日常使用的视频格式中,AVI是一种常见且经常被使用的音频视频交叉格式之一。它的优点之一是占用的存储空间相对较小,但也明显存在着画质损失的缺点。虽然AVI格式的视频在某种程度上也很常见,但与最常见的M…

缓存之缓存简介

目录 一.缓存的作用二.缓存的使用1.适用缓存的数据场景2.读取缓存流程图 三.本地缓存和分布式缓存 一.缓存的作用 Java缓存技术是在应用程序和数据库之间的一种中间层,用于存储暂时性数据,尤其是读取频繁但更新较少的数据。它的作用是减轻应用程序和数据库之间的负担,提高应用程…

PyCharm安装教程,新手详细

首先进入官网:https://www.jetbrains.com/pycharm/download/?sectionwindows#sectionwindows 然后选择版本,我下载的是社区版,一般学习是够了 然后点击Download进行下载。 双击exe运行 然后选择安装路径,建议放在D盘 然后这…

Python 图片处理笔记

import numpy as np import cv2 import os import matplotlib.pyplot as plt# 去除黑边框 def remove_the_blackborder(image):image cv2.imread(image) #读取图片img cv2.medianBlur(image, 5) #中值滤波,去除黑色边际中可能含有的噪声干扰#medianBlur( Inp…

Qt---day4---9.20

qt完成时钟&#xff1a; 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent> #include <QtDebug> #include <QPainter> #include <QTimerEvent> #include <QTime>QT_BEGIN_NAMESPACE names…

wpf资源Resources探究性学习(一)

测试环境&#xff1a; vistual studio 2017 .net framework 3.5 window 10 新建WPF应用(.net framework)&#xff0c;项目名称为&#xff1a;WpfDemo&#xff0c;如下图&#xff1a; 新建完项目后&#xff0c;默认带有一个名为MainWindow.xaml的代码 一 简单使用字符串资源…

OpenCV实现“蓝线挑战“特效

原理 算法原理可以分为三个流程&#xff1a; 1、将视频&#xff08;图像&#xff09;从&#xff08;顶->底&#xff09;或&#xff08;左->右&#xff09;逐行&#xff08;列&#xff09;扫描图像。 2、将扫描完成的行&#xff08;列&#xff09;像素重新生成定格图像…

蓝桥杯 题库 简单 每日十题 day6

01 删除字符 题目描述 给定一个单词&#xff0c;请问在单词中删除t个字母后&#xff0c;能得到的字典序最小的单词是什么&#xff1f; 输入描述 输入的第一行包含一个单词&#xff0c;由大写英文字母组成。 第二行包含一个正整数t。 其中&#xff0c;单词长度不超过100&#x…

【卖出备兑看涨期权策略(Covered_call)】

卖出备兑看涨期权策略&#xff08;Covered_call&#xff09; 卖出备兑看涨期权策略是一种最基本的收入策略&#xff0c;该策略主要操作就是在持有标的资产的同时卖出对应的看涨期权合约&#xff0c;以此来作为从持有的标的资产中获取租金的一种方法。如果标的资产的价格上涨到…

Pikachu XSS(跨站脚本攻击)

文章目录 Cross-Site ScriptingXSS&#xff08;跨站脚本&#xff09;概述反射型[xss](https://so.csdn.net/so/search?qxss&spm1001.2101.3001.7020)(get)反射型xss(post)存储型xssDOM型xssDOM型xss-xxss-盲打xss-过滤xss之htmlspecialcharsxss之href输出xss之js输出 Cros…

前端--HTML

文章目录 HTML结构快速生成代码框架HTML常见标签 表格标签 编写简历信息 填写简历信息 Emmet 快捷键 HTML 特殊字符 一、HTML结构 1.认识HTML标签 HTML 代码是由 "标签" 构成的. 形如: <body>hello</body> 标签名 (body) 放到 < > 中 大部分标…

华为手机如何开启设置健康使用手机模式限制孩子玩手机时间?

华为手机如何开启设置健康使用手机模式限制孩子玩手机时间&#xff1f; 1、在手机上找到「设置」并点击打开&#xff1b; 2、在设置内找到「健康使用手机」并点击进入&#xff1b; 3、开启健康使用手机后&#xff0c;选择孩子使用&#xff1b; 4、在健康使用手机内&#xff0c…

使用Arduino简单测试HC-08蓝牙模块

目录 模块简介模块测试接线代码测试现象 总结 模块简介 HC-08 蓝牙串口通信模块是新一代的基于 Bluetooth Specification V4.0 BLE 蓝牙协议的数传模块。无线工作频段为 2.4GHz ISM&#xff0c;调制方式是 GFSK。模块最大发射功率为4dBm&#xff0c;接收灵度-93dBm&#xff0c…

SpringSecurity 核心过滤器——SecurityContextPersistenceFilter

文章目录 前言过滤器介绍用户信息的存储获取用户信息存储用户信息获取用户信息 处理逻辑总结 前言 SecurityContextHolder&#xff0c;这个是一个非常基础的对象&#xff0c;存储了当前应用的上下文SecurityContext&#xff0c;而在SecurityContext可以获取Authentication对象…

基于SSM+Vue的乐购游戏商城系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

沈阳建筑大学《乡村振兴战略下传统村落文化旅游设计》 许少辉八一著作

沈阳建筑大学《乡村振兴战略下传统村落文化旅游设计》 许少辉八一著作

playwright的安装与使用

一、安装 所有安装严格按照指定版本&#xff0c;不然可能会报错&#xff0c;为啥报错我也不知道 1、准备环境 win10&#xff08;playwright好像不支持win7 python2&#xff09; 2、 安装python3.7.9&#xff08;这个是为了兼容robot&#xff09; https://www.python.org/do…

数学建模__非线性规划Python实现

使用到的是scipy库 线性规划指的是目标模型均为线性&#xff0c;除此以外的都是非线性规划&#xff0c;使用scipy提供的方法对该类问题进行求解。 from scipy.optimize import minimize import numpy as np#定义目标函数 def fun(args):a,b,c,d argsv lambda x: (ax[0])/ (b…

SpringMVC的拦截器和JSR303的使用

目录 一、JSR303 二、拦截器&#xff08;interceptor&#xff09; 一、JSR303 1.1.什么是JSR303 JSR 303&#xff0c;它是Java EE&#xff08;现在称为Jakarta EE&#xff09;规范中的一部分。JSR 303定义了一种用于验证Java对象的标准规范&#xff0c;也称为Bean验证。 Bean验…