利用大语言模型,矢量数据库实现数据库的智能搜索

news2024/11/28 14:38:46

目的

        数据库使用SQL 语言查询数据,数据库的记录中要有一个关键字段(通常称为主键字段,它的值在数据库列表中是唯一的),数据记录是结构化的.

   如果你需要根据数据记录的内容来查询数据记录,就需要通过Select 语句在数据库中历遍所有的数据记录。对于非结构化的文档数据库而言,可能某些属性嵌入在记录值的文本中,就显得非常复杂了。

     例如 查询年龄在10岁到18岁的学生 的数据比较简单,但是如果查询查询读过《西游记》的学生,可能就比较难一点。除非你设置一个字段包含书籍的列表。

      同样的,对于商品数据库而言,商品的信息大量是非结构化的数据。例如产品信息中可能包含了用途的字段,内容是“该产品主要用于修补汽车轮胎” 。当需要查找 ”修补轮胎的胶水“,就需要查找产品分类名称为”胶水“,用途为”该产品主要用于修补汽车轮胎“ 。使用SQL 时要一字不差才行。        

        为了提高查询的效率,SQL 数据库只能采取添加关键字的方式来实现,比如添加 ”汽车“,”修补“,”轮胎“ 几个关键字,或者将产品的分类做的非常细。

          SQL 查询方法要求非常严苛,缺乏了灵活性。在一些分类系统中(Catalog System)。查询信息非常刻板,令人恼火。

解决方案

        为了解决这些问题,基于大预言模型的向量数据库应运而生。

        需要用于 AI 的非结构化数据集的数量只会继续增长,那么您如何处理数百万个向量呢?这就是向量嵌入和向量数据库发挥作用的地方。这些向量在称为嵌入的连续多维空间中表示,该空间由嵌入模型生成,专门用于将向量数据转换为嵌入。向量数据库用于存储嵌入模型的输出并对其进行索引。向量嵌入是数据的数值表示,根据语义含义或几乎任何数据类型的类似特征对数据集进行分组。

        例如,以“car”和“vehicle”这两个词为例。它们都具有相似的含义,即使它们的拼写不同。为了使 AI 应用程序能够实现有效的语义搜索,“car”和“vehicle”的向量表示必须捕获它们的语义相似性。在机器学习方面,嵌入表示编码此语义信息的高维向量。这些向量嵌入是推荐、聊天机器人和 ChatGPT 等生成式应用程序的支柱。

        向量数据库能够将向量存储为高维点并进行检索。这些数据库增加了额外的功能,可以高效、快速地查找 N 维空间中的最近邻。开发人员将文档生成的向量索引到向量数据库中。这样的话,他们便可通过查询相邻向量来找到相似的内容。

        在大模型应用Embedding 技术将许多文档切片,然后生成矢量数据库,将文档中的内容转换为矢量数据库的内容,当对话机器人提问时,通过查询矢量数据库获取最相近的知识,由大模型回答问题。流程如下图所示。

         针对数据库查询而言,我们如何生成矢量数据库的内容呢?我的解决思路是将数据库的所有记录读出来,作为文档喂给矢量数据库。 并且将数据库记录的ID 作为矢量数据库的ID。

实验方法

实验使用三个程序完成,原始数据存储在mongoDB 数据库中,矢量数据库使用开源的Chroma。

mongoDB  上添加产品信息

from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client['productDB']
collection = db['product']
"""
documents = []
documents.append({
    "name":"motor",
     "brand":"sanyo",
     "manufacture":"sanyo motor company",
     "feature":{
         "current":"10A",
          "voltage":"48V",
          "power":"120Kw",
          "speed":"1200"
         }
    })
documents.append({
    "name":"DCmotor",
     "brand":"maxon",
     "manufacture":"maxon",
     "feature":{
         "current":"5A",
          "voltage":"24V",
          "power":"10W",
          "speed":"2400"
         }
    })
documents.append({
    "name":"servo motor",
     "brand":"inovance",
     "manufacture":"inovance",
     "feature":{
         "current":"2A",
          "voltage":"24V",
          "power":"80W",
          "speed":"4800"
         }
    })
"""
#collection.insert_many(documents)
for data in collection.find():
    print ("Model"+str(data))
    print(data["_id"])

