【黄啊码】如何用GPT和向量数据库做问答型AI

知识库服务依赖该数据库,Embedding 形式个性化训练 ChatGPT,必不可少的就是向量数据库
因为 qdrant 向量数据库只支持 Docker 部署,所以需要先安装好 Docker 服务。

命令行安装
拉取镜像

docker pull qdrant/qdrant
运行服务

docker run -d -p 6333:6333 qdrant/qdrant
宝塔面板下安装

docker 管理器的镜像管理里,拉取 qdrant/qdrant

根据镜像创建容器,注意端口映射那里,填完以后一定要点那个 + 号,其他的是默认的

这样就能安装成功了。

向量数据库

但向量化数据存储到哪里呢?存到MySQL吗?答案显然是不现实的,存到MySQL你怎么做相似性查询,MySQL显然不太擅长做这件事情,想想都难。这时候就该向量数据库登场了

1、先建个collection

curl --location --request PUT 'http://your.domain.name/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、文档片段向量化‍

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": "文档片段内容"
}'

返回值:‍‍‍‍

{"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。‍‍

curl --location --request PUT 'https://your.domain.name/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做相似性检索。

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,表示我们只要一个最相似的结果。

返回值:

{"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的样子:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/562749.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式组件 Nacos

1.在之前的文章写过的就不用重复写。 写一些没有写过的新东西 2.细节 2.1命名空间 : 配置隔离 默认: public (默认命名空间):默认新增所有的配置都在public空间下 2.1.1 开发 、测试 、生产:有不同的配置文件 比如…

使用Intellij idea编写Spark应用程序(Scala+Maven)

使用Intellij idea编写Spark应用程序(ScalaMaven) 对Scala代码进行打包编译时,可以采用Maven,也可以采用sbt,相对而言,业界更多使用sbt。这里介绍IntelliJ IDEA和Maven的组合使用方法。IntelliJ IDEA和SBT的组合使用方法&#xf…

Day 14 JDBC

JDBC 1、简单入门 Statement2、preparedStatement3、主键回显4、批量操作5、事务6、Druid6.1 工具类V16.2 工具类V26.3 1、简单入门 Statement 步骤: 1、注册驱动 2、创建连接 3、创建 Statement对象 4、编写sql语句 并且发送sql语句获得结果集 5、解析结果集 6、释放资源 注意…

jmeter使用方法---自动化测试

HTTP信息头管理器 一个http请求会发送请求到服务器,请求里面包含:请求头、请求正文、请求体,请求头就是信息头Authorization头的主要用作http协议的认证。 Authorization的作用是当客户端访问受口令保护时,服务器端会发送401状态…

微光图像增强算法学习记录(一)

微光图像增强(LLIE)旨在恢复照明并提高微光图像的可见性,本文对阅读的文献进行记录和分享,帮助回顾和大家建立学习资料。 文献一摘要及前沿摘选主要贡献网络结构实验结论 文献二摘要 文献三摘要主要贡献网络架构实验 文献四摘要实…

C++一维数组练习oj(2)

这时上次的C一维数组练习:C一维数组练习oj-CSDN博客 这到题目我承认非常难!当然这只是我认为,因为我只学到了一维数组! 对于你们来说可能不难。 好了我不客套了。 这题我们可以将他理解为一条时间轴: 时间轴上小李每1…

分布式搜索引擎ES-RestClient查询文档快速入门

RestClient查询文档快速入门 文章目录 RestClient查询文档快速入门1.1、match_all1.2、全文检索查询1.3、精确查询1.4、复合查询-boolean query1.5、排序和分页1.6、高亮(解析查询高亮结果) 1.1、match_all package cn.mannor.hotel;import org.apache.…

深度学习pytorch——多层感知机反向传播(持续更新)

在讲解多层感知机反向传播之前,先来回顾一下多输出感知机的问题,下图是一个多输出感知机模型: 课时44 反向传播算法-1_哔哩哔哩_bilibili 根据上一次的分析深度学习pytorch——感知机(Perceptron)(持续更新…

基于python+vue的街道办管理系统flask-django-php-nodejs

在此基础上,结合现有街道办管理体系的特点,运用新技术,构建了以 python为基础的街道办管理信息化管理体系。首先,以需求为依据,根据需求分析结果进行了系统的设计,并将其划分为管理员和用户二种角色和多个主…

分布式搜索引擎-DSL查询文档

分布式搜索引擎-DSL查询文档 文章目录 分布式搜索引擎-DSL查询文档1、DSL Query的分类1.1、全文检索查询1.2、精确查询1.3、地理查询1.4、复合查询1.5、Function Score Query1.6、复合查询Boolean Query 2、搜索结果处理2.1、排序2.2、分页2.3、深度分页2.4、高亮 1、DSL Query…

Fabric Measurement

Fabric Measurement 布料测量

SpringBoot 文件上传(二)

上一节讲解了如何利用MultipartFile接收浏览器端上传的文件,这节讲解服务器端如何将文件保存到本地目录下,下节讲解服务端如何将文件保存在阿里云上。 本节需要解决两个难点: 文件重名问题文件大小限制问题 存储文件 首先解决如何存储文件…