Source code for langchain.smith.evaluation.config

"""运行评估器的配置。"""

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