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

用Python玩转PostgreSQL向量搜索:手把手教你安装pgvector插件并实战AI应用

用Python玩转PostgreSQL向量搜索手把手教你安装pgvector插件并实战AI应用在AI技术席卷各行各业的今天向量数据库已成为构建智能应用的核心基础设施。PostgreSQL凭借其强大的扩展能力通过pgvector插件实现了高效的向量存储与检索功能让传统关系型数据库也能在AI时代大放异彩。本文将带你从零开始在Windows系统上完成pgvector插件的编译安装并通过Python实战演示如何构建一个完整的向量搜索应用。1. 环境准备与pgvector插件安装1.1 开发环境配置在开始安装pgvector之前需要确保系统已准备好必要的开发工具链Visual Studio 2022pgvector的Windows版本需要通过VS的nmake工具进行编译。建议安装使用C的桌面开发工作负载PostgreSQL 15确保已安装并配置好PostgreSQL服务Git用于克隆pgvector源码仓库提示安装Visual Studio时务必勾选C核心功能和Windows SDK组件这是nmake正常运行的基础。1.2 从源码编译pgvector打开x64 Native Tools Command PromptVS开发人员命令提示符执行以下步骤set PGROOTC:\Program Files\PostgreSQL\15 git clone --branch v0.4.4 https://github.com/pgvector/pgvector.git cd pgvector nmake /F Makefile.win nmake /F Makefile.win install常见问题排查nmake命令未找到检查VS安装目录下的VC\Auxiliary\Build目录是否已加入PATH链接错误确认PGROOT变量指向正确的PostgreSQL安装路径权限问题以管理员身份运行命令提示符1.3 启用pgvector扩展安装完成后在PostgreSQL中启用扩展CREATE EXTENSION IF NOT EXISTS vector;验证安装是否成功SELECT * FROM pg_available_extensions WHERE name vector;2. PostgreSQL向量数据库基础操作2.1 向量数据类型与表设计pgvector引入了vector数据类型支持不同维度的向量存储-- 创建包含向量列的表 CREATE TABLE document_embeddings ( id SERIAL PRIMARY KEY, content TEXT, embedding vector(768), -- 768维向量 metadata JSONB );向量列支持的主要操作欧式距离-余弦相似度内积#2.2 向量索引优化对于大规模向量数据需要创建专用索引提升查询性能-- 创建IVFFlat索引适合精确搜索 CREATE INDEX ON document_embeddings USING ivfflat (embedding vector_l2_ops) WITH (lists 100); -- 创建HNSW索引适合高召回率场景 CREATE INDEX ON document_embeddings USING hnsw (embedding vector_l2_ops) WITH (m 16, ef_construction 64);索引参数对比参数IVFFlatHNSW构建速度快慢查询速度中等快内存占用低高适合场景中小规模数据大规模高维数据3. Python集成实战3.1 环境配置与连接设置安装必要的Python包pip install psycopg[binary] numpy sentence-transformers建立数据库连接并注册向量类型import psycopg from pgvector.psycopg import register_vector import numpy as np conn psycopg.connect( dbnamevector_db, userpostgres, passwordyour_password, autocommitTrue ) register_vector(conn)3.2 文本向量化与存储使用Sentence-BERT模型生成文本嵌入from sentence_transformers import SentenceTransformer model SentenceTransformer(all-MiniLM-L6-v2) def embed_text(text): return model.encode(text).tolist() # 示例文本 documents [ PostgreSQL is a powerful open-source database, Vector search enables semantic similarity queries, AI applications often require nearest neighbor search ] # 存储向量 with conn.cursor() as cur: for doc in documents: embedding embed_text(doc) cur.execute( INSERT INTO document_embeddings (content, embedding) VALUES (%s, %s), (doc, embedding) )3.3 实现语义搜索功能构建一个完整的搜索接口def semantic_search(query, top_k5): query_embedding embed_text(query) with conn.cursor() as cur: cur.execute( SELECT id, content, 1 - (embedding %s) AS similarity FROM document_embeddings ORDER BY embedding %s LIMIT %s , (query_embedding, query_embedding, top_k)) results cur.fetchall() for row in results: print(fID: {row[0]}, Similarity: {row[2]:.4f}) print(fContent: {row[1]}\n)测试搜索semantic_search(database search techniques)4. 高级应用与性能优化4.1 混合查询策略结合传统SQL查询与向量搜索def hybrid_search(query, categoryNone, min_similarity0.7): query_embedding embed_text(query) conditions [embedding %s %s % (%s, str(1 - min_similarity))] params [query_embedding] if category: conditions.append(metadata-category %s) params.append(category) with conn.cursor() as cur: cur.execute(f SELECT id, content, 1 - (embedding %s) AS similarity FROM document_embeddings WHERE { AND .join(conditions)} ORDER BY embedding %s LIMIT 10 , [query_embedding] params [query_embedding]) return cur.fetchall()4.2 批量处理与性能调优对于大规模数据导入使用COPY命令提升性能def bulk_insert_embeddings(documents): embeddings [embed_text(doc) for doc in documents] with conn.cursor() as cur: with cur.copy(COPY document_embeddings (content, embedding) FROM STDIN) as copy: for doc, emb in zip(documents, embeddings): copy.write_row((doc, emb))索引优化建议对于超过100万条记录的数据集考虑分区表策略定期执行ANALYZE更新统计信息调整maintenance_work_mem参数加速索引构建4.3 实时应用集成示例构建一个Flask API服务from flask import Flask, request, jsonify app Flask(__name__) app.route(/search, methods[POST]) def search_api(): data request.json results semantic_search(data[query], data.get(top_k, 5)) return jsonify([{ id: row[0], content: row[1], similarity: float(row[2]) } for row in results]) if __name__ __main__: app.run(port5000)测试请求curl -X POST http://localhost:5000/search \ -H Content-Type: application/json \ -d {query:database techniques}5. 实际应用场景扩展5.1 推荐系统实现利用用户行为数据构建推荐引擎def get_recommendations(user_id, item_type, top_n10): # 获取用户嵌入向量 with conn.cursor() as cur: cur.execute( SELECT embedding FROM user_profiles WHERE user_id %s, (user_id,) ) user_embedding cur.fetchone()[0] # 查找相似物品 with conn.cursor() as cur: cur.execute( SELECT item_id, name, 1 - (embedding %s) AS similarity FROM items WHERE type %s ORDER BY embedding %s LIMIT %s , (user_embedding, item_type, user_embedding, top_n)) return cur.fetchall()5.2 异常检测方案通过向量距离识别异常数据点def detect_anomalies(threshold2.5): with conn.cursor() as cur: # 计算每个点到聚类中心的距离 cur.execute( WITH centroids AS ( SELECT avg(embedding) AS center FROM transaction_embeddings ) SELECT id, amount, (embedding - (SELECT center FROM centroids)) AS distance FROM transaction_embeddings WHERE (embedding - (SELECT center FROM centroids)) %s ORDER BY distance DESC , (threshold,)) return cur.fetchall()5.3 多模态搜索实践结合文本和图像向量实现跨模态搜索def multimodal_search(imageNone, textNone, top_k5): if image and text: # 融合多模态查询 image_embedding image_model.encode(image) text_embedding text_model.encode(text) query_embedding (image_embedding text_embedding) / 2 elif image: query_embedding image_model.encode(image) else: query_embedding text_model.encode(text) with conn.cursor() as cur: cur.execute( SELECT id, content, 1 - (embedding %s) AS similarity FROM multimodal_embeddings ORDER BY embedding %s LIMIT %s , (query_embedding, query_embedding, top_k)) return cur.fetchall()

