OceanBase seekdb 是什么 OceanBase seekdb 是一个支持向量搜索、全文检索、混合搜索和数据库内 AI 推理的 AI 原生数据库。如果你熟悉 MySQL,你会发现 OceanBase seekdb 的 SQL 用法几乎完全一致,同时它还额外提供了向量和 AI 能力。 OceanBase seekdb-cli 同样适用于 OceanBase 的 MySQL 模式和 MySQL 数据库。
为什么需要 OceanBase seekdb-cli
核心特性详解
seekdb schema tables
{
"ok": true,
"data": [
{"name": "orders", "columns": 4, "rows": 3}
]
}
seekdb --format table schema tables
{"ok": false, "error": {"code": "LIMIT_REQUIRED", "message": "Query returns more than 100 rows. Please add LIMIT to your SQL."}}
# 读操作,直接执行 seekdb sql "SELECT * FROM orders LIMIT 10" # 写操作,必须加 --write seekdb sql --write "INSERT INTO orders (user_id, amount, status, phone) VALUES (4, 199.00, 'paid', '13700000001')" # 危险操作,即使加了 --write 也会被拦截 seekdb sql --write "DELETE FROM orders" # ← 没有 WHERE,被拦截!
seekdb sql "SELECT * FROM orders LIMIT 3"
{"ok": true, "columns": ["id", "user_id", "amount", "status", "phone"], "rows": [
{"id": 1, "user_id": 1, "amount": "99.00", "status": "paid", "phone": "138****5678"},
{"id": 2, "user_id": 2, "amount": "256.50", "status": "paid", "phone": "139****4321"},
{"id": 3, "user_id": 1, "amount": "38.00", "status": "pending", "phone": "136****1234"}
], "time_ms": 9}
seekdb sql "SELECT price FROM orders LIMIT 5"
{"ok": false, "error": {"code": "SQL_ERROR", "message": "execute sql failed 1054 Unknown column 'price' in 'field list'"}, "schema": {"table": "orders", "columns": ["id", "user_id", "amount", "status", "phone"], "indexes": ["PRIMARY(id)"]}}
seekdb sql "SELECT * FROM ordes LIMIT 5"
{"ok": false, "error": {"code": "SQL_ERROR", "message": "execute sql failed 1146 Table 'test.ordes' doesn't exist"}, "schema": {"tables": ["orders"]}}
seekdb ai-guide
安装与连接
pip install seekdb-cli
mkdir -p ~/.seekdb # 连接远程 seekdb / OceanBase / MySQL echo 'SEEKDB_DSN="seekdb://user:password@host:port/database"' > ~/.seekdb/config.env # 或使用嵌入式模式(指定本地数据库路径) echo 'SEEKDB_DSN="embedded:/path/to/mydata"' > ~/.seekdb/config.env
seekdb status
{
"ok": true,
"data": {
"cli_version": "0.1.0",
"mode": "embedded",
"server_version": "...",
"database": "test",
"connected": true
}
}
seekdb sql --write "CREATE TABLE orders (id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, amount DECIMAL(10,2), status VARCHAR(20), phone VARCHAR(20))" seekdb sql --write "INSERT INTO orders (user_id, amount, status, phone) VALUES (1, 99.00, 'paid', '13812345678'), (2, 256.50, 'paid', '13987654321'), (1, 38.00, 'pending', '13612341234')" seekdb sql "SELECT * FROM orders LIMIT 10"
seekdb --format table sql "SELECT * FROM orders LIMIT 10"
# 验证连接(自动使用默认数据库 ~/.seekdb/seekdb.db) seekdb status
mkdir -p ~/.seekdb echo 'SEEKDB_DSN="embedded:/path/to/your/data/directory"' > ~/.seekdb/config.env
# 用户表 seekdb sql --write " CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), email VARCHAR(100), phone VARCHAR(20), city VARCHAR(20), created_at DATETIME DEFAULT CURRENT_TIMESTAMP )" # 商品表 seekdb sql --write " CREATE TABLE products ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100), category VARCHAR(50), price DECIMAL(10,2), stock INT )" # 订单表(关联用户和商品) seekdb sql --write " CREATE TABLE orders ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, product_id INT, quantity INT, amount DECIMAL(10,2), status VARCHAR(20), created_at DATETIME DEFAULT CURRENT_TIMESTAMP )"
# 用户数据(10 个用户,来自不同城市)
seekdb sql --write "
INSERT INTO users (name, email, phone, city) VALUES
('张三', 'zhang@example.com', '13812345678', '北京'),
('李四', 'li@example.com', '13987654321', '上海'),
('王五', 'wang@example.com', '13600000001', '广州'),
('赵六', 'zhao@example.com', '13700000002', '深圳'),
('陈七', 'chen@example.com', '13800000003', '北京'),
('周八', 'zhou@example.com', '13900000004', '上海'),
('吴九', 'wu@example.com', '13600000005', '成都'),
('郑十', 'zheng@example.com', '13700000006', '杭州'),
('冯十一', 'feng@example.com', '13800000007', '北京'),
('褚十二', 'chu@example.com', '13900000008', '上海')"
# 商品数据(不同品类)
seekdb sql --write "
INSERT INTO products (name, category, price, stock) VALUES
('无线蓝牙耳机', '数码', 299.00, 500),
('机械键盘', '数码', 599.00, 200),
('人体工学椅', '家具', 1299.00, 80),
('咖啡豆(500g)', '食品', 89.00, 1000),
('运动水壶', '户外', 59.00, 800),
('笔记本支架', '数码', 199.00, 300),
('降噪耳机', '数码', 999.00, 150),
('瑜伽垫', '户外', 149.00, 400)"
# 订单数据(近 30 天,模拟真实分布)
seekdb sql --write "
INSERT INTO orders (user_id, product_id, quantity, amount, status, created_at) VALUES
(1, 2, 1, 599.00, 'paid', DATE_SUB(NOW(), INTERVAL 1 DAY)),
(1, 7, 1, 999.00, 'paid', DATE_SUB(NOW(), INTERVAL 3 DAY)),
(2, 1, 2, 598.00, 'paid', DATE_SUB(NOW(), INTERVAL 2 DAY)),
(2, 3, 1, 1299.00, 'paid', DATE_SUB(NOW(), INTERVAL 5 DAY)),
(3, 4, 3, 267.00, 'paid', DATE_SUB(NOW(), INTERVAL 1 DAY)),
(3, 5, 2, 118.00, 'pending', DATE_SUB(NOW(), INTERVAL 6 DAY)),
(4, 6, 1, 199.00, 'paid', DATE_SUB(NOW(), INTERVAL 4 DAY)),
(4, 2, 1, 599.00, 'paid', DATE_SUB(NOW(), INTERVAL 2 DAY)),
(5, 1, 1, 299.00, 'paid', DATE_SUB(NOW(), INTERVAL 3 DAY)),
(5, 8, 2, 298.00, 'refund', DATE_SUB(NOW(), INTERVAL 7 DAY)),
(6, 7, 1, 999.00, 'paid', DATE_SUB(NOW(), INTERVAL 1 DAY)),
(7, 3, 1, 1299.00, 'paid', DATE_SUB(NOW(), INTERVAL 4 DAY)),
(8, 4, 5, 445.00, 'paid', DATE_SUB(NOW(), INTERVAL 2 DAY)),
(9, 2, 2, 1198.00, 'paid', DATE_SUB(NOW(), INTERVAL 6 DAY)),
(10,1, 1, 299.00, 'pending', DATE_SUB(NOW(), INTERVAL 1 DAY)),
(1, 5, 3, 177.00, 'paid', DATE_SUB(NOW(), INTERVAL 15 DAY)),
(2, 8, 1, 149.00, 'paid', DATE_SUB(NOW(), INTERVAL 20 DAY)),
(3, 6, 2, 398.00, 'paid', DATE_SUB(NOW(), INTERVAL 25 DAY))"
# 准备文档文件
cat > docs.jsonl << 'EOF'
{"id": "doc1", "text": "seekdb 部署指南:支持 Docker 一键部署,也可以通过二进制包手动安装。推荐使用 Docker Compose 部署生产环境。"}
{"id": "doc2", "text": "seekdb 向量索引原理:使用 HNSW 算法构建向量索引,支持余弦相似度、欧氏距离等多种距离度量。"}
{"id": "doc3", "text": "seekdb 混合搜索:将语义向量搜索和 BM25 全文检索的结果通过 RRF 算法融合,在召回率和精度上优于单一搜索方式。"}
{"id": "doc4", "text": "seekdb 性能调优:合理设置 HNSW 的 ef_construction 参数可以在索引速度和搜索精度之间取得平衡。"}
{"id": "doc5", "text": "seekdb 数据备份:支持逻辑备份和物理备份两种方式,生产环境建议每天全量备份并配合 binlog 实现 PITR。"}
EOF
# 创建向量集合
seekdb collection create product_docs --dimension 384 --distance cosine
# 导入文档(seekdb 自动调用内置嵌入模型生成向量)
seekdb add product_docs --file docs.jsonl
OceanBase seekdb-cli 的 Agent Skill
pip install seekdb-agent-skills
seekdb-agent-skills
场景一:探索一个陌生数据库
# 第一步:看有哪些表
seekdb schema tables
{"ok": true, "data": [
{"name": "users", "columns": 6, "rows": 10},
{"name": "products", "columns": 5, "rows": 8},
{"name": "orders", "columns": 7, "rows": 18}
]}
# 第二步:看 orders 表的详细结构
seekdb schema describe orders
{"ok": true, "data": {"table": "orders", "columns": [
{"name": "id", "type": "INT", "nullable": false, "key": "PRI"},
{"name": "user_id", "type": "INT", "nullable": true},
{"name": "product_id", "type": "INT", "nullable": true},
{"name": "quantity", "type": "INT", "nullable": true},
{"name": "amount", "type": "DECIMAL(10,2)","nullable": true},
{"name": "status", "type": "VARCHAR(20)", "nullable": true},
{"name": "created_at", "type": "DATETIME", "nullable": true}
]}}
# 第三步:分析订单数据的分布画像
seekdb table profile orders
{"ok": true, "data": {"table": "orders", "row_count": 18,
"columns": [
{"name": "status", "null_rate": 0, "distinct": 3,
"top_values": [{"value": "paid", "count": 14}, {"value": "pending", "count": 2}, {"value": "refund", "count": 1}]},
{"name": "amount", "null_rate": 0, "min": 118.00, "max": 1299.00, "avg": 513.17}
]
}}
# 第四步:推断表之间的关联关系
seekdb relations infer
{"ok": true, "data": {"relations": [
{"from": "orders.user_id", "to": "users.id", "confidence": 0.95},
{"from": "orders.product_id", "to": "products.id", "confidence": 0.92}
]}}
场景二:用自然语言查数据
# 第一步:先查 Top 5 用户 ID 和金额
seekdb sql "
SELECT user_id, SUM(amount) AS total
FROM orders
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)
AND status = 'paid'
GROUP BY user_id
ORDER BY total DESC
LIMIT 5"
{"ok": true, "columns": ["user_id", "total"], "rows": [
{"user_id": 2, "total": "1897.00"},
{"user_id": 9, "total": "1198.00"},
{"user_id": 7, "total": "1299.00"},
{"user_id": 6, "total": "999.00"},
{"user_id": 1, "total": "598.00"}
], "time_ms": 12}
# 第二步:关联 users 表获取姓名和城市
seekdb sql "
SELECT u.name, u.city, SUM(o.amount) AS total
FROM orders o JOIN users u ON o.user_id = u.id
WHERE o.created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)
AND o.status = 'paid'
GROUP BY u.id, u.name, u.city
ORDER BY total DESC
LIMIT 5"
{
"ok": true,"columns": ["name", "city", "total"],"rows": [
{"name": "李四", "city": "上海", "total": "1897.00"},
{"name": "张三", "city": "北京", "total": "1598.00"},
{"name": "吴九", "city": "成都", "total": "1299.00"},
{"name": "冯十一", "city": "北京", "total": "1198.00"},
{"name": "周八", "city": "上海", "total": "999.00"}
],
"affected": 0,
"time_ms": 0
}
场景三:搜索向量集合
# 第一步:确认集合状态
seekdb collection info product_docs
{"ok": true, "data": {"name": "product_docs", "count": 5, "dimension": 384, "distance": "cosine"}}
# 第二步:语义搜索
seekdb query product_docs --text "部署指南" --limit 5
{
"ok": true,"data": {"results": [
{
"id": "doc1",
"score": 0.6445,
"document": "seekdb 部署指南:支持 Docker 一键部署...",
"metadata": {}
},
{
"id": "doc2",
"score": 0.3827,
"document": "seekdb 向量索引原理:使用 HNSW 算法构建向量索引...",
"metadata": {}
},
{
"id": "doc5",
"score": 0.3103,
"document": "seekdb 数据备份:支持逻辑备份和物理备份两种方式...",
"metadata": {}
},
{
"id": "doc3",
"score": 0.2157,
"document": "seekdb 混合搜索:将语义向量搜索和 BM25 全文检索的结果...",
"metadata": {}
},
{
"id": "doc4",
"score": 0.2089,
"document": "seekdb 性能调优:合理设置 HNSW 的 ef_construction 参数...",
"metadata": {}
}
],
"count": 5
},
"time_ms": 4259
}
场景四:通过管道组合
# 用 jq 从查询结果中筛选出上海用户
seekdb sql "SELECT * FROM users LIMIT 100" | jq '.rows[] | select(.city == "上海") | {name, email}'
# 统计各城市的付款订单总金额,输出 CSV 格式
seekdb sql "SELECT u.city, SUM(o.amount) as gmv FROM orders o JOIN users u ON o.user_id=u.id WHERE o.status='paid' GROUP BY u.city ORDER BY gmv DESC LIMIT 10" \
| jq -r '["city","gmv"], (.rows[] | [.city, .gmv]) | @csv'
# 将数据导入集合
cat docs.jsonl | seekdb add product_docs --stdin
pip install seekdb-cli
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69909943/viewspace-3117938/ ,如需转载,请注明出处,否则将追究法律责任。