Files
langchain/docs/extras/guides/evaluation/string/string_distance.ipynb
T
2023-07-25 11:49:25 -07:00

5.2 KiB

String Distance

One of the simplest ways to compare an LLM or chain's string output against a reference label is by using string distance measurements such as Levenshtein or postfix distance. This can be used alongside approximate/fuzzy matching criteria for very basic unit testing.

This can be accessed using the string_distance evaluator, which uses distance metric's from the rapidfuzz library.

Note: The returned scores are distances, meaning lower is typically "better".

For more information, check out the reference docs for the StringDistanceEvalChain for more info.

In [1]:
# %pip install rapidfuzz
In [2]:
from langchain.evaluation import load_evaluator

evaluator = load_evaluator("string_distance")
In [3]:
evaluator.evaluate_strings(
    prediction="The job is completely done.",
    reference="The job is done",
)
Out [3]:
{'score': 0.11555555555555552}
In [4]:
# The results purely character-based, so it's less useful when negation is concerned
evaluator.evaluate_strings(
    prediction="The job is done.",
    reference="The job isn't done",
)
Out [4]:
{'score': 0.0724999999999999}

Configure the String Distance Metric

By default, the StringDistanceEvalChain uses levenshtein distance, but it also supports other string distance algorithms. Configure using the distance argument.

In [5]:
from langchain.evaluation import StringDistance

list(StringDistance)
Out [5]:
[<StringDistance.DAMERAU_LEVENSHTEIN: 'damerau_levenshtein'>,
 <StringDistance.LEVENSHTEIN: 'levenshtein'>,
 <StringDistance.JARO: 'jaro'>,
 <StringDistance.JARO_WINKLER: 'jaro_winkler'>]
In [6]:
jaro_evaluator = load_evaluator(
    "string_distance", distance=StringDistance.JARO
)
In [7]:
jaro_evaluator.evaluate_strings(
    prediction="The job is completely done.",
    reference="The job is done",
)
Out [7]:
{'score': 0.19259259259259254}
In [8]:
jaro_evaluator.evaluate_strings(
    prediction="The job is done.",
    reference="The job isn't done",
)
Out [8]:
{'score': 0.12083333333333324}