前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何用GPT和向量数据库做出一款定制化机器人

如何用GPT和向量数据库做出一款定制化机器人

作者头像
ImportSource
发布2023-08-28 17:47:02
6670
发布2023-08-28 17:47:02
举报
文章被收录于专栏:ImportSourceImportSource

LLM大语言模型火的一塌糊涂,很多人已经开始频繁的使用GPT等产品来为自己的工作和生活提效。但这一切还都是通用场景,你如何让LLM去服务你自己所在公司的业务领域呢?比如可不可以借助GPT来提高自己公司产品的推荐效率呢?可不可以借助GPT来更好地服务员工日常的问题咨询呢?可不可以借助GPT来搭建公司自己的知识库呢?可不可以借助GPT来改善公司的客户服务体验呢?答案是一切兼有可能。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

你也许会想你这个GPT等这些大语言模型都是回答一些通用的问题,像我们公司的考勤制度你GPT根本就无法回答,像我们的商品推荐你GPT根本无法推荐,你GPT又没有我们的数据,你怎么做到呢?‍‍

GPT虽然不能直接回答,但GPT为你开放了API,让你做这些事情成为可能。‍‍‍‍‍‍‍‍‍‍‍‍

openai embedding(向量化API)‍‍‍‍

openai为公众用户开放了向量化API。这就为我们做到上面的事情提供了可能。我们可以借助embedding API获取到任意文档的向量数据。拿到向量数据我们就可以做比对,做相似性的比较,相近的就是可能的答案。

向量数据库

但向量化数据存储到哪里呢?存到MySQL吗?答案显然是不现实的,存到MySQL你怎么做相似性查询,MySQL显然不太擅长做这件事情,想想都难。这时候就该向量数据库登场了。先上一张图,这张图请你永远铭记在心,这个时代已经来了。

前面说MySQL不擅长处理向量数据,有人就开始琢磨开放向量数据库了,Qdrant就是其中一款,向量数据库就是专门用来做向量检索的。至于什么是向量?我相信你是知道的,总之万物兼可向量化。

既然获取向量的API有了,存向量的数据库也有了,接下来的事情就是具体的实际操作了。我们这里以构建一个企业定制化的AI机器人为例来讲讲具体怎么快速整出一个专属于企业自己的AI机器人。‍‍‍‍‍‍‍‍‍‍‍

拆分文档‍

我们现在假定你有3万个文档,这些文档要被向量化后做相似性检索。那么你需要把这3万个文档向量化后存入向量数据库Qdrant。有一种方案是一个文档就是一个向量化单位(数据),但由于文档大小不一,GPT 速度和token限制,这显然是不行的。还有一种方案就是我们把每个文档都按照固定的size去拆分,把一个文档拆分成多个片段(这里我们叫document segment),然后每个片段就是一个向量单位。像下面这样:

如图我们可以把文档A拆分成四个文档片段,他们的id分别为1,2,3,4。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

存入向量库‍‍‍‍‍‍‍‍‍

现在我们知道向量的基本单位就是一个文档片段,那么我们现在就想办法把一个个片段存入向量库。先简单介绍几个本文要用到的Qdrant概念。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

  • collection。你可以认为就是MySQL的数据库,在Qdrant里叫collection。
  • points。在collection里有一行行向量数据,points就是向量数据。 ‍

好,现在开始实操。‍‍

1、先建个collection

代码语言:javascript
复制
curl --location --request PUT 'http://your.domain.name/qdrant/collections/[your collection name]' \
--header 'Content-Type: application/json' \
--data-raw '{
    "vectors": {
      "size": 1536,
      "distance": "Dot"
    }
  }'

注意:由于GPT的向量维度是惊人的1536个维度,所以在这里建collection的时候请填写size为1536,distance默认就是Dot。具体的collection名称在path上传就可以了。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

数据库建好后,我们就可以在这个库里添加向量数据了,但向量数据从哪里来呢?前面说了,我们可以通过openai的API来拿到文档片段的向量数据。

2、文档片段向量化‍

代码语言:javascript
复制
curl --location --request POST 'https://your.domain.name/api/xxxx/embeddings?accessToken=xxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
  "model": "text-embedding-ada-002",
  "input": "文档片段内容"
}'

返回值:‍‍‍‍

代码语言:javascript
复制
{
    "model": "text-embedding-ada-002-v2",
    "object": "list",
    "data": [
        {
            "object": "embedding",
            "embedding": [
                -0.011098763,
                0.0022886666,
                0.0019187077,
                -0.02824744,
                -6.070769E-4,
                0.019469986,
                -0.014631506,
                0.0020021298,
                -0.015770398,
                -0.019745642,
                0.015494743,
                ...此处省略若干行(1536行实在太长)
                -0.0138480645,
                3.0421853E-4,
                -0.004363337,
                -0.0016793226,
                0.0029088915,
                -0.0062639094
            ],
            "index": 0
        }
    ],
    "usage": {
        "prompt_tokens": 6,
        "completion_tokens": 0,
        "total_tokens": 6
    }
}

这样我们就拿到了文档片段的向量化数据。‍‍‍‍‍‍‍‍‍‍‍‍