相关文章:

用Python玩转PostgreSQL向量搜索:手把手教你安装pgvector插件并实战AI应用

用Python玩转PostgreSQL向量搜索:手把手教你安装pgvector插件并实战AI应用 在AI技术席卷各行各业的今天,向量数据库已成为构建智能应用的核心基础设施。PostgreSQL凭借其强大的扩展能力,通过pgvector插件实现了高效的向量存储与检索功能&…...

告别PM2!用Docker容器化部署Nuxt3 SSR项目的完整避坑指南(附Dockerfile配置)

从PM2到Docker:Nuxt3 SSR项目容器化部署实战手册 为什么选择Docker部署Nuxt3 SSR项目? 每次项目上线就像在玩俄罗斯轮盘赌——开发环境跑得好好的,一到服务器就各种报错。传统PM2部署方式最让人头疼的就是环境差异问题,而Docker恰…...

AXI事务属性避坑指南:从Cache行为反推AxCACHE信号怎么设(附常见误区)

AXI事务属性实战解析:从异常现象到信号配置的深度诊断 在复杂的芯片设计验证过程中,AXI协议的事务属性配置往往是系统调试中最隐蔽却又最关键的一环。当工程师面对"明明配置了Write-Back却看不到数据及时更新"或"预期中的传输合并未能提升…...

避坑指南:Unity Sprite描边Shader的5个常见错误与优化技巧(附完整可运行代码)

Unity Sprite描边Shader深度优化:从原理到工业级解决方案 在2D游戏开发中,Sprite描边效果是提升视觉表现力的重要手段,但许多开发者都会遇到描边断裂、锯齿明显、性能低下等问题。本文将深入分析这些问题的根源,并提供一套完整的优…...

