Vespa查询时无法识别嵌入ID,检索阶段嵌入功能异常
问题解决:Vespa检索时"Multiple embedders are provided but no embedder id is given"错误
错误核心
检索时触发非法查询错误,提示存在多个嵌入器(x、y)但未指定使用哪一个,导致查询字符串无法完成嵌入处理。索引阶段正常,说明嵌入器配置本身有效,仅查询阶段缺少指定逻辑。
问题分析
- 错误提示指向
embed(x, qes?)调用未指定嵌入器ID,系统识别到x、y两个可用嵌入器,无法自动选择。 - 查询代码存在两处关键问题:
- YQL语句中的
nearestNeighbor(x,y)未关联正确的查询嵌入参数,也未指定嵌入器 - 请求body中的
x,y写法无效,未正确传递查询嵌入或嵌入器指定信息
- YQL语句中的
- Rank Profile配置中
inputs=[("query(query_embedding)", "ten")]的类型ten需确认是否与tensor字段的类型定义一致(当前映射中有tensor类型字段,可能存在类型不匹配)
解决方案
方案1:查询时明确指定嵌入器ID
修改YQL语句,在embed调用中指定要使用的嵌入器(比如选择x),同时确保Rank Profile逻辑匹配:
result = self.vespa_app.query( yql="select * from sources * where {targetHits: 10}nearestNeighbor(x, embed(x, qes?, embedder(x))) and doc_id = " + f"{doc_id}", query=query, ranking="default", hits=1, )
方案2:使用预计算嵌入向量(推荐)
取消注释查询代码中预计算嵌入的逻辑,直接将生成的向量传入查询参数,避免在Vespa端触发自动嵌入:
def get_to(self, query: str, doc_id: int): with self.vespa_app.syncio(connections=12) as session: start = time.time() print(f"Got the Query:- {query}") st = time.time() # 预计算查询嵌入向量 embeddings = self.vespa_obj.embedding_function.embed_query(query) print(f"Time to get the Embeddings:- {round(time.time()-st, 2)}s") result = self.vespa_app.query( yql="select * from sources * where {targetHits: 10}nearestNeighbor(x, query_embedding) and doc_id = "+ f"{doc_id}", ranking="default", # 将预计算的向量传入query_embedding参数 body={"query_embedding": embeddings}, hits=1, ) assert(result.is_successfull()) end = time.time() total_time = round(end-start, 2) print(f"Search time:- {total_time}s") return self.display_hits_as_df(result, self.vespa_obj.meta_variables+['text']), total_time
同时调整Rank Profile配置,确保与输入参数匹配:
self.app_package.schema.add_rank_profile( RankProfile( name="default", first_phase="closeness(x, query_embedding)", # 匹配输入的query_embedding参数 inputs=[("query(query_embedding)", "tensor<float>(d0:768)")], # 替换为你的tensor实际维度 ) )
方案3:设置默认嵌入器
在Vespa应用配置中指定默认嵌入器,避免每次查询手动指定:
self.app_package.add_model( Model( id="default_embedder", name="x", # 指定默认使用x嵌入器 type="tensor", parameters={"output": "tensor<float>(d0:768)"} ) )
关键注意事项
- 确保tensor字段的类型定义(比如
type="tensor<float>(d0:768)")与Rank Profile输入、嵌入向量维度完全一致 - 若使用Vespa内置嵌入模型,需在应用配置中正确注册所有嵌入器(x、y)并明确各自ID
内容的提问来源于stack exchange,提问作者user10516115
相关产品推荐
相关产品推荐

