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

目的

        数据库使用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 电商,知识库,技术文档查询等等。

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

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

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

相关文章

【数学】主成分分析(PCA)的应用案例解析(Python)

接着上文PCA的数学详细推导过程,本文介绍使用Python结合图像压缩案例解释PCA的具体实现流程,以了解数据处理的一些方法 Jupyter Notebook file 文章目录 借助 scikit-learn 实现 PCA输入数据PCA降维并重建 手动实现 PCA 过程输入数据数据居中处理协方差矩…

自动驾驶(八十四)---------中间件对比分析

很久没有写博客了,CSDN无故非法删了我第82篇,让我很恼火,一直提不起兴趣重新写一遍第82篇。但回初心,知识需要用自己的语言输出,所以今天对比分析自动驾驶中间件: 1. 中间件介绍 在自动驾驶架构中&#xf…

【Git】git命令大全(持续更新)

本文架构 0.描述git简介术语 1.常用命令2. 信息管理新建git库命令更改存在库设置获取当前库信息 3.工作空间相关将工作空间文件添加到缓存区(增)从工作空间中移除文件(删)撤销提交 4.远程仓库相关同步远程仓库分支 (持…

【学习笔记】Python大数据处理与分析——数据预处理

一、数据清洗 1、唯一值与重复值 获取唯一值的方法是采用unique()函数,用于Series对象: s1 pd.Series([2, 3, 4, 1, 2, 5, 3, 6, 4, 9, 5, 3, 4, 2, 1, 2])print(s1.unique()) →[2 3 4 1 5 6 9] 但unique()函数不能用于DataFrame对象,而d…

html接入百度地图

1.申请key key申请地址&#xff1a;https://lbsyun.baidu.com/apiconsole/key#/home 注意&#xff1a;白名单设置*则所有可访问&#xff0c;正式发布保证安全需修改为域名 官方文档 https://lbsyun.baidu.com/index.php?titlejspopularGL 2.html接入示例 <!DOCTYPE …

基于51单片机智能鱼缸仿真LCD1602显示( proteus仿真+程序+设计报告+讲解视频)

基于51单片机智能鱼缸仿真LCD显示 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真4. 程序代码5. 设计报告6. 设计资料内容清单&&下载链接资料下载链接&#xff1a; 基于51单片机智能鱼缸仿真LCD显示( proteus仿真程序设计报告讲解视频&#xff09; 仿真图prot…

基于springboot+vue+Mysql的汽车租赁系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

04-15 周一 GitHub仓库CI服务器actions-runner和workflow yaml配置文档解析

04-15 周一 GitHub仓库CI服务器配置过程文档 时间版本修改人描述2024年4月15日10:35:52V0.1宋全恒新建文档2024年4月17日10:33:20v1.0宋全恒完成github actions CI的配置和工作流配置文件解读文档的撰写 简介 一些基础概念 前提知识 仓库介绍 地址镜像介绍https://github.…

选择生产制造项目管理系统?全面解析功能与实际应用!

生产效率和项目规划是制造企业亟需解决的难题&#xff0c;想要从容的应对这些挑战&#xff0c;离不开好用的生产制造项目管理系统。下面我们全面解析什么才能称得上是好用的生产制造项目管理系统。 一、好用的生产制造项目管理系统 什么样的项目管理系统才能算是好用呢&#x…

【QT进阶】Qt Web混合编程之VS2019 CEF的编译与使用(图文并茂超详细介绍)

往期回顾 【QT入门】Qt自定义控件与样式设计之自定义QLineEdit实现搜索编辑框-CSDN博客 【QT入门】Qt自定义控件与样式设计之自定义QTabWidget实现tab在左&#xff0c;文本水平的效果-CSDN博客【QT进阶】Qt Web混合编程之CEF、QCefView简单介绍-CSDN博客 【QT进阶】Qt Web混合编…

微服务相关

1. 微服务主要七个模块 中央管理平台&#xff1a;生产者、消费者注册&#xff0c;服务发现&#xff0c;服务治理&#xff0c;调用关系生产者消费者权限管理流量管理自定义传输协议序列化反序列化 2. 中央管理平台 生产者A在中央管理平台注册后&#xff0c;中央管理平台会给他…

2024运营级租房源码管理PHP后台+uniapp前端(app+小程序+H5)

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 一、详细介绍 房产系统 一款基于ThinkPHPUniapp开发的房产管理系统&#xff0c;支持小程序、H5、APP&#xff1b;包含房客、房东、经纪人三种身份。核心功能有&#xff1a;新盘销售、房屋租赁、地图找房、房源代理、…

基于SSM+Jsp+Mysql的准速达物流管理系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

保护视力,从 CareUEyes 开始 —— 你的电脑护眼小助手

在数字化时代&#xff0c;我们的眼睛比以往任何时候都更频繁地面对屏幕。长时间盯着电脑工作&#xff0c;不仅影响视力&#xff0c;还可能导致眼疲劳和不适。今天&#xff0c;我要向大家推荐一款专为电脑用户设计的护眼软件——CareUEyes。 CareUEyes&#xff1a;你的视力守护者…

数据大爆炸:WordCount程序的多元化执行方式

文章目录 主要内容1.左方工作区右键New,选择Map文件2.再创建mymap,myreducer,mywordcount类&#xff1a;3.打包在linux中运行&#xff0c;注意处理的文件式完全分布式文件3.1打jar包步骤&#xff1a; 4.完成内容 主要内容 尝试使用不同的方式运行wordcount程序。 1&#xff09…

【洛谷 P3366】【模板】最小生成树 题解(无向图+边集数组+Kruskal算法+最小生成树+并查集+路径压缩)

【模板】最小生成树 题目描述 如题&#xff0c;给出一个无向图&#xff0c;求出最小生成树&#xff0c;如果该图不连通&#xff0c;则输出 orz。 输入格式 第一行包含两个整数 N , M N,M N,M&#xff0c;表示该图共有 N N N 个结点和 M M M 条无向边。 接下来 M M M 行…

「Qt Widget中文示例指南」如何实现行编辑功能

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 Line Edits&#xf…

PHP 使用 PHPMailer 发送电子邮件

1. PHPMailer 介绍 phpMailer 是一个非常强大的 php 发送邮件扩展包&#xff0c;可以设定发送邮件地址、回复地址、邮件主题、html邮件内容和上传附件等&#xff0c;使用起来非常方便。它目前有着有近 4 千万的下载量&#xff0c;是 PHP 开发者实现邮件发送功能的首选扩展包 它…

Oracle11.2.0.1,(CVE-2012-1675)漏洞解决方案

1.进入容器停止监听 docker exec -it -u 0 oracle11g bash su - oracle lsnrctl stop listener2.找到监听配置文件位置&#xff0c;修改监听文件 echo $ORACLE_HOMEvi network/admin/listener.ora #在文件底部添加 SECURE_REGISTER_LISTENER (IPC) #启动监听 lsnrctl start …

vue3:tree结构的全选和取消

实现的功能&#xff0c;上面有个选择框&#xff0c;当选中全部时&#xff0c;下方树被全选 代码&#xff1a; <template><div><el-select v-model"selectAll" style"margin-bottom: 10px;" change"handleSelectAllChange">&…