前言

如果说Python是跟随我的步伐学习的话,我觉得我在日常开发方面已经没有太大的问题了。然而,由于我没有Python开发经验,我思考着应该写些什么内容。我回想起学习Java时的学习路线,直接操作数据库是其中一项重要内容,无论使用哪种编程语言,与数据库的交互都是不可避免的。然而,直接操作MySQL数据库似乎缺乏趣味性,毕竟每天都在写SQL语句。突然我想到了我之前写过的一系列私人知识库文章,于是我想到了向量数据库,毕竟这是当前非常热门的技术之一。

如果AI离开了向量数据库,就好像失去了灵魂一样。市面上有很多向量数据库产品,我选择了最近腾讯推出的向量数据库,并且我还有一张免费试用卡,趁着还没过期,我决定写一些相关文章。而且我看了一下,这个数据库对于新手来说非常友好,因为它有可视化界面。对于一个新手来说,能够看到实际效果是最客观的。就像当初学习SQL时,如果没有Navicat这个可视化工具,就会感觉力不从心一样。

向量数据库

向量数据库具有将复杂的非结构化数据转化为多维逻辑坐标值的能力,简而言之,它可以将我们所了解的所有事物转化为可计算的数字。一旦数据进入数学领域,我们就能够对其进行计算。此外,向量数据库还可以作为一个外部知识库,为大型模型提供最新、最全面的信息,以应对需要及时回答的问题。同时,它也能够赋予大型语言模型长期记忆的能力,避免在对话过程中产生"断片"的情况。可以说,向量数据库是大型语言模型的最佳合作伙伴。

如果你对任何内容有任何疑问,请点击以下官方文档链接查看更多信息:https://img-bss.csdnimg.cn/1113tusoutuanli.pdf

虽然这是官方的文档,里面存在许多错误,我已经积极提供了反馈,但可惜没有得到有效处理。尽管如此,这并不会妨碍我们的阅读。文档最后还有一个官方的案例代码仓库,对于有兴趣的同学可以直接滑动到最后进行查阅。不过,对于新手而言,可能并不太友好,原因在于代码量较大,很难一下子消化。就好比刚学习Java的时候,要看别人的业务逻辑一样,即使有大量注释,也会感到吃力。

好的,废话不多说,我们直接进入正题吧。如果你还有未领取的,可以免费领取一下。

腾讯官方体验地址:https://cloud.tencent.com/product/vdb

建立数据库连接

领取完毕后,你需要创建一个新的免费示例,这个过程不难,大家都会。成功之后,你需要开启外网访问,否则无法进行本地的测试和联调。在开启外网访问时,需要将外网白名单ip设置为0.0.0.0/0,这将接受所有IP的请求。

好的,接下来我们需要获取数据库的登录名和密码。这些信息将用于连接和管理数据库。

创建数据库

import tcvectordb
from tcvectordb.model.enum import FieldType, IndexType, MetricType, ReadConsistency #create a database client object
client = tcvectordb.VectorDBClient(url='http://*******', username='root', key='1*******', read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)
# create a database
db = client.create_database(database_name='db-xiaoyu') print(db.database_name) # list databases
db_list = client.list_databases() for db in db_list:
print(db.database_name)

好的,我们现在开始替换所需的内容,完成数据库的创建。一旦数据库创建完成,我们还需要创建集合,而不是传统的表,因为在向量数据库中,它们被称为集合。因此,我们接下来要创建集合。

创建集合

创建集合和创建表的过程类似,但前提是集合需要存储向量,而表用于存储数据。在这里,我们选择使用集成了embedding的集合。如果不使用集成的embedding,你需要使用其他embedding模型来输出向量,然后将其输入到集合中进行存储。除非你想手动输入向量值,否则这是必要的。

设计索引(不是设计 Collection 的结构)

在使用向量对应的文本字段时,不建议建立索引。这样做会占用大量内存资源,而且没有实际作用。除了向量对应的文本字段外,如果需要进行业务过滤,也就是在查询时需要使用where条件,那么必须单独为这个条件字段定义一个索引。也就是说,你需要用哪个字段进行过滤,就必须为该字段定义一个索引。向量数据库支持动态模式(Schema),在写入数据时可以写入任意字段,无需提前定义,类似于MongoDB。目前,主键id和向量字段vector是固定且必需的,字段名称也必须一致,否则会报错。

在之前讲解私人知识库的时候,我会单独引入其他embedding模型,因为向量数据库没有继承这些模型。不过,腾讯已经将embedding模型集成在了他们的系统中,这样就不需要来回寻找模型了。需要注意的是,为了确保一致性,你选择的embedding模型后面的vector字段要设置为768维。

