存储#

1. 概念#

Storage模块是一个全面的框架,旨在处理各种类型的数据存储机制。它由抽象基类和具体实现组成,适用于键值存储和向量存储系统。

2. 类型#

2.1 键值存储#

BaseKeyValueStorage:

  • 目的:作为创建各种键值存储系统的基础抽象类。

  • 功能:标准化操作如保存、加载和清除数据记录。主要通过Python字典进行交互。

  • 使用场景:适用于JSON文件存储、NoSQL数据库(如MongoDB和Redis)以及内存中的Python字典。

InMemoryKeyValueStorage:

  • 描述:BaseKeyValueStorage的具体实现,使用内存中的列表。

  • 特性:非常适合临时存储,因为数据是易失的,程序终止时会丢失。

  • 功能:实现用于在内存中保存、加载和清除记录的方法。

JsonStorage:

  • 描述:BaseKeyValueStorage的另一个具体实现,专注于JSON文件存储。

  • 特性:确保以人类可读的格式持久化存储记录。支持通过自定义JSON编码器对特定枚举类型进行定制。

  • 功能:包含将数据保存为JSON格式、加载和清除数据的方法。

2.2 VectorDB 存储#

BaseVectorStorage:

  • 用途:一个抽象基类,设计用于扩展特定的向量存储实现。

  • 功能:支持各种操作,如添加、删除向量、查询相似向量以及维护向量数据库的状态。

  • 功能:在指定向量维度、集合名称、距离度量等方面提供灵活性。

MilvusStorage:

  • 描述:BaseVectorStorage的具体实现,专为与云原生向量搜索引擎Milvus交互而设计。

参考:Milvus

TiDBStorage:

  • 描述:BaseVectorStorage的具体实现,专为与TiDB交互而设计,一个满足您所有AI需求的数据库:向量嵌入、知识图谱和操作数据。

参考:TiDB

QdrantStorage:

  • 描述:BaseVectorStorage的具体实现,专为与向量搜索引擎Qdrant交互而设计。

参考:Qdrant

2.3 图存储#

BaseGraphStorage:

  • 目的:一个抽象基类,设计用于扩展特定的图存储实现。

  • 功能特性:支持多种操作,如get_clientget_schemaget_structured_schemarefresh_schemaadd_tripletdelete_triplet以及query

NebulaGraph:

  • 描述:BaseGraphStorage的具体实现,专为与NebulaGraph交互而设计,NebulaGraph是一个开源、分布式、可扩展、极速的图数据库。

参考:NebulaGraph

Neo4jGraph:

  • 描述:BaseGraphStorage的具体实现,专为与Neo4jGraph(最受信任的图数据库之一)交互而设计。

参考:Neo4jGraph

3. 开始使用#

要开始使用您提供的存储模块,您需要了解关键类及其方法的基本用法。该模块包含一个抽象基类BaseKeyValueStorage及其具体实现InMemoryKeyValueStorageJsonStorage,以及通过BaseVectorStorage及其实现MilvusStorageQdrantStorage实现的向量存储系统。

3.1. 使用 InMemoryKeyValueStorage#

from camel.storages.key_value_storages import InMemoryKeyValueStorage

# Create an instance of InMemoryKeyValueStorage
memory_storage = InMemoryKeyValueStorage()

# Save records
memory_storage.save([{'key1': 'value1'}, {'key2': 'value2'}])

# Load records
records = memory_storage.load()
print(records)

# Clear all records
memory_storage.clear()
>>> [{'key1': 'value1'}, {'key2': 'value2'}]

3.2. 使用 JsonStorage#

from camel.storages.key_value_storages import JsonStorage
from pathlib import Path

# Create an instance of JsonStorage with a specific file path
json_storage = JsonStorage(Path("my_data.json"))

# Save records
json_storage.save([{'key1': 'value1'}, {'key2': 'value2'}])

# Load records
records = json_storage.load()
print(records)

