编程 Venice Read Compute:把字段投影和向量点积下推到服务端

2026-09-20 00:04:11

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 向量字段与查询向量做点积,返回标量,结果写入 resultFieldNameinputFieldName 必须是 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 Client2 hops

关键词:Read Compute、Venice、Da Vinci、读时计算、下推、向量检索

推荐文章

程序员茄子在线接单