数据库迁移#

Argilla 服务器数据库迁移#

自 Argilla 1.6.0 起,关于用户和工作区的信息,以及 FeedbackDataset 的数据存储在 SQL 数据库(SQLite 或 PostgreSQL)中。 因此,Argilla 的每个版本更新都可能需要数据库迁移,以将数据库模式更新到新版本。本节介绍如何执行数据库迁移。

为了应用迁移,需要建立与数据库的连接。 如果使用 SQLite,则应用迁移的唯一方法是从运行 Argilla 服务器的同一台机器执行迁移命令。 如果使用 PostgreSQL,则可以从任何可以访问 PostgreSQL 数据库的机器执行迁移命令,并将 ARGILLA_DATABASE_URL 环境变量设置为数据库的 URL。

列出可用的数据库修订/迁移#

要列出可用的数据库修订/迁移,可以使用 argilla server database revisions 命令。 此命令将列出数据库可以迁移到的不同修订版本。 由于单个版本可能会生成多个修订版本,因此该命令还将显示为每个版本生成的最新修订版本。

argilla server database revisions
INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.

Tagged revisions
-----------------
• 1.7 (revision: '1769ee58fbb4')
• 1.8 (revision: 'ae5522b4c674')
• 1.11 (revision: '3ff6484f8b37')
• 1.13 (revision: '1e629a913727')

Alembic revisions
-----------------
3fc3c0839959 -> 1e629a913727 (head), fix suggestions type enum values
8c574ada5e5f -> 3fc3c0839959, create suggestions table
3ff6484f8b37 -> 8c574ada5e5f, update_enum_columns
ae5522b4c674 -> 3ff6484f8b37, add record metadata column
e402e9d9245e -> ae5522b4c674, create fields table
8be56284dac0 -> e402e9d9245e, create responses table
3a8e2f9b5dea -> 8be56284dac0, create records table
b9099dc08489 -> 3a8e2f9b5dea, create questions table
1769ee58fbb4 -> b9099dc08489, create datasets table
82a5a88a3fa5 -> 1769ee58fbb4, create workspaces_users table
74694870197c -> 82a5a88a3fa5, create workspaces table
<base> -> 74694870197c, create users table

Current revision
----------------
Current revision(s) for sqlite:////Users/gabrielmbmb/.argilla/argilla.db?check_same_thread=False:
Rev: 1e629a913727 (head)
Parent: 3fc3c0839959
Path: /Users/gabrielmbmb/Source/Argilla/argilla/src/argilla/server/alembic/versions/1e629a913727_fix_suggestions_type_enum_values.py

    fix suggestions type enum values

    Revision ID: 1e629a913727
    Revises: 3fc3c0839959
    Create Date: 2023-07-24 12:47:11.715011

应用最新迁移#

如果在不带任何参数的情况下调用 migrate 命令,则将应用最新的迁移。

argilla server database migrate

应用特定迁移#

migrate 命令也可以用于应用特定的迁移。 为此,需要提供 --revision 选项,其中包含修订版本的名称或数据库将迁移到的 Argilla 版本。

argilla server database migrate migrate --revision 1.7

警告

应用比当前数据库修订版本旧的修订版本会将数据库恢复到该修订版本的状态,这意味着数据可能会丢失。

从旧模式迁移#

对于旧版本的 Argilla,从 UI 创建的标签未包含在标注模式中。 相反,UI 使用 Elastic Search 中的数据集元数据索引来存储此信息。

警告

警告:从 Argilla v1.4.0 版本开始,所有标签都将使用新的标签模式设置创建。 请务必将使用 UI 创建标签的数据集迁移到正确的标签模式。

如果你想将此信息移动到相应的标签模式,你可以执行以下代码片段

import argilla as rg
from argilla.client import api

rg.init()
client = api.active_client()

# This metadata key was used by the UI to store created labels in datasets
CUSTOM_DATA_KEY = "rubrix.recogn.ai/ui/custom/userData.v1"
datasets = [dataset for dataset in client.http_client.get("/api/datasets") if CUSTOM_DATA_KEY in dataset["metadata"]]
print(f"Found {len(datasets)} datasets to migrate")
for ds in datasets:
    metadata = ds["metadata"]
    task = ds["task"]
    name = ds["name"]
    workspace = ds["owner"]  # owner will be replaced by `workspace` in newer versions

    if task == "TextClassification":  # Build text classification settings
        labels = metadata[CUSTOM_DATA_KEY]["labels"]
        settings = rg.TextClassificationSettings(label_schema=set(labels))
    elif task == "TokenClassification":  # Build token classification settings
        labels = metadata[CUSTOM_DATA_KEY]["entities"]
        settings = rg.TokenClassificationSettings(label_schema=set(labels))
    else:
        raise Exception(f"No labels key for task {task}. {dataset}")

    # Setting the dataset workspace to work with current dataset
    rg.set_workspace(workspace)

    # We will complete labels schema with labels found in dataset records.
    # This will avoid errors on label schema validation (when labels in records are not present in the label schema)
    metrics = client.compute_metric(name=name, metric="dataset_labels")
    for label in metrics.results["labels"]:
        settings.label_schema.add(label)
    print(f"Settings labels for dataset '{name}': {settings}")
    rg.configure_dataset(name=name, settings=settings)
import argilla as rg
from argilla.client import api

rg.init()
rg_client = api.active_client()

new_workspace = "<put-target-workspace-here>"

empty_workspace_datasets = [
    ds["name"]
    for ds in rg_client.http_client.get("/api/datasets")
    # filtering dataset with no workspace (use `"owner"` if you're running this code with server versions <=1.3.0)
    if not ds.get("workspace", None)
]

rg.set_workspace("")  # working from the "empty" workspace

for dataset in empty_workspace_datasets:
    rg.copy(dataset, dataset, new_workspace)

# Dataset are normally copied to the provided workspace
# You should delete datasets with no workspace
# In that case, uncomment following lines
# for dataset in empty_workspace_datasets:
#    rg.delete(dataset)

重新索引数据集#

有时,更新需要我们重新索引数据。

Argilla 指标#

对于我们内部计算的指标,可以通过简单地将相同的记录加载并记录回相同的索引来完成。 这是因为我们的内部指标是在日志记录期间计算和更新的。

import argilla as rg

dataset = "my-outdated-dataset"
ds = rg.load(dataset)
rg.log(ds, dataset)

Elasticsearch#

对于 Elastic 索引,重新索引需要更多的工作。 为了确保正确地重新索引,我们需要加载记录并将它们存储在一个全新的索引中。

import argilla as rg

dataset = "my-outdated-dataset"
ds = rg.load(dataset)
new_dataset = "my-new-dataset"
rg.log(ds, new_dataset)

反馈数据集#

如果你正在使用新的反馈数据集,并且想要更新搜索引擎信息,你应该复制你的数据集

import argilla as rg

dataset = rg.FeedbackDataset.from_argilla(name="feedback-dataset")
dataset = dataset.pull()
dataset.push_to_argilla(name=f"{dataset.name}_copy")
import argilla as rg

dataset = rg.FeedbackDataset.from_argilla(name="feedback-dataset")
dataset.push_to_argilla(name=f"{dataset.name}_copy")

此外,从 Argilla 1.21.0 版本开始,可以使用 CLI 任务将所有反馈数据集重新索引到搜索引擎

argilla server search-engine reindex

或者,仅重新索引提供 ID 的特定反馈数据集

argilla server search-engine reindex --feedback-dataset-id 08476931-ac30-4eec-9a35-bb59b48aea91

你可以将 REINDEX_DATASETS 环境变量设置为 true 以重新索引数据集。