【黄啊码】如何用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}”

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java动态规划学习笔记

学习笔记目录,这里记录个大纲,详情点链接 背包问题 01背包问题综述 01背包问题(二维数组)https://blog.csdn.net/m0_73065928/article/details/136794406?spm1001.2014.3001.5501 01背包问题(滚动数组&#xff09…

牛客NC111 最大数【中等 贪心、排序 Java,Go,PHP】

题目 题目链接: https://www.nowcoder.com/practice/fc897457408f4bbe9d3f87588f497729 思路 贪心解法对于 numsnums 中的任意两个值 aa 和 bb,我们无法直接从常规角度上确定其大小/先后关系。但我们可以根据「结果」来决定 aa 和 bb 的排序关系&#…

视觉信息处理和FPGA实现第6次作业-Matlab实现灰度图像的亮度调节

一、代码 close all;clear all;clc; pic imread("cameraman.tif"); [M,N] size(pic); disp("Contrast Ajust Demo"); value input("Please input number of value, range: 0~2\n"); while value>2 || value<0disp("The number is in…

15:00面试,15:06就出来了,问的问题有点变态了

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到3月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降30%…

比赛记录:Codeforces Round 936 (Div. 2) A~E

传送门:CF [前题提要]:赛时一小时过了A~D,E感觉也不是很难(甚至感觉思维难度是小于D的),感觉这回是自己不够自信了,要是自信一点深入想一下应该也能做出来,咱就是说,如果E和D换一下,结果也是一样的,虽上大分,但是心里很不服,故记录一下 A - Median of an Array 当时网卡加载了…

Winform数据绑定

简介# 在C#中提起控件绑定数据&#xff0c;大部分人首先想到的是WPF&#xff0c;其实Winform也支持控件和数据的绑定。 Winform中的数据绑定按控件类型可以分为以下几种&#xff1a; 简单控件绑定列表控件绑定表格控件绑定 绑定基类# 绑定数据类必须实现INotifyPropertyChanged…

GPT4.0

GPT4.0 支持官网所有功能以及所有第三方GPTS&#xff0c;完全同步官网。无需魔法&#xff0c;填写授权码直达官网。全天超18小时维护&#xff0c;无需担心不稳定。没有永久卡&#xff0c;3.5免费提供&#xff0c;4.0可以按需下单即可&#xff0c;不存在跑路。 需要的联系

B站python爬虫课程笔记(Q16-19结束)

下面是学习的网址&#xff1a; ​​​​​​【Python爬虫】 目录 16、捕捉异常try&except语句的一些问题 1&#xff09;一些常见的异常类型 2&#xff09;try&except的使用 17、测试Bug的一些问题 1&#xff09;assert断定函数的使用 2&#xff09;unittest单元…

2024年阿里云优惠活动整理_云服务器活动大全

2024阿里云优惠活动大全包括云服务器优惠价格、优惠券免费领取入口、域名优惠口令、域名优惠、云数据库优惠活动、对象存储OSS优惠活动、企业邮箱优惠、阿里云建站优惠、无影云电脑优惠价格、CDN特惠等&#xff0c;阿里云服务器网aliyunfuwuqi.com长期更新阿里云优惠活动大全&a…

哈希表(c++)

1、介绍 哈希表&#xff0c;也称为散列表&#xff0c;是一种非常高效的数据结构。它通过将键&#xff08;Key&#xff09;映射到数组的特定位置来快速查找、插入和删除数据。这个映射过程由哈希函数&#xff08;Hash Function&#xff09;完成&#xff0c;该函数将键转化为一个…

【浅尝C++】C++基础第三弹=>内联函数/auto关键字/范围for/nullptr(含如何查看内联函数展开效果)

&#x1f3e0;专栏介绍&#xff1a;浅尝C专栏是用于记录C语法基础、STL及内存剖析等。 &#x1f6a9;一些备注&#xff1a;之前的文章有点杂乱&#xff0c;这里将前面的知识点重新组织了&#xff0c;避免了过多冗余的废话。 &#x1f3af;每日努力一点点&#xff0c;技术变化看…

【已解决】MySQL(Navicat)中如何一次性执行多个sql脚本文件

目录 问题现象&#xff1a; 问题分析&#xff1a; 思路&#xff1a; 解决方法&#xff1a; 1、运行cmd命令窗口 2、执行文本文件内容合并命令 总结&#xff1a; 1、使用文本文件内容合并命令&#xff0c;将多个sql脚本文件的内容合并到一个新的sql文件中去。 2、然后在Nav…

《由浅入深学习SAP财务》:第2章 总账模块 - 2.1 基础知识

2.1.1 总账模块的基本功能 总账模块&#xff08;General Ledger&#xff0c;GL&#xff09;是“总分类账会计模块”的中文简称&#xff0c;它是财务会计&#xff08;FI&#xff09;模块的一个子模块&#xff0c;它是一切会计事务处理的核心模块。 它的基本功能有会计科…

3、Jenkins持续集成-Jenkins安装和插件管理

文章目录 一、Jenkins安装1. 安装JDK2. 获取jenkins安装包3. 安装包上传到服务器&#xff0c;进行安装4. 修改Jenkins配置&#xff08;1&#xff09;低版本Jenkins的rpm包&#xff08;2&#xff09;高版本Jenkins的rpm包 5. 启动Jenkins6. 打开浏览器访问7. 获取并输入admin账户…

1240. 完全二叉树的权值

给定一棵包含 N 个节点的完全二叉树&#xff0c;树上每个节点都有一个权值&#xff0c;按从上到下、从左到右的顺序依次是 A1,A2,⋅⋅⋅AN&#xff0c;如下图所示&#xff1a; 现在小明要把相同深度的节点的权值加在一起&#xff0c;他想知道哪个深度的节点权值之和最大&#x…

在抖音上开店,运营什么产品好卖?市场才是关键点!

大家好&#xff0c;我是电商小布。 很多来加入抖音小店的新手朋友&#xff0c;都是看到了这个项目的发展情况&#xff0c;并认为未来的发展也是不错的。 但是很多朋友在入驻的时候&#xff0c;是并没有搞清楚自己要来玩什么&#xff0c;要卖什么的。 而这个是我们在开店之前…

c++的学习之路:3、入门(2)

一、引用 1、引用的概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空 间&#xff0c;它和它引用的变量共用同一块内存空间。 怎么说呢&#xff0c;简单点理解就是你的小名&#xff0c;家里人叫你小名&#…

EI级!高创新原创未发表!VMD-TCN-BiGRU-MATT变分模态分解卷积神经网络双向门控循环单元融合多头注意力机制多变量时间序列预测(Matlab)

EI级&#xff01;高创新原创未发表&#xff01;VMD-TCN-BiGRU-MATT变分模态分解卷积神经网络双向门控循环单元融合多头注意力机制多变量时间序列预测&#xff08;Matlab&#xff09; 目录 EI级&#xff01;高创新原创未发表&#xff01;VMD-TCN-BiGRU-MATT变分模态分解卷积神经…

最长公共子序列详解:状态表示的两种方法

本题链接&#xff1a;897. 最长公共子序列 - AcWing题库 给定两个长度分别为 N 和 M 的字符串 A 和 B&#xff0c;求既是 A 的子序列又是 B 的子序列的字符串长度最长是多少。 本题分析如下图&#xff0c;对于状态可以分两种情况讨论 #include<iostream> #include<cst…

递归和递推的区别

目录 1、递推 2、递归 3、结言 递归 递推 1、递推 递推就是说从初值出发后一直运算到所需的结果。 ——从已知到未知。&#xff08;从小到大&#xff09; 举一个简单的例子&#xff1a; 每天能学习一个小时的编程&#xff0c;那么一个月之后可以学到三十小时的编程知识。…