Byzer Storage是一个为 RAG 设计的高性能存储引擎,它提供了简单易用的Python API,支持向量搜索、全文检索以及结构化查询。本文将详细介绍Byzer Storage的使用方法和主要特性。

Byzer Storage 也是 byzerllm 的一个子项目。

0. 安装和启动

pip install byzerllm
byzerllm storage start

That's it! Byzer Storage 会自动安装并下载相关依赖,并且默认会启动一个 byzerai_store 的集群,现在我们可以开始使用它了。

## 1. 初始化

创建一个 ByzerStorage 对象,链接 byzerai_store 集群,并且指定数据库和表名(可以不存在)。

from byzerllm.apps.byzer_storage.simple_api import ByzerStorage, DataType, FieldOption, SortOption




storage = ByzerStorage("byzerai_store", "my_database1", "my_table4s")

2. 创建库表(可选)

Byzer Storage使用Schema来定义表结构。我们可以使用SchemaBuilder来构建Schema:

_ = (
    storage.schema_builder()
    .add_field("_id", DataType.STRING)
    .add_field("name", DataType.STRING)
    .add_field("content", DataType.STRING, [FieldOption.ANALYZE])
    .add_field("raw_content", DataType.STRING, [FieldOption.NO_INDEX])    
    .add_array_field("summary", DataType.FLOAT)    
    .add_field("created_time", DataType.LONG, [FieldOption.SORT])    
    .execute()
)

这个Schema定义了以下字段:

- `_id`: 字符串类型的主键

- `name`: 字符串类型,可用于过滤条件

- `content`: 字符串类型,带有ANALYZE选项,用于全文搜索

- `raw_content`: 字符串类型,带有NO_INDEX选项,不会被索引

- `summary`: 浮点数组类型,用于存储向量

- `created_time`: 长整型,带有SORT选项,可用于排序

3. 写入数据

准备数据并使用WriteBuilder写入Storage:

data = [
    {"_id": "1", "name": "Hello", "content": "Hello, world!", "raw_content": "Hello, world!", "summary": "hello world", "created_time": 1612137600},
    {"_id": "2", "name": "Byzer", "content": "Byzer, world!", "raw_content": "Byzer, world!", "summary": "byzer", "created_time": 1612137601},
    {"_id": "3", "name": "AI", "content": "AI, world!", "raw_content": "AI, world!", "summary": "AI", "created_time": 16121376002},
    {"_id": "4", "name": "ByzerAI", "content": "ByzerAI, world!", "raw_content": "ByzerAI, world!", "summary": "ByzerAi", "created_time": 16121376003},
]




storage.write_builder().add_items(data, vector_fields=["summary"], search_fields=["content"]).execute()
storage.commit()

这里我们使用`add_items`方法批量添加数据,并指定了`summary`为向量字段,`content`为搜索字段。最后调用`commit()`来确保数据被持久化。

4. 查询数据

Byzer Storage支持多种查询方式,包括向量搜索、全文检索、过滤和排序。

4.1 向量搜索 + 全文检索

query = storage.query_builder()
query.set_vector_query("ByzerAI", fields=["summary"])
results = query.set_search_query("Hello", fields=["content"]).execute()
print(results)

这个查询结合了向量搜索和全文检索,它会在`summary`字段中搜索与"ByzerAI"相似的向量,同时在`content`字段中搜索包含"Hello"的文档。

4.2 过滤 + 向量搜索 + 全文检索

query = storage.query_builder()
query.and_filter().add_condition("name", "AI").build()
query.set_vector_query("ByzerAI", fields="summary")
results = query.set_search_query("Hello", fields=["content"]).execute()
print(results)

这个查询首先过滤`name`字段等于"AI"的文档,然后在结果中进行向量搜索和全文检索。

### 4.3 过滤 + 排序

query = storage.query_builder()
query.and_filter().add_condition("name", "AI").build().sort("created_time", SortOption.DESC)
results = query.execute()
print(results)

这个查询过滤`name`字段等于"AI"的文档,然后按`created_time`字段降序排序。

## 5. 删除数据

### 5.1 根据ID删除

storage.delete_by_ids(["3"])




query = storage.query_builder()
query.and_filter().add_condition("name", "AI").build()
results = query.execute()
print(results)

这里我们删除了ID为"3"的文档,然后查询验证删除结果。

### 5.2 删除整个表

storage.drop()

这个操作会删除整个表及其所有数据,请谨慎使用。

## 结论

为什么说可甜可咸呢?前面我们可以看到他可以很轻松的在用户笔记本运行,但是他也支持分布式运行,并且天然支持存算分离。

简而言之,Byzer Storage提供了一套简洁而强大的API,能够轻松实现向量搜索、全文检索、结构化查询等功能。它的设计非常适合AI应用场景,可以有效地存储和检索各种类型的数据。通过本文的介绍,相信读者已经对Byzer Storage有了基本的了解,并能够开始在自己的项目中使用这个强大的存储引擎。

Logo

更多推荐