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

devtools/2024/9/20 6:52:49/ 标签: 数据库, langchain

目的

        数据库使用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 PromptTemplateimport 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-Boternie_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.ppmy.cn/devtools/6510.html

相关文章

无法连接到MongoDB Atlas 的Cloud Database

打开Mongodb网页: 选择允许任何地址连接 连接成功

负载均衡集群——HAProxy

目录 1 HAProxy介绍 2 功能简介 3 实验组网介绍 4 实验步骤 4.1 通过 HAProxy 实现简单负载均衡调度功能 步骤 1 安装 HAProxy 步骤 2 修改配置 HAProxy 文件 4.2 HAProxy 监控页面配置 步骤 1 修改 HAProxy 配置文件 步骤 2 查看监控页面 3.3 HAProxy 日志相关配置 …

什么是神经网络和机器学习?【云驻共创】

什么是神经网络和机器学习? 一.背景 在当今数字化浪潮中,神经网络和机器学习已成为科技领域的中流砥柱。它们作为人工智能的支柱,推动了自动化、智能化和数据驱动决策的进步。然而,对于初学者和专业人士来说,理解神经…

论文笔记:Are Human-generated Demonstrations Necessary for In-context Learning?

iclr 2024 reviewer 评分 6668 1 intro 大型语言模型(LLMs)已显示出在上下文中学习的能力 给定几个带注释的示例作为演示,LLMs 能够为新的测试输入生成输出然而,现行的上下文学习(ICL)范式仍存在以下明显…

微服务面试题

这里写目录标题 1.微服务是什么2.你知道哪些RPC架构3.SpringCloud和Dubbo有什么区别4.SpringCloud由什么组成5.Eureka包含几个组件6.Eureka的工作原理7.说一下什么是Eureka的自我保护机制8.什么是CAP原则9.都是服务注册中心,Eureka比Zookeeper好在哪里10.Ribbon的作…

请陪伴Kimi和GPT成长

经验的闪光汤圆 但是我想要写实的 你有吗? 岁数大了,希望如何学习新知识呢?又觉得自己哪些能力亟需补强呢? 看论文自然得用Kimi,主要是肝不动了,眼睛也顶不住了。 正好昨天跟专业人士学会了用工作流的办法跟…

EI Scopus双检索 | 2024年清洁能源与智能电网国际会议(CCESG 2024)

会议简介 Brief Introduction 2024年清洁能源与智能电网国际会议(CCESG 2024) 会议时间:2024年 11月27-29日 召开地点:澳大利亚悉尼 大会官网:CCESG 2024-2024 International Joint Conference on Clean Energy and Smart Grid 由CoreShare科…

Springboot项目中Controller层的单元测试

源码展示: 原来的controller类: import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.*;RestController RequestMapping("/web") Slf4j Service public clas…

Taro-vue微信小程序用户隐私保护

Taro-vue微信小程序用户隐私保护 一、在 微信公众平台的【设置】- 【服务内容与声明】 ,设置用户隐私保护指引,添加项目需要的接口权限。 【用户隐私保护指引】提交之后,官方会进行审核。审核通过之后,对应的接口权限才会生效。 …

js设置:root得样式

在CSS中&#xff0c;:root 是一个伪类选择器&#xff0c;它匹配文档树的根元素。在HTML文档中&#xff0c;根元素通常是 <html> 元素。:root 选择器常用于定义CSS变量&#xff08;也称为自定义属性&#xff09;&#xff0c;以便在整个文档范围内使用这些变量。 关于“水…

Automated CNN approach

图1有点简单 作者未提供代码

【MySQL】表的增删改查

目录 前言&#xff1a; 新增&#xff08;Create&#xff09;&#xff1a; 查询&#xff08;Retrieve&#xff09;&#xff1a; 别名&#xff1a; 去重&#xff1a;DISTINCT 排序&#xff1a;ORDER BY &#xff1a; 条件查询&#xff1a;WHERE &#xff1a; 分页查询&am…

acwing算法提高之图论--无向图的双连通分量

目录 1 介绍2 训练 1 介绍 本博客用来记录无向图的双连通分量的相关题目。 以下所有概念都是针对无向图而言的。 桥&#xff1a;本质是边&#xff0c;去掉它&#xff0c;图就不连通了。这样的边叫作桥。 边双连通分量&#xff1a;不包含桥的连通块&#xff0c;且边的数目最大…

速盾:cdn可以加速哪些服务器

CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;是一种通过将网站的静态资源部署到全球各地的服务器上&#xff0c;以提供更快速、更可靠的访问体验的技术。CDN可以加速许多类型的服务器&#xff0c;包括但不限于以下几种&#xff1a; 静态资源服…

【考研高数】学习笔记分享

派大星说数学&#xff08;导学部分&#xff09; 关于做题 测试 答疑阶段 直播 群内 高中基础知识导学 一、数与式 述了课程学习和因式分解、分式拆解等知识点。学生应了解课程内容&#xff0c;带着疑问听课&#xff0c;不要抄笔记&#xff0c;导学课和基础课都有测验&…

Java,Python和Go语言语法差异对比

前段时间一直在找工作&#xff0c;比较颓废&#xff0c;很长时间都没有更新博客了&#xff0c;最近公司的项目需要用到Python语言和Go语言&#xff0c; 所以又重新学习了一下Python语言和Go语言&#xff0c;现在做一些总结&#xff0c;方便以后复习使用&#xff0c;同时也给其他…

web大型工程项目架构以及搭建

一、项目结构 ├── public/ ├── config/ │ └── proxy.js # 本地代理配置 ├── src/ │ ├── assets/ │ ├── components/ │ ├── configs/ │ │ ├── index.js # 应用配置 │ │ ├…

什么是0-day漏洞,怎么防护0-day漏洞攻击

随着信息技术的快速发展&#xff0c;网络安全问题日益凸显&#xff0c;其中0day漏洞攻击作为一种高级威胁手段&#xff0c;给企业和个人用户带来了极大的风险。下面德迅云安全就对0day漏洞攻击进行简单讲解下&#xff0c;并分享相应的一些安全措施&#xff0c;以期提高网络安全…

XiaodiSec day033 Learn Note 小迪渗透学习笔记

XiaodiSec day033 Learn Note 小迪渗透学习笔记 记录得比较凌乱&#xff0c;不尽详细 day33 文件上传 中间件上传&#xff0c;学了也不一定遇得到&#xff0c;但是要学 文件上传漏洞有几个情况会导致&#xff0c;有后端验证&#xff0c;第三方富文本编辑器导致 编辑器被目…

【Vue】Vue中使一个div铺满全屏

在Vue中实现div全屏铺满的方式与纯CSS实现类似&#xff0c;只是在Vue组件中应用CSS的方式略有不同。 最近在项目开发中&#xff0c;就遇到了这个问题&#xff0c;特此记录一下&#xff0c;方便大伙避坑。 有这么一段代码&#xff1a; <template><div class"fu…