Venice Read Compute:把字段投影和向量点积下推到服务端
Venice 是 LinkedIn 开源的 derived data platform。
- 仓库:
- 文档:
它的读路径提供三类 API:single get、batch get、read compute。前两类是常规的按 key 取值,read compute 的定义是:project some fields and/or compute some function on the fields of values associated with a set of keys。仓库 README 明确写了它是 server-side operations,目的是减少网络传输——字段投影和计算都在服务端完成,客户端只拿到结果。
支持的算子
算子在 ComputeRequestBuilder 的 javadoc 与 README 中列出:
project(String... fieldNames)/project(Collection):只返回指定字段。文档注明 "right now only top-level fields are supported",即只支持顶层字段。dotProduct(String inputFieldName, List dotProductParam, String resultFieldName):把存储中的某个 float 向量字段与查询向量做点积,返回标量,结果写入resultFieldName。inputFieldName必须是 value record 的顶层字段。cosineSimilarity(String inputFieldName, List cosSimilarityParam, String resultFieldName):余弦相似度,返回标量。hadamardProduct(String inputFieldName, List hadamardProductParam, String resultFieldName):Hadamard 积,返回向量。javadoc 注明,调用这个 API 时 compute request 的 version header 要用 version 2。count(String inputFieldName, String resultFieldName):返回 array/map 字段的元素个数(number of records for array/map field)。
AvroGenericReadComputeStoreClient 上还有 computeWithKeyPrefixFilter(byte[] keyPrefix, ComputeRequestWrapper, StreamingCallback) 和 computeAggregation()(聚合,例如 count)。javadoc 说明这个接口是 internal、subject to change。
调用形态
thin client 文档给出的示例:
Set keys = Set.of("key1", "key2", "key3");
List queryVector = Arrays.asList(0.1f, 0.2f, 0.3f);
client.compute()
.project("field1", "field2")
.dotProduct("embedding", queryVector, "similarity")
.execute(keys)
.whenComplete((results, error) -> {
...
results.forEach((key, record) -> record.get("similarity"));
});
streamingExecute(Set keys) 与 execute 的差别:超时发生时它返回已经可用的响应,而不是抛 TimeoutException。另有回调形式 streamingExecute(keys, StreamingCallback)。
executeWithFilter(Predicate predicate, StreamingCallback callback) 标注为 @Experimental:对满足 predicate 的 key 执行 compute,可用于 partial key lookups。predicate 指定一些必要的 leading top-level key fields;predicate 传 null 时对所有 value 执行。文档说明这个实验特性未来可能有不兼容变更。
两种客户端模式
Classical Venice:对远端分布式后端做远程查询,read compute 下推到后端,只有计算结果返回客户端。
Da Vinci:预先加载部分或全部 partition 到本地缓存,查询打在本地缓存上,后续更新持续从流中应用。
客户端类型与延迟
架构文档中的一张表:
| 客户端 | hop | 延迟 | 说明 |
|---|---|---|---|
| Thin Client | 2 hops | 。 |
关键词:Read Compute、Venice、Da Vinci、读时计算、下推、向量检索