Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
File renamed without changes.
File renamed without changes.
132 changes: 132 additions & 0 deletions RAG-1stWeek/Report_Ragas_metrics/Hateslop Week5.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
# Hateslop Week5

## Overview of metrics

- 메트릭은 AI 애플리케이션의 성능을 평가하기 위해 사용되는 정량적 지표입니다. 메트릭은 애플리케이션과 애플리케이션을 구성하는 개별 요소들이 주어진 테스트 데이터에 대해 얼마나 잘 수행되고 있는지를 평가하는 데 도움을 줍니다. 메트릭은 비교, 최적화, 그리고 애플리케이션 개발 및 배포 과정에서 의사 결정을 위한 수치적 근거를 제공합니다. 메트릭은 다음과 같은 측면에서 중요합니다:
1. 구성 요소 선택: 메트릭은 AI 애플리케이션의 다양한 구성 요소, 예를 들어 LLM(대형 언어 모델), 검색기(Retriever), 에이전트 구성 등의 성능을 사용자 데이터와 비교하여 다양한 옵션 중에서 최적의 것을 선택하는 데 사용할 수 있습니다.
2. 오류 진단 및 디버깅: 메트릭은 애플리케이션의 어떤 부분에서 오류가 발생하거나 성능이 저하되는지를 식별하는 데 도움을 주어 디버깅 및 개선을 용이하게 합니다.
3. 지속적인 모니터링 및 유지보수: 메트릭은 AI 애플리케이션의 성능을 시간에 따라 추적할 수 있도록 하며, 데이터 변화, 모델 성능 저하, 또는 사용자 요구의 변화와 같은 문제를 감지하고 대응할 수 있도록 합니다.

**Different types of metrics**

![image.png](RAG-1stWeek\Report_Ragas_metrics\image.png)

### 다양한 형태의 메트릭

메트릭은 사용되는 메커니즘에 따라 두 가지 범주로 분류할 수 있습니다:

- **LLM 기반 메트릭:** 이러한 메트릭은 평가를 수행하기 위해 LLM(대형 언어 모델)을 사용합니다. 점수나 결과를 도출하기 위해 하나 이상의 LLM 호출이 수행될 수 있습니다. 이러한 메트릭은 동일한 입력에 대해 항상 동일한 결과를 반환하지 않을 수 있으므로 다소 비결정적일 수 있습니다. 반면에, 이러한 메트릭은 인간 평가와 더 가까운 정확도를 보이는 것으로 입증되었습니다.

Ragas에서 모든 LLM 기반 메트릭은 MetricWithLLM 클래스에서 상속받습니다. 이러한 메트릭은 점수를 매기기 전에 LLM 객체가 설정되어야 합니다.

```python
from ragas.metrics import FactualCorrectness
scorer = FactualCorrectness(llm=evaluation_llm)
```

각 LLM 기반 메트릭은 Prompt 객체를 사용하여 작성된 프롬프트와 연관되어 있습니다.

- **Non-LLM 기반 메트릭:** 이러한 메트릭은 평가를 수행하기 위해 LLM을 사용하지 않습니다. 이러한 메트릭은 결정적(deterministic)이며 LLM 없이 AI 애플리케이션의 성능을 평가하는 데 사용할 수 있습니다. 이러한 메트릭은 문자열 유사성, BLEU 점수 등과 같은 전통적인 방법을 통해 AI 애플리케이션의 성능을 평가합니다. 이러한 이유로, 이러한 메트릭은 인간 평가와의 상관관계가 낮은 것으로 알려져 있습니다.

Ragas에서 모든 Non-LLM 기반 메트릭은 Metric 클래스에서 상속받습니다.

메트릭은 평가하는 데이터의 유형에 따라 크게 두 가지 범주로 분류할 수 있습니다:

