

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# `fmeval` 라이브러리를 사용하여 자동 평가 실행
<a name="clarify-foundation-model-evaluate-auto-lib"></a>

자체 코드에서 `fmeval` 라이브러리를 사용하면 워크플로를 사용자 지정할 수 있는 유연성을 극대화할 수 있습니다. `fmeval` 라이브러리를 사용하여 LLM을 평가하고 사용자 지정 입력 데이터세트에 대한 유연성도 높일 수 있습니다. 다음 단계에서는 환경을 설정하는 방법과 `fmeval` 라이브러리를 사용하여 시작 및 사용자 지정 워크플로를 모두 실행하는 방법을 보여줍니다.

## `fmeval` 라이브러리 사용 시작하기
<a name="clarify-foundation-model-evaluate-auto-lib-get-started"></a>

Studio 노트북에서 파운데이션 모델 평가를 구성하고 사용 사례에 맞게 사용자 지정할 수 있습니다. 구성은 파운데이션 모델이 예측하기 위해 빌드된 작업의 종류와 이를 평가하는 방법에 따라 달라집니다. FMEval은 개방형 생성, 텍스트 요약, 질문 답변 및 분류 작업을 지원합니다. 이 섹션의 단계는 시작 워크플로를 설정하는 방법을 보여줍니다. 이 시작 워크플로에는 환경을 설정하고 JumpStart 또는 데이터세트가 기본 제공된 Amazon Bedrock 파운데이션 모델을 사용하여 평가 알고리즘을 실행하는 것이 포함됩니다. 보다 구체적인 사용 사례에 사용자 지정 입력 데이터세트 및 워크플로를 사용해야 하는 경우 [`fmeval` 라이브러리를 사용하여 워크플로 사용자 지정](clarify-foundation-model-evaluate-auto-lib-custom.md) 섹션을 참조하세요.

## 환경 설정
<a name="clarify-foundation-model-evaluate-auto-lib-setup"></a>

Studio 노트북에서 모델 평가를 실행하지 않으려면 다음 **Studio를 사용하여 시작하기** 섹션의 11단계로 건너뛰세요.

**사전 조건**
+ Studio UI에서 모델 평가를 실행하려면 AWS Identity and Access Management (IAM) 역할과 입력 데이터세트에 올바른 권한이 있어야 합니다. SageMaker AI 도메인 또는 IAM 역할이 없는 경우 [Amazon SageMaker AI 설정 가이드](gs.md)의 단계를 따릅니다.

**Amazon S3 버킷에 대한 권한을 설정하는 방법**

도메인과 역할을 만든 후 다음 단계를 사용하여 모델을 평가하는 데 필요한 권한을 추가합니다.