# Clear all records
json_storage.clear()
>>>  [{'key1': 'value1'}, {'key2': 'value2'}]

3.3. 使用 MilvusStorage#

from camel.storages import MilvusStorage, VectorDBQuery, VectorRecord

# Create an instance of MilvusStorage with dimension = 4
milvus_storage = MilvusStorage(
    url_and_api_key=("Your Milvus URI","Your Milvus Token"),
    vector_dim=4,
    collection_name="my_collection")

# Add two vector records
milvus_storage.add([VectorRecord(
            vector=[-0.1, 0.1, -0.1, 0.1],
            payload={'key1': 'value1'},
        ),
        VectorRecord(
            vector=[-0.1, 0.1, 0.1, 0.1],
            payload={'key2': 'value2'},
        ),])

# Load the remote collection
milvus_storage.load()

# Query similar vectors
query_results = milvus_storage.query(VectorDBQuery(query_vector=[0.1, 0.2, 0.1, 0.1], top_k=1))
for result in query_results:
    print(result.record.payload, result.similarity)

# Clear all vectors
milvus_storage.clear()
>>> {'key2': 'value2'} 0.5669466853141785

3.4. 使用 TiDBStorage#

如果您使用TiDB Serverless,可以重定向到TiDB Cloud Web控制台获取数据库URL。(在连接面板上选择"使用SQLAlchemy连接" > "PyMySQL")

import os
from camel.storages import TiDBStorage, VectorDBQuery, VectorRecord

os.environ["TIDB_DATABASE_URL"] = "The database url of your TiDB cluster."

# Create an instance of TiDBStorage with dimension = 4
tidb_storage = TiDBStorage(
    url_and_api_key=(os.getenv("DATABASE_URL"), ''),
    vector_dim=4,
    collection_name="my_collection"
)

# Add two vector records
tidb_storage.add([
    VectorRecord(
        vector=[-0.1, 0.1, -0.1, 0.1],
        payload={'key1': 'value1'},
    ),
    VectorRecord(
        vector=[-0.1, 0.1, 0.1, 0.1],
        payload={'key2': 'value2'},
    ),
])

# Load the remote collection
tidb_storage.load()

# Query similar vectors
query_results = tidb_storage.query(VectorDBQuery(query_vector=[0.1, 0.2, 0.1, 0.1], top_k=1))
for result in query_results:
    print(result.record.payload, result.similarity)

# Clear all vectors
tidb_storage.clear()
>>> {'key2': 'value2'} 0.5669466755703252

3.5. 使用 QdrantStorage#

from camel.storages import QdrantStorage, VectorDBQuery, VectorRecord

# Create an instance of QdrantStorage with dimension = 4
qdrant_storage = QdrantStorage(vector_dim=4, collection_name="my_collection")

# Add two vector records
qdrant_storage.add([VectorRecord(
            vector=[-0.1, 0.1, -0.1, 0.1],
            payload={'key1': 'value1'},
        ),
        VectorRecord(
            vector=[-0.1, 0.1, 0.1, 0.1],
            payload={'key2': 'value2'},
        ),])

# Query similar vectors
query_results = qdrant_storage.query(VectorDBQuery(query_vector=[0.1, 0.2, 0.1, 0.1], top_k=1))
for result in query_results:
    print(result.record.payload, result.similarity)

# Clear all vectors
qdrant_storage.clear()
>>> {'key2': 'value2'} 0.5669467095138407

3.6. 使用 NebulaGraph#

from camel.storages.graph_storages import NebulaGraph

nebula_graph = NebulaGraph("your_host", "your_username", "your_password", "your_space")

# Show existing tags
query = 'SHOW TAGS;'
print(nebula_graph.query(query))

3.7. 使用 Neo4jGraph#

from camel.storages import Neo4jGraph

neo4j_graph = Neo4jGraph(
    url="your_url",
    username="your_username",
    password="your_password",
)

query = "MATCH (n) DETACH DELETE n"
print(neo4j_graph.query(query))