- Single Turn 메트릭: 이러한 메트릭은 사용자와 AI 간의 단일 상호작용을 기반으로 AI 애플리케이션의 성능을 평가합니다. Ragas에서 단일 회차 평가를 지원하는 모든 메트릭은 SingleTurnMetric 클래스에서 상속받으며, single_turn_ascore 메서드를 사용해 점수가 매겨집니다. 또한 단일 회차 샘플(Single Turn Sample) 객체를 입력으로 기대합니다.

```python
from ragas.metrics import FactualCorrectness # LLM 기반 Single Turn 메트릭

metric = FactualCorrectness() # FactualCorrectness 인스턴스 생성
await metric.single_turn_ascore(sample) # 단일 회차 샘플에 대해 점수 매기기
```


- Multi-Turn 메트릭: 이러한 메트릭은 사용자와 AI 간의 다중 상호작용을 기반으로 AI 애플리케이션의 성능을 평가합니다. Ragas에서 다중 회차 평가를 지원하는 모든 메트릭은 MultiTurnMetric 클래스에서 상속받으며, multi_turn_ascore 메서드를 사용해 점수가 매겨집니다. 또한 다중 회차 샘플(Multi Turn Sample) 객체를 입력으로 기대합니다.

```python
from ragas.metrics import AgentGoalAccuracy # LLM 기반 Multi-Turn 메트릭 import
from ragas import MultiTurnSample # Multi-Turn 샘플 import

scorer = AgentGoalAccuracy() # AgentGoalAccuracy 인스턴스 생성
await metric.multi_turn_ascore(sample) # 다중 회차 샘플에 대해 점수 매기기
```


### 메트릭 설계 원칙

AI 애플리케이션에 대한 효과적인 메트릭을 설계하려면 신뢰성, 해석 가능성, 관련성을 보장하기 위해 몇 가지 핵심 원칙을 따라야 합니다. Ragas에서 메트릭을 설계할 때 따르는 다섯 가지 주요 원칙은 다음과 같습니다:

1. 단일 측면 초점(**Single-Aspect Focus**)

하나의 메트릭은 AI 애플리케이션의 성능 중 특정한 한 가지 측면만을 타겟으로 해야 합니다. 이는 메트릭이 해석 가능하고 실질적인 행동을 유도할 수 있도록 하며, 측정되는 항목에 대한 명확한 통찰을 제공합니다.

2. 직관적이고 해석 가능한 설계(**Intuitive and Interpretable**)

메트릭은 이해하고 해석하기 쉬워야 합니다. 명확하고 직관적인 메트릭은 결과를 쉽게 전달하고 의미 있는 결론을 도출하는 데 도움을 줍니다.

3. 효과적인 프롬프트 흐름(**Effective Prompt Flows**)

대형 언어 모델(LLM)을 사용하여 메트릭을 개발할 때, 인간 평가와 밀접하게 연관된 지능적인 프롬프트 흐름을 사용해야 합니다. 복잡한 작업을 특정 프롬프트를 가진 작은 하위 작업으로 분해하면 메트릭의 정확성과 관련성이 향상됩니다.

4. 강건성(**Robustness**)

LLM 기반 메트릭은 원하는 결과를 반영하는 충분한 few-shot 예제를 포함해야 합니다. 이는 메트릭의 강건성을 높이고 LLM이 따를 수 있는 맥락과 지침을 제공하여 더 나은 평가를 보장합니다.

5. 일관된 점수 범위(**Consistent Scoring Ranges**)

메트릭 점수 값을 정규화하거나 특정 범위(예: 0에서 1 사이)에 포함되도록 하는 것이 중요합니다. 이렇게 하면 서로 다른 메트릭 간의 비교가 용이하고 평가 프레임워크 전반에서 일관성과 해석 가능성을 유지할 수 있습니다.


이러한 원칙은 AI 애플리케이션을 평가할 때 효과적이고 실질적인 메트릭을 만드는 데 기초가 됩니다.

### 사용 가능한 메트릭 목록

