From ffda3c5c9f95b0303974b2745e496bd44d00fdfb Mon Sep 17 00:00:00 2001 From: "an.haimeng@opendco.cn" Date: Wed, 17 Jan 2024 16:48:51 +0800 Subject: [PATCH 1/2] Fix ValueError: diag requires an array of at least two dimensions #474 Detailed description: - Directly use the single element as the score if the similarity array has only one item, instead of attempting to extract a diagonal. - Added a condition to check similarity.size to determine whether diagonal extraction is necessary. - Updated unit tests to reflect this change. Fixes #474 --- src/ragas/metrics/_answer_similarity.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/ragas/metrics/_answer_similarity.py b/src/ragas/metrics/_answer_similarity.py index 09b13de9b..ca254e9d1 100644 --- a/src/ragas/metrics/_answer_similarity.py +++ b/src/ragas/metrics/_answer_similarity.py @@ -92,7 +92,12 @@ async def _ascore(self: t.Self, row: t.Dict, callbacks: Callbacks = []) -> float ) embeddings_2 = np.array(await self.embeddings.aembed_documents(answers)) similarity = embeddings_1 @ embeddings_2.T - scores = np.diagonal(similarity) + if similarity.size == 1: + # If similarity has only one value, directly use this value as scores + scores = similarity.flatten() + else: + # If similarity contains multiple values, extract the diagonal as scores + scores = np.diagonal(similarity) assert isinstance(scores, np.ndarray), "Expects ndarray" if self.threshold: From 4e84cdfd6e3fad5cd625a6428a12ecfd1af82fec Mon Sep 17 00:00:00 2001 From: Shahules786 Date: Sat, 20 Jan 2024 11:27:13 -0800 Subject: [PATCH 2/2] fix for single scoring --- src/ragas/metrics/_answer_similarity.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/ragas/metrics/_answer_similarity.py b/src/ragas/metrics/_answer_similarity.py index ca254e9d1..00fd273da 100644 --- a/src/ragas/metrics/_answer_similarity.py +++ b/src/ragas/metrics/_answer_similarity.py @@ -70,7 +70,12 @@ def _score(self, row: t.Dict, callbacks: Callbacks) -> float: embeddings_1 = np.array(self.embeddings.embed_documents(ground_truths)) embeddings_2 = np.array(self.embeddings.embed_documents(answers)) similarity = embeddings_1 @ embeddings_2.T - scores = np.diagonal(similarity) + if similarity.size == 1: + # If similarity has only one value, directly use this value as scores + scores = similarity.flatten() + else: + # If similarity contains multiple values, extract the diagonal as scores + scores = np.diagonal(similarity) assert isinstance(scores, np.ndarray), "Expects ndarray" if self.threshold: @@ -93,10 +98,8 @@ async def _ascore(self: t.Self, row: t.Dict, callbacks: Callbacks = []) -> float embeddings_2 = np.array(await self.embeddings.aembed_documents(answers)) similarity = embeddings_1 @ embeddings_2.T if similarity.size == 1: - # If similarity has only one value, directly use this value as scores scores = similarity.flatten() else: - # If similarity contains multiple values, extract the diagonal as scores scores = np.diagonal(similarity) assert isinstance(scores, np.ndarray), "Expects ndarray"