存储#
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_client、get_schema、get_structured_schema、refresh_schema、add_triplet、delete_triplet以及query。
NebulaGraph:
描述:
BaseGraphStorage的具体实现,专为与NebulaGraph交互而设计,NebulaGraph是一个开源、分布式、可扩展、极速的图数据库。
参考:NebulaGraph
Neo4jGraph:
描述:
BaseGraphStorage的具体实现,专为与Neo4jGraph(最受信任的图数据库之一)交互而设计。
参考:Neo4jGraph
3. 开始使用#
要开始使用您提供的存储模块,您需要了解关键类及其方法的基本用法。该模块包含一个抽象基类BaseKeyValueStorage及其具体实现InMemoryKeyValueStorage和JsonStorage,以及通过BaseVectorStorage及其实现MilvusStorage或QdrantStorage实现的向量存储系统。
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))