Dataset 是 AgentLoop 為 AI 情境設計的新型資料存放區,在傳統日誌儲存的基礎上提供完整 CRUD、靈活 Schema、向量檢索與多維分析能力,讓 AI 運行時資料從"唯讀日誌"升級為"可管理資產"。Dataset 適用於 AI 應用的資料全生命週期管理,包括訓練資料管理、評測資料集構建、Bad Case 追蹤、模型版本迴歸等情境。
背景介紹
與 SLS Logstore 的關係
維度 | Logstore | Dataset |
資料模型 | Append-Only,寫入後不可修改 | 完整 CRUD,支援增刪改查 |
Schema | 靈活自訂索引配置 | 自訂 Schema,支援類型: text / long / double / json |
檢索能力 | 全文檢索索引 + SQL 分析 | 全文檢索索引 + 語義搜尋 + SQL 分析 + 組合查詢 |
向量能力 | 支援 embedding 向量索引,支援語義相似性檢索 | 內建 embedding 向量索引,支援語義相似性檢索 |
資料修訂 | 不支援 | 支援按 ID 更新和刪除 |
適用情境 | 日誌採集、監控警示、審計合規 | AI 資料管理、評測基準、訓練資料、Bad Case 追蹤 |
核心能力
能力 | 說明 |
自訂 Schema | 自訂欄位與類型,支援 |
向量檢索 | 對 text 欄位配置 embedding 模型即開啟向量索引,支援語義相似性檢索 |
完整 CRUD | 通過標準 SQL 執行 INSERT / UPDATE / DELETE,資料可修訂、可演化 |
多維檢索 | 全文檢索索引 + 語義搜尋 + SQL 分析,四種查詢模式自由組合 |
版本追溯 | 每條資料自動產生唯一 ID,支援追溯、匯出與迴歸測試 |
使用步驟
環境準備
安裝 SDK
pip install alibabacloud-cms20240330-inner==6.0.8配置憑證
通過環境變數或 .env 檔案設定:
export ALIBABA_CLOUD_ACCESS_KEY_ID="your-access-key-id"
export ALIBABA_CLOUD_ACCESS_KEY_SECRET="your-access-key-secret"
export ALIBABA_CLOUD_ENDPOINT="cms.cn-shanghai.aliyuncs.com"
export ALIBABA_CLOUD_CMS_WORKSPACE="your-workspace"初始化用戶端
from alibabacloud_cms20240330.client import Client
from alibabacloud_tea_openapi.models import Config
config = Config(
access_key_id="your-access-key-id",
access_key_secret="your-access-key-secret",
endpoint="cms.cn-shanghai.aliyuncs.com",
)
client = Client(config)
workspace = "your-workspace"建立 Dataset
Schema 欄位類型
Dataset 支援使用者自訂 Schema,可選欄位類型:
類型 | 說明 | 可選能力 | 樣本欄位 |
| 文本類型,支援全文和語義檢索 |
| question、output |
| 長整型,支援數值範圍查詢 | — | input_tokens、latency_ms |
| 浮點型,支援數值範圍查詢 | — | score |
| JSON 類型,支援嵌套欄位索引 |
| metadata |
向量索引:對 text 類型欄位設定 embedding 即開啟向量索引,支援語義檢索。
內建 ID 主鍵:Dataset 自動為每條資料產生唯一的 id 主鍵。UPDATE 和 DELETE 必須通過該主鍵進行。
SDK 樣本
from alibabacloud_cms20240330.models import (
CreateDatasetRequest,
IndexJsonKey,
IndexKey,
)
schema = {
"input": IndexKey(
type="text",
chn=True, # 開啟中文分詞
embedding="text-embedding-v4", # 開啟向量索引
),
"output": IndexKey(
type="text",
chn=True,
embedding="text-embedding-v4",
),
"model": IndexKey(type="text"),
"score": IndexKey(type="double"),
"metadata": IndexKey(
type="json",
json_keys={
"input_tokens": IndexJsonKey(type="long"),
"output_tokens": IndexJsonKey(type="long"),
},
),
}
request = CreateDatasetRequest(
dataset_name="my_dataset",
description="AI 問答資料集",
schema=schema,
)
client.create_dataset(workspace, request)資料寫入
Dataset 支援通過 ExecuteQuery 介面執行 INSERT SQL 寫入。
插入資料(INSERT)
資料寫入通過 ExecuteQuery 介面執行標準 SQL。
單條插入:
from alibabacloud_cms20240330.models import ExecuteQueryRequest
sql = """
INSERT INTO my_dataset (input, output, model, score)
VALUES (
'如何查看最近一小時的錯誤記錄檔?',
'使用查詢語句: level:ERROR',
'qwen-plus',
0.95
)
"""
request = ExecuteQueryRequest(query=sql, type="SQL")
response = client.execute_query(workspace, "my_dataset", request)
print(f"affected_rows: {response.body.meta.affected_rows}")批量插入:
sql = """
INSERT INTO my_dataset (input, output, model, score)
VALUES
('統計今天各介面調用次數', 'SELECT api, count(*) ...', 'gpt-4o', 0.88),
('尋找響應逾時的請求', 'latency > 5000 | SELECT ...', 'claude-3.5-sonnet', 0.92)
"""
request = ExecuteQueryRequest(query=sql, type="SQL")
client.execute_query(workspace, "my_dataset", request)更新資料(UPDATE)
更新操作必須通過 id 主鍵進行,暫不支援批次更新:
sql = """
UPDATE my_dataset
SET score = 0.98, output = '最佳化後的回答...'
WHERE id = 'your-doc-id'
"""
request = ExecuteQueryRequest(query=sql, type="SQL")
client.execute_query(workspace, "my_dataset", request)刪除資料(DELETE)
刪除操作同樣必須通過 id 主鍵進行:
sql = "DELETE FROM my_dataset WHERE id = 'your-doc-id'"
request = ExecuteQueryRequest(query=sql, type="SQL")
client.execute_query(workspace, "my_dataset", request)提示:可先通過查詢擷取目標資料的 id,再執行更新或刪除。資料查詢
資料查詢通過 ExecuteQuery 介面(type="SQL"),支援四種查詢模式,可自由組合:
查詢模式 | 文法 | 說明 |
全文檢索索引 |
| 關鍵詞匹配,支援 AND / OR / 數值比較 |
語義搜尋 |
| 向量語義檢索(兩種形式) |
SQL 分析 |
| 標準 SQL 查詢與統計 |
組合查詢 |
| 自由組合 |
全文檢索索引
全文檢索索引使用關鍵詞匹配文法,與 SLS 查詢文法一致:
文法 | 說明 | 樣本 |
| 單欄位匹配 |
|
| 組合條件 |
|
| 或條件 |
|
| 數值比較 |
|
| 混合條件 |
|
使用關鍵詞匹配文法,可單獨使用或通過管道 | 與 SQL 組合:
from alibabacloud_cms20240330.models import ExecuteQueryRequest
# 全文檢索索引
request = ExecuteQueryRequest(query="input:錯誤", type="SQL")
response = client.execute_query(workspace, "my_dataset", request)
# 全文檢索索引 + SQL
query = "input:錯誤 | SELECT input, score FROM my_dataset ORDER BY score DESC LIMIT 5"
request = ExecuteQueryRequest(query=query, type="SQL")
response = client.execute_query(workspace, "my_dataset", request)語義搜尋
語義搜尋基於向量相似性進行檢索,前提是對應欄位已在 Schema 中配置 embedding 向量索引。
提供兩種使用形式,滿足不同的查詢和分析情境:
形式一:檢索文法 similarity()
用於管道 | 左側的檢索條件中,可與全文檢索索引文法通過 AND / OR混合使用:
# 語義搜尋
request = ExecuteQueryRequest(query="similarity(input, '日誌分析') < 0.3", type="SQL")
# 語義搜尋 + 全文檢索索引
request = ExecuteQueryRequest(
query="similarity(input, '日誌分析') < 0.3 AND model:qwen-plus",
type="SQL",
)
# 語義搜尋 + SQL
request = ExecuteQueryRequest(
query="similarity(input, '日誌分析') < 0.3 | SELECT input, score FROM my_dataset ORDER BY score DESC",
type="SQL",
)形式二:SQL 函數 semantic_distance()
用於管道 | 右側的 SQL 陳述式中,可在 SELECT、WHERE、ORDER BY 中靈活使用:
sql = """
SELECT input, semantic_distance(input, '日誌查詢統計') AS similarity
FROM my_dataset
WHERE semantic_distance(input, '日誌查詢統計') < 0.3
ORDER BY semantic_distance(input, '日誌查詢統計') ASC
"""
request = ExecuteQueryRequest(query=sql, type="SQL")
response = client.execute_query(workspace, "my_dataset", request)SQL 分析
Dataset 支援標準 SQL 查詢與統計分析,包括 GROUP BY / HAVING / ORDER BY / LIMIT / CTE / 子查詢 / 視窗函數等。SQL 引擎基於 PrestoSQL 文法,在服務端轉換為 PostgreSQL 執行。
sql = """
SELECT model, count(*) AS total, avg(score) AS avg_score
FROM my_dataset
GROUP BY model
ORDER BY total DESC
"""
request = ExecuteQueryRequest(query=sql, type="SQL")
response = client.execute_query(workspace, "my_dataset", request)分頁使用 LIMIT offset, count 文法:
page_size = 10
page = 2
skip = (page - 1) * page_size
# 第 2 頁(跳過 10 條,取 10 條)
sql = f"SELECT * FROM my_dataset ORDER BY score DESC LIMIT {skip}, {page_size}"
request = ExecuteQueryRequest(query=sql, type="SQL")
response = client.execute_query(workspace, "my_dataset", request)組合查詢
四種查詢模式可通過管道 | 自由組合,檢索條件放 | 左側,SQL 放右側:
# 全文 + SQL + semantic_distance
query = """
model:qwen-plus
| SELECT input, output, score
FROM my_dataset
WHERE semantic_distance(input, '資料分析') < 0.4
ORDER BY score DESC
LIMIT 10
"""
request = ExecuteQueryRequest(query=query, type="SQL")
response = client.execute_query(workspace, "my_dataset", request)關於 SQL 支援的完整能力(函數、子句、限制等),請參閱 Dataset 產品功能文檔。
Dataset 管理
操作 | API | 說明 |
建立 |
| 建立 Dataset 並定義 Schema |
查看 |
| 擷取 Dataset 詳情(含 Schema) |
列舉 |
| 列舉所有 Dataset,支援分頁和名稱過濾 |
更新 |
| 更新 Dataset 描述 |
刪除 |
| 刪除 Dataset(不可恢複) |
列舉 Dataset
from alibabacloud_cms20240330.models import ListDatasetsRequest
request = ListDatasetsRequest(max_results=100)
response = client.list_datasets(workspace, request)
for ds in response.body.datasets:
print(f"{ds.dataset_name}: {ds.description}")
# 按名稱過濾
request = ListDatasetsRequest(max_results=100, dataset_name="my_dataset")
response = client.list_datasets(workspace, request)擷取 Dataset 詳情
response = client.get_dataset(workspace, "my_dataset")
print(response.body.to_map()) # 包含 Schema、建立時間等更新 Dataset
from alibabacloud_cms20240330.models import UpdateDatasetRequest
request = UpdateDatasetRequest(description="更新後的描述")
client.update_dataset(workspace, "my_dataset", request)刪除 Dataset
# 謹慎操作,資料不可恢複
client.delete_dataset(workspace, "my_dataset")典型情境
情境一:Bad Case 管理
從線上資料中篩選低分樣本,人工標註後更新:
# 1. 篩選低分樣本
sql = "SELECT id, input, output, score FROM my_dataset WHERE score < 0.3 ORDER BY score ASC LIMIT 50"
request = ExecuteQueryRequest(query=sql, type="SQL")
response = client.execute_query(workspace, "my_dataset", request)
# 2. 人工審核後更新標註
sql = """
UPDATE my_dataset
SET human_label = 'hallucination', fix_suggestion = '需要增加事實核查'
WHERE id = 'bad-case-id'
"""
client.execute_query(workspace, "my_dataset", ExecuteQueryRequest(query=sql, type="SQL"))情境二:版本迴歸測試
基於 Dataset 構建評測基準集,對比不同模型版本效果:
# 擷取基準測試集
sql = "SELECT id, input, expected_output FROM my_dataset WHERE is_baseline = 'true'"
request = ExecuteQueryRequest(query=sql, type="SQL")
baseline = client.execute_query(workspace, "my_dataset", request)
# 運行新版本模型,對比結果
for sample in baseline.body.data:
new_output = run_new_model(sample["input"])
score = evaluate(new_output, sample["expected_output"])
# 記錄評測結果...情境三:訓練資料匯出
篩選高品質樣本匯出用於模型 SFT 微調或 RL 後訓練:
import json
# 查詢高品質樣本
sql = """
SELECT input, output FROM my_dataset
WHERE human_label = 'correct' AND score >= 0.9
LIMIT 10000
"""
request = ExecuteQueryRequest(query=sql, type="SQL")
response = client.execute_query(workspace, "my_dataset", request)
# 匯出為 JSONL 格式
with open("sft_data.jsonl", "w") as f:
for item in response.body.data:
f.write(json.dumps({
"input": item["input"],
"output": item["output"],
}, ensure_ascii=False) + "\n")
限制與約束
約束項 | 限制 | 說明 |
預設返回行數 | 1,000 | 未指定 LIMIT 時,預設返回 1000 條 |
單次查詢最大返回行數 | 100,000 | LIMIT 不可超過此值 |
單次查詢最大返回資料量 | 100MB | 單次查詢返回的資料量不超過此值 |
JOIN | 不支援 | 暫不支援任何類型的 JOIN 操作 |
集合操作 | 不支援 | 暫不支援 UNION / INTERSECT / EXCEPT |
跨 Dataset 查詢 | 不支援 | 暫不支援與其他 Dataset 的聯集查詢 |
UPDATE / DELETE 方式 | 僅支援按 | 暫不支援按條件批次更新 / 刪除 |
部分函數 | 不支援 |
|
參數預留位置 | 不支援 | 不支援 |
最佳實務
Schema 設計
有高頻語義搜尋需求的欄位,建議配置
embedding開啟向量索引。使用
json類型支援動態擴充的資料列,如中繼資料、自訂多維打標列等。
資料管理
通過查詢擷取
id後再執行更新 / 刪除。定期清理低品質資料,保持信噪比。
結合 Pipeline 實現自動化資料清洗入庫。
查詢最佳化
語義搜尋配合條件過濾縮小範圍。
巨量資料量情境建議使用分頁方式分批擷取資料。
複雜統計優先使用 SQL 分析。
常見問題
Dataset 與 LogStore 有什麼區別?
LogStore 是 Append-Only 的日誌儲存,適合寫入後不再修改的情境;Dataset 支援完整的 CRUD 操作,適合需要修訂、打標、版本管理的 AI 資料情境。
如何擷取資料的 ID?
插入資料時系統自動產生 id。可通過查詢擷取:
sql = "SELECT id, input FROM my_dataset LIMIT 10"
request = ExecuteQueryRequest(query=sql, type="SQL")
response = client.execute_query(workspace, "my_dataset", request)更新和刪除為什麼必須用 ID?
為保證資料一致性和操作安全,UPDATE 和 DELETE 目前僅支援按主鍵 id 操作,不支援批量條件更新 / 刪除。
語義搜尋的閾值如何選擇?
similarity() / semantic_distance() 返迴向量距離,範圍 0-1,越小越相似。建議:
0.1 - 0.2:嚴格匹配。
0.2 - 0.3:常規匹配。
0.3 - 0.5:寬鬆匹配。
資料如何自動入庫?
AgentLoop 提供 Pipeline 資料處理能力,支援從 LogStore 自動清洗、去重、評估後寫入 Dataset。詳見 Pipeline 使用指南。
API 參考
Dataset 管理
操作 | 方法 | 參數 |
建立 |
|
|
查看 |
| — |
列舉 |
|
|
更新 |
|
|
刪除 |
| — |
資料操作
所有資料操作統一通過 ExecuteQuery 介面:
from alibabacloud_cms20240330.models import ExecuteQueryRequest
request = ExecuteQueryRequest(query="...", type="SQL")
response = client.execute_query(workspace, dataset_name, request)參數 | 類型 | 說明 |
| string | 支援四種查詢模式:全文檢索索引、語義搜尋、SQL 分析、組合查詢。語義搜尋提供 |
| string | 目前固定值 |
響應結構
{
"data": [{"id": "...", "input": "...", "score": 0.95, ...}],
"meta": {
"count": 10,
"affectedRows": 0,
"elapsedMillisecond": 42,
"progress": "Complete"
},
"requestId": "..."
}欄位 | 說明 |
| 查詢結果數組(SELECT 操作) |
| 返回的資料條數 |
| 影響的行數(INSERT / UPDATE / DELETE 操作) |
| 查詢耗時(毫秒) |
SDK 範例程式碼
完整可啟動並執行範例程式碼見 dataset/samples/v2/ 目錄:
檔案 | 說明 | 代碼附件 |
| 端到端自閉環示範(建立→寫入→查詢→更新→刪除) | |
| Dataset 資源管理(建立 / 查看 / 列舉 / 更新 / 刪除) | |
| 資料寫入(單條插入 / 批量插入 / 更新 / 刪除) | |
| 資料查詢(全文檢索索引 / 語義搜尋 / SQL 分析 / 組合查詢 / 分頁) |