Ragas는 LLM 애플리케이션의 성능을 측정하는 데 사용할 수 있는 다양한 평가 메트릭을 제공합니다. 이러한 메트릭은 애플리케이션의 성능을 객관적으로 측정하는 데 도움이 되도록 설계되었습니다. 메트릭은 RAG(Retrieval Augmented Generation) 및 에이전트 워크플로우와 같은 다양한 애플리케이션 및 작업에 사용할 수 있습니다.

각 메트릭은 애플리케이션의 특정 측면을 평가하기 위해 설계된 평가 패러다임입니다. LLM 기반 메트릭은 점수나 결과를 도출하기 위해 하나 이상의 LLM 호출을 사용할 수 있습니다. 사용자 지정 메트릭을 작성하거나 수정할 수도 있습니다.

#### Retrieval Augmented Generation(RAG) 메트릭:

- **Context Precision (문맥 정밀도)**
- **Context Recall (문맥 재현율)**
- **Context Entities Recall (문맥 엔티티 재현율)**
- **Noise Sensitivity (노이즈 민감도)**
- **Response Relevancy (응답 관련성)**
- **Faithfulness (신뢰성)**
- **Multimodal Faithfulness (멀티모달 신뢰성)**
- **Multimodal Relevance (멀티모달 관련성)**

#### 에이전트 또는 도구 사용 사례 메트릭:

- **Topic Adherence (주제 준수)**
- **Tool Call Accuracy (도구 호출 정확성)**
- **Agent Goal Accuracy (에이전트 목표 정확성)**

#### 자연어 비교 메트릭:

- **Factual Correctness (사실 정확성)**
- **Semantic Similarity (의미적 유사성)**
- **Non LLM String Similarity (비 LLM 문자열 유사성)**
- **BLEU Score**
- **ROUGE Score**
- **String Presence (문자열 존재 여부)**
- **Exact Match (정확 일치)**

#### SQL 관련 메트릭:

- **Execution-based Datacompy Score (실행 기반 Datacompy 점수)**
- **SQL Query Equivalence (SQL 쿼리 동등성)**

#### 범용 메트릭:

- **Aspect Critic (측면 비평)**
- **Simple Criteria Scoring (간단한 기준 점수화)**
- **Rubrics-based Scoring (루브릭 기반 점수화)**
- **Instance-specific Rubrics Scoring (인스턴스별 루브릭 점수화)**

#### 기타 작업:

- **Summarization (요약)**

이러한 다양한 메트릭을 활용하여 LLM 애플리케이션의 성능을 다각적으로 평가하고 분석할 수 있습니다.
Binary file added RAG-1stWeek/Report_Ragas_metrics/image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
112 changes: 52 additions & 60 deletions embeddings.ipynb → RAG-1stWeek/embeddings.ipynb

Large diffs are not rendered by default.