3、把向量数据存入向量库‍

继续回到Qdrant的API,下面这个API就负责添加数据,叫add points。‍‍

代码语言:javascript
复制
curl --location --request PUT 'https://your.domain.name/qdrant/collections/[your_collection_name]/points?wait=true' \
--header 'Content-Type: application/json' \
--data-raw '{
  "points": [
    {"id": 1, "vector": [
                -0.011098763,
                0.0022886666,
                0.0019187077,
                -0.02824744,
                -6.070769E-4,
                0.019469986,
                -0.014631506,
                0.0020021298,
                -0.015770398,
                -0.019745642,
                0.015494743,
                ...此处省略若干行(1536行实在太长)
                -0.0138480645,
                3.0421853E-4,
                -0.004363337,
                -0.0016793226,
                0.0029088915,
                -0.0062639094
    ], 
                "payload": {"doc_segment": "文档片段内容"}}
  ]
}'

注意:points里边有三个关键字段,id、vector、payload。‍‍‍‍‍

id:唯一编号。相当于mysql的自增id。这个id要和你mysql里的文档片段表的id保持一致,方便后面反查到文档片段。‍‍‍‍‍‍‍‍‍‍‍‍‍‍

vector:向量数据。这里就是上面你拿到的向量数组。‍‍‍‍‍‍‍‍‍‍‍‍

payload:存储一些附加信息。这里我存了文档片段。‍‍

相似性检索‍‍‍‍‍‍‍‍‍

上面已经把一个个文档片段存入到Qdrant。现在我们就可以试试效果了。

1、向量化问题

我们现在把用户的提问进行向量化。同样用的是openai 的embedding API获得向量数组。这里同上就不赘述。‍‍‍‍‍‍‍

2、搜索

这一步是最关键的一步,前面做了那么多,就为了最后这一下搜索。我们使用Qdrant的search points API做相似性检索。

代码语言:javascript
复制
curl --location --request POST 'https://your.domain.name/qdrant/collections/[your_collection_name]/points/search' \
--header 'Content-Type: application/json' \
--data-raw '{
    "vector": [
        -0.009807939,
        -0.036723405,
        -0.0041218707,
        -0.0159379,
        -0.042078312,
       ...此处省略若干行(1536行实在太长)
        -0.017488007,
        -0.022744272,
        0.0015791698,
        -0.008109869,
        0.002321635,
        -6.385377E-4,
        0.0057318667
    ],
    "top": 1
}'

注意:这里我们把上面拿到的问题的向量化数据传入到vector字段,top则传1,表示我们只要一个最相似的结果。

返回值:

代码语言:javascript
复制
{
    "result": [
        {
            "id": 1,
            "version": 0,
            "score": 0.77804655,
            "payload": null,
            "vector": null
        }
    ],
    "status": "ok",
    "time": 0.000159604
}

注意:可以看出已经返回了最可能的答案,就是id为1的那个文档片段,另外可以发现分数为0.77804655,这里你不要计较这个分数的高低,分数都是相对的,总之你现在已经拿到了最可能的答案。

我们现在知道了最可能的答案就在id为1的文档片段里。是时候把这个文档片段反查出来了。怎么反查呢?其实前面提到了一点。那就是我们采用的是MySQL和向量库双写。MySQL负责管理文档关系,这是MySQL擅长的,Qdrant负责处理向量检索,这也是Qdrant擅长的。嗯,我们拿着这个id去MySQL表里反查文档片段内容。‍‍‍‍‍‍‍‍‍‍‍‍‍‍

MySQL管理文档关系‍

为了管理文档和通过向量化搜索后能拿到文档片段,我们需要在MySQL建两张表。

一张文档表、一张文档片段表,两者是一对多的关系。上面我们从向量库拿到的id就是文档片段的id,这样我们就可以反查到文档片段。

你也许在想我把片段拿到了,但依然不知道具体的答案啊。这时候就需要gpt的prompt出场了。

GPT Prompt最终总结和润色

我们拿到文档片段后,就可以构建下面这样一个prompt。

大体prompt的样子:

代码语言:javascript
复制
“{doc_seg},
请从提供的内容中找到最接近的答案(不知道就不回答):
{question}”

注意:其中 doc_seg和question是文档片段和问题的变量。

然后把其喂给openai的API:/v1/chat/completions。具体这个API就不赘述,您可以自行去openai官网查阅。最终它会返回一个比较精准的回答。

总结

以上,就是我们构建一个企业定制化的机器人的全部逻辑。总结一下就是:文档拆分、向量化、gpt prompt总结润色,so easy。

记住,向量化数据库很重要,现在非常火,该了解了解了~‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

‍‍

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-07-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ImportSource 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
向量数据库
腾讯云向量数据库(Tencent Cloud VectorDB)是一款全托管的自研企业级分布式数据库服务,专用于存储、检索、分析多维向量数据。该数据库支持多种索引类型和相似度计算方法,单索引支持千亿级向量规模,可支持百万级 QPS 及毫秒级查询延迟。腾讯云向量数据库不仅能为大模型提供外部知识库,提高大模型回答的准确性,还可广泛应用于推荐系统、自然语言处理等 AI 领域。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档