"""运行评估器的配置。"""
from typing import Any, Callable, Dict, List, Optional, Sequence, Union
from langchain_core.embeddings import Embeddings
from langchain_core.language_models import BaseLanguageModel
from langchain_core.prompts import BasePromptTemplate
from langchain_core.pydantic_v1 import BaseModel, Field
from langsmith import RunEvaluator
from langsmith.evaluation.evaluator import EvaluationResult, EvaluationResults
from langsmith.schemas import Example, Run
from langchain.evaluation.criteria.eval_chain import CRITERIA_TYPE
from langchain.evaluation.embedding_distance.base import (
EmbeddingDistance as EmbeddingDistanceEnum,
)
from langchain.evaluation.schema import EvaluatorType, StringEvaluator
from langchain.evaluation.string_distance.base import (
StringDistance as StringDistanceEnum,
)
RUN_EVALUATOR_LIKE = Callable[
[Run, Optional[Example]], Union[EvaluationResult, EvaluationResults, dict]
]
BATCH_EVALUATOR_LIKE = Callable[
[Sequence[Run], Optional[Sequence[Example]]],
Union[EvaluationResult, EvaluationResults, dict],
]
[docs]class EvalConfig(BaseModel):
"""给定运行评估器的配置。
参数
----------
evaluator_type:EvaluatorType
要使用的评估器类型。
方法
-------
get_kwargs()
获取评估器配置的关键字参数。"""
evaluator_type: EvaluatorType
[docs] def get_kwargs(self) -> Dict[str, Any]:
"""获取load_evaluator调用的关键字参数。
返回
-------
Dict[str, Any]
load_evaluator调用的关键字参数。
"""
kwargs = {}
for field, val in self:
if field == "evaluator_type":
continue
elif val is None:
continue
kwargs[field] = val
return kwargs
[docs]class SingleKeyEvalConfig(EvalConfig):
"""运行评估器的配置,只需要一个键。"""
reference_key: Optional[str] = None
"""数据集中用作参考字符串的键。
如果未提供,我们将尝试自动推断。"""
prediction_key: Optional[str] = None
"""用于表示预测的跟踪运行输出字典中的关键字。如果未提供,则将自动推断。"""
input_key: Optional[str] = None
"""追踪运行的输入字典中要使用的关键字,用于表示输入。如果未提供,则将自动推断。"""
[docs] def get_kwargs(self) -> Dict[str, Any]:
kwargs = super().get_kwargs()
# Filer out the keys that are not needed for the evaluator.
for key in ["reference_key", "prediction_key", "input_key"]:
kwargs.pop(key, None)
return kwargs
CUSTOM_EVALUATOR_TYPE = Union[RUN_EVALUATOR_LIKE, RunEvaluator, StringEvaluator]
SINGLE_EVAL_CONFIG_TYPE = Union[EvaluatorType, str, EvalConfig]
[docs]class RunEvalConfig(BaseModel):
"""运行评估的配置。
参数
----------
evaluators:List[Union[EvaluatorType, EvalConfig, RunEvaluator, Callable]]
配置要应用于数据集运行的评估器。
每个可以是:class:`EvaluatorType <langchain.evaluation.schema.EvaluatorType>`的字符串,比如EvaluatorType.QA,
评估器类型字符串("qa"),或者给定评估器的配置(例如:class:`RunEvalConfig.QA <langchain.smith.evaluation.config.RunEvalConfig.QA>`)。
custom_evaluators:Optional[List[Union[RunEvaluator, StringEvaluator]]]
要应用于数据集运行的自定义评估器。
reference_key:Optional[str]
在数据集运行中用作参考字符串的键。
如果未提供,将自动推断。
prediction_key:Optional[str]
从跟踪运行的输出字典中使用的键来表示预测。
如果未提供,将自动推断。
input_key:Optional[str]
从跟踪运行的输入字典中使用的键来表示输入。
如果未提供,将自动推断。
eval_llm:Optional[BaseLanguageModel]
传递给使用语言模型的任何评估器的语言模型。""" # noqa: E501
evaluators: List[
Union[
SINGLE_EVAL_CONFIG_TYPE,
CUSTOM_EVALUATOR_TYPE,
]
] = Field(default_factory=list)
"""为数据集运行应用的评估器的配置。
每个可以是一个
:class:`EvaluatorType <langchain.evaluation.schema.EvaluatorType>` 的字符串,
例如 `EvaluatorType.QA`,评估器类型字符串 ("qa"),或者给定评估器的配置
(例如,
:class:`RunEvalConfig.QA <langchain.smith.evaluation.config.RunEvalConfig.QA>`)。""" # noqa: E501
custom_evaluators: Optional[List[CUSTOM_EVALUATOR_TYPE]] = None
"""应用于数据集运行的自定义评估器。"""
batch_evaluators: Optional[List[BATCH_EVALUATOR_LIKE]] = None
"""在聚合/批量级别运行的评估器。
这些生成一个或多个指标,这些指标分配给完整的测试运行。
因此,它们与单个跟踪没有关联。"""
reference_key: Optional[str] = None
"""数据集中用作参考字符串的键。
如果未提供,我们将尝试自动推断。"""
prediction_key: Optional[str] = None
"""用于表示预测的跟踪运行输出字典中的关键字。如果未提供,则将自动推断。"""
input_key: Optional[str] = None
"""追踪运行的输入字典中要使用的关键字,用于表示输入。如果未提供,则将自动推断。"""
eval_llm: Optional[BaseLanguageModel] = None
"""需要传递给需要的任何评估器的语言模型。"""
class Config:
arbitrary_types_allowed = True
[docs] class Criteria(SingleKeyEvalConfig):
"""参考无标准评估器的配置。
参数
----------
criteria : Optional[CRITERIA_TYPE]
要评估的标准。
llm : Optional[BaseLanguageModel]
用于评估链的语言模型。"""
criteria: Optional[CRITERIA_TYPE] = None
llm: Optional[BaseLanguageModel] = None
evaluator_type: EvaluatorType = EvaluatorType.CRITERIA
def __init__(
self, criteria: Optional[CRITERIA_TYPE] = None, **kwargs: Any
) -> None:
super().__init__(criteria=criteria, **kwargs) # type: ignore[call-arg]
[docs] class LabeledCriteria(SingleKeyEvalConfig):
"""用于带有引用的标记(有参考文献)标准评估器的配置。
参数
----------
criteria:Optional[CRITERIA_TYPE]
要评估的标准。
llm:Optional[BaseLanguageModel]
用于评估链的语言模型。"""
criteria: Optional[CRITERIA_TYPE] = None
llm: Optional[BaseLanguageModel] = None
evaluator_type: EvaluatorType = EvaluatorType.LABELED_CRITERIA
def __init__(
self, criteria: Optional[CRITERIA_TYPE] = None, **kwargs: Any
) -> None:
super().__init__(criteria=criteria, **kwargs) # type: ignore[call-arg]
[docs] class EmbeddingDistance(SingleKeyEvalConfig):
"""用于嵌入距离评估器的配置。
参数
----------
embeddings:Optional[Embeddings]
用于计算距离的嵌入。
distance_metric:Optional[EmbeddingDistanceEnum]
用于计算距离的距离度量。"""
evaluator_type: EvaluatorType = EvaluatorType.EMBEDDING_DISTANCE
embeddings: Optional[Embeddings] = None
distance_metric: Optional[EmbeddingDistanceEnum] = None
class Config:
arbitrary_types_allowed = True
[docs] class StringDistance(SingleKeyEvalConfig):
"""字符串距离评估器的配置。
参数
----------
distance:Optional[StringDistanceEnum]
要使用的字符串距离度量。"""
evaluator_type: EvaluatorType = EvaluatorType.STRING_DISTANCE
distance: Optional[StringDistanceEnum] = None
"""要使用的字符串距离度量标准。
damerau_levenshtein:Damerau-Levenshtein距离。
levenshtein:Levenshtein距离。
jaro:Jaro距离。
jaro_winkler:Jaro-Winkler距离。"""
normalize_score: bool = True
"""是否将距离归一化到0到1之间。
仅适用于Levenshtein和Damerau-Levenshtein距离。"""
[docs] class QA(SingleKeyEvalConfig):
"""QA评估器的配置。
参数
----------
prompt : Optional[BasePromptTemplate]
用于生成问题的提示模板。
llm : Optional[BaseLanguageModel]
用于评估链的语言模型。"""
evaluator_type: EvaluatorType = EvaluatorType.QA
llm: Optional[BaseLanguageModel] = None
prompt: Optional[BasePromptTemplate] = None
[docs] class ContextQA(SingleKeyEvalConfig):
"""用于基于上下文的问答评估器的配置。
参数
----------
prompt:Optional[BasePromptTemplate]
用于生成问题的提示模板。
llm:Optional[BaseLanguageModel]
用于评估链的语言模型。"""
evaluator_type: EvaluatorType = EvaluatorType.CONTEXT_QA
llm: Optional[BaseLanguageModel] = None
prompt: Optional[BasePromptTemplate] = None
[docs] class CoTQA(SingleKeyEvalConfig):
"""用于基于上下文的问答评估器的配置。
参数
----------
prompt:Optional[BasePromptTemplate]
用于生成问题的提示模板。
llm:Optional[BaseLanguageModel]
用于评估链的语言模型。"""
evaluator_type: EvaluatorType = EvaluatorType.CONTEXT_QA
llm: Optional[BaseLanguageModel] = None
prompt: Optional[BasePromptTemplate] = None
[docs] class JsonValidity(SingleKeyEvalConfig):
"""用于JSON有效性评估的配置。
参数
----------"""
evaluator_type: EvaluatorType = EvaluatorType.JSON_VALIDITY
[docs] class JsonEqualityEvaluator(EvalConfig):
"""用于JSON相等性评估器的配置。
参数
----------"""
evaluator_type: EvaluatorType = EvaluatorType.JSON_EQUALITY
[docs] class ExactMatch(SingleKeyEvalConfig):
"""精确匹配字符串评估器的配置。
参数
----------
ignore_case : bool
在比较字符串时是否忽略大小写。
ignore_punctuation : bool
在比较字符串时是否忽略标点符号。
ignore_numbers : bool
在比较字符串时是否忽略数字。"""
evaluator_type: EvaluatorType = EvaluatorType.EXACT_MATCH
ignore_case: bool = False
ignore_punctuation: bool = False
ignore_numbers: bool = False
[docs] class RegexMatch(SingleKeyEvalConfig):
"""用于正则表达式匹配字符串评估器的配置。
参数
----------
flags : int
传递给正则表达式的标志。示例:re.IGNORECASE。"""
evaluator_type: EvaluatorType = EvaluatorType.REGEX_MATCH
flags: int = 0
[docs] class ScoreString(SingleKeyEvalConfig):
"""评分字符串评估器的配置。
这类似于标准评估器,但默认配置为返回1-10分的分数。
建议通过将`normalize_by`设置为10来对这些分数进行归一化。
参数
----------
criteria : Optional[CRITERIA_TYPE]
要评估的标准。
llm : Optional[BaseLanguageModel]
用于评估链的语言模型。
normalize_by: Optional[int] = None
如果要对分数进行归一化,则使用的分母。
如果未提供,则分数将在1到10之间(默认情况下)。
prompt : Optional[BasePromptTemplate]"""
evaluator_type: EvaluatorType = EvaluatorType.SCORE_STRING
criteria: Optional[CRITERIA_TYPE] = None
llm: Optional[BaseLanguageModel] = None
normalize_by: Optional[float] = None
prompt: Optional[BasePromptTemplate] = None
def __init__(
self,
criteria: Optional[CRITERIA_TYPE] = None,
normalize_by: Optional[float] = None,
**kwargs: Any,
) -> None:
super().__init__(criteria=criteria, normalize_by=normalize_by, **kwargs) # type: ignore[call-arg]
[docs] class LabeledScoreString(ScoreString):
evaluator_type: EvaluatorType = EvaluatorType.LABELED_SCORE_STRING