检查其他资源
- 为这个问题添加了一个非常描述性的标题。
- 使用集成搜索在LangChain文档中进行了搜索。
- 使用GitHub搜索找到了一个类似的问题,但没有找到。
- 我确信这是LangChain中的一个bug,而不是我的代码。
- 通过更新到LangChain的最新稳定版本(或特定集成包)无法解决此bug。
示例代码
from langchain_community.vectorstores import FAISS
from langchain_aws import BedrockEmbeddings
texts = ["I like apples", "I like oranges"]
distance_strategy = "MAX_INNER_PRODUCT"
embeddings = BedrockEmbeddings(
region_name="us-east-1", model_id="amazon.titan-embed-text-v1"
)
normalize_L2 = False
vectorstore = FAISS.from_texts(
texts,
embeddings,
distance_strategy=distance_strategy,
normalize_L2=normalize_L2
)
results = vectorstore.similarity_search_with_score("I like apples", k=1)
print(results)
normalize_L2 = True
vectorstore = FAISS.from_texts(
texts,
embeddings,
distance_strategy=distance_strategy,
normalize_L2=normalize_L2
)
results = vectorstore.similarity_search_with_score("I like apples", k=1)
print(results)
results = vectorstore.similarity_search_with_relevance_scores("I like apples", k=1)
print(results)
错误信息和堆栈跟踪(如果适用)
- 无响应*
描述
根据FAISS,首先需要对向量进行归一化,然后使用内积构建索引以获得余弦相似度。然而,运行上面的代码时,当设置normalize_L2 = True
时,会出现警告:
UserWarning: Normalizing L2 is not applicable for metric type: MAX_INNER_PRODUCT
此外,相关性分数不符合直觉。如果我们计算余弦相似度,那么从similarity_search_with_relevance_scores
获得的相关性分数应该与从similarity_search_with_score
获得的相关性分数相同。然而,实现将导致两个向量更接近时的相关性分数较小。
langchain/libs/core/langchain_core/vectorstores/base.py
第422行至第427行 fd54619
| def_max_inner_product_relevance_score_fn(distance: float) ->float: |
| """将距离归一化为[0, 1]范围内的分数.""" |
| if distance > 0: |
| return 1.0 - distance |
| |
| return -1.0 * distance |
2条答案
按热度按时间zpjtge221#
关于相关性分数问题,之前提到了一些问题:#9519、#22209和#14948。而
normalize_L2
问题从未讨论过。我想这是因为许多嵌入模型对嵌入进行归一化处理,而Titan嵌入模型没有这样做。运行上述代码将给出以下输出:
0pizxfdo2#
如果这种行为确实出乎意料,我可以帮忙提交PR来解决这个问题。