llama_index ``` [Question]: similarity_top_k not clear ```

inb24sb2  于 5个月前  发布在  其他
关注(0)|答案(5)|浏览(61)

问题验证

  • 我已经在文档和Discord上寻找答案。

问题

我仍然不明白为什么在设置了similarity_top_k之后,我在检索中得到的结果有时会更少。
示例:

index = VectorStoreIndex(
        nodes=nodes,
        storage_context=storage_context,
        similarity_top_k=10
    )
print(len(index.as_retriever().retrieve(query))) #  returns 5
iqxoj9l9

iqxoj9l91#

VectorStoreIndex类处理了当存在少于similarity_top_k相关节点的情况,只需返回可用节点直到找到的数量。这意味着如果你将similarity_top_k设置为10,但只找到了5个相关节点,它将返回这5个节点而不引发错误1(https://github.com/run-llama/llama_index/blob/main/llama-index-integrations/vector_stores/llama-index-vector-stores-weaviate/llama_index/vector_stores/weaviate/base.py)2(https://github.com/run-llama/llama_index/blob/main/llama-index-core/llama_index/core/indices/vector_store/retrievers/retriever.py)。

  • 要继续与Dosu交谈,请提及@dosu。*
sd2nnvve

sd2nnvve2#

但是基于什么来确定相关节点呢?我们不应该计算余弦距离并得到最接近的前10个元素吗?

pod7payv

pod7payv3#

VectorStoreIndex类中,节点的相关内容是基于它们与查询嵌入的余弦相似度。实际上,余弦距离被用来获取最接近的前10个元素。
下面是一个函数,展示了如何计算余弦相似度并用于检索最接近的前k个元素:

def get_top_k_embeddings(
    query_embedding: List[float],
    doc_embeddings: List[List[float]],
    doc_ids: List[str],
    similarity_top_k: int = 5,
) -> Tuple[List[float], List]:
    """Get top nodes by similarity to the query."""
    qembed_np = np.array(query_embedding)
    dembed_np = np.array(doc_embeddings)
    dproduct_arr = np.dot(dembed_np, qembed_np)
    norm_arr = np.linalg.norm(qembed_np) * np.linalg.norm(dembed_np, axis=1)
    cos_sim_arr = dproduct_arr / norm_arr

    tups = [(cos_sim_arr[i], doc_ids[i]) for i in range(len(doc_ids))]
    sorted_tups = sorted(tups, key=lambda t: t[0], reverse=True)[:similarity_top_k]

    result_similarities = [s for s, _ in sorted_tups]
    result_ids = [n for _, n in sorted_tups]
    return result_similarities, result_ids

此函数计算查询嵌入与文档嵌入之间的余弦相似度,对它们进行排序,并返回最接近的前k个元素1(https://github.com/run-llama/llama_index/blob/main/docs/docs/examples/low_level/vector_store.ipynb)2(https://github.com/run-llama/llama_index/blob/main/llama-index-integrations/vector_stores/llama-index-vector-stores-upstash/llama_index/vector_stores/upstash/base.py)3(https://github.com/run-llama/llama_index/blob/main/llama-index-integrations/vector_stores/llama-index-vector-stores-cassandra/llama_index/vector_stores/cassandra/base.py)4(https://github.com/run-llama/llama_index/blob/main/llama-index-legacy/llama_index/legacy/vector_stores/cassandra.py)。

  • 要继续与Dosu交谈,请提及@dosu。*
yuvru6vn

yuvru6vn4#

如果你的索引中有重复项,它们将从初始的前k个结果中移除。

egmofgnx

egmofgnx5#

如果我的top k是10,只有5个被返回,那么其他5个是重复的吗?

相关问题