33from enum import Enum
44
55from langchain_core .callbacks import Callbacks
6- from rapidfuzz import distance
76
87from ragas .dataset_schema import SingleTurnSample
98from ragas .metrics .base import MetricType , SingleTurnMetric
@@ -16,13 +15,6 @@ class DistanceMeasure(Enum):
1615 JARO = "jaro"
1716
1817
19- DISTANCE_MEASURE_MAP = {
20- DistanceMeasure .LEVENSHTEIN : distance .Levenshtein ,
21- DistanceMeasure .HAMMING : distance .Hamming ,
22- DistanceMeasure .JARO : distance .Jaro ,
23- }
24-
25-
2618@dataclass
2719class ExactMatch (SingleTurnMetric ):
2820 name : str = "exact_match" # type: ignore
@@ -42,6 +34,7 @@ async def _ascore(self, row: t.Dict, callbacks: Callbacks) -> float:
4234 return await self ._single_turn_ascore (SingleTurnSample (** row ), callbacks )
4335
4436
37+ @dataclass
4538class StringPresent (SingleTurnMetric ):
4639 name : str = "string_present" # type: ignore
4740 _required_columns : t .Dict [MetricType , t .Set [str ]] = field (
@@ -64,13 +57,28 @@ async def _ascore(self, row: t.Dict, callbacks: Callbacks) -> float:
6457 return await self ._single_turn_ascore (SingleTurnSample (** row ), callbacks )
6558
6659
67- class StringDistance (SingleTurnMetric ):
68- name : str = "string_distance" # type: ignore
60+ @dataclass
61+ class NonLLMStringSimilarity (SingleTurnMetric ):
62+ name : str = "non_llm_string_similarity" # type: ignore
6963 _required_columns : t .Dict [MetricType , t .Set [str ]] = field (
7064 default_factory = lambda : {MetricType .SINGLE_TURN : {"reference" , "response" }}
7165 )
7266 distance_measure : DistanceMeasure = DistanceMeasure .LEVENSHTEIN
7367
68+ def __post_init__ (self ):
69+ try :
70+ from rapidfuzz import distance
71+ except ImportError :
72+ raise ImportError (
73+ "rapidfuzz is required for string distance. Please install it using `pip install rapidfuzz`"
74+ )
75+
76+ self .distance_measure_map = {
77+ DistanceMeasure .LEVENSHTEIN : distance .Levenshtein ,
78+ DistanceMeasure .HAMMING : distance .Hamming ,
79+ DistanceMeasure .JARO : distance .Jaro ,
80+ }
81+
7482 def init (self , run_config : RunConfig ):
7583 pass
7684
@@ -81,7 +89,7 @@ async def _single_turn_ascore(
8189 response = sample .response
8290 assert isinstance (reference , str ), "Expecting a string"
8391 assert isinstance (response , str ), "Expecting a string"
84- return 1 - DISTANCE_MEASURE_MAP [self .distance_measure ].normalized_distance (
92+ return 1 - self . distance_measure_map [self .distance_measure ].normalized_distance (
8593 reference , response
8694 )
8795
0 commit comments