You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vespa查询时无法识别嵌入ID,检索阶段嵌入功能异常

问题解决:Vespa检索时"Multiple embedders are provided but no embedder id is given"错误

错误核心

检索时触发非法查询错误,提示存在多个嵌入器(x、y)但未指定使用哪一个,导致查询字符串无法完成嵌入处理。索引阶段正常,说明嵌入器配置本身有效,仅查询阶段缺少指定逻辑。

问题分析

  1. 错误提示指向embed(x, qes?)调用未指定嵌入器ID,系统识别到x、y两个可用嵌入器,无法自动选择。
  2. 查询代码存在两处关键问题:
    • YQL语句中的nearestNeighbor(x,y)未关联正确的查询嵌入参数,也未指定嵌入器
    • 请求body中的x,y写法无效,未正确传递查询嵌入或嵌入器指定信息
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 01:35:30