【黄啊码】如何用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.mzph.cn/news/765084.shtml

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

相关文章

飞桨AI应用@riscv OpenKylin

在riscv编译安装飞桨PaddlePaddle参见: 算能RISC-V通用云编译飞桨paddlepaddleopenKylin留档_在riscv下进行paddlelite源码编译-CSDN博客 安装好飞桨,就可以用飞桨进行推理了。刚开始计划用ONNX推理,但是在算能云没有装上,所以最…

【正点原子Linux连载】第十七章 异步通知实验 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南

1)实验平台:正点原子ATK-DLRK3568开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id731866264428 3)全套实验源码手册视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban 第十七…

C 经典面试题15例

1.引用与指针有什么区别? 答 、1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 3) 不存在指向空值的引用,但是存在指向空值的指针。 2. 描述实时系统的基本特性 答 、在特定时间内完成特定的任…

2024年华为OD机试真题-石头剪刀布游戏-Python-OD统一考试(C卷)

题目描述: 石头剪刀布游戏有3种出拳形状:石头、剪刀、布。 分别用字母 A,B,C表示。 游戏规则: 1)出拳形状之间的胜负规则如下:A> B;B> C;C> A “>” 左边一个字母,表示相对优势形状。 右边一个字母,表示相对劣势形状。 2) 当本场次中有且仅有一种出拳形状…

Java发送请求-get源码

发送请求 配置依赖-pom.xml Welcome! - The Apache HTTP Server Project 官网解释这个源码httpClient是执行httpget和httppost 步骤: 查看httpClient源码,源码和方法都没有有用的解释 查看CloseableHttpClient源码类 这个抽象类实现2个接口&#xf…

使用conda创建python 虚拟环境

在cmd命令窗口,输入conda activate激活虚拟环境,可以看到默认为base,下面来介绍如何使用conda来创建python虚拟环境,因为在不同的工程中,对python等有不同版本需求,容易出现冲突。 1. 安装conda &#xff…

TCP与UDP:网络协议的技术原理与要点

文章目录 1. TCP(传输控制协议)1.1 面向连接1.1.1 三次握手1.1.2 四次挥手 1.2 可靠性1.3 有序传输1.4 流量控制1.5 拥塞控制 2. UDP(用户数据报协议)2.1 无连接2.2 不可靠性2.3 无序传输2.4 简单 3. TCP和UDP的头部结构4. TCP和U…

LeetCode232:用栈实现队列

题目描述 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回元素 int peek() 返…

docker 哲学 - 网络桥接器、容器网络接口 、容器间的通信方式

1、解释 docker0 veth eth 2、vethXX 和 ethXX 是肯定一一对应吗 比如 eth1 对应 veth1 3、如果 A容器使用 默认创建方式 。定义他内部网络为 eth0,容器B使用 --network 连上 已创建的网络 172.89.2.1 。此时假设 B的 ip是 172.89.2.2 ,容器网络接口是 e…

2024年企业级通用人工智能的关键技术趋势

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

腾讯三面被问到有没有参加过CTF_我反手就是一套军体拳打得面试官哑口无言!

目录 ​ 前言: 正文: 什么是CTF? 什么是PWN? 为什么要学CTF? CTF竞赛模式: CTF各大题型简介: 学之前的思考:分析赛题情况 常规做法 CTF比赛需要的知识储备 CTF比赛的神器&#xff…

51单片机中断信号的种类及应用场景

在嵌入式系统中,中断是一种重要的事件处理机制,它可以在程序执行的任何时候暂停当前任务,转而执行与之相关的特殊任务或事件。51单片机作为一种常见的微控制器,其中断功能在各种应用中起着关键作用。然而,对于初学者和…

Jmeter-基础元件使用(二)-属性及对数据库简单操作

一、Jmeter属性 当我们想要在不同线程组中使用某变量,就需要使用属,此时Jmeter属性的设置需要函数来进行set和get操作 1.创建set函数 2.然后采用Beanshell取样器进行函数执行 3.调用全局变量pro_id 4.将上面生成的函数字符串粘贴到另一个线程组即可…

二、阅读器的开发(初始)-- 2、阅读器开发

1、epubjs核心工作原理 1.1 epubjs的核心工作原理解析 epub电子书,会通过epubjs去实例化一个Book对象,Book对象会对电子书进行解析。Book对象可以通过renderTo方法去生成一个Rendition对象,Rendition主要负责电子书的渲染,通过R…

PointNet++论文复现(一)【PontNet网络模型代码详解 - 分类部分】

PontNet网络模型代码详解 - 分类部分 专栏持续更新中!关注博主查看后续部分! 分类模型的训练: ## e.g., pointnet2_ssg without normal features python train_classification.py --model pointnet2_cls_ssg --log_dir pointnet2_cls_ssg python test_classification.py…

景区污水处理设备亮点及价格分析

诸城市鑫淼环保小编带大家了解一下景区污水处理设备亮点及价格分析 美丽景区的治理过程中,废水处理至关重要,为您提供一体化污水处理设备和溶气气浮机,致力于解决污水排放问题。我们的设备节能高效、占地小、运行稳定,助您轻松达标…

Ethereum 和 Layer2的关系

文章目录 一、Ethereum 和 Layer21.1 以太坊(Ethereum)1.2 Layer 2(第二层解决方案) 二、目前的 Layer2 不同的解决方案有什么优缺点?2.1 状态通道(State Channels)2.2 侧链(Sidecha…

【C#】C#窗体应用修改窗体的标题和图标

修改窗体顶部的标题和图表,如果不修改则会使用默认的图标,标题默认为Form1,如第一张图,这时候如果想换成和系统有关的内容,如第二张图,可以使用下面的方法进行修改,修改后打开该软件任务栏显示的…

linux系统kubernetes的ServiceAccount和RBAC角色访问控制

ServiceAccount和RBAC ServiceAccount使用场景:Service account与User account区别:Service Account应用示例创建角色 RBACRBAC简述创建k8s账号与RBAC授权使用设置上下文和账户切换设置工作上下文(前提得有用户)查看当前的工作上下文切换上下…

学习笔记Day14:Linux下软件安装

软件安装 Anaconda 所有语言的包(package)、依赖(dependency)和环境(environment)管理器&#xff0c;类似应用商店 Conda < Miniconda < Anaconda&#xff08;有交互界面&#xff09; Linux下Miniconda即可 安装Miniconda 搜索北外/清华miniconda镜像网站&#xff…