Python中使用Oracle向量数据库实现文本检索系统
Python中使用Oracle向量数据库实现文本检索系统
- 代码分析
在本文中,我们将深入分析一个使用Oracle向量数据库实现文本检索系统的Python代码,并基于相同的技术生成一个新的示例。这个系统允许我们存储文档及其嵌入向量,并执行相似性搜索。
代码分析
让我们逐步分析原始代码的主要组件和功能:
-
导入必要的库:
- 使用
oracledb连接Oracle数据库 - 使用
numpy处理向量 - 使用
pydantic进行配置验证 - 使用
flask和redis进行Web应用程序集成
- 使用
-
定义
OracleVectorConfig类:- 使用Pydantic模型验证Oracle连接配置
-
创建
OracleVector类:- 实现向量数据库的核心功能
- 使用
contextmanager管理数据库连接 - 实现CRUD操作和向量搜索
-
实现
OracleVectorFactory类:- 用于初始化向量数据库实例
现在,让我们基于相同的技术创建一个新的示例代码:
import array
import json
import uuid
from contextlib import contextmanager
from typing import List, Dict, Anyimport numpy as np
import oracledb
from pydantic import BaseModel, validatorclass OracleConfig(BaseModel):host: strport: intuser: strpassword: strdatabase: str@validator('host', 'user', 'password', 'database')def check_not_empty(cls, v):if not v:raise ValueError("Field cannot be empty")return vclass TextEmbeddingStore:def __init__(self, config: OracleConfig):self.pool = self._create_connection_pool(config)self.table_name = "text_embeddings"self._create_table()def _create_connection_pool(self, config: OracleConfig):return oracledb.create_pool(user=config.user,password=config.password,dsn=f"{config.host}:{config.port}/{config.database}",min=1,max=5,increment=1)@contextmanagerdef _get_cursor(self):conn = self.pool.acquire()conn.inputtypehandler = self._input_type_handlerconn.outputtypehandler = self._output_type_handlercur = conn.cursor()try:yield curfinally:cur.close()conn.commit()conn.close()def _input_type_handler(self, cursor, value, arraysize):if isinstance(value, np.ndarray):return cursor.var(oracledb.DB_TYPE_VECTOR,arraysize=arraysize,inconverter=self._numpy_to_array)def _output_type_handler(self, cursor, metadata):if metadata.type_code is oracledb.DB_TYPE_VECTOR:return cursor.var(metadata.type_code,arraysize=cursor.arraysize,outconverter=self._array_to_numpy)def _numpy_to_array(self, value):return array.array('f', value)def _array_to_numpy(self, value):return np.array(value, dtype=np.float32)def _create_table(self):with self._get_cursor() as cur:cur.execute(f"""CREATE TABLE IF NOT EXISTS {self.table_name} (id VARCHAR2(100) PRIMARY KEY,text CLOB NOT NULL,metadata JSON,embedding VECTOR NOT NULL)""")def add_texts(self, texts: List[str], embeddings: List[List[float]], metadata: List[Dict] = None):if metadata is None:metadata = [{} for _ in texts]values = [(str(uuid.uuid4()), text, json.dumps(meta), np.array(emb, dtype=np.float32))for text, emb, meta in zip(texts, embeddings, metadata)]with self._get_cursor() as cur:cur.executemany(f"INSERT INTO {self.table_name} (id, text, metadata, embedding) VALUES (:1, :2, :3, :4)",values)def search_similar(self, query_vector: List[float], top_k: int = 5) -> List[Dict[str, Any]]:query_vector = np.array(query_vector, dtype=np.float32)with self._get_cursor() as cur:cur.execute(f"""SELECT id, text, metadata, vector_distance(embedding, :1) AS distanceFROM {self.table_name}ORDER BY distanceFETCH FIRST :2 ROWS ONLY""",[query_vector, top_k])results = []for id, text, metadata, distance in cur:results.append({"id": id,"text": text,"metadata": json.loads(metadata),"distance": distance,"similarity": 1 - distance})return results# 使用示例
if __name__ == "__main__":config = OracleConfig(host="localhost",port=1521,user="your_username",password="your_password",database="your_database")store = TextEmbeddingStore(config)# 添加文本和嵌入texts = ["Hello world", "Python programming", "Vector database"]embeddings = [[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9]]store.add_texts(texts, embeddings)# 搜索相似文本query_vector = [0.2, 0.3, 0.4]results = store.search_similar(query_vector, top_k=2)for result in results:print(f"Text: {result['text']}")print(f"Similarity: {result['similarity']:.4f}")print("---")
这个新的示例代码实现了一个简化版的文本嵌入存储系统,使用Oracle向量数据库。它包含以下主要功能:
- 使用Pydantic进行配置验证
- 创建和管理Oracle连接池
- 使用上下文管理器处理数据库连接
- 处理numpy数组和Oracle向量类型之间的转换
- 实现添加文本和嵌入的方法
- 实现基于向量相似度的搜索方法
这个示例展示了如何使用Oracle向量数据库来存储和检索文本嵌入,可以作为构建更复杂的文本检索或推荐系统的基础。
在实际应用中,你可能需要添加错误处理、日志记录、性能优化等功能。
相关文章:
Python中使用Oracle向量数据库实现文本检索系统
Python中使用Oracle向量数据库实现文本检索系统 代码分析 在本文中,我们将深入分析一个使用Oracle向量数据库实现文本检索系统的Python代码,并基于相同的技术生成一个新的示例。这个系统允许我们存储文档及其嵌入向量,并执行相似性搜索。 代码分析 让我们逐步分析原始代码的主…...
java考试题20道
选择题 编译Java源代码文件的命令是javac javac命令是将Java源代码文件进行编译得到字节码文件(.class文件) java命令是在JVM上运行得到的字节码文件 下面是一个示例: javac test.java -------> test.class java test ------> 运行test.class文件下列那…...
云仓的优势体现在哪里?
云仓,即云仓储,是一种基于互联网和大数据技术的新型仓储管理模式。它通过高度的信息化、自动化和集成化管理模式,为企业提供高效、灵活、智能的仓储解决方案。云仓的优势主要体现在以下几个方面: ———————————————…...
github 设置中文,亲测有效
点进去 安装 选上面第二个,不行再选第一个 GitHub - maboloshi/github-chinese: GitHub 汉化插件,GitHub 中文化界面。 (GitHub Translation To Chinese)...
Spring容器生命周期中如前置运行程序和后置运行程序
在Spring容器加入一个实现了BeanPostProcessor接口bean实例,重写postProcessBeforeInitialization、postProcessAfterInitialization方法,在方法里面写具体的实现,从而达到Spring容器在初如化前或销毁时执行预定的程序,方法如下&a…...
C++ 现代教程二
线程支持库 - C中文 - API参考文档 GitHub - microsoft/GSL: Guidelines Support Library Fluent C:奇异递归模板模式(CRTP) - 简书 #include <thread> #include <iostream> #include <unordered_map> #include <futu…...
JavaScript函数闭包解析
一、什么是闭包 JavaScript中的函数闭包是指函数可以访问其父级作用域中的变量,即使函数在父级作用域外被调用。闭包可以获取和修改其父级作用域中的变量,即使父级作用域已经被销毁。 在JavaScript中,当一个函数被定义时,它会创…...
STM32MP135裸机编程:使用软件触发硬件复位
0 参考资料 STM32MP13xx参考手册.pdf 1 使用寄存器实现软件复位 1.1 复位电路概述 重点关注下面标红的路线: 通过这条路线可以清楚看到,我们可以通过设置RCC_MP_GRSTCSETR寄存器让RPCTL(复位脉冲控制器)给NRST(硬件复…...
【饼图交通方式】用ECharts的graphic配置打造个性化
利用ECharts的graphic配置打造个性化图表 内容概要 ECharts是一款强大的数据可视化工具,它提供了丰富的配置选项来定制图表。本文将重点介绍graphic配置的使用,展示如何通过在饼图中添加个性化的图形元素,例如中心图像,来增强图…...
大模型学习笔记3【大模型】LLaMA学习笔记
文章目录 学习内容LLaMALLaMA模型结构LLaMA下载和使用好用的开源项目[Chinese-Alpaca](https://github.com/ymcui/Chinese-LLaMA-Alpaca)Chinese-Alpaca使用量化评估 学习内容 完整学习LLaMA LLaMA 2023年2月,由FaceBook公开了LLaMA,包含7B࿰…...
工程师 - 什么是SMP
什么是 SMP(对称多处理)? What is SMP (symmetric multiprocessing)? 对称多处理(SMP,symmetric multiprocessing)是由多个处理器完成的计算机处理过程,这些处理器共享一个操作系统࿰…...
Webpack: 并行构建
概述 受限于 Node.js 的单线程架构,原生 Webpack 对所有资源文件做的所有解析、转译、合并操作本质上都是在同一个线程内串行执行,CPU 利用率极低,因此,理所当然地,社区出现了一些以多进程方式运行 Webpack࿰…...
Vue的介绍与使用
1.Vue的介绍 内容讲解 【1】Vue介绍 1.vue属于一个前端框架,底层使用原生js编写的。主要用来进行前端和后台服务器之间的一个交互。 2.Vue是一套构建用户界面的渐进式前端框架。 “渐进式框架”简单的来说你可以将Vue作为你的应用一部分嵌入其中,代理…...
MYSQL双主双从,使用Keepalived双机热备+LVS高可用群集
MYSQL双主双从,使用Keepalived双机热备LVS高可用群集 文档只记录KeepalivedLVSmysql主从,不包含检验,如需检验,请自行添加web服务器 一、IP规划 服务器IP备注master1192.168.100.131master2的从master2192.168.100.132maste…...
9.计算机视觉—目标检测
目录 1.物体检测边缘框目标检测数据集总结边缘框代码实现2.锚框:目标检测的一种方法IoU—交并比赋予锚框标号使用非极大值抑制(NMS)输出总结代码实现1.物体检测 边缘框 一个边缘框可以通过四个数字定义 (左上x,左上y),(右下x,右下y)(左上x,左上y,宽,高)(中间x,中间y…...
构造函数深入理解
目录 构造函数构造函数体赋值初始化列表初始化列表格式初始化列表的意义以及注意点const修饰的成员变量初始化对象成员具体初始化的地方缺省值存在的意义例子1例子2 初始化与赋值引用成员变量的初始化注意点1注意点2我的疑惑 自定义类型成员初始化例子1例子2例子3例子4 初始化列…...
Rocky Linux 9 快速安装docker 教程
前述 CentOS 7系统将于2024年06月30日停止维护服务。CentOS官方不再提供CentOS 及后续版本,不再支持新的软件和补丁更新。CentOS用户现有业务随时面临宕机和安全风险,并无法确保及时恢复。由于 CentOS Stream 相对不稳定,刚好在寻找平替系统…...
go语言并发编程1-Gouroutine
参考文档:www.topgoer.com 使用方法 直接包装成函数,go关键字触发即可 注意事项 1 main方法结束后,main方法内启动的子协程会立即结束,无论是否执行完毕; 启动多个groutine 使用sync包的WaitGroup来控制…...
Sylar服务器框架——Http模块
1、http.h 定义了HttpMethod和HttpStatus /* Request Methods */ #define HTTP_METHOD_MAP(XX) \XX(0, DELETE, DELETE) \XX(1, GET, GET) \XX(2, HEAD, HEAD) \XX(3, POST, POST) \XX(4, PUT, …...
7km远距离WiFi实时图传模块,无人机海上无线传输方案,飞睿智能WiFi MESH自组网技术
在浩瀚无垠的海洋上,无人机正在开启一场前所未有的技术创新。它们不再只是天空的舞者,更是海洋的守望者,为我们带来前所未有的视野和数据。而这一切的背后,都离不开一项创新性的技术——飞睿智能远距离WiFi实时图传模块与无线Mesh…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