db = client.database('db-xiaoyu')
# -- index config
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)),
FilterIndex(name='author', field_type=FieldType.String, index_type=IndexType.FILTER),
FilterIndex(name='bookName', field_type=FieldType.String, index_type=IndexType.FILTER)
) # Embedding config
ebd = Embedding(vector_field='vector', field='text', model=EmbeddingModel.BGE_BASE_ZH) # create a collection
coll = db.create_collection(
name='book-xiaoyu',
shard=1,
replicas=0,
description='this is a collection of test embedding',
embedding=ebd,
index=index
)
print(vars(coll))

我们已经成功创建了数据库和集合,并且现在让我们来看一下它们的结构。实际上,它们的原理与MySQL和其他数据库相似,只是存储的内容和术语发生了变化。我们可以将其视为数据库操作。

插入/替换数据

当插入数据时,如果集合中已经存在具有相同ID的文档,则会删除原始文档并插入新的文档数据。需要注意的是,很多字段我们都没有指定,例如page、text等。你可以继续添加这些字段,因为它们类似于MongoDB。但请注意,text字段必须与你在配置embedding时指定的字段相同,否则无法将其转换为向量。

coll = db.collection('book-emb')
# 写入数据。
# 参数 build_index 为 True,指写入数据同时重新创建索引。
res = coll.upsert(
documents=[
Document(id='0001', text="话说天下大势,分久必合,合久必分。", author='罗贯中', bookName='三国演义', page=21),
Document(id='0002', text="混沌未分天地乱,茫茫渺渺无人间。", author='吴承恩', bookName='西游记', page=22),
Document(id='0003', text="甄士隐梦幻识通灵,贾雨村风尘怀闺秀。", author='曹雪芹', bookName='红楼梦', page=23)
],
build_index=True
)

当我们完成数据插入后,我们可以立即执行查询操作。但请注意,如果你将 "build_index" 字段设置为 "false",即使插入成功,查询时也无法检索到数据。因此,如果要立即生效并能查询到数据,你必须将其设置为 "true"。这个是重建索引的过程

查询数据

这里的查询可以分为精确查询和相似度查询两种。精确查询是指除了向量字段外的其他字段查询条件都是精确匹配的。由于我们在建立索引时已经对作者(author)和书名(bookName)建立了索引,所以我们可以直接对它们进行数据过滤,但是我不会在这里演示。现在我将演示一下模糊查询,即对向量字段匹配后的结果进行查询,并同时加上过滤条件。

doc_lists = coll.searchByText(
embeddingItems=['天下大势,分久必合,合久必分'],
filter=Filter(Filter.In("bookName", ["三国演义", "西游记"])),
params=SearchParams(ef=200),
limit=3,
retrieve_vector=False, # 不返回向量
output_fields=['bookName','author']
)
# printf
for i, docs in enumerate(doc_lists.get("documents")):
for doc in docs:
print(doc)

除了上面提到的Python的写法,我们还可以通过界面来进行精确查询。只需要在界面中填写where后的条件即可。

要进行模糊查询,可以直接使用text文字进行查询,或者定义过滤字段来进行查询优化。

总结

剩下的删除数据这部分我就不演示了。今天先跟向量数据库熟悉一下界面操作,感觉就像在使用Kibana查询ES数据一样。不知道你们有没有类似的感觉。好了,今天我们先只关注文本操作,下一期我会尝试处理图像或者视频数据。总的来说,相比Java,Python的SDK使用起来更加舒适。如果你曾经使用过Java SDK与平台接口对接,就会发现Python SDK上手更快。