生成矢量数据库

from langchain.vectorstores import Chroma
from langchain.chat_models import ErnieBotChat
from langchain.embeddings import ErnieEmbeddings
from langchain.docstore.document import Document
import os
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client['productDB']
collection = db['product']
os.environ['ERNIE_CLIENT_ID'] ="xxxxx"
os.environ['ERNIE_CLIENT_SECRET'] ="xxxx"
db_path = "./product_vector" #索引库名称
embeddings = ErnieEmbeddings(
    ernie_client_id='FAiHIjSQqH5gAhET3sHNTkiH',
    ernie_client_secret='wlIBmWY4d2Zvrs0GyQbT3JeTXV6kdub4',
)
#loader = PyPDFLoader("example_data/text.pdf")
#docs = loader.load()
#print("Loadded....")
m_docs=[]
m_ids=[]
for data in collection.find():
    #print("model"+str(data))
    m_docs.append(Document(page_content="this is an product struct data in json :"+str(data)))
    m_ids.append(str(data["_id"]))
print(m_ids)
print(m_docs)
vectorstore = Chroma.from_documents(documents=m_docs,ids=m_ids,persist_directory=db_path, embedding=ErnieEmbeddings())

查询产品

from langchain.vectorstores import Chroma
from langchain.chat_models import ErnieBotChat
from langchain.embeddings import ErnieEmbeddings
from langchain.chains import RetrievalQA
from langchain import PromptTemplate

import os
os.environ['ERNIE_CLIENT_ID'] ="xxxx"
os.environ['ERNIE_CLIENT_SECRET'] ="xxxx"
db_path = "./product_vector" #索引库名称
embeddings = ErnieEmbeddings(
    ernie_client_id='FAiHIjSQqH5gAhET3sHNTkiH',
    ernie_client_secret='wlIBmWY4d2Zvrs0GyQbT3JeTXV6kdub4',
)

llm_model = ErnieBotChat(model_name='ERNIE-Bot', #ERNIE-Bot
                    ernie_client_id='FAiHIjSQqH5gAhET3sHNTkiH',
                    ernie_client_secret='wlIBmWY4d2Zvrs0GyQbT3JeTXV6kdub4',
                    temperature=0.75,
                    )
vectorstore = Chroma(persist_directory="./product_vector",embedding_function=embeddings)

# Retrieve and generate using the relevant snippets of the blog.
retriever = vectorstore.as_retriever()
print("RAG....")
prompt_template = """参考内容如下:
---------------------
{context}
---------------------
请根据上面内容,回答下面这个问题:  {question}
如果无法根据上面内容回答问题,请如实说明,我不知道:"""

PROMPT = PromptTemplate(
    template=prompt_template, input_variables=["context", "question"]
)
chain_type_kwargs = {"prompt": PROMPT, "verbose":True}
qa = RetrievalQA.from_chain_type(llm=llm_model,
                                 chain_type="stuff",
                                 retriever=retriever,
                                 chain_type_kwargs=chain_type_kwargs
                                 )

query = "查找 功率为 80W产品的电机"


ret = qa.run(query)
print(ret)

结果

runfile('E:/yao2024/python2024/untitled2.py', wdir='E:/yao2024/python2024')
RAG....
Number of requested results 4 is greater than number of elements in index 3, updating n_results = 3


> Entering new StuffDocumentsChain chain...


> Entering new LLMChain chain...
Prompt after formatting:
参考内容如下:
---------------------
this is an product struct data in json :{'_id': ObjectId('661f838f21552cd009b44b48'), 'name': 'servo motor', 'brand': 'inovance', 'manufacture': 'inovance', 'feature': {'current': '2A', 'voltage': '24V', 'power': '80W', 'speed': '4800'}}

this is an product struct data in json :{'_id': ObjectId('661f838f21552cd009b44b46'), 'name': 'motor', 'brand': 'sanyo', 'manufacture': 'sanyo motor company', 'feature': {'current': '10A', 'voltage': '48V', 'power': '120Kw', 'speed': '1200'}}

