【腾讯云云上实验室】用向量数据库解决如何快速上线智能问答应用

2023-12-01 21:31:09 浏览数 (1)

腾讯云向量数据库专门存储和检索向量数据的服务提供给用户, 在高性能、高可用、大规模、低成本、简单易用、稳定可靠、智能运维等方面体现出显著优势,在免费的版本中虽然无法创建副本,但是能满足几乎所有的测试需求。当下腾讯云向量数据库官方给了一些应用示例,例如有:大规模知识库、推荐系统、问答系统、文本/图像检索。

【腾讯云云上实验室】用向量数据库——突破搜索极限-让问答应用秒上线

腾讯云向量数据库产品特性

产品特性有很多都是很实际的贴近现实所提供的功能,Embedding、高性能、高可用、低成本、简单易用、稳定可靠。

Embedding功能

这个功能我必须要单独说一下:

官方说法:"数据写入/检索自动向量化,对齐传统数据库的使用体验,用户无需关注向量生成过程,极大降低使用门槛"。

这个是对于我们非研究生以上水平的人员非常友好的特性,大大降低了我们本科开发者使用入门的门槛。

低成本、简单易用

这个特性是对小企业来说是非常友好的,毕竟如果成本太高,加之当下市场环境导致企业投资的风险度超级高,相对低成本、简单易用好上手就能降本啊,现在都不是降本增效吗,非常符合企业需求,就算是向上提出,通过的概率也是比较大的。

高性能、高可用、稳定可靠

这就是又好又快又方便的源泉,哪个企业都希望自己的服务器非常稳定、安全、靠谱,

腾讯云向量数据库的基本使用方法——Web端

大致的目录如下:

由于内容较多,都放在一篇里面就太乱套了,所以我单独的分开写了一下,可以在这里连接中看到上方的操作:

【腾讯云云上实验室-向量数据库】——Web端操作-CSDN博客

在这里也祝愿你申请高级版本使用名额的时候能有空位置哦。

腾讯云向量数据库的基本使用方法——Python版本

在这篇文章中我准备了对应的python代码的操作方法,毕竟咱们现在跑环境啥的用python是最方便的,先学会具体的使用,后面可以先上线后优化,没有任何困难可以阻止我们前进的脚步。

腾讯向量数据库——Embedding-CSDN博客

这里需要注意的是一定要提前开【公网】以及添加对应的安全组端口号【TCP:40000】,否则无法连接。

具体操作目录:

游戏各门派技能招式问题解答

这里测试的内容是一个简单的游戏问答,我准备的是一些技能的数据,根据用户的问题来检索向量数据,根据向量数据库【相似度查询】匹配【score】最高的返回给用户结果。难度不是很大,就是过程的数据准备挺麻烦,希望各位看官点点赞支持一下哈,这里留了数据整理的连接。

 未序列化:【腾讯云云上实验室-向量数据库】——测试数据集——Embedding——text数据(未json化)-CSDN博客

序列化:【腾讯云云上实验室-向量数据库】——测试数据集——Embedding——text数据(json序列化)-CSDN博客

这里后面就开始做一个具体的数据测试,数据的话在【序列化】的连接里面,想自己做测试的话可以跟着做以下。

1、向量数据库创建

这里就直接写个【mygame_db】了。

2、创建数据集合

注:这里要开启【Embedding】哦。不然我们自己可搞不定的。

添加几个Filter后面方便检索。

3、利用python批量插入数据

直接批量upsert数据,这里是可以优化的,但是由于数据库效率比较高,几百条数据嗖嗖嗖~就怎么方便怎么来了。

这里的使用方式不是最高效的,具体的我做了测试,可以参考这篇文章:【腾讯云云上实验室-向量数据库】——添加测试数据方法对照实验-CSDN博客

代码语言:javascript复制
import tcvectordb
from tcvectordb.model.collection import Embedding, UpdateQuery
from tcvectordb.model.document import Document, Filter, SearchParams
from tcvectordb.model.enum import FieldType, IndexType, MetricType, EmbeddingModel
from tcvectordb.model.index import Index, VectorIndex, FilterIndex, HNSWParams, IVFFLATParams
from tcvectordb.model.enum import FieldType, IndexType, MetricType, ReadConsistency
import json
import re

# create a database client object
client = tcvectordb.VectorDBClient(url='http://换成自己的公网地址:40000',
                                   username='root', key='EgERj1OzZq2pBilNQO********',
                                   read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)
# 指定写入原始文本的数据库与集合
db = client.database('mygame_db')
coll = db.collection('skill_info')

files = open("skill.txt", "r", encoding="utf-8")
arr = []  # temp
for item in files.readlines():
    if item.__eq__("n") or item.__eq__("r"):
        continue
    # print(len(item.split("n")))
    arr.append(item.split()[0])

arr_list = []  # 总
title = ""
count = 0
for item in arr:
    result1 = re.match(r"d.", item, re.I)
    if result1 == None:
        lists = {}  # 单
        count  = 1
        lists["id"] = count
        lists["title"] = title
        temp = item.split(":")
        lists["skill_name"] = temp[1]
        lists["skill_info"] = temp[2]
        arr_list.append(lists)
    else:
        title = item.replace(":", "").split(".")[1]

docs = []
for item in arr_list:
    st_info = '{}:{}:{}'.format(item["title"], item["skill_name"], item["skill_info"])
    res = coll.upsert(
        documents=[
            Document(id=str(item["id"]),
                     text=st_info,
                     title=item["title"],
                     skill_name=item["skill_name"],
                     skill_info=item["skill_info"],
                     )
        ]
    )

