当前位置: 首页 > news >正文

GPT知识库浅析

一、引言

上篇文章《GPT简介及应用》介绍了GPT的应用场景,里面提到GPT bot的基本使用:基于GPT训练好的数据,回答用户的问题。

但在使用过程中,如果用户的问题里面出现最新的术语,就会出现这种提示:

截至我最后更新的时间(2023年4月),"llama_index"这个术语并不是广泛认知或者在特定领域内公认的一个概念,因此我无法直接提供关于"llama_index"的具体信息。这个术语可能是指某个特定项目、工具、指标或者是某个领域内的专有名词。

这时候我们自然会想到,有没有办法将最新的/私有的数据提供给GPT,让GPT基于这些数据来回答问题呢?答案当然是有的,那就是:GPT知识库。

二、简介

GPT 知识库,就像是一个包含了各种武功秘籍的宝库。GPT Bot 像是一位可以通过阅读和理解这些秘籍,来不断提高自己的武功水平的修炼者。

武功大师会将自身的武术经验沉淀升华,编撰成绝世的武功秘籍。

以往武功大师想要把这些武功秘籍传承下去,需要经过层层选拔,挑选出最合适的徒弟,辅以精心指导,日夜打磨,才可能培养出下一代的武功大师。

但现在只需要将武功秘籍给GPT Bot,它就可以快速理解,并且吸收为自身内力,为不同级别的人员提供指导。

这就是GPT知识库+GPT Bot的威力:

GPT Bot 利用 GPT 知识库中的信息,来回答用户的问题,提供帮助和建议,从而更好地满足用户的需求。

三、知识库构建

GPT的核心原理,就是基于大量的数据进行学习,然后根据用户提出的问题,将关联性最高的内容,组装成自然语言作为答案(当然实际的实现要复杂得多)。

GPT知识库的核心逻辑也是差不多:学习用户提供的文档,然后经过算法识别,得到文档内容的关联性。

当用户提供问题时,就可以根据关联性,获取对应的文档内容。然后组装成自然语言,返回给用户。

市面上比较出名的工具有 LangChainLlamaIndex 等,工具间各有优点,它们的核心功能都是:对大量语言相关的数据进行分析和处理,以提供最佳的搜索结果和答案。

下文均以LlamaIndex为例。

3.1 demo

使用这些工具来构建知识库也相对简单,只需几行代码即可构建成功(前提是有OpenAI的账号)。

from llama_index import VectorStoreIndexindex = VectorStoreIndex.from_documents(documents=documents
)

VectorStoreIndexLlamaIndex提供的API,只需要将文档documents(如何生成documents在下文中介绍)传入,即可自动解析,根据默认的embedding算法,构建成一个有关联性的索引数据。

然后,将这些索引数据,转换为内置的搜索引擎,即可用自然语言进行问答。

query_engine = index.as_query_engine()
response = query_engine.query("武林第一是谁?")
print(response)

四、文档读取

在构建知识库时,需要将用户文档,转换为LlamaIndex的参数documentsLlamaIndex提供了各式各样的文档读取器 Reader:Llama Hub

4.1 内置文档读取器

LlamaIndex内置了许多文档读取器,可以读取不同格式的文件,如Markdown、PDF、Word、PPT、图片视频等。

from llama_index.core import SimpleDirectoryReaderdocuments = SimpleDirectoryReader("./data").load_data()

4.2 Hive读取器

很多业务数据都存放在大数据仓库Hive中,LlamaIndex也提供了HiveReader快速读取数据:Hive Loader (llamahub.ai)。

但这个读取器,只能读取非安全的Hive,若Hive启用了Kerberos认证则会连接失败。

查看源码,很容易发现这个Reader只是对pyhive的简单封装,没有适配Kerberos认证:

        """Initialize with parameters."""try:from pyhive import hiveexcept ImportError:raise ImportError("`hive` package not found, please run `pip install pyhive`")self.con = hive.Connection(host=host,port=port,username=username,database=database,auth=auth,password=password,)

因此若Hive启用了Kerberos,则需要自定义实现:

from TCLIService.ttypes import TOperationState
from llama_index import (Document,
)from pyhive import hive# 注意此处的配置可能根据你的 Hive 配置或集群细节而有所不同
conn = hive.Connection(host=hive_server2_host,port=10000,auth='KERBEROS',kerberos_service_name='hive',database=hive_database
)
cursor = None
try:# 创建游标cursor = conn.cursor()# 执行查询cursor.execute(hive_query_sql)# 以防查询是异步的,等待它完成status = cursor.poll().operationStatewhile status in (TOperationState.INITIALIZED_STATE,TOperationState.RUNNING_STATE):status = cursor.poll().operationState# 获取结果rows = cursor.fetchall()# 处理结果documents = []for row in rows:document = Document(text=row.__str__())documents.append(document)logger.info(document)
finally:# 无论是否遇到异常,始终关闭游标和连接if cursor:cursor.close()conn.close()

这样将用户文档转换为LlamaIndex的文档格式document,即可快速构建成GPT知识库。

五、文档存储