this is an product struct data in json :{'_id': ObjectId('661f838f21552cd009b44b47'), 'name': 'DCmotor', 'brand': 'maxon', 'manufacture': 'maxon', 'feature': {'current': '5A', 'voltage': '24V', 'power': '10W', 'speed': '2400'}}
---------------------
请根据上面内容,回答下面这个问题:  查找 功率为 80W产品的电机
如果无法根据上面内容回答问题,请如实说明,我不知道:

> Finished chain.

> Finished chain.
根据提供的JSON数据内容,我们可以找到功率为80W的电机产品。以下是符合这一条件的产品信息:


```json
{
  '_id': ObjectId('661f838f21552cd009b44b48'),
  'name': 'servo motor',
  'brand': 'inovance',
  'manufacture': 'inovance',
  'feature': {
    'current': '2A',
    'voltage': '24V',
    'power': '80W',
    'speed': '4800'
  }
}
```
这款产品的名称为"servo motor",品牌为"inovance",制造商为"inovance",功率为80W。其他特性包括电流为2A,电压为24V,转速为4800。

结束语

        大模型支持下的分类数据库智能查询在企业应用中非常广泛,比如 物料管理,产品管理,生命周期管理,B2B 电商,知识库,技术文档查询等等。

     大语言模型的横空出世将快速地改变软件的架构,数据存储方式。这是我们值得注意的,

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

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

相关文章

SQL255 给出employees表中排名为奇数行的first_name

