无服务器LanceDB
将您的数据存储在S3上,并使用Lambda在生产环境中轻松计算嵌入向量和检索查询。

如果您希望根据使用场景灵活扩展,同时节省维护工作量和成本,这是一个绝佳的选择。
让我们一步步了解如何创建一个简单的Lambda函数来查询S3上的SIFT数据集。
在开始之前,您需要确保创建一个安全的AWS账户访问权限。我们建议使用用户策略,这样AWS可以安全地共享凭证,而无需您将环境变量传递到Lambda中。
我们还将使用容器来部署Lambda代码。对于Lambda来说这是一个不错的选择,因为您无需像自行构建软件包那样面临空间限制。
初始设置:创建LanceDB表并将其远程存储在S3上
我们将以SIFT向量数据集为例。为简化操作,我们已公开提供了一份Lance格式的SIFT数据集,可直接访问并用于填充我们的LanceDB表。
为此,请先从以下位置本地下载Lance文件:
然后,我们可以编写一个快速的Python脚本来填充我们的LanceDB表:
import lance
sift_dataset = lance.dataset("/path/to/local/vec_data.lance")
df = sift_dataset.to_table().to_pandas()
import lancedb
db = lancedb.connect(".")
table = db.create_table("vector_example", df)
创建好表格后,我们可以自由地将这些数据迁移到S3,实现远程托管。
构建我们的Lambda应用:一个简单的向量搜索事件处理器
现在我们有了一个远程托管的LanceDB表,我们需要能够从Lambda查询它。为此,让我们使用AWS python容器基础创建一个新的Dockerfile:
FROM public.ecr.aws/lambda/python:3.10
RUN pip3 install --upgrade pip
RUN pip3 install --no-cache-dir -U numpy --target "${LAMBDA_TASK_ROOT}"
RUN pip3 install --no-cache-dir -U lancedb --target "${LAMBDA_TASK_ROOT}"
COPY app.py ${LAMBDA_TASK_ROOT}
CMD [ "app.handler" ]
现在让我们创建一个简单的Lambda函数,用于查询app.py中的SIFT数据集。
import json
import numpy as np
import lancedb
db = lancedb.connect("s3://eto-public/tables")
table = db.open_table("vector_example")
def handler(event, context):
status_code = 200
if event['query_vector'] is None:
status_code = 404
return {
"statusCode": status_code,
"headers": {
"Content-Type": "application/json"
},
"body": json.dumps({
"Error ": "No vector to query was issued"
})
}
# Shape of SIFT is (128,1M), d=float32
query_vector = np.array(event['query_vector'], dtype=np.float32)
rs = table.search(query_vector).limit(2).to_list()
return {
"statusCode": status_code,
"headers": {
"Content-Type": "application/json"
},
"body": json.dumps(rs)
}
将容器部署到ECR
下一步是将容器构建并推送到ECR,之后便可用于创建新的Lambda函数。
最佳做法是遵循AWS官方文档中的说明进行操作,您可以在此处查看:
最后一步:设置您的Lambda函数
容器推送完成后,您可以通过选择容器来创建Lambda函数。