跳到主要内容
Postgres Embedding 是一个用于 Postgres 的开源向量相似度搜索工具,它使用 分层可导航小世界 (HNSW) 进行近似最近邻搜索。
它支持
  • 使用 HNSW 进行精确和近似最近邻搜索
  • L2 距离
本笔记本展示了如何使用 Postgres 向量数据库 (PGEmbedding)。
PGEmbedding 集成会自动为您创建 pg_embedding 扩展,但您也可以运行以下 Postgres 查询来添加它
CREATE EXTENSION embedding;
# Pip install necessary package
pip install -qU  langchain-openai langchain-community
pip install -qU  psycopg2-binary
pip install -qU  tiktoken
将 OpenAI API 密钥添加到环境变量中以使用 OpenAIEmbeddings
import getpass
import os

if "OPENAI_API_KEY" not in os.environ:
    os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")
OpenAI API Key:········
## Loading environment variables
from typing import List, Tuple
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import PGEmbedding
from langchain_core.documents import Document
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
if "DATABASE_URL" not in os.environ:
    os.environ["DATABASE_URL"] = getpass.getpass("Database Url:")
Database Url:········
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)

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,
)

query = "What did the president say about Ketanji Brown Jackson"
docs_with_score: List[Tuple[Document, float]] = db.similarity_search_with_score(query)
for doc, score in docs_with_score:
    print("-" * 80)
    print("Score: ", score)
    print(doc.page_content)
    print("-" * 80)

在 Postgres 中使用向量存储

在 PG 中上传向量存储

db = PGEmbedding.from_documents(
    embedding=embeddings,
    documents=docs,
    collection_name=collection_name,
    connection_string=connection_string,
    pre_delete_collection=False,
)

创建 HNSW 索引

默认情况下,该扩展执行顺序扫描搜索,召回率为 100%。您可以考虑为近似最近邻 (ANN) 搜索创建 HNSW 索引,以加快 similarity_search_with_score 的执行时间。要在向量列上创建 HNSW 索引,请使用 create_hnsw_index 函数
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=3, efconstruction=16, efsearch=16);
上述语句中使用的 HNSW 索引选项包括
  • maxelements: 定义索引的最大元素数。这是一个必填参数。上面显示的示例值为 3。一个实际的示例将具有更大的值,例如 1000000。“元素”是指数据集中的数据点(向量),它在 HNSW 图中表示为一个节点。通常,您会将此选项设置为能够容纳数据集中行数的值。
  • dims: 定义向量数据中的维度数。这是一个必填参数。上面的示例中使用了小值。如果您存储的数据是使用 OpenAI 的 text-embedding-ada-002 模型生成的,该模型支持 1536 维度,那么您将定义一个值 1536,例如。
  • m: 定义在图构建期间为每个节点创建的双向链接(也称为“边”)的最大数量。支持以下附加索引选项
  • efConstruction: 定义索引构建期间考虑的最近邻居数量。默认值为 32。
  • efsearch: 定义索引搜索期间考虑的最近邻居数量。默认值为 32。有关如何配置这些选项以影响 HNSW 算法的信息,请参阅调整 HNSW 算法

在 PG 中检索向量存储

store = PGEmbedding(
    connection_string=connection_string,
    embedding_function=embeddings,
    collection_name=collection_name,
)

retriever = store.as_retriever()
retriever
VectorStoreRetriever(vectorstore=<langchain_community.vectorstores.pghnsw.HNSWVectoreStore object at 0x121d3c8b0>, search_type='similarity', search_kwargs={})
db1 = PGEmbedding.from_existing_index(
    embedding=embeddings,
    collection_name=collection_name,
    pre_delete_collection=False,
    connection_string=connection_string,
)

query = "What did the president say about Ketanji Brown Jackson"
docs_with_score: List[Tuple[Document, float]] = db1.similarity_search_with_score(query)
for doc, score in docs_with_score:
    print("-" * 80)
    print("Score: ", score)
    print(doc.page_content)
    print("-" * 80)

以编程方式连接这些文档到 Claude、VSCode 等,通过 MCP 获取实时答案。
© . This site is unofficial and not affiliated with LangChain, Inc.