FSearch文件搜索工具:基于索引的Linux桌面快速文件搜索解决方案

FSearch文件搜索工具:基于索引的Linux桌面快速文件搜索解决方案 【免费下载链接】fsearch A fast file search utility for Unix-like systems based on GTK3 项目地址: https://gitcode.com/gh_mirrors/fs/fsearch FSearch是一款为类Unix系统设计的快速文件…...

终极KMS激活工具:Windows和Office一键永久激活完整指南

终极KMS激活工具:Windows和Office一键永久激活完整指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统频繁弹出激活提示而烦恼吗?Office文档突然变成只…...

省下一个定时器!用STM32外部时钟模式驱动YF-S401流量计,资源占用更少

优化嵌入式系统资源占用:STM32外部时钟模式驱动YF-S401流量计实战 在资源受限的嵌入式系统中,每一个定时器和中断通道都显得弥足珍贵。想象一下这样的场景:你的STM32需要同时处理电机控制、无线通信、用户界面交互,现在还要实时监…...

避开DSC移植的坑:从屏厂PPS到内核配置的全链路避坑指南(MTK/高通平台通用思路)

深度解析DSC移植全流程:从PPS参数到内核配置的实战避坑手册 当一块支持DSC(Display Stream Compression)技术的新屏幕模组交到你手上时,作为显示模块的技术负责人,你面临的不仅是一次常规驱动移植,更是一场…...

NCM音频解密终极指南:3步解锁网易云音乐加密格式,实现全平台自由播放

NCM音频解密终极指南:3步解锁网易云音乐加密格式,实现全平台自由播放 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经下载了网易云音乐的NCM格式文件,却发现只能在特定客户端播放&#…...

终极指南:如何用MyTV-Android原生技术让老旧电视焕发新生

终极指南:如何用MyTV-Android原生技术让老旧电视焕发新生 【免费下载链接】mytv-android 使用Android原生开发的视频播放软件 项目地址: https://gitcode.com/gh_mirrors/my/mytv-android 还在为家中老旧Android电视无法流畅观看直播而烦恼吗?面对…...

别再只盯着FR4了!PCB板材选型避坑指南:从DK、Tg到CTE,手把手教你读懂关键参数

PCB板材选型实战指南:从参数解析到场景化决策 在高速数字电路和射频系统设计中,板材选择往往成为项目成败的关键变量。当信号速率突破10Gbps,当工作环境温度跨越-40℃到125℃的工业级范围,传统FR4的局限性开始显现。我曾亲眼见证过…...

Stable Diffusion Forge终极指南:三步构建高性能AI图像生成平台

Stable Diffusion Forge终极指南:三步构建高性能AI图像生成平台 【免费下载链接】stable-diffusion-webui-forge 项目地址: https://gitcode.com/GitHub_Trending/st/stable-diffusion-webui-forge 想要体验最先进的AI图像生成技术,却苦于复杂的…...

SAP CO物料分类账配置避坑指南:从OMX1到CKMSTART,手把手教你搞定ML激活与报错处理

SAP CO物料分类账实战配置全解析:从OMX1到CKMSTART的避坑手册 物料分类账(Material Ledger)作为SAP CO模块的核心功能,直接影响企业成本核算的精确度。但在实际配置过程中,90%的实施问题都源于配置顺序错误或关键检查点…...

Akagi:5分钟快速上手!用AI提升你的雀魂麻将水平

Akagi:5分钟快速上手!用AI提升你的雀魂麻将水平 【免费下载链接】Akagi 支持雀魂、天鳳、麻雀一番街、天月麻將,能夠使用自定義的AI模型實時分析對局並給出建議,內建Mortal AI作為示例。 Supports Majsoul, Tenhou, Riichi City, …...

如何为你的ESP32 AI助手添加“眼睛“:xiaozhi-esp32摄像头集成终极指南

如何为你的ESP32 AI助手添加"眼睛":xiaozhi-esp32摄像头集成终极指南 【免费下载链接】xiaozhi-esp32 An MCP-based chatbot | 一个基于MCP的聊天机器人 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32 想象一下,你…...

3步修复损坏视频:使用Untrunc轻松恢复珍贵回忆

3步修复损坏视频:使用Untrunc轻松恢复珍贵回忆 【免费下载链接】untrunc Restore a truncated mp4/mov. Improved version of ponchio/untrunc 项目地址: https://gitcode.com/gh_mirrors/un/untrunc 你是否曾经遇到过视频文件损坏的情况?那些珍贵…...

免费Mac桌面歌词神器LyricsX:解锁音乐沉浸新体验