83 changes: 41 additions & 42 deletions intro.ipynb → RAG-1stWeek/intro.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@
"metadata": {},
"outputs": [],
"source": [
"from dotenv import load_dotenv\n",
"import os\n",
"from dotenv import load_dotenv # .env 파일에 저장된 환경 변수를 불러오는 라이브러리 import\n",
"import os # 운영 체제와 상호작용하는 모듈\n",
"\n",
"load_dotenv()\n",
"load_dotenv() # .env 파일에 저장된 환경 변수들을 현재 환경에 로드\n",
"\n",
"OPENAI_API_KEY=os.getenv(\"OPENAI_API_KEY\")\n"
"OPENAI_API_KEY = os.getenv(\"OPENAI_API_KEY\") # 환경 변수에서 'OPENAI_API_KEY'를 가져와 변수에 저장\n"
]
},
{
Expand All @@ -23,25 +23,25 @@
"name": "stdout",
"output_type": "stream",
"text": [
"제가 실시간으로 날씨를 알려드릴 수는 없지만, 내일 서울의 예상 날씨는 대체로 맑은 날씨가 예상되며 최저 기온은 약 10도, 최고 기온은 약 19도 정도가 되겠습니다. 하지만 정확한 예보는 내일 아침에 다시 확인해보시는 것이 좋을 것 같습니다.\n"
"내일 서울의 날씨는 대체로 맑겠으며 최고 기온은 26도, 최저 기온은 15도로 예상됩니다. 오전과 오후의 기온 차이가 있으니, 따뜻한 옷차림으로 준비하시면 좋을 것 같아요.\n"
]
}
],
"source": [
"from openai import OpenAI\n",
"from openai import OpenAI # OpenAI API를 사용하기 위한 라이브러리 import\n",
"\n",
"client = OpenAI(api_key=OPENAI_API_KEY)\n",
"client = OpenAI(api_key=OPENAI_API_KEY) # API 키를 사용해 OpenAI 클라이언트 인스턴스 생성\n",
"\n",
"prompt=\"내일 서울 날씨는 어때?\"\n",
"prompt = \"내일 서울 날씨는 어때?\" # OpenAI API에 전송할 사용자 메시지 정의\n",
"\n",
"completion = client.chat.completions.create(\n",
" model=\"gpt-3.5-turbo-0125\",\n",
" messages=[\n",
" {\"role\": \"user\", \"content\": prompt},\n",
"completion = client.chat.completions.create( # GPT 모델에 사용자 메시지를 보내고 응답 생성\n",
" model=\"gpt-3.5-turbo-0125\", # 사용할 모델 이름 지정\n",
" messages=[ # 대화의 내용을 리스트 형식으로 전달\n",
" {\"role\": \"user\", \"content\": prompt}, # 사용자의 메시지를 입력\n",
" ]\n",
")\n",
"\n",
"print(completion.choices[0].message.content)"
"print(completion.choices[0].message.content) # 응답 메시지의 내용을 출력"
]
},
{
Expand All @@ -58,16 +58,15 @@
}
],
"source": [
"curious_prompt = \"어떻게 네가 내일 날씨를 이야기해줄 수 있니? 너는 실시간 정보 업데이트가 안 되지 않니? 기상청 정보는 어떻게 알고 있는 거니?\"\n",
"curious_prompt = \"어떻게 네가 내일 날씨를 이야기해줄 수 있니? 너는 실시간 정보 업데이트가 안 되지 않니? 기상청 정보는 어떻게 알고 있는 거니?\" # 추가적인 질문 정의\n",
"\n",
"completion = client.chat.completions.create(\n",
" model=\"gpt-3.5-turbo-0125\",\n",
" messages=[\n",
" {\"role\": \"user\", \"content\": curious_prompt},\n",
"completion = client.chat.completions.create( # 추가적인 질문에 대해 모델에 요청\n",
" model=\"gpt-3.5-turbo-0125\", # 동일한 모델 사용\n",
" messages=[ # 대화의 내용을 리스트 형식으로 전달\n",
" {\"role\": \"user\", \"content\": curious_prompt}, # 사용자의 메시지를 입력\n",
" ]\n",
")\n",
"\n",
"print(completion.choices[0].message.content)"
"print(completion.choices[0].message.content) # 응답 메시지의 내용을 출력"
]
},
{
Expand Down Expand Up @@ -100,19 +99,19 @@
"- (충청권, 28일) 충북남부: 1mm 내외\n",
"- (전라권) 전남해안: 5mm 미만\n",
"- (경상권, 28일) 경북동해안: 5~10mm/ 대구.경북내륙, 부산.울산.경남: 5mm 미만\n",
"- (제주도, 29일) 제주도: 5~40mm\"\"\"\n",
"- (제주도, 29일) 제주도: 5~40mm\"\"\" # 기상청의 날씨 정보 텍스트 데이터\n",
"\n",
"prompt = \"내일 날씨는 어때?\" + \"\\n\\n\" + weather_info\n",
"prompt = \"내일 날씨는 어때?\" + \"\\n\\n\" + weather_info # 사용자 메시지와 날씨 정보를 결합하여 생성\n",
"\n",
"completion = client.chat.completions.create(\n",
" model=\"gpt-3.5-turbo-0125\",\n",
" messages=[\n",
" {\"role\": \"user\", \"content\": prompt},\n",
"completion = client.chat.completions.create( # 모델에 새로운 요청 전송\n",
" model=\"gpt-3.5-turbo-0125\", # 동일한 모델 사용\n",
" messages=[ # 대화의 내용을 리스트 형식으로 전달\n",
" {\"role\": \"user\", \"content\": prompt}, # 사용자 메시지를 입력\n",
" ], \n",
" temperature=0.0\n",
" temperature=0.0 # 응답의 무작위성을 제거하여 더욱 결정적인 답변 생성\n",
")\n",
"\n",
"print(completion.choices[0].message.content)"
"print(completion.choices[0].message.content) # 응답 메시지의 내용을 출력"
]
},
{
Expand All @@ -130,25 +129,25 @@
}
],
"source": [
"def count_common_words(text1, text2):\n",
" words1 = text1.split()\n",
" words2 = text2.split()\n",
" common_words = set(words1) & set(words2)\n",
" return len(common_words)\n",
"def count_common_words(text1, text2): # 두 텍스트 간 공통 단어 수를 계산하는 함수 정의\n",
" words1 = text1.split() # 첫 번째 텍스트를 단어 단위로 나눔\n",
" words2 = text2.split() # 두 번째 텍스트를 단어 단위로 나눔\n",
" common_words = set(words1) & set(words2) # 두 텍스트 간 공통 단어를 집합 교집합으로 찾음\n",
" return len(common_words) # 공통 단어 수 반환\n",
"\n",
"question = '한국의 전통 음식에 대해 무엇을 알고 계신가요?'\n",
"question = '한국의 전통 음식에 대해 무엇을 알고 계신가요?' # 사용자 질문 텍스트\n",
"\n",
"ref_texts = [\n",
"ref_texts = [ # 비교할 참조 텍스트 리스트\n",
" '한국의 전통 음식은 다양한 재료와 조리법으로 유명합니다. 김치, 불고기, 비빔밥 등이 대표적인 예시입니다.',\n",
" '한국의 음식 문화는 건강에 좋은 재료를 사용하는 것으로 알려져 있습니다. 발효 식품인 김치가 대표적입니다.',\n",
" '한국의 역사와 문화는 매우 흥미롭습니다. 고궁과 한복, 그리고 태권도 등이 유명한 문화 요소입니다.'\n",
"]\n",
"\n",
"common_word_counts = [count_common_words(question, ref_text) for ref_text in ref_texts]\n",
"common_word_counts = [count_common_words(question, ref_text) for ref_text in ref_texts] # 각 참조 텍스트와 사용자 질문 간 공통 단어 수 계산\n",
"\n",
"most_similar_index = common_word_counts.index(max(common_word_counts))\n",
"print(f\"가장 유사한 텍스트 번호: {most_similar_index+1}\")\n",
"print(f\"겹치는 단어 수 : {common_word_counts[most_similar_index]}\")"
"most_similar_index = common_word_counts.index(max(common_word_counts)) # 가장 많은 공통 단어 수를 가지는 텍스트의 인덱스 찾기\n",
"print(f\"가장 유사한 텍스트 번호: {most_similar_index+1}\") # 가장 유사한 텍스트의 번호 출력 (1부터 시작)\n",
"print(f\"겹치는 단어 수 : {common_word_counts[most_similar_index]}\") # 가장 많이 겹치는 단어 수 출력"
]
},
{
Expand All @@ -161,9 +160,9 @@
],
"metadata": {
"kernelspec": {
"display_name": ".retrieval-augmented-generation",
"display_name": "tf210",
"language": "python",
"name": "python3"
"name": "tf210"
},
"language_info": {
"codemirror_mode": {
Expand All @@ -175,7 +174,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.4"
"version": "3.10.14"
}
},
"nbformat": 4,
Expand Down
Loading