通过以上示例可以看到,GPT知识库只保存在程序的内存中,退出程序就会被丢弃掉,下次再使用就需要重新构建。为了避免重复构建,需要将构建好的索引数据保存下来。

为了存储这些索引数据,业界一般会使用向量数据库

5.1 向量数据库

向量数据库与常规数据库的不同点,主要在于向量数据库是一种基于向量空间模型的数据库系统,它将数据存储为向量,并利用向量之间的相似度来进行查询和分类。在大模型模型训练中,可以提供更高效的数据存储及查询能力。

各大厂商都提供了自身的向量数据库,如阿里、腾讯、华为等。

以下以腾讯云VectorDB为例。

5.2 上传数据

LlamaIndex集成了腾讯云VectorDB的SDK,二次封装功能接口,简化使用。

Tencent Cloud VectorDB - LlamaIndex

初始化连接:

import tcvectordbvector_store = TencentVectorDB(url="http://10.0.X.X",key="eC4bLRy2va******************************",collection_params=CollectionParams(dimension=1536, drop_exists=True),
)

注意:

  • drop_exists默认为True,即如果向量集合已存在,会先删除再重建。
  • dimension固定为1536,因为LlamaIndex构建索引数据时,固定维度为1536。若不相同,在上传数据时会出现数据不兼容报错。

上传数据:

storage_context = StorageContext.from_defaults(vector_store=vector_store)index = VectorStoreIndex.from_documents(documents,storage_context=storage_context
)

这样,即可将构建好的索引数据,同步保存到腾讯云VectorDB。

5.3 复用数据

GPT查询腾讯云VectorDB,初始化连接时需要将drop_exists参数设置为False,并且去掉documents即可。

import tcvectordbvector_store = TencentVectorDB(url="http://10.0.X.X",key="eC4bLRy2va******************************",collection_params=CollectionParams(dimension=1536, drop_exists=False),
)storage_context = StorageContext.from_defaults(vector_store=vector_store)index = VectorStoreIndex.from_documents(storage_context=storage_context
)

到这里,GPT知识库基本构建成功。

接下来就是让GPT去查询索引数据,组装成自然语言,返回给用户。

待续。

相关文章:

GPT知识库浅析

一、引言 上篇文章《GPT简介及应用》介绍了GPT的应用场景,里面提到GPT bot的基本使用:基于GPT训练好的数据,回答用户的问题。 但在使用过程中,如果用户的问题里面出现最新的术语,就会出现这种提示: 截至我…...

SpringMVC--SpringMVC的视图

目录 1. 总述 2. ThymeleafView视图 3. 转发视图 4. 重定向视图 5. 视图控制器view-controller 1. 总述 在SpringMVC框架中,视图(View)是一个非常重要的概念,它负责将模型数据(Model)展示给用户。简单…...

Datax,hbase与mysql数据相互同步

参考文章:datax mysql 和hbase的 相互导入 目录 0、软件版本说明 1、hbase数据同步至mysql 1.1、hbase数据 1.2、mysql数据 1.3、json脚本(hbase2mysql.json) 1.4、同步成功日志 2、mysql数据同步至hbase 1.1、hbase数据 1.2、mysql…...

ubuntu spdlog 封装成c++类使用

安装及编译方法&#xff1a;ubuntu spdlog 日志安装及使用_spdlog_logger_info-CSDN博客 h文件&#xff1a; #ifndef LOGGING_H #define LOGGING_H#include <iostream> #include <cstring> #include <sstream> #include <string> #include <memor…...

【C语言】——字符串函数的使用与模拟实现(上)

【C语言】——字符串函数 前言一、 s t r l e n strlen strlen 函数1.1、函数功能1.2、函数的使用1.3、函数的模拟实现&#xff08;1&#xff09;计数法&#xff08;2&#xff09;递归法&#xff08;3&#xff09;指针 - 指针 二、 s t r c p y strcpy strcpy 函数2.1、函数功能…...

数据库(1)

目录 1.什么是事务&#xff1f;事务的基本特性ACID&#xff1f; 2.数据库中并发一致性问题&#xff1f; 3.数据的隔离等级&#xff1f; 4.ACID靠什么保证的呢&#xff1f; 5.SQL优化的实践经验&#xff1f; 1.什么是事务&#xff1f;事务的基本特性ACID&#xff1f; 事务指…...

VirtualBox - 与 Win10 虚拟机 与 宿主机 共享文件

原文链接 https://www.cnblogs.com/xy14/p/10427353.html 1. 概述 需要在 宿主机 和 虚拟机 之间交换文件复制粘贴 貌似不太好使 2. 问题 设置了共享文件夹之后, 找不到目录 3. 环境 宿主机 OS Win10开启了 网络发现 略虚拟机 OS Win10开启了 网络发现 略Virtualbox 6 4…...

深入浅出 useEffect:React 函数组件中的副作用处理详解

useEffect 是 React 中的一个钩子函数&#xff0c;用于处理函数组件中的副作用操作&#xff0c;如发送网络请求、订阅消息、手动修改 DOM 等。下面是 useEffect 的用法总结&#xff1a; 基本用法 import React, { useState, useEffect } from react;function Example() {cons…...