数据查看:

当前信息还是比较少的,但是用一个没有的词来进行相似度查询还是可以看到0.779这种匹配度的, 这个score就是我们需要的参数,相似度查询完毕后就可以根据返回的分数来判断哪个合适一些。

可以直接测试一下询问状态。

4、相似度查询本地化处理

我们在web端测试能拿到对应的结果,接下来我们用python进行本地处理,处理完毕后直接开接口,测试一下。

代码语言:javascript复制
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

# create a database client object

client = tcvectordb.VectorDBClient(url='换成自己的公网地址:40000',
                                   username='root',
                                   key='EgERjI66Plcj80J**************',
                                   read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)

db = client.database('mygame_db')
coll = db.collection('skill_info')

doc_lists = coll.searchByText(
    embeddingItems=['请问有类似【横扫千军】的招数吗?'],
    params=SearchParams(ef=200),
    limit=3
)
# printf
for i, docs in enumerate(doc_lists.get("documents")):
    print(i)
    for doc in docs:
        print(doc)

查看效果:

本地这里我返回了3条,其中分数最高的是大唐官府的横扫千军技能,还是匹配上了呢,分数是0.779,匹配度还OK,算是通过心理预期。

5、相似度查询接口化处理

毕竟真的想要做具体的应用,肯定需要本地化处理一下,别忘记开跨域,不然访问不到。

代码语言:javascript复制
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
import uvicorn
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

# create a database client object

client = tcvectordb.VectorDBClient(url='换成自己的公网地址:40000',
                                   username='root',
                                   key='EgERjI66Pl**************',
                                   read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)

db = client.database('mygame_db')
coll = db.collection('skill_info')


def getinfo(msg):
    doc_lists = coll.searchByText(
        embeddingItems=[msg],
        params=SearchParams(ef=200),
        limit=1
    )
    result = "您所提问的问题是:{}n与您所询问的问题最贴近的内容为:n".format(msg)
    for i, docs in enumerate(doc_lists.get("documents")):
        for doc in docs:
            result  = "【{}】门派的【{}】技能。n其功能是:【{}】。n您还可以通过其它方法提问来获取更准确的回复。".format(
                doc["title"], doc["skill_name"], doc["skill_info"])
    return result


app = FastAPI()

origins = [
    "http://localhost",
    "http://127.0.0.1",
    "http://localhost:8000",
    "http://127.0.0.1:8000"
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)


@app.get("/")
async def root(msg):
    return getinfo(msg)


if __name__ == '__main__':
    uvicorn.run(app="main:app", host="0.0.0.0", port=8000, reload=True)

搞定后运行起来就好。

浏览器访问效果:

6、应用化处理

为了手机访问方便,我们就写一个H5的小应用,用着也方便,说上线就直接架个服务也就能上了。

代码集合:

代码语言:javascript复制
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>游戏技能问题解答中心</title>
    <link
      rel="stylesheet"
      href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css"
    />
    <link rel="stylesheet" href="css/index.css" />
  </head>
  <body>
    <div id="page1">
      <div id="top"><p>游戏技能问题解答中心</p></div>
      <div id="content">
        <div id="plain">
          <input type="text" placeholder="请输入您询问的内容" class="form-control" id="msg"/>
          <hr style="width: 80%;"/>
          <button style="font-size: 2rem;width: 80%;" class="btn btn-btn btn-primary btn-lg btn-block"  onclick="req()">点击查询结果</button>
          <hr style="width: 80%;"/>
          <div id="msgs"></div>
        </div>
      </div>
      <div id="foot"></div>
    </div>
    <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
    <script src="js/index.js"></script>
    <script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
  </body>
</html>

JS代码:

代码语言:javascript复制
$(document).ready(function () {});
function req() {
  var msg = $("#msg").val();
  if (msg == "" || msg.length < 2) {
    $("#msgs").text("不能进行空查询,字符串长度必须大于2.");
    return;
  }
  $.ajax({
    url: "http://127.0.0.1:8000?msg="   msg,
    type: "get",
    dataType: "json",
    success: function (data) {
      $("#msgs").text(data);
    },
  });
}

SS样式:

代码语言:javascript复制
* {
  padding: 0px;
  margin: 0px;
}
#msgs{
  width: 80%;
  font-size: 2rem;
  text-align: center;
  border: 1px solid black;
}
body{
  width: 100%;
  height: 100vh;
}
#top{
  width: 100%;
  height: 5vh;
}
#top p{
  text-align: center;
  font-size: 2rem;
  line-height: 5vh;
  font-weight: bolder;
}
#content{
  width: 100%;
  height: 90vh;
  background: radial-gradient(222px at -2.9% 12.9%, rgb(241, 80, 6) 0%, rgba(236, 180, 238, 0.56) 46.4%, rgb(163, 203, 247) 100.7%);
}
#plain{
  width: 80%;
  height: 70vh;
  position: relative;
  top: 20vh;
  left: 20%;
}
#plain input{
  width: 80%;
  height: 10vh;
  font-size: 2rem;
}

#foot{
  width: 100%;
  height: 5vh;
}

结构:

自己用足够了,如果后面需要上线操作就再说了。至此简单应用制作完毕,效果我测试了,反应超级快。

总结

向量数据库相比于传统数据库的优点还是非常的多的,类似的模糊查询如果使用其它数据库根本无法做到如此完美的模糊匹配,并且根据分数类判断哪个最为贴近,非常推荐大家学会使用,配置便捷,操作简单,上手容易,争取在最短时间内学会,在公司的下个应用上提出你的建议,让领导可以刮目相看。

0 人点赞