🔥🔥Java开发者的Python快速实战指南:探索向量数据库之文本搜索的更多相关文章

  1. JAVA开发者的Golang快速指南

    Golang作为Docker.Kubernetes和OpenShift等一些酷辣新技术的首选编程语言,越来越受欢迎.尤其它们都是开源的,很多情况下,开源是非常有价值的.深入学习阅Golang等源代码库 ...

  2. 针对Quant的Python快速入门指南

    作者:用Python的交易员 (原创文章,转载请注明出处) 最近有越来越多的朋友在知乎或者QQ上问我如何学习入门Python,就目前需求来看,我需要写这么一篇指南. 针对整个vn.py框架的学习,整体 ...

  3. MessagePack Java 0.6.X 快速开始指南 - 安装

    0.6.x 版本的 MessagePack 已经过期被淘汰了.如果你现在开始使用 MessagePack 话,请不要使用这个版本. 我们再这里保留 0.6.x 版本的内容主要用于参考用途. 最新的 M ...

  4. Ansible快速实战指南----多机自动化执行命令、部署神器

                                      1.需求: 需要在多台主机上,发送文件.执行命令,进行快速部署 2.ansible 远程复制文件 例子:在当前节点(20.88.14 ...

  5. SQL Server 2012实施与管理实战指南(笔记)——Ch4数据库连接组件

    4.数据库连接组件 访问数据库有多种不同的技术,包括ADO,ODBC,OLEDB,ADO.NET等这些都有一些共性.首先要建立连接(Connection),然后通过命令(Command)对数据库进行访 ...

  6. [置顶] 【Android实战】----从Retrofit源码分析到Java网络编程以及HTTP权威指南想到的

    一.简介 接上一篇[Android实战]----基于Retrofit实现多图片/文件.图文上传中曾说非常想搞明白为什么Retrofit那么屌.最近也看了一些其源码分析的文章以及亲自查看了源码,发现其对 ...

  7. Java程序员的现代RPC指南(Windows版预编译好的Protoc支持C++,Java,Python三种最常用的语言,Thrift则支持几乎主流的各种语言)

    Java程序员的现代RPC指南 1.前言 1.1 RPC框架简介 最早接触RPC还是初学Java时,直接用Socket API传东西好麻烦.于是发现了JDK直接支持的RMI,然后就用得不亦乐乎,各种大 ...

  8. 阿里巴巴泰山版《Java 开发者手册》,也是一份防坑指南

    我是风筝,公众号「古时的风筝」,一个不只有技术的技术公众号,一个在程序圈混迹多年,主业 Java,另外 Python.React 也玩儿的 6 的斜杠开发者. Spring Cloud 系列文章已经完 ...

  9. Spring MVC 程序首页的设置 - 一号门-程序员的工作,程序员的生活(java,python,delphi实战)

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  10. 【Android实战】----从Retrofit源代码分析到Java网络编程以及HTTP权威指南想到的

    一.简单介绍 接上一篇[Android实战]----基于Retrofit实现多图片/文件.图文上传中曾说非常想搞明确为什么Retrofit那么屌. 近期也看了一些其源代码分析的文章以及亲自查看了源代码 ...

随机推荐

  1. c++中unique_ptr 的使用和理解

    unique_ptr 的使用 std::unique_ptr是c++11起引入的智能指针,为什么必须要在c++11起才有该特性,主要还是c++11增加了move语义,否则无法对对象的所有权进行传递. ...

  2. linux 查找目录中的大文件

    find是Linux系统中常用的文件查找命令.它可以在文件系统中查找指定条件的文件,并执行相应的操作.语法格式如下: find [pathname] [options] pathname: 指定查找的 ...

  3. K8S集群中使用JD KMS服务对敏感数据安全加密

    基本概念 KMS,Key Management Service,即密钥管理服务,在K8S集群中,以驱动和插件的形式启用对Secret,Configmap进行加密.以保护敏感数据, 驱动和插件需要使用者 ...

  4. 浅谈 Linux 下 vim 的使用

    Vim 是从 vi 发展出来的一个文本编辑器,其代码补全.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用. Vi 是老式的字处理器,功能虽然已经很齐全了,但还有可以进步的地方.Vim 可 ...

  5. windows下flutter的环境安装

    Flutter是谷歌出品的移动应用SDK,性能卓越.体验精美.跨平台.HotReload等等这些特点. Dart是谷歌推出的编程语言.支持即时编译JIT(Just In Time).HotReload ...

  6. Sermant类隔离架构:解决JavaAgent场景类冲突的实践

    本文分享自华为云社区<Sermant类隔离架构解析--解决JavaAgent场景类冲突的实践>,作者:华为云开源. Sermant是基于Java字节码增强技术的无代理服务网格,其利用Jav ...

  7. 「loj - 6179」Pyh 的求和

    link. 我们想要求出 \(\varphi(ij)=\varphi(i)\varphi(j)C\) 中的常数.先研究 \(i=p^a\),\(j=p^b\) 的情况,即 \(\varphi(p^{a ...

  8. Java 21新特性:Sequenced Collections(有序集合)

    在JDK 21中,Sequenced Collections的引入带来了新的接口和方法来简化集合处理.此增强功能旨在解决访问Java中各种集合类型的第一个和最后一个元素需要非统一且麻烦处理场景. 下面 ...

  9. 想转行DevOps工程师?快来看看DevOps工程师的学习路径,少走弯路

    DevOps方法论 :::tips DevOps方法论的主要来源是Agile, Lean 和TOC, 独创的方法论是持续交付. ::: DevOps 是一种软件开发方法,涉及持续开发,持续测试,持续集 ...

  10. 33家国内外知名的手机广告平台的SDK名单汇总,吐血推荐

    下面格式:第一行是广告平台名称,第二行是SDK的包名特征,第三行是平台网站 多盟cn.domob.androidhttp://www.domob.cn/百度推广SDK com.baidu统计SDK c ...