《QT实用小工具·十九》回车跳转到不同的编辑框

1、概述 源码放在文章末尾 该项目实现通过回车键让光标从一个编辑框跳转到另一个编辑框&#xff0c;下面是demo演示&#xff1a; 项目部分代码如下&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget>namespace Ui { class Widget; }class Widget : p…...

基本的数据类型在16位、32位和64位机上所占的字节大小

1、目前常用的机器都是32位和64位的&#xff0c;但是有时候会考虑16位机。总结一下在三种位数下常用的数据类型所占的字节大小。 数据类型16位(byte)32位(byte)64位(byte)取值范围char111-128 ~ 127unsigned char1110 ~ 255short int / short222-32768~32767unsigned short222…...

关注招聘 关注招聘 关注招聘

&#x1f525;关注招聘 &#x1f525;关注招聘 &#x1f525;关注招聘 &#x1f525;开源产品&#xff1a; 1.农业物联网平台开源版 2.充电桩系统开源版 3.GPU池化软件(AI人工智能训练平台/推理平台) 开源版 产品销售&#xff1a; 1.农业物联网平台企业版 2.充电桩系统企业…...

Django框架设计原理

相信大多数的Web开发者对于MVC&#xff08;Model、View、Controller&#xff09;设计模式都不陌生&#xff0c;该设计模式已经成为Web框架中一种事实上的标准了&#xff0c;Django框架自然也是一个遵循MVC设计模式的框架。不过从严格意义上讲&#xff0c;Django框架采用了一种更…...

Linux ARM平台开发系列讲解(QEMU篇) 1.2 新添加一个Linux kernel设备树

1. 概述 上一章节我们利用QEMU成功启动了Linux kernel,但是细心的小伙伴就会发现,我们用默认的defconfig是没有找到设备树源文件的,但是又发现kernel启动时候它使用了设备树riscv-virtio,qemu,这是因为qemu用了一个默认的设备树文件,该章节呢我们就把这个默认的设备树文件…...

OSPF动态路由实验(思科)

华为设备参考&#xff1a; 一&#xff0c;技术简介 OSPF&#xff08;Open Shortest Path First&#xff09;是一种内部网关协议&#xff0c;主要用于在单一自治系统内决策路由。它是一种基于链路状态的路由协议&#xff0c;通过链路状态路由算法来实现动态路由选择。 OSPF的…...

MyBatis 等类似的 XML 映射文件中,当传入的参数为空字符串时,<if> 标签可能会导致 SQL 语句中的条件判断出现意外结果。

问题 传入的参数为空字符串&#xff0c;但还是根据参数查询了。 原因 在 XML 中使用 标签进行条件判断时&#xff0c;需要明确理解其行为。在 MyBatis 等类似的 XML 映射文件中&#xff0c; 标签通常用于动态拼接 SQL 语句的条件部分。当传入的参数 riskLevel 为空字符串时…...

git的安装

git的安装 在CentOS系统上安装git时&#xff0c;我们可以选择yum安装或者源码编译安装两种方式。Yum的安装方式的好处是比较简单&#xff0c;直接输入”yum install git”命令即可。但是Yum的安装的话&#xff0c;不好控制安装git的版本。如果我们想选择安装git的版本&#xf…...

蓝桥杯嵌入式模板(cubemxkeil5)

LED 引脚PC8~PC15&#xff0c;默认高电平&#xff08;灭&#xff09;。 此外还要配置PD2为输出引脚&#xff08;控制LED锁存&#xff09; &#xff0c;默认低电平&#xff08;锁住&#xff09;&#xff01;&#xff01;&#xff01; #include "led.h"void led_disp…...

ELFK (Filebeat+ELK)日志分析系统

一. 相关介绍 Filebeat&#xff1a;轻量级的开源日志文件数据搜集器。通常在需要采集数据的客户端安装 Filebeat&#xff0c;并指定目录与日志格式&#xff0c;Filebeat 就能快速收集数据&#xff0c;并发送给 logstash 进或是直接发给 Elasticsearch 存储&#xff0c;性能上相…...

HttpClient、OKhttp、RestTemplate接口调用对比( Java HTTP 客户端)

文章目录 HttpClient、OKhttp、RestTemplate接口调用对比HttpClientOkHttprestTemplate HttpClient、OKhttp、RestTemplate接口调用对比 HttpClient、OkHttp 和 RestTemplate 是三种常用的 Java HTTP 客户端库&#xff0c;它们都可以用于发送 HTTP 请求和接收 HTTP 响应&#…...

[旅游] 景区排队上厕所

人有三急&#xff0c;急中最急是上个厕所要排队&#xff0c;而且人还不少&#xff01;这样就需要做一个提前量的预测&#xff0c;万一提前量的预测&#xff0c;搞得不当&#xff0c;非得憋出膀光炎&#xff0c;或者尿裤子。尤其是女厕所太少&#xff01;另外一点是儿童根本就没…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...