钱投六年投资网络安全产业版图
06-17
前言 如果按照我的节奏学习 Python,我觉得日常开发不会有太大问题。不过,由于我没有Python开发经验,所以我就思考我应该写什么。
回忆起学习Java时的学习路线。直接操作数据库是重要内容之一。
无论使用哪种编程语言,与数据库的交互都是不可避免的。不过,直接操作MySQL数据库似乎没什么意思,毕竟我每天都在写SQL语句。
突然想到之前写过的一系列私有知识库文章,于是就想到了向量数据库。毕竟这是目前非常流行的技术之一。
如果AI离开了矢量数据库,就等于失去了灵魂。市场上有许多矢量数据库产品。
我选择的是腾讯最近推出的矢量数据库,而且还有免费试用卡。在到期之前,我决定写一些相关的文章。
我看了一下,这个数据库对于新手来说非常友好,因为它有可视化界面。对于新手来说,能够看到实际效果才是最客观的。
就像我刚学 SQL 的时候,如果没有可视化工具 Navicat,我会感到力不从心。矢量数据库矢量数据库能够将复杂的非结构化数据转换为多维逻辑坐标值。
简而言之,它可以将我们所知道的一切转化为可计算的数字。一旦数据进入数学领域,我们就可以对其进行计算。
此外,矢量数据库还可以作为外部知识库,为大型模型提供最新、最全面的信息,以便及时回答需要回答的问题。同时,还可以赋予大型语言模型长期记忆能力,避免对话过程中出现“碎片”。
可以说,向量数据库是大型语言模型的最佳拍档。如果您对任何内容有疑问,请点击下面的官方文档链接查看更多信息: Studio code run import tcvectordbfrom tcvectordb.model.enum import FieldType, IndexType, MetricType, ReadConsistency#create a database client objectclient = tcvectordb.VectorDBClient (url =' username='root', key='1*****', read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)# 创建数据库db = client.create_database(database_name='db-xiaoyu') print( db.database_name)# listdatabasesdb_list = client.list_databases()for db in db_list: print(db.database_name)好了,我们现在开始替换所需的内容,完成数据库的创建。
创建数据库后,我们还需要创建集合,而不是传统的表,因为在矢量数据库中它们被称为集合。因此,我们接下来将创建该集合。
创建集合 创建集合的过程与创建表类似,但前提是集合需要存储向量,而表用于存储数据。在这里,我们选择使用具有集成嵌入的集合。
如果不使用集成嵌入,则需要使用其他嵌入模型来输出向量,然后将其输入到集合中进行存储。除非您想手动输入向量值,否则这是必要的。
当使用向量对应的文本字段设计索引(不是Collection的结构)时,不建议创建索引。这样做会占用大量的内存资源,并且没有实际效果。
除了向量对应的文本字段之外,如果需要进行业务过滤,即查询中需要使用where条件,那么就必须为这个条件字段单独定义一个索引。也就是说,你需要使用哪个字段来进行过滤,就必须为该字段定义一个索引。
Vector数据库支持动态模式(Schema),写入数据时可以写入任意字段,无需提前定义,类似于MongoDB。目前主键id和向量字段向量是固定且必需的,字段名称也必须一致,否则会报错。
之前解释私有知识库的时候,我会单独介绍其他的嵌入模型,因为向量数据库并没有继承这些模型。不过,腾讯已经将嵌入模型集成到了他们的系统中,所以不需要来回寻找模型。
需要注意的是,为了保证一致性,你选择的嵌入模型背后的向量场必须设置为维度。代码语言:python 代码运行次数:0 复制Cloud Studio代码运行 db = client.database('db-xiaoyu')# --index configindex = Index( FilterIndex(name='id', field_type=FieldType.String, index_type= IndexType.PRIMARY_KEY)、VectorIndex(name='向量'、dimension=、index_type=IndexType.HNSW、metric_type=MetricType.COSINE、params=HNSWParams(m=16、efconstruction=))、FilterIndex(name='作者' , field_type =FieldType.String, index_type=IndexType.FILTER), FilterIndex(name='bookName', field_type=FieldType.String, index_type=IndexType.FILTER))# 嵌入 configebd = Embedding(vector_field='vector', field=' text' , model=EmbeddingModel.BGE_BASE_ZH)# 创建集合coll = db.create_collection( name='book-xiaoyu', shard=1,replicas=0, description='这是测试嵌入的集合', embedding=ebd, index= index)print(vars(coll)) 我们已经成功创建了数据库和集合,现在让我们看一下它们事实上,它们的结构与MySQL等数据库类似,只是存储的内容和术语发生了变化。
我们可以将其视为数据库操作。 image插入/替换数据 插入数据时,如果集合中已存在相同ID的文档,则删除原文档并插入新的文档数据。
需要注意的是,我们没有指定很多字段,例如页面、文本等。您可以继续添加这些字段,因为它们与 MongoDB 类似。
但请注意,文本字段必须与您配置嵌入时指定的字段相同,否则无法转换为向量。代码语言:python 代码运行次数:0 复制Cloud Studio代码运行 coll = db.collection('book-emb')# 写入数据。
# 参数build_index为True,表示写入数据的同时重新创建索引。 res = coll.upsert(documents=[ Document(id='', text="讲到世界大势,分久必团结,久合必团结”必须分。
",author='罗贯中', bookName='三国演义', page=21), Document(id='', text="混沌不分,天下混沌,无有天下第一。",author='吴承恩',bookName='西游记',page=22),Document(id='',text="甄世隐梦中有通灵知识,贾雨村是",author='曹雪芹', bookName='红楼梦', page=23)], build_index=True) 当我们完成数据插入后,我们可以立即执行查询操作。
但请注意,如果将“build_index”字段设置为“false”,即使插入成功,查询时也无法检索到数据。因此,如果希望它立即生效并且能够查询数据,则必须将其设置为“true”。
这就是重建索引的过程。这里查询数据可以分为两种:精准查询和相似度查询。
精确查询是指除矢量字段之外的其他字段的查询条件完全匹配。由于我们在索引的时候已经索引了作者(author)和书名(bookName),所以我们可以直接对其进行数据过滤,不过这里我就不演示了。
下面我演示一个模糊查询,即对向量字段进行匹配后查询结果,同时添加过滤条件。代码语言:python 代码运行次数:0 复制Cloud Studio代码并运行 doc_lists = coll.searchByText( embeddingItems=['世界大势是分久必合,分久必合团结久了,就会分'], filter=Filter(Filter.In("bookName", ["《三国演义》,《西游记》])), params=SearchParams(ef= ), limit=3,retrieve_vector=False, # 不返回向量 output_fields=['bookName','author'] )# printffor i, docs in enumerate(doc_lists.get("documents")): for doc in docs: print(doc) 除了上面提到的Python写法之外,我们还可以通过接口进行精确查询,只需在接口中的where后面填写条件即可,对图像进行模糊查询,可以直接使用文本来查询,或者定义过滤字段进行查询优化 图片总结 删除数据的剩余部分我就不演示了,今天我们来熟悉一下矢量数据库的界面操作。
感觉就像用Kibana查询ES数据一样。不知道你是否也有类似的感受。
好吧,今天我们只关注文本操作。下次我会尝试处理图像或视频数据。
总的来说,Python的SDK比Java用起来更舒服。如果你曾经使用过Java SDK与平台接口对接过,你会发现Python SDK上手速度更快。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-17
06-06
06-18
06-17
06-17
06-08
06-18
06-18
06-18
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用