题目来源: 给出employees表中排名为奇数行的first_name_牛客题霸_牛客网 描述 对于employees表中,输出first_name排名(按first_name升序排序)为奇数的first_name CREATE TABLE employees ( emp_no int(11) NOT NULL, birth_date date NOT NULL, firs…

春藤实业启动SAP S/4HANA Cloud Public Edition项目,与工博科技携手数字化转型之路

3月11日,广东省春藤实业有限公司(以下简称“春藤实业”)SAP S/4HANA Cloud Public Edition(以下简称“SAP ERP公有云”)项目正式启动。春藤实业董事长陈董、联络协调项目经理慕总、内部推行项目经理陈总以及工博董事长…

【.Net动态Web API】背景与实现原理

🚀前言 本文是《.Net Core进阶编程课程》教程专栏的导航站(点击链接,跳转到专栏主页,欢迎订阅,持续更新…) 专栏介绍:通过源码实例来讲解Asp.Net Core进阶知识点,让大家完全掌握每一…

pt-archiver归档表数据

一 介绍 pt-archiver的原理主要是根据定义的时间间隔(sleep参数),扫描要清理的数据表。它按照指定的规则分批(limit参数)将查询到的记录转移到其他表或文件中,发现它是按主键去删除的表数据,对数据库影响很小。 二 语法 /bin/pt-archiver …

关于外网java后端服务访问内网minio中间件,因连接minio超时,启动失败问题

注:服务器情况:2台服务器,内网服务器包含(activemq、minio、nginx、redis、mysql、后端java服务)。外网服务器只有后端java服务,访问内网的中间件(内网服务器开放了部分指定端口) 问…

GPT状态和原理 - 解密OpenAI模型训练

目录 1 如何训练 GPT 助手 1.1 第一阶段 Pretraining 预训练 1.2 第二阶段:Supervised Finetuning有监督微调 1.3 第三阶段 Reward Modeling 奖励建模 1.4 第四阶段 Reinforcement Learning 强化学习 1.5 总结 2 第二部分:如何有效的应用在您的应…

中文编程入门(Lua5.4.6中文版)第十二章 Lua 协程 参考《愿神》游戏

在《愿神》的提瓦特大陆上,每一位冒险者都拥有自己的独特力量——“神之眼”,他们借助元素之力探索广袤的世界,解决谜题,战胜敌人。而在提瓦特的科技树中,存在着一项名为“协同程序”的高级秘术,它使冒险者…

Go 语言中的 GIF 图像处理完全指南:`image/gif`的技术与实践

Go 语言中的 GIF 图像处理完全指南:image/gif的技术与实践 概述安装与基础设置导入 image/gif 包初步配置示例:设置一个简单的 GIF 编码环境 读取与解码 GIF 图像读取 GIF 文件解析 GIF 数据 创建与编码 GIF 图像创建 GIF 图像编码 GIF 图像 处理 GIF 动…

利用 Python 开发手机 App 实战

Python语言虽然很万能,但用它来开发app还是显得有点不对路,因此用Python开发的app应当是作为编码练习、或者自娱自乐所用,加上目前这方面的模块还不是特别成熟,bug比较多,总而言之,劝君莫轻入。 准备工作 …

BGP边界网关路由实验(华为)

一,技术简介 BGP(边界网关路由协议)是一种自治系统(AS)间的协议,主要用于在不同的AS之间交换路由信息。AS是一个由一组网络设备和路由器组成的网络集合,这些设备可以在一个共同的管理域中协同工…

通过本机电脑远程访问路由器loopback的ip

实验拓扑图 本机电脑增加路由信息 正常设置telnet用户,然后通过本地电脑telnet 软件ensp中的设备,尝试是否可以正常访问即可 测试通过本地电脑可以正常访问ensp里面设备的loopback的ip地址了 最重要的一点是本机需要增加一条路由route add ip mask 下…

.NET 发布,部署和运行应用程序

.NET应用发布 发布.Net应用有很多种方式,下面列举三种发布方式: 单文件发布跨平台发布Docker发布 单文件发布 右键工程,选择“发布”,部署模式选择“独立”,目标运行时选择自己想要部署到的系统,我这里用…

GIT上超火的阿里内部1000页Java核心笔记,啃完竟然拿到阿里P7offer!

除了ReetrantLock,你还接触过JUC中的哪些并发工具? 请谈谈ReadWriteLock 和StampedLock。 如何让Java的线程彼此同步?你了解过哪些同步器?请分别介绍下。 CyclicBarrier和CountDownLatch看起来很相似,请对比下呢&am…

分布式限流——Redis + Lua脚本实现令牌桶算法

主要思路概括如下: 定义数据结构: 使用Redis存储令牌桶的状态,包括当前令牌数(KEYS[1])和上一次令牌填充的时间戳(KEYS[1]:last)。 计算新增令牌: 获取当前系统时间与上次令牌填充时…

type-cDP输入转双type-cDP输出,加type-c接口充电管理同时接两台显示器或者VR投屏,龙迅LT8712SX方案,龙迅桥接芯片方案

type-c的应用在各种设备上更加广泛,包括手机,电脑,游戏掌机, 因为type-c的功能非常强大,可以做到PD快充,DP信号输出,USB信号输出,所以很多设备为了做得更简洁都开始把其他的如HDMI接…

Docker应用推荐个人服务器实用有趣的项目推荐

Wallabag:是一个开源的、自托管的文章阅读和保存工具。它允许你保存网页文章并进行离线阅读,去除广告和不必要的内容,以提供更好的阅读体验。Wallabag支持多种导入和导出格式,并提供了一些实用的功能,如标签、阅读列表…

小程序如何优化搜索排名,获取曝光

在移动互联网时代,小程序以其便捷、轻量级的特点,逐渐成为用户获取服务的重要渠道。然而,小程序数量众多,如何让自己的小程序在搜索中脱颖而出,获取更多的曝光和流量,成为众多开发者关注的焦点。 一、理解…

Spring AI【人工智能】

Spring AI【人工智能】 前言版权推荐Spring AI官网介绍使用新建项目配置pom.xml配置application.properties创建Controller 测试 最后 前言 2024-4-11 10:58:44 昨天晚上睡觉刷B站看到一个视频 以下内容源自《【人工智能】》 仅供学习交流使用 版权 禁止其他平台发布时删除…

Word学习笔记之奇偶页的页眉与页码设置

1. 常用格式 在毕业论文中,往往有一下要求: 奇数页右下角显示、偶数页左下角显示奇数页眉为每章标题、偶数页眉为论文标题 2. 问题解决 2.1 前期准备 首先,不论时要求 1、还是要求 2,这里我们都要做一下设置: 鼠…

OpenCV从入门到精通实战(八)——基于dlib的人脸关键点定位

本文使用Python库dlib和OpenCV来实现面部特征点的检测和标注。 下面是代码的主要步骤和相关的代码片段: 步骤一:导入必要的库和设置参数 首先,代码导入了必要的Python库,并通过argparse设置了输入图像和面部标记预测器的参数。…