免费Mac桌面歌词神器LyricsX:解锁音乐沉浸新体验 【免费下载链接】Lyrics Swift-based iTunes plug-in to display lyrics on the desktop. 项目地址: https://gitcode.com/gh_mirrors/lyr/Lyrics 在Mac上听音乐时,你是否曾想过让歌词像电影字幕一…...

软件因果图管理中的根因分析者

在软件开发和运维过程中,因果图管理是一种用于识别和解决复杂问题的有效方法。而根因分析者(Root Cause Analyst)则是这一过程中的核心角色,他们通过系统化的方法追溯问题的源头,确保类似问题不再发生。随着软件系统规…...

如何快速上手OpenBCI GUI:解锁脑机接口的终极开源工具

如何快速上手OpenBCI GUI:解锁脑机接口的终极开源工具 【免费下载链接】OpenBCI_GUI A cross platform application for the OpenBCI Cyton and Ganglion. Tested on Mac, Windows and Ubuntu/Mint Linux. 项目地址: https://gitcode.com/gh_mirrors/op/OpenBCI_G…...

解放双手!明日方舟全自动小助手MAA的终极使用指南

解放双手!明日方舟全自动小助手MAA的终极使用指南 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://gitcode…...

HarmonyOS Video组件预览图片优化实践:告别黑屏,提升视频播放体验

引言:视频播放体验的第一印象在HarmonyOS应用开发中,Video组件作为多媒体播放的核心控件,其用户体验直接影响着应用的整体质量。一个常见的痛点问题是:视频在开始播放前显示为黑色屏幕,直到用户点击播放并再次暂停后&a…...

解决NeRFStudio下载超时:手把手教你手动生成谷歌云盘直链(附Poster数据集链接)

突破网络限制:NeRFStudio数据集手动下载与本地配置全指南 当你在深夜调试NeRFStudio的nerfacto模型时,突然弹出的TimeoutError是否曾让你抓狂?本文将带你深入理解谷歌云盘直链生成机制,并手把手教你绕过下载障碍,让3D重…...

别再死记硬背了!用TwinCAT 3和Wireshark抓包,5分钟搞懂EtherCAT数据帧

用TwinCAT 3和Wireshark实战解析EtherCAT数据帧:从理论到可视化的跨越 每次翻开EtherCAT协议文档,看到那些密密麻麻的字段定义和时序图,是不是感觉头大?作为工业自动化领域的工程师,我们更习惯用示波器看波形&#xff…...

碧蓝航线Perseus补丁:3步解锁全皮肤终极指南

碧蓝航线Perseus补丁:3步解锁全皮肤终极指南 【免费下载链接】Perseus Azur Lane scripts patcher. 项目地址: https://gitcode.com/gh_mirrors/pers/Perseus 还在为碧蓝航线中那些精美的皮肤无法体验而烦恼吗?Perseus原生库补丁为你提供了一个稳…...

别再手动刷固件了!手把手教你用Arduino IDE给ESP8266/ESP32实现无线OTA升级

告别物理烧录:用Arduino IDE实现ESP系列芯片的智能OTA升级 想象一下这样的场景:你部署在屋顶的温湿度传感器需要更新算法,分布在三个楼层的智能灯光系统要修复控制逻辑,而所有这些设备都嵌在墙内或安装在难以触及的位置。传统方式…...

从零开始:如何用Akagi在雀魂对局中获得AI实时指导

从零开始:如何用Akagi在雀魂对局中获得AI实时指导 【免费下载链接】Akagi 支持雀魂、天鳳、麻雀一番街、天月麻將,能夠使用自定義的AI模型實時分析對局並給出建議,內建Mortal AI作為示例。 Supports Majsoul, Tenhou, Riichi City, Amatsuki,…...

5大实用技巧:彻底掌握网盘直链下载助手的高效用法

5大实用技巧:彻底掌握网盘直链下载助手的高效用法 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘…...

别再说LIN过时了!手把手教你用AUTOSAR MCAL配置LIN驱动(基于EB Tresos实战)

别再说LIN过时了!手把手教你用AUTOSAR MCAL配置LIN驱动(基于EB Tresos实战) 在汽车电子领域,每当讨论车载网络协议时,CAN、FlexRay甚至以太网总是占据话题中心,而LIN总线却常被贴上"过时"或"…...

别再乱设触发电平了!手把手教你用NI-DAQmx搞定模拟边沿与迟滞触发(附LabVIEW范例)

别再乱设触发电平了!手把手教你用NI-DAQmx搞定模拟边沿与迟滞触发(附LabVIEW范例) 实验室里最让人抓狂的瞬间,莫过于数据采集时触发信号像脱缰野马一样失控。明明设置了3V的上升沿触发,设备却对信号中的每一个毛刺都积…...

免费抖音下载神器:douyin-downloader完整使用指南

免费抖音下载神器:douyin-downloader完整使用指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. …...