LangChain “DistanceStrategy导入错误”引起“更改相似检索方法失效”
**问题:**我们想通过如下方式去修改相似度计算的方法为点积(默认是欧式距离),但修改后发现无效。
db = FAISS.from_texts(texts, embeddings, metadatas=metadatas, distance_strategy=DistanceStrategy.MAX_INNER_PRODUCT)
查看源码:在执行“if distance_strategy == DistanceStrategy.MAX_INNER_PRODUCT:”判断时,结果为false,导致选择的faiss索引为IndexFlatL2(采用欧氏距离)。
@classmethod
def __from(
cls,
texts: Iterable[str],
embeddings: List[List[float]],
embedding: Embeddings,
metadatas: Optional[Iterable[dict]] = None,
ids: Optional[List[str]] = None,
normalize_L2: bool = False,
distance_strategy: DistanceStrategy = DistanceStrategy.EUCLIDEAN_DISTANCE,
**kwargs: Any,
) -> FAISS:
faiss = dependable_faiss_import()
if distance_strategy == DistanceStrategy.MAX_INNER_PRODUCT:
index = faiss.IndexFlatIP(len(embeddings[0]))
else:
# Default to L2, currently other metric types not initialized.
index = faiss.IndexFlatL2(len(embeddings[0]))
vecstore = cls(
embedding.embed_query,
index,
InMemoryDocstore(),
{},
normalize_L2=normalize_L2,
distance_strategy=distance_strategy,
**kwargs,
)
vecstore.__add(texts, embeddings, metadatas=metadatas, ids=ids)
return vecstore
解决方案:导入错误引起。
# 将:
from langchain.vectorstores.pgvector import DistanceStrategy
# 修改为:
from langchain.vectorstores.utils import DistanceStrategy