前言
为什么说用好大模型离不开向量数据库呢?
答复这个问题之前我们先来理解一下什么是向量?
好比在我们看到这个水果时,我们知道它是一个苹果。但在“苹果”这个词被发明之前,人们是如何形貌这个水果的呢?通过观察它的颜色、巨细、外形、纹理等特性,我们可以更清楚地定义这个水果。将这些特性用数字来表达,我们就可以得到一个向量。
一旦复杂的图像被转换成计算机可识别的数字表示,计算机就可以“认识”这个苹果了。但是,当新的苹果出现时,计算机还能识别它吗?固然可以,因为新的图像在向量空间中与最靠近的向量具有高相似性,计算机可以通过比力向量之间的相似度来进行识别。
AI训练中的向量维度
今天让我们惊叹不已的人工智能,往往通过上千个向量维度来学习训练,他们就像是AI大模型的眼睛,当AI大模型遇上巨大的向量数据,这组黄金搭档如何让硅基生物更聪明呢?
以大语言模型为例。简单来说在训练时, 喂给它的词句都会先转化为向量数据, 当训练数据里出现多组雷同的语言时,在向量数据构成的高维空间,相近的词汇就会距离更近,语言模型就可以徐徐捕捉到词汇间的语意和语法。
举例阐明: 它会更明白苹果和西瓜语意上靠近,但是和公交车相差甚远,接下来模型必要对上下文进行理解,此时Transformer架构就开始发挥作用,从每个词自身出发,观察和其他词之间的关系权重。
例如这句话里“我昨天买的苹果很好吃”, “很好吃”和“我”关系权重最大,权重结果被看成新的维度记录下来,一句更复杂的话,也转化成了带权重的向量,原模型颠末查询计算。天生权重最高的答案输出给你,一次问答就完成了
快速检索非结构化数据的利器 — 向量数据库
大模型训练推理过程更为复杂,他们必要处置惩罚如文本图像,音视频等大量非结构化数据,并转化为向量数据进行学习,这些数据的规模动辄过亿,向量维度可能高达数千,在选择数据库时,传统数据库只能进行行列检索逐一对应,
再输出精准的答案,但向量数据库,则是专门为非结构化数据检索而设计,它将项量数据构成一个立体高维空间,在空间中进行模糊检索,可以或许快速输出权重最高的答案。
AI的海马体–腾讯云向量数据库
业界的AI大模型采取预训练的模式,使用收集好的数据进行训练, 知识库难以做到及时更新,而接入向量数据库后,就像给模型插了个高性能外接硬盘,支持学习互联网等最新信息,比重新训练模型微调等方式更加自制高效。
在线推理时,大模型着实是没有影象功能的,只能通过重新输入之前的问答,实现短期影象,而且输入的内容也是有长度限制的。
腾讯云向量数据库(Tencent Cloud VectorDB)作为一种专门存储和检索向量数据的服务提供给用户,可以充当AI的海马体,让人工智能拥有影象汗青,问答可以或许当成新的训练语料,进入向量数据库永世储存,甚至当用户提出了重复相似的提问,向量数据库会直接给出缓存答案,这就让AI大模型,越用越聪明,越用越迅捷。
一、腾讯云向量数据库介绍
重磅组合,行业领先
LLM+向量数据库,打造专属RAG应用
智能化能力
腾讯云向量数据库可以和大语言模型 LLM 配合使用。企业的私域数据在颠末文本分割、向量化后,可以存储在腾讯云向量数据库中,构建起企业专属的外部知识库,从而在后续的检索任务中,为大模型提供提示信息,辅助大模型天生更加准确的答案。
产品亮点
高性能持百万级 OPS 及毫秒级查询延迟低本钱全流程平台托管,无需进行任何安装、部署、运维操作大规模单索引支持 10 亿级向量数据规模简单易用用户通过 API即可快速操作数据库,开发效率高高可用提供多副本高可用特性,提高容灾能力稳定可靠源自腾讯集团自研的向量检索引擎,近40个业务线上稳定运行 二、AI技术在智能客服中的作用
AI技术在智能客服平台中的关键作用
智能客服是一种基于AI技术的解决方案,通过向量数据库存储企业知识(如商品信息、游戏信息等),并利用LLM进行天然语言处置惩罚,从而准确、高效地答复客户问题,提高客户满足度、低落企业客服本钱
融合AI技术与向量数据库的上风与挑战
挑战上风推理问题天生答案通过向量数据库为LLM提供外部知识库,提高大模型答复的准确性客服引导式话术LLM理解引导式话术,在用户问题不完备的环境下,通过与用户的互动,逐步引导用户提问,服务更加友好多轮对话LLM通过对多轮的深入语义分析和精准理解,实现了天然、流畅的对话,增强了与用户的密切感 三、智能客服平台构建
物料准备
提交完成后等待创建即可
- 创建完成后记得开启外网访问所在, 并配置白名单, 我这里配置的是0.0.0.0/0
原始数据获取
Git所在: https://github.com/SophonPlus/ChineseNlpCorpus
获取其中一个类目即可哦!!
项目开发
创建数据库
相干依赖引入
- import tcvectordb
- 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
复制代码 创建数据库
- client = tcvectordb.VectorDBClient(url='http://lb-esqjs4rv-35ijkpnybtm1fsuc******', username='root', key='gD0Ip*******', read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)
- db = client.create_database(database_name='db-test')
- print(db.database_name)
复制代码 留意:
- VectorDBClient 中的 url 和 key 填写成本身申请的向量数据库的哦 (key 就是 秘钥)
- read_consistency :设置读一致性 , 是非必填参数 , 默认取值 EVENTUAL_CONSISTENCY , 可取值如下:
- ReadConsistency.STRONG_CONSISTENCY:强一致性。
- ReadConsistency.EVENTUAL_CONSISTENCY:最终一致性。
创建 Collection
- # 第一步,设计索引
- 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='intelligent',
- shard=1,
- replicas=0,
- description='this is a collection of test embedding',
- embedding=ebd,
- index=index
- )
- print(vars(coll))
复制代码 留意:
- 向量数据库的Collection 是设计的索引而不是 设计表格的结构
- 必须的索引 : 主键 id、向量字段 vector 这两个字段现在是固定且必须的
- 除了id,vector这两个字段外,如果有其他字段是可以不消定义的, 直接通过 Embedding 添加即可
- create_collection 参数可以直接参考 腾讯云向量数据库 , 讲解的很清楚
- Embedding 的功能是腾讯云向量数据库(Tencent Cloud VectorDB)提供将非结构化数据转换为向量数据的能力。 这一点我真的是爱了 。
- 由于 BGE_BASE_ZH默认是 768 因此 在设置VectorIndex的 dimension 时 值为 768 , 否则会报错哦!
运行完上述代码之后 , 你的向量数据库 的库名以及集合都已经创建完了哦!
Embedding
关于 Embedding 我必须拿出来单独说一下, 腾讯云的工程师,简直就是太知心了
要知道一个Embedding 将原始文本转换成向量进行数据插入, 这一点给开发者提供了多少的便利啊!(懂得都懂, 我是被折磨坏了!!)
连接数据库写入原始数据
引入依赖
- import tcvectordb
- import pandas as pd
- from tcvectordb.model.document import Document, Filter, SearchParams
- from tcvectordb.model.enum import FieldType, IndexType, MetricType, ReadConsistency
复制代码 连接向量数据库
- client = tcvectordb.VectorDBClient(url='http://lb-esqjs4rv-3**********', username='root', key='gD0Ips0RA***********9CBBE', read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)
- # 指定写入原始文本的数据库与集合
- db = client.database('db-test')
- coll = db.collection('intelligent')
复制代码 解析csv 数据并写入原始文本 (embedding)
- documents = []
- count = 1
- for index, row in data.iterrows():
- st_info = '{}:{}'.format(row["title"], row["reply"])
- count += 1
- print(f'{st_info} /n 11')
- res = coll.upsert(
- documents=[
- Document(
- id=str(count),
- text=st_info,
- title=row['title'],
- reply=row['reply'],
- )
- ],
- build_index=True
- )
复制代码 csv 部分数据如下
留意:
- 除了 id、text 字段必须写入,可以写入其他任意字段
- upsert 会执行覆盖写,若文档id已存在,则新数据会直接覆盖原有数据(删除原有数据,再插入新数据)
- 参数 build_index 为 True,指写入数据同时重新创建索引。
相似度查询
测试结果没有问题
相似度查询当地化
代码如下
- import tcvectordb
- from tcvectordb.model.enum import FieldType, IndexType, MetricType, EmbeddingModel, ReadConsistency
- from tcvectordb.model.index import Index, VectorIndex, FilterIndex, HNSWParams
- from tcvectordb.model.document import Document, Filter, SearchParams
- client = tcvectordb.VectorDBClient(url='http://lb-esqjs4rv-*********', username='root', key='gD0Ips0RA********BBE', read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)
- # 指定写入原始文本的数据库与集合
- db = client.database('db-test')
- coll = db.collection('intelligent')
- searchword = input('请输入查询问题:')
- doc_lists = coll.searchByText(
- embeddingItems=[searchword],
- params=SearchParams(ef=200),
- limit=3,
- retrieve_vector=False,
- )
- # printf
- for i, docs in enumerate(doc_lists.get("documents")):
- print(i)
- for doc in docs:
- print(doc)
复制代码 测试结果:
这里我是直接选择csv 中的一个问题进行提问的 , 可以看出返回三条中第一条匹配度是 0.9 , 完全没有问题, 而这个答复也是csv 中对应的答复
留意:
- searchByText 提供按照 embeddingItems 输入的文本批量进行相似性查询的能力
- limit 用于限制每个单位搜刮条件的条数,如 vector 传入三组向量,limit 为 3,则 limit 限制的是每组向量返回 top 3 的相似度向量
- params 指定索引类型对应的查询参数,HNSW 类型必要设置 ef,指定查询的遍历范围;IVF 系列必要设置 nprobe,指定查询的单位数量
- retrieve_vector 指定是否输出向量字段
新增数据
对于数据库而言新增数据必不可少, 那么向量数据库如何实现数据插入呢 ?
代码如下 :
- import tcvectordb
- from tcvectordb.model.enum import FieldType, IndexType, MetricType, ReadConsistency
- from tcvectordb.model.index import Index, VectorIndex, FilterIndex, HNSWParams
- from tcvectordb.model.collection import UpdateQuery
- from tcvectordb.model.document import Document, SearchParams, Filter
- #create a database client object
- client = tcvectordb.VectorDBClient(url='http://xxxxxxxxp-beijing.xxxxxx.com:40000', username='root', key='xxxxxxxx', read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)
- # 指定写入数据的数据库与集合
- db = client.database('db-test')
- coll = db.collection('intelligent')
- # 写入数据,可能存在一定延迟
- res = coll.upsert(
- documents=[
- Document(id='0001', text="腾讯云向量数据库(Tencent Cloud VectorDB)是一款全托管的自研企业级分布式数据库服务,专用于存储、检索、分析多维向量数据。该数据库支持多种索引类型和相似度计算方法,单索引支持 10 亿级向量规模,可支持百万级 QPS 及毫秒级查询延迟。腾讯云向量数据库不仅能为大模型提供外部知识库,提高大模型回答的准确性,还可广泛应用于推荐系统、自然语言处理等 AI 领域。",title='腾讯云向量数据库', is_best='1' ),
- Document(id='0002',
- text="数据写入/检索自动向量化,对齐传统数据库的使用体验,用户无需关注向量生成过程,极大降低使用门槛。",
- title='Embedding功能', is_best='1'),
- Document(id='0003',
- text="腾讯云向量数据库 Tencent Cloud VectorDB 基于腾讯集团每日处理千亿次检索的向量引擎 OLAMA,底层采用 Raft 分布式存储,通过 Master 节点进行集群管理和调度,实现系统的高效运行。同时,腾讯云向量数据库支持设置多分片和多副本,进一步提升了负载均衡能力,使得向量数据库能够在处理海量向量数据的同时,实现高性能、高可扩展性和高容灾能力。",
- title='产品架构', is_best='1'),
- ],
- build_index=True
- )
复制代码 我们自定一些数据进行写入, 看一下是否可以查询的到呢 ?
根据反馈的结果可以看到, 数据执行是完全没有问题的, 那么我们如和实现智能客服呢 ?
参考链接 腾讯云向量数据库这里给我们 提供了http api 的开发手册哦! 还等什么赶快去体验一下吧 !!
四、向量数据库api
通过上面的介绍我们已经相识了,腾讯云向量数据库的使用了, 接下来我们将启动当地服务完成接口调用, 从而实现智能客服的开发
1. 搭建FastAPI 开启当地接口调用
- from fastapi import FastAPI
- import tcvectordb
- from tcvectordb.model.enum import ReadConsistency
- from tcvectordb.model.document import SearchParams
- app = FastAPI()
- @app.get("/search")
- async def search_docs(searchword: str):
- client = tcvectordb.VectorDBClient(
- url='http://lbxxxxxxx.com:40000',
- username='root',
- key='xxxxxxxx',
- read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY,
- timeout=30
- )
- db = client.database('db-test')
- coll = db.collection('intelligent')
- doc_lists = coll.searchByText(
- embeddingItems=[searchword],
- params=SearchParams(ef=200),
- limit=1,
- retrieve_vector=False,
- )
- results = []
- for i, docs in enumerate(doc_lists.get("documents")):
- result = {}
- result["index"] = i
- result["docs"] = [doc for doc in docs]
- results.append(result)
- return results
复制代码 将上述代码放入 main.py 中, 然后终端输入 uvicorn main:app --reload 来启动程序
效果如下图:
浏览器进行接口访问 :
到现在为止, 我们的接口已经没有问题了 , 但是如果接入前端程序的话,会出现一个问题 === 跨域
这个问题我们可以到场中间件来启用跨域资源共享
- # 添加中间件以启用跨域资源共享
- app.add_middleware(
- CORSMiddleware,
- allow_origins=["*"], # 允许所有来源的跨域请求,你也可以指定具体的来源
- allow_credentials=True,
- allow_methods=["*"], # 允许所有HTTP方法的请求
- allow_headers=["*"], # 允许所有头部的请求
- )
复制代码 完备代码如下 :
- from fastapi import FastAPIimport tcvectordbfrom tcvectordb.model.enum import ReadConsistencyfrom tcvectordb.model.document import SearchParamsapp = FastAPI()# 添加中间件以启用跨域资源共享
- app.add_middleware(
- CORSMiddleware,
- allow_origins=["*"], # 允许所有来源的跨域请求,你也可以指定具体的来源
- allow_credentials=True,
- allow_methods=["*"], # 允许所有HTTP方法的请求
- allow_headers=["*"], # 允许所有头部的请求
- )
- @app.get("/search")async def search_docs(searchword: str): client = tcvectordb.VectorDBClient( url='http://lbxxxxxxx.com:40000', username='root', key='xxxxxxxx', read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30 ) db = client.database('db-test') coll = db.collection('intelligent') doc_lists = coll.searchByText( embeddingItems=[searchword], params=SearchParams(ef=200), limit=1, retrieve_vector=False, ) results = [] for i, docs in enumerate(doc_lists.get("documents")): result = {} result["index"] = i result["docs"] = [doc for doc in docs] results.append(result) return results
复制代码 好啦 接下来 就可以正常的调用了 !!
五、常见问题
- embedding 在写入数据时 text字段是有长度限制的, 导致在写入数据时会报错 ,这一点必要留意一下
- 官网上部分参数讲解的并不是很清楚, 必要本身去摸索一下
六、总结
团体体验下来感觉腾讯云向量数据库真是个宝藏啊, 写入的速度也是杠杠的, 有项体验的宝贝抓紧体验一下吧
- 对于 embedding的设定节省了我很多的时间 , 再也不消担心我的原始数据如何转换向量啦
- 官方文档也比力多, 完全不消担心本身会被卡到哦!
总之, 腾讯云向量数据库在用户体验上以及学习本钱上做了很大的功夫, 完全不消担心使用以及操作上的问题。详细的信息大家也可以查看一下官方对腾讯云数据库的见解:
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |