跳转到内容

无服务器LanceDB

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

s3-lambda

如果您希望根据使用场景灵活扩展,同时节省维护工作量和成本,这是一个绝佳的选择。

让我们一步步了解如何创建一个简单的Lambda函数来查询S3上的SIFT数据集。

在开始之前,您需要确保创建一个安全的AWS账户访问权限。我们建议使用用户策略,这样AWS可以安全地共享凭证,而无需您将环境变量传递到Lambda中。

我们还将使用容器来部署Lambda代码。对于Lambda来说这是一个不错的选择,因为您无需像自行构建软件包那样面临空间限制。

初始设置:创建LanceDB表并将其远程存储在S3上

我们将以SIFT向量数据集为例。为简化操作,我们已公开提供了一份Lance格式的SIFT数据集,可直接访问并用于填充我们的LanceDB表。

为此,请先从以下位置本地下载Lance文件:

s3://eto-public/datasets/sift/vec_data.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官方文档中的说明进行操作,您可以在此处查看:

https://docs.aws.amazon.com/lambda/latest/dg/images-create.html#images-upload

最后一步:设置您的Lambda函数

容器推送完成后,您可以通过选择容器来创建Lambda函数。