向量检索在 AI 应用里很常见,但很多工业项目不想为了几个知识库、工单匹配或故障相似度查询再部署一套独立向量数据库。SonnetDB 的思路是把 VECTOR(N) 作为 measurement field,让向量和设备、时间、标签一起进入同一套查询模型。
下面用 C# 嵌入式 API 写一个完整例子。
using SonnetDB.Engine;
using SonnetDB.Sql;
using SonnetDB.Sql.Execution;using var db = Tsdb.Open(new TsdbOptions
{RootDirectory = "data/vector-demo"
});SqlExecutor.Execute(db, """CREATE MEASUREMENT device_embeddings (device_id TAG,source TAG,embedding FIELD VECTOR(4))""");SqlExecutor.Execute(db, """INSERT INTO device_embeddings (time, device_id, source, embedding)VALUES(1713676800000, 'pump-1', 'alarm', [1.0, 0.0, 0.0, 0.0]),(1713676801000, 'pump-2', 'alarm', [0.8, 0.2, 0.0, 0.0]),(1713676802000, 'fan-1', 'log', [0.0, 1.0, 0.0, 0.0])""");var result = (SelectExecutionResult)SqlExecutor.Execute(db, """SELECT *FROM knn(device_embeddings, embedding, [1.0, 0.0, 0.0, 0.0], 2, 'cosine')WHERE source = 'alarm'""");foreach (var row in result.Rows)
{Console.WriteLine($"time={row[0]}, distance={row[1]}, device={row[2]}");
}
knn(measurement, column, query_vector, k, metric) 返回的前两列固定是 time 和 distance,后面跟 measurement 的 tag 和 field。因为这里声明了 device_id、source 和 embedding,所以结果列会是:
time, distance, device_id, source, embedding
距离度量怎么选
SonnetDB 当前支持三类度量:
'cosine'或'cosine_distance':适合文本 embedding、语义搜索、归一化向量。'l2'、'l2_distance'或'euclidean':适合传感器特征、轨迹特征等物理距离含义更强的向量。'inner_product'、'dot'或'ip':适合希望最大化点积的场景。
所有度量在 KNN 输出里都遵循“距离越小越相似”的排序习惯。
加上时间窗口
工业数据通常要按时间收窄候选集:
var recent = (SelectExecutionResult)SqlExecutor.Execute(db, """SELECT *FROM knn(device_embeddings, embedding, [1, 0, 0, 0], 5)WHERE source = 'alarm'AND time >= 1713676800000AND time < 1713676810000""");
这比单纯向量库多了一层业务语义:先按 tag 和时间窗口缩小数据,再做向量相似度。对设备故障、巡检记录、报警摘要来说,这个组合非常实用。
官网地址:https://sonnetdb.com
技术文章站:https://iotpaper.net
开源仓库:https://github.com/IoTSharp/SonnetDB