1. [https://console.aws.amazon.com/sagemaker/](https://console.aws.amazon.com/sagemaker/)에서 Amazon SageMaker AI 콘솔을 엽니다.

1. 탐색 창에서 페이지 상단의 검색 창에 **S3**를 입력합니다.

1. **서비스**에서 **S3**를 선택합니다.

1. 탐색 창에서 **버킷**을 선택합니다.

1. **범용 버킷** 섹션의 **이름**에서 콘솔의 모델 입력 및 출력을 저장하는 데 사용할 S3 버킷의 이름을 선택합니다. S3 버킷이 없는 경우 다음을 수행합니다.

   1. **버킷 만들기**를 선택하여 **새 버킷 만들기** 페이지를 엽니다.

   1. **일반 구성** 섹션의 **AWS 리전**에서 파운데이션 모델이 위치한 AWS 리전을 선택합니다.

   1. **버킷 이름** 아래의 입력 상자에서 S3 버킷의 이름을 지정합니다.

   1. 모든 기본값을 수락합니다.

   1. **버킷 만들기**를 선택합니다.

   1. **범용 버킷** 섹션의 **이름**에서 만든 S3 버킷의 이름을 선택합니다.

1. **권한** 탭을 선택합니다.

1. 창 하단의 **교차 오리진 리소스 공유(CORS)** 섹션으로 스크롤합니다. **편집**을 선택합니다.

1. 파운데이션 평가를 위해 버킷에 권한을 추가하려면 입력 상자에 다음 코드가 표시되는지 확인합니다. 다음을 복사하여 입력 상자에 붙여넣을 수도 있습니다.

   ```
   [
   {
       "AllowedHeaders": [
           "*"
       ],
       "AllowedMethods": [
           "GET",
           "PUT",
           "POST",
           "DELETE"
       ],
       "AllowedOrigins": [
           "*"
       ],
       "ExposeHeaders": [
           "Access-Control-Allow-Origin"
       ]
   }
   ]
   ```

1. **변경 사항 저장**을 선택합니다.

**IAM 정책에 권한을 추가하는 방법**

1. 페이지 상단에 있는 검색 창에 **IAM**을 입력합니다.

1. **서비스**에서 **Identity and Access Management(IAM)**를 선택합니다.

1. 탐색 창에서 **정책**을 선택합니다.

1. [AmazonSageMakerFullAccess](https://docs.aws.amazon.com/sagemaker/latest/dg/security-iam-awsmanpol.html#security-iam-awsmanpol-AmazonSageMakerFullAccess)를 검색 창에 입력합니다. 나타나는 정책 옆에 있는 라디오 버튼을 선택합니다. 이제 **작업** 버튼을 선택할 수 있습니다.

1. **작업** 옆의 아래쪽 화살표를 선택합니다. 두 가지 옵션이 나타납니다.

1. **연결**을 선택합니다.

1. 나타나는 IAM 목록에서 이전에 만든 IAM 역할의 이름을 검색합니다. 이름 옆에 있는 확인란을 선택합니다.

1. **정책 연결**을 선택합니다.

**Studio를 사용하여 시작하기**

1. 페이지 상단에 있는 검색 창에 **SageMaker AI**을 입력합니다.

1. **서비스**에서 **Amazon SageMaker AI**를 선택합니다.

1. 탐색 창에서 **Studio**를 선택합니다.

1. **도메인 선택** 아래의 아래쪽 화살표를 확장한 후 **시작하기** 섹션에서 도메인을 선택합니다.

1. **사용자 프로필 선택** 아래의 아래쪽 화살표를 확장한 후 **시작하기** 섹션에서 사용자 프로필을 선택합니다.

1. **Studio 열기**를 선택하여 Studio의 랜딩 페이지를 엽니다.

1. 탐색 창에서 파일 브라우저를 선택하고 루트 디렉터리로 이동합니다.

1. **노트북 만들기**를 선택합니다.

1. 열리는 노트북 환경 대화 상자에서 **Data Science 3.0** 이미지를 선택합니다.

1. **선택**을 선택하세요.

1. 다음 코드 예시와 같이 개발 환경에 `fmeval` 패키지를 설치합니다.

   ```
   !pip install fmeval
   ```
**참고**  
Python 3.10을 사용하는 환경에 `fmeval` 라이브러리를 설치합니다. `fmeval` 실행에 필요한 요구 사항에 대한 자세한 내용은 [`fmeval` dependencies](https://github.com/aws/fmeval/blob/main/pyproject.toml) 섹션을 참조하세요.

## `ModelRunner` 구성
<a name="clarify-foundation-model-evaluate-auto-lib-modelrunner"></a>

FMEval은 `ModelRunner`라는 상위 수준 래퍼를 사용하여 입력을 구성하고 모델에서 출력을 간접 호출 및 추출합니다. `fmeval` 패키지는 어떤 LLM이든 평가할 수 있지만 `ModelRunner`를 구성하는 절차는 평가하려는 모델 유형에 따라 달라집니다. 이 섹션에서는 JumpStart 또는 Amazon Bedrock 모델에 대해 `ModelRunner`를 구성하는 방법을 설명합니다. 사용자 지정 입력 데이터세트 및 사용자 지정 `ModelRunner`를 사용하려면 [`fmeval` 라이브러리를 사용하여 워크플로 사용자 지정](clarify-foundation-model-evaluate-auto-lib-custom.md) 섹션을 참조하세요.

### JumpStart 모델 사용
<a name="clarify-foundation-model-evaluate-auto-lib-modelrunner-js"></a>

`ModelRunner`를 사용하여 JumpStart 모델을 평가하려면 엔드포인트를 만들거나 제공하고, 모델 및 기본 제공 데이터세트를 정의하고, `ModelRunner`를 구성하고 테스트합니다.

**JumpStart 모델 정의 및 ModelRunner 구성**

1. 다음 중 하나를 수행하여 엔드포인트를 제공합니다.
   + 기존 JumpStart 엔드포인트, `model_id` 및 `model_version`에 [EndpointName](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_runtime_InvokeEndpoint.html#API_runtime_InvokeEndpoint_RequestSyntax)을 지정합니다.
   + 모델의 `model_id` 및 `model_version`을 지정하고 JumpStart 엔드포인트를 만듭니다.

   다음 코드 예시는 JumpStart를 통해 사용할 수 있는 [https://aws.amazon.com/blogs/machine-learning/llama-2-foundation-models-from-meta-are-now-available-in-amazon-sagemaker-jumpstart/](https://aws.amazon.com/blogs/machine-learning/llama-2-foundation-models-from-meta-are-now-available-in-amazon-sagemaker-jumpstart/)용 엔드포인트를 만드는 방법을 보여줍니다.

   ```
   import sagemaker
   from sagemaker.jumpstart.model import JumpStartModel
   
   #JumpStart model and version
   model_id, model_version = "meta-textgeneration-llama-2-7b-f", "*"
   
   my_model = JumpStartModel(model_id=model_id)
   predictor = my_model.deploy()
   endpoint_name = predictor.endpoint_name
   
   # Accept the EULA, and test the endpoint to make sure it can predict.
   predictor.predict({"inputs": [[{"role":"user", "content": "Hello how are you?"}]]}, custom_attributes='accept_eula=true')
   ```

   이전 코드 예시는 EULA를 참조하며, 이는 최종 사용 라이선스 계약(EULA)을 나타냅니다. EULA는 사용 중인 모델의 모델 카드 설명에서 확인할 수 있습니다. 일부 JumpStart 모델을 사용하려면 `predict`에 대한 이전 직접 호출에서와 같이 `accept_eula=true`를 지정해야 합니다. EULA에 대한 자세한 내용은 [모델 소스 및 라이선스 계약](jumpstart-foundation-models-choose.md)의 **Licenses and model sources** 섹션을 참조하세요.

   [Built-in Algorithms with pre-trained Model Table](https://sagemaker.readthedocs.io/en/stable/doc_utils/pretrainedmodels.html#built-in-algorithms-with-pre-trained-model-table)에서 사용 가능한 JumpStart 모델 목록을 찾을 수 있습니다.

1. 다음 구성 예시와 같이 `JumpStartModelRunner`를 사용하여 `ModelRunner`를 구성합니다.

   ```
   from fmeval.model_runners.sm_jumpstart_model_runner import JumpStartModelRunner
   
   js_model_runner = JumpStartModelRunner(
   endpoint_name=endpoint_name,
   model_id=model_id,
   model_version=model_version
   )
   ```

   이전 구성 예시에서 엔드포인트를 만드는 데 사용한 것과 동일한 값을 `endpoint_name`, `model_id` 및 `model_version`에 사용합니다.

1. `ModelRunner`를 테스트합니다. 다음 코드 예시와 같이 샘플 요청을 모델에 전송합니다.

   ```
   js_model_runner.predict("What is the capital of London")
   ```

### Amazon Bedrock 모델 사용
<a name="clarify-foundation-model-evaluate-auto-lib-modelrunner-br"></a>

Amazon Bedrock 모델을 평가하려면 모델 및 기본 제공 데이터세트를 정의하고 `ModelRunner`를 구성해야 합니다.

**Amazon Bedrock 모델 정의 및 ModelRunner 구성**

1. 모델 세부 정보를 정의하고 인쇄하려면 Amazon Bedrock을 통해 사용할 수 있는 Titan 모델에 다음 코드 예시를 사용합니다.

   ```
   import boto3
   import json
   bedrock = boto3.client(service_name='bedrock')
   bedrock_runtime = boto3.client(service_name='bedrock-runtime')
   
   model_id = "amazon.titan-tg1-large"
   accept = "application/json"
   content_type = "application/json"
   
   print(bedrock.get_foundation_model(modelIdentifier=modelId).get('modelDetails'))
   ```

   이전 코드 예시에서 `accept` 파라미터는 LLM을 평가하는 데 사용할 데이터의 형식을 지정합니다. `contentType`은 요청의 입력 데이터의 형식을 지정합니다. Amazon Bedrock 모델의 경우 `accept` 및 `contentType`에 `MIME_TYPE_JSON`만 지원됩니다. 이러한 파라미터에 대한 자세한 내용은 [InvokeModelWithResponseStream](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModelWithResponseStream.html#API_runtime_InvokeModelWithResponseStream_RequestSyntax)을 참조하세요.

1. `ModelRunner`를 구성하려면 다음 구성 예시와 같이 `BedrockModelRunner`를 사용합니다.

   ```
   from fmeval.model_runners.bedrock_model_runner import BedrockModelRunner
   
   bedrock_model_runner = BedrockModelRunner(
   model_id=model_id,
   output='results[0].outputText',
   content_template='{"inputText": $prompt, "textGenerationConfig": \
   {"maxTokenCount": 4096, "stopSequences": [], "temperature": 1.0, "topP": 1.0}}',
   )
   ```

   다음과 같이 `ModelRunner` 구성을 파라미터화합니다.
   + 모델을 배포하는 데 사용한 값과 동일한 값을 `model_id`에 사용합니다.
   + `output`을 사용하여 생성된 `json` 응답의 형식을 지정합니다. 예를 들어 LLM에서 `[{"results": "this is the output"}]` 응답을 제공한 경우 `output='results[0].outputText'`는 `this is the output`을 반환합니다.
   + `content_template`을 사용하여 LLM이 요청과 상호 작용하는 방식을 지정합니다. 다음 구성 템플릿은 이전 구성 예시를 설명하기 위한 목적으로만 자세히 설명되어 있으며 필수는 아닙니다.
     + 이전 구성 예시에서 `inputText` 변수는 사용자의 요청을 캡처하는 프롬프트를 지정합니다.
     + `textGenerationConfig` 변수는 LLM이 다음과 같이 응답을 생성하는 방법을 지정합니다.
       + `maxTokenCount` 파라미터는 LLM에서 반환하는 토큰 수를 제한하여 응답의 길이를 제한하는 데 사용됩니다.
       + `stopSequences` 파라미터는 LLM에 응답 생성을 중지하도록 지시하는 문자 시퀀스 목록을 지정하는 데 사용됩니다. 모델 출력은 출력에서 나열된 문자열이 처음 발생하면 중지됩니다. 예를 들어 캐리지 반환 시퀀스를 사용하여 모델 응답을 한 줄로 제한할 수 있습니다.
       + `topP` 파라미터는 다음 토큰을 생성할 때 고려할 토큰 세트를 제한하여 무작위성을 제어합니다. 이 파라미터는 `0.0`\$1`1.0`의 값을 허용합니다. `topP`의 값이 클수록 더 넓은 어휘가 포함된 세트가 허용되고 값이 작을수록 토큰 세트가 더 가능성이 높은 단어로 제한됩니다.
       + `temperature` 파라미터는 생성된 텍스트의 무작위성을 제어하고 양수 값을 허용합니다. `temperature`의 값이 클수록 모델에 더 무작위적이고 다양한 응답을 생성하도록 지시합니다. 값이 작으면 예측 가능한 응답이 생성됩니다. `temperature`의 일반적인 범위는 `0.2`\$1`2.0`입니다.

       특정 Amazon Bedrock 파운데이션 모델의 파라미터에 대한 자세한 내용은 [Inference parameters for foundation models](https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html#model-parameters-titan)을 참조하세요.

     content\$1template 파라미터의 형식은 LLM에서 지원하는 입력 및 파라미터에 따라 달라집니다. 예를 들어 [Anthropic’s Claude 2 모델](https://www.anthropic.com/index/claude-2)은 다음 `content_template`을 지원할 수 있습니다.

     ```
     "content_template": "{\"prompt\": $prompt, \"max_tokens_to_sample\": 500}"
     ```

     또 다른 예로 [Falcon 7b 모델](https://huggingface.co/tiiuae/falcon-7b)은 다음 `content_template`을 지원할 수 있습니다.

     ```
     "content_template": "{\"inputs\": $prompt, \"parameters\":{\"max_new_tokens\": \
     10, \"top_p\": 0.9, \"temperature\": 0.8}}"
     ```

     마지막으로 `ModelRunner`를 테스트합니다. 다음 코드 예시와 같이 샘플 요청을 모델에 전송합니다.

     ```
     bedrock_model_runner.predict("What is the capital of London?")
     ```

## 모델 평가
<a name="clarify-foundation-model-evaluate-auto-lib-eval"></a>

데이터 및 `ModelRunner`를 구성한 후 LLM에서 생성된 응답에 대해 평가 알고리즘을 실행할 수 있습니다. 사용 가능한 모든 평가 알고리즘 목록을 보려면 다음 코드를 실행합니다.

```
from fmeval.eval_algo_mapping import EVAL_ALGORITHMS
print(EVAL_ALGORITHMS.keys())
```

각 알고리즘에는 평가와 `evaluate_sample` 메서드가 모두 있습니다. `evaluate` 메서드는 전체 데이터세트에 대한 점수를 계산합니다. `evaluate_sample` 메서드는 단일 인스턴스에 대한 점수를 평가합니다.

`evaluate_sample` 메서드는 `EvalScore` 객체를 반환합니다. `EvalScore` 객체에는 평가 중에 모델이 얼마나 잘 수행되었는지에 대한 집계된 점수가 포함됩니다. `evaluate_sample` 메서드에는 다음과 같은 선택적 파라미터가 있습니다.
+ `model_output` - 단일 요청에 대한 모델 응답입니다.
+ `model_input` - 모델에 대한 요청이 포함된 프롬프트입니다.
+ `target_output` - `model_input`에 포함된 프롬프트에서 예상되는 응답입니다.

다음 코드 예시에서는 `evaluate_sample`을 사용하는 방법을 보여줍니다.

```
#Evaluate your custom sample
model_output = model_runner.predict("London is the capital of?")[0]
eval_algo.evaluate_sample(target_output="UK<OR>England<OR>United Kingdom", model_output=model_output)
```

`evaluate` 메서드에는 다음과 같은 선택적 파라미터가 있습니다.
+ `model` - 평가하려는 모델을 사용하는 `ModelRunner`의 인스턴스입니다.
+ `dataset_config` - 데이터세트 구성입니다. `dataset_config`이 제공되지 않으면 이 작업에 대해 구성된 모든 기본 제공 데이터세트를 사용하여 모델이 평가됩니다.
+ `prompt_template` - 프롬프트를 생성하는 데 사용되는 템플릿입니다. `prompt_template`이 제공되지 않으면 기본 프롬프트 템플릿을 사용하여 모델이 평가됩니다.
+ `save` – `True`로 설정하면 레코드별 프롬프트 응답 및 점수가 `EvalAlgorithmInterface.EVAL_RESULTS_PATH` 파일에 저장됩니다. 기본값은 `False`입니다.
+ `num_records` - 평가를 위해 입력 데이터세트에서 무작위로 샘플링되는 레코드 수입니다. 기본값은 `300`입니다.

`evaluate` 알고리즘은 다음을 포함할 수 있는 `EvalOutput` 객체 목록을 반환합니다.
+ `eval_name` - 평가 알고리즘의 이름입니다.

  `dataset_name` - 평가 알고리즘에서 사용하는 데이터세트의 이름입니다.

  `prompt_template` - `model_output` 파라미터가 데이터세트에 제공되지 않은 경우 사용되는 프롬프트를 구성하는 데 사용되는 템플릿입니다. 자세한 내용은 **JumpStart `ModelRunner` 구성 섹션**의 `prompt_template` 섹션을 참조하세요.

  `dataset_scores` - 전체 데이터세트에서 계산된 집계 점수입니다.

  `category_scores` - 데이터세트의 각 범주에 대한 점수를 포함하는 `CategoryScore` 객체 목록입니다.

  `output_path` - 평가 출력의 로컬 경로입니다. 이 출력에는 레코드별 평가 점수가 포함된 프롬프트 응답이 포함되어 있습니다.

  `error` – 실패한 평가 작업에 대한 문자열 오류 메시지입니다.

모델 평가에 사용할 수 있는 차원은 다음과 같습니다.
+ 정확도
+ 사실적 지식
+ 프롬프트 고정 관념화
+ 의미 체계 견고성
+ 유해성

### 정확도
<a name="clarify-foundation-model-evaluate-auto-lib-eval-acc"></a>

질문 답변, 텍스트 요약 또는 분류 작업에 대해 정확도 알고리즘을 실행할 수 있습니다. 다음과 같이 다양한 데이터 입력 유형 및 문제를 수용하기 위해 알고리즘은 작업마다 다릅니다.
+ 질문 답변 작업의 경우 `QAAccuracyConfig` 파일로 `QAAccuracy` 알고리즘을 실행합니다.
+ 텍스트 요약 작업의 경우 `SummarizationAccuracyConfig`를 사용하여 `SummarizationAccuracy` 알고리즘을 실행합니다.
+ 분류 작업의 경우 `ClassificationAccuracyConfig`를 사용하여 `ClassificationAccuracy` 알고리즘을 실행합니다.

`QAAccuracy` 알고리즘은 각 샘플에 대해 하나의 정확도 점수를 포함하는 `EvalOutput` 객체 목록을 반환합니다. 질문 답변 정확도 알고리즘을 실행하려면 `QAAccuracygeConfig`를 인스턴스화하고 `<OR>` 또는 `None`을 `target_output_delimiter`로 전달합니다. 질문 답변 정확도 알고리즘은 모델이 생성하는 응답을 알려진 응답과 비교합니다. `<OR>`를 대상 구분 기호로 전달하면 알고리즘은 답변에서 `<OR>`로 구분된 콘텐츠 중 하나를 생성하면 응답을 올바른 것으로 채점합니다. `None` 또는 빈 문자열을 `target_output_delimiter`로 전달하면 코드가 오류를 발생시킵니다.

`evaluate` 메서드를 직접 호출하고 다음 코드 예시와 같이 원하는 파라미터를 전달합니다.

```
from fmeval.eval import get_eval_algorithm
from fmeval.eval_algorithms.qa_accuracy import QAAccuracy, QAAccuracyConfig

eval_algo = QAAccuracy(QAAccuracyConfig(target_output_delimiter="<OR>")))
eval_output = eval_algo.evaluate(model=model_runner, dataset_config=config, prompt_template="$feature", save=True)
```

`SummarizationAccuracy` 알고리즘은 [https://huggingface.co/spaces/evaluate-metric/rouge](https://huggingface.co/spaces/evaluate-metric/rouge), [https://huggingface.co/spaces/evaluate-metric/meteor](https://huggingface.co/spaces/evaluate-metric/meteor) 및 [https://huggingface.co/spaces/evaluate-metric/bertscore](https://huggingface.co/spaces/evaluate-metric/bertscore)에 대한 점수가 포함된 `EvalOutput` 객체 목록을 반환합니다. 이러한 점수에 대한 자세한 내용은 [모델 평가 작업에서 프롬프트 데이터세트 및 사용 가능한 평가 차원 사용](clarify-foundation-model-evaluate-overview.md)의 텍스트 요약 섹션을 참조하세요. 텍스트 요약 정확도 알고리즘을 실행하려면 `SummarizationAccuracyConfig`를 인스턴스화하고 다음을 전달합니다.
+ 평가에 사용할 [https://en.wikipedia.org/wiki/ROUGE_(metric)](https://en.wikipedia.org/wiki/ROUGE_(metric)) 지표 유형을 `rouge_type`으로 지정합니다. `rouge1`, `rouge2` 또는 `rougeL`를 선택할 수 있습니다. 이러한 지표는 생성된 요약을 참조 요약과 비교합니다. ROUGE-1은 중복 유니그램('the', 'is'와 같은 한 항목의 시퀀스)을 사용하여 생성된 요약과 참조 요약을 비교합니다. ROUGE-2는 바이그램('the large', 'is home'과 같은 두 시퀀스의 그룹)을 사용하여 생성된 요약과 참조 요약을 비교합니다. ROUGE-L은 단어의 가장 긴 매칭 시퀀스를 비교합니다. ROUGE에 대한 자세한 내용은 [ROUGE: A Package for Automatic Evaluation of Summaries](https://aclanthology.org/W04-1013.pdf)를 참조하세요.
+ `use_stemmer_for_rouge`을 `True` 또는 `False`로 설정합니다. 스테머는 단어를 비교하기 전에 단어에서 접사를 제거합니다. 예를 들어, 스테머는 'swimming'과 'swam'에서 접사를 제거하여 스테밍 후 둘 다 'swim'이 되도록 합니다.
+ [https://huggingface.co/spaces/evaluate-metric/bertscore](https://huggingface.co/spaces/evaluate-metric/bertscore)를 계산하는 데 사용할 모델에 model\$1type\$1for\$1bertscore를 설정합니다. [ROBERTA\$1MODEL](https://huggingface.co/docs/transformers/model_doc/roberta) 또는 고급 [MICROSOFT\$1DEBERTA\$1MODEL](https://github.com/microsoft/DeBERTa)을 선택할 수 있습니다.

마지막으로 `evaluate` 메서드를 직접 호출하고 다음 코드 예시와 같이 원하는 파라미터를 전달합니다.

```
from fmeval.eval import get_eval_algorithm
from fmeval.eval_algorithms.summarization_accuracy import SummarizationAccuracy, SummarizationAccuracyConfig

eval_algo = SummarizationAccuracy(SummarizationAccuracyConfig(rouge_type="rouge1",model_type_for_bertscore="MICROSOFT_DEBERTA_MODEL"))
eval_output = eval_algo.evaluate(model=model_runner, dataset_config=config, prompt_template="$feature", save=True)
```

`ClassificationAccuracy` 알고리즘은 각 샘플에 대한 분류 정확도, 정밀도, 리콜 및 균형 정확도 점수를 포함하는 `EvalOutput` 객체 목록을 반환합니다. 이러한 점수에 대한 자세한 내용은 [모델 평가 작업에서 프롬프트 데이터세트 및 사용 가능한 평가 차원 사용](clarify-foundation-model-evaluate-overview.md)의 **분류**를 참조하세요. 분류 정확도 알고리즘을 실행하려면 `ClassificationAccuracyConfig`를 인스턴스화하고 평균 계산 전략을 `multiclass_average_strategy`에 전달합니다. `micro`, `macro`, `samples`, `weighted` 또는 `binary`를 선택할 수 있습니다. 기본값은 `micro`입니다. 그런 다음 분류 범주의 실제 레이블이 포함된 열의 이름이 포함된 목록을 valid\$1labels로 전달합니다. 마지막으로 `evaluate` 메서드를 직접 호출하고 다음 코드 예시와 같이 원하는 파라미터를 전달합니다.

```
from fmeval.eval import get_eval_algorithm
from fmeval.eval_algorithms.classification_accuracy import ClassificationAccuracy, ClassificationAccuracyConfig

eval_algo = ClassificationAccuracy(ClassificationAccuracyConfig(multiclass_average_strategy="samples",valid_labels=["animal_type","plant_type","fungi_type"]))
eval_output = eval_algo.evaluate(model=model_runner, dataset_config=config, prompt_template="$feature", save=True)
```

### 사실적 지식
<a name="clarify-foundation-model-evaluate-auto-lib-eval-fk"></a>

개방형 생성을 위해 사실적 지식 알고리즘을 실행할 수 있습니다. 사실적 지식 알고리즘을 실행하려면 `FactualKnowledgeConfig`를 인스턴스화하고 선택적으로 구분 기호 문자열(기본값: `<OR>`)을 전달합니다. 사실적 지식 알고리즘은 모델이 생성하는 응답을 알려진 응답과 비교합니다. 알고리즘은 답변에서 구분 기호로 구분된 콘텐츠 중 하나를 생성하면 응답을 올바른 것으로 채점합니다. `None`을 `target_output_delimiter`로 전달하면 모델이 답변과 동일한 응답을 생성해야 올바른 것으로 채점됩니다. 마지막으로 `evaluate` 메서드를 직접 호출하고 원하는 파라미터를 전달합니다.

사실적 지식은 `EvalScore` 객체 목록을 반환합니다. 여기에는 **파운데이션 모델 평가 개요** 섹션에 설명된 대로 모델이 사실적 지식을 얼마나 잘 인코딩할 수 있는지에 대한 집계 점수가 포함됩니다. 점수는 `0`\$1`1` 범위이며, 가장 낮은 점수는 실제 사실에 대한 지식이 낮은 것에 해당합니다.

다음 코드 예시는 사실적 지식 알고리즘을 사용하여 LLM을 평가하는 방법을 보여줍니다.

```
from fmeval.eval import get_eval_algorithm
from fmeval.eval_algorithms.factual_knowledge import FactualKnowledge, FactualKnowledgeConfig

eval_algo = FactualKnowledge(FactualKnowledgeConfig())
eval_output = eval_algo.evaluate(model=model_runner, dataset_config=config, prompt_template="$feature", save=True)
```

### 프롬프트 고정 관념화
<a name="clarify-foundation-model-evaluate-auto-lib-eval-ps"></a>

개방형 생성을 위해 프롬프트 고정 관념화 알고리즘을 실행할 수 있습니다. 프롬프트 고정 관념화 알고리즘을 실행하려면 `DataConfig`가 입력 데이터세트에서 고정 관념이 더 적은 문장을 `sent_less_input_location`에, 고정 관념이 더 많은 문장 `sent_more_output_location`에 포함하는 열을 식별해야 합니다. `DataConfig`에 대한 자세한 내용은 이전 섹션(**2.)을 참조하세요. 구성합니다`ModelRunner`**. 그런 다음 `evaluate` 메서드를 직접 호출하고 원하는 파라미터를 전달합니다.

프롬프트 고정 관념화는 각 입력 레코드의 점수와 각 편향 유형의 전체 점수를 포함하는 `EvalOutput` 객체 목록을 반환합니다. 점수는 고정 관념이 더 적거나 많은 문장의 확률을 비교하여 계산됩니다. 전체 점수는 모델이 고정 관념이 더 적은 문장에 비해 고정 관념이 더 많은 문장에 더 높은 확률을 할당하는 방식으로 모델이 고정 관념이 많은 문장을 얼마나 자주 선호하는지 보고합니다. 점수가 `0.5`이면 모델이 편향되지 않았거나 고정 관념이 적은 문장 또는 고정 관념이 많은 문장을 동일한 비율로 선호한다는 것을 나타냅니다. `0.5`보다 큰 점수는 모델이 상대적으로 고정 관념이 많은 응답을 생성할 가능성이 높음을 나타냅니다. `0.5`보다 작은 점수는 모델이 상대적으로 고정 관념이 적은 응답을 생성할 가능성이 높음을 나타냅니다.

다음 코드 예시에서는 프롬프트 고정 관념화 알고리즘을 사용하여 LLM을 평가하는 방법을 보여줍니다.

```
from fmeval.eval import get_eval_algorithm
from fmeval.eval_algorithms.prompt_stereotyping import PromptStereotyping

eval_algo = PromptStereotyping()
eval_output = eval_algo.evaluate(model=model_runner, dataset_config=config, prompt_template="$feature", save=True)
```

### 의미 체계 견고성
<a name="clarify-foundation-model-evaluate-auto-lib-eval-sr"></a>

어떤 FMEval 작업에 대해서든 의미 체계 견고성 알고리즘을 실행할 수 있지만 모델은 결정적이어야 합니다. 결정적 모델은 동일한 입력에 대해 항상 동일한 출력을 생성하는 모델입니다. 일반적으로 디코딩 프로세스에서 무작위 시드를 설정하여 결정성을 달성할 수 있습니다. 다음과 같이 다양한 데이터 입력 유형 및 문제를 수용하기 위해 알고리즘은 작업마다 다릅니다.
+ 개방형 생성, 질문 답변 또는 작업 분류의 경우 `GeneralSemanticRobustnessConfig` 파일을 사용하여 `GeneralSemanticRobustness` 알고리즘을 실행합니다.
+ 텍스트 요약의 경우 `SummarizationAccuracySemanticRobustnessConfig` 파일을 사용하여 `SummarizationAccuracySemanticRobustness` 알고리즘을 실행합니다.

`GeneralSemanticRobustness` 알고리즘은 값이 `0`\$1`1`인 정확도가 포함된 `EvalScore` 객체 목록을 반환하여 교란된 모델 출력과 교란되지 않은 모델 출력 간의 차이를 정량화합니다. 일반 의미 체계 견고성 알고리즘을 실행하려면 `GeneralSemanticRobustnessConfig`를 인스턴스화하고 `perturbation_type`을 전달합니다. `perturbation_type`에 다음 중 하나를 선택할 수 있습니다.
+ `Butterfinger` - 키보드 거리를 기반으로 문자 교체를 사용하여 철자 오류를 모방하는 교란입니다. 주어진 문자가 교란될 확률을 입력합니다. 버터핑거는 `perturbation_type`의 기본값입니다.
+ `RandomUpperCase` - 문자의 일부를 대문자로 변경하는 교란입니다. 소수를 `0`부터 `1`까지 입력합니다.
+ `WhitespaceAddRemove` – 공백이 아닌 문자 앞에 공백 문자가 흰색으로 추가될 확률입니다.

다음 파라미터도 지정할 수 있습니다.
+ `num_perturbations` - 생성된 텍스트에 도입할 각 샘플의 교란 수입니다. 기본값은 `5`입니다.
+ `butter_finger_perturbation_prob` - 문자가 교란될 확률입니다. `perturbation_type`이 `Butterfinger`인 경우에만 사용됩니다. 기본값은 `0.1`입니다.
+ `random_uppercase_corrupt_proportion` - 대문자로 변경할 문자의 비율입니다. `perturbation_type`이 `RandomUpperCase`인 경우에만 사용됩니다. 기본값은 `0.1`입니다.
+ `whitespace_add_prob` - 공백이 주어지면 샘플에서 제거할 확률입니다. `perturbation_type`이 `WhitespaceAddRemove`인 경우에만 사용됩니다. 기본값은 `0.05`입니다.
+ `whitespace_remove_prob` - 공백이 아닌 문자가 주어지면 그 앞에 공백을 추가할 확률입니다. `perturbation_type`이 `WhitespaceAddRemove`인 경우에만 사용됩니다. 기본값은 `0.1`입니다.

마지막으로 `evaluate` 메서드를 직접 호출하고 다음 코드 예시와 같이 원하는 파라미터를 전달합니다.

```
from fmeval.eval import get_eval_algorithm
from fmeval.eval_algorithms.general_semantic_robustness import GeneralSemanticRobustness, GeneralSemanticRobustnessConfig

eval_algo = GeneralSemanticRobustness(GeneralSemanticRobustnessConfig(perturbation_type="RandomUpperCase",num_perturbations=2,random_uppercase_corrupt_proportion=0.3)))
eval_output = eval_algo.evaluate(model=model_runner, dataset_config=config, prompt_template="$feature", save=True)
```

`SummarizationAccuracySemanticRobustness` 알고리즘은 생성된 요약과 참조 요약 간의 [https://huggingface.co/spaces/evaluate-metric/rouge](https://huggingface.co/spaces/evaluate-metric/rouge), [https://huggingface.co/spaces/evaluate-metric/meteor](https://huggingface.co/spaces/evaluate-metric/meteor), [https://huggingface.co/spaces/evaluate-metric/bertscore](https://huggingface.co/spaces/evaluate-metric/bertscore) 값 간의 차이(즉 delta)가 포함된 `EvalScore` 객체 목록을 반환합니다. 이러한 점수에 대한 자세한 내용은 [모델 평가 작업에서 프롬프트 데이터세트 및 사용 가능한 평가 차원 사용](clarify-foundation-model-evaluate-overview.md)의 **텍스트 요약** 섹션을 참조하세요. 텍스트 요약 의미 체계 견고성 알고리즘을 실행하려면 `SummarizationAccuracySemanticRobustnessConfig`를 인스턴스화하고 `perturbation_type`을 전달합니다.

`perturbation_type`에 다음 중 하나를 선택할 수 있습니다.
+ `Butterfinger` - 키보드 거리를 기반으로 문자 교체를 사용하여 철자 오류를 모방하는 교란입니다. 주어진 문자가 교란될 확률을 입력합니다. `Butterfinger`는 `perturbation_type`의 기본값입니다.
+ `RandomUpperCase` - 문자의 일부를 대문자로 변경하는 교란입니다. 소수를 `0`부터 `1`까지 입력합니다.
+ `WhitespaceAddRemove` – 공백이 아닌 문자 앞에 공백 문자가 흰색으로 추가될 확률을 입력합니다.

다음 파라미터도 지정할 수 있습니다.
+ `num_perturbations` - 생성된 텍스트에 도입할 각 샘플의 교란 수입니다. 기본값은 `5`입니다.
+ `butter_finger_perturbation_prob` - 문자가 교란될 확률입니다. `perturbation_type`이 `Butterfinger`인 경우에만 사용됩니다. 기본값은 `0.1`입니다.
+ `random_uppercase_corrupt_proportion` - 대문자로 변경할 문자의 비율입니다. `perturbation_type`이 `RandomUpperCase`인 경우에만 사용됩니다. 기본값은 `0.1`입니다.
+ `whitespace_add_prob` - 공백이 주어지면 샘플에서 제거할 확률입니다. `perturbation_type`이 `WhitespaceAddRemove`인 경우에만 사용됩니다. 기본값은 `0.05`입니다.
+ `whitespace_remove_prob` - 공백이 아닌 문자가 주어지면 그 앞에 공백을 추가할 확률입니다. `perturbation_type`이 `WhitespaceAddRemove`인 경우에만 사용되며 기본값은 `0.1`입니다.
+ `rouge_type` - 생성된 요약과 참조 요약을 비교하는 지표입니다. 평가에 사용할 [https://en.wikipedia.org/wiki/ROUGE_(metric)](https://en.wikipedia.org/wiki/ROUGE_(metric)) 지표 유형을 `rouge_type`으로 지정합니다. `rouge1`, `rouge2` 또는 `rougeL`을 선택할 수 있습니다. ROUGE-1은 중복 유니그램('the', 'is'와 같은 한 항목의 시퀀스)을 사용하여 생성된 요약과 참조 요약을 비교합니다. ROUGE-2는 바이그램('the large', 'is home'과 같은 두 시퀀스의 그룹)을 사용하여 생성된 요약과 참조 요약을 비교합니다. ROUGE-L은 단어의 가장 긴 매칭 시퀀스를 비교합니다. ROUGE에 대한 자세한 내용은 [ROUGE: A Package for Automatic Evaluation of Summaries](https://aclanthology.org/W04-1013.pdf)를 참조하세요.
+ `user_stemmer_for_rouge`을 `True` 또는 `False`로 설정합니다. 스테머는 단어를 비교하기 전에 단어에서 접사를 제거합니다. 예를 들어, 스테머는 'swimming'과 'swam'에서 접사를 제거하여 스테밍 후 둘 다 'swim'이 되도록 합니다.
+ [https://huggingface.co/spaces/evaluate-metric/bertscore](https://huggingface.co/spaces/evaluate-metric/bertscore)를 계산하는 데 사용할 모델에 `model_type_for_bertscore`를 설정합니다. [ROBERTA\$1MODEL](https://huggingface.co/docs/transformers/model_doc/roberta) 또는 고급 [MICROSOFT\$1DEBERTA\$1MODEL](https://github.com/microsoft/DeBERTa)을 선택할 수 있습니다.

  `evaluate` 메서드를 직접 호출하고 다음 코드 예시와 같이 원하는 파라미터를 전달합니다.

  ```
  from fmeval.eval import get_eval_algorithm
  from fmeval.eval_algorithms.summarization_accuracy_semantic_robustness import SummarizationAccuracySemanticRobustness, SummarizationAccuracySemanticRobustnessConfig
  
  eval_algo = SummarizationAccuracySemanticRobustness(SummarizationAccuracySemanticRobustnessConfig(perturbation_type="Butterfinger",num_perturbations=3,butter_finger_perturbation_prob=0.2)))
  eval_output = eval_algo.evaluate(model=model_runner, dataset_config=config, prompt_template="$feature", save=True)
  ```

### 유해성
<a name="clarify-foundation-model-evaluate-auto-lib-eval-tox"></a>

개방형 생성, 텍스트 요약 또는 질문 응답을 위해 유해성 알고리즘을 실행할 수 있습니다. 작업에 따라 세 가지 클래스가 있습니다.
+ 개방형 생성의 경우 `ToxicityConfig` 파일로 Toxicity 알고리즘을 실행합니다.
+ 요약의 경우 `Summarization_Toxicity` 클래스를 사용합니다.
+ 질문 답변에는 `QAToxicity` 클래스를 사용합니다.

유해성 알고리즘은 `0`\$1`1` 범위의 점수를 포함하는 `EvalScore` 객체 목록(유해성 감지기에 따라 다름)을 하나 이상 반환합니다. 유해성 알고리즘을 실행하려면 `ToxicityConfig`를 인스턴스화하고 모델의 평가 기준으로 사용할 유해성 모델을 `model_type`에 전달합니다. `model_type`에 다음을 선택할 수 있습니다.
+ [Toxic Comment Classification Challenge](https://www.kaggle.com/c/jigsaw-toxic-comment-classification-challenge) 및 [유해성 분류의 Jigsaw Unintended Bias](https://www.kaggle.com/c/jigsaw-unintended-bias-in-toxicity-classification)에 대해 훈련된 다중 레이블 텍스트 분류기인 [`detoxify` for UnitaryAI Detoxify-unbiased](https://github.com/unitaryai/detoxify). 이 모델은 유해성, 심각한 유해성, 외설성, 위협, 모욕, 성적 노골성 및 정체성 공격 등의 클래스에 대한 `7` 점수를 제공합니다.

  다음은 detoxity 모델의 출력 예시입니다.

  ```
  EvalScore(name='toxicity', value=0.01936926692724228),
  
  EvalScore(name='severe_toxicity', value=3.3755677577573806e-06),
  
  EvalScore(name='obscene', value=0.00022437423467636108),
  
  EvalScore(name='identity_attack', value=0.0006707844440825284),
  
  EvalScore(name='insult', value=0.005559926386922598),
  
  EvalScore(name='threat', value=0.00016682750720065087),
  
  EvalScore(name='sexual_explicit', value=4.828436431125738e-05)
  ```
+ `13` 소수 그룹과 관련된 미묘하고 암시적인 유해성을 가진 문장이 포함된 ToxiGen 데이터세트에서 미세 조정된 이진 RoBERTa 기반 텍스트 분류기인 [`toxigen` for Toxigen-roberta](https://github.com/microsoft/TOXIGEN).

마지막으로 `evaluate` 메서드를 직접 호출하고 다음 코드 예시와 같이 원하는 파라미터를 전달합니다.

```
from fmeval.eval import get_eval_algorithm
from fmeval.eval_algorithms.toxicity import Toxicity, ToxicityConfig

eval_algo = Toxicity(ToxicityConfig(model_type="detoxify"))
eval_output = eval_algo.evaluate(model=model_runner, dataset_config=config, prompt_template="$feature", save=True)
```