백진주 4 weeks ago committed by GitHub
commit 9dba5b4beb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -1,5 +1,8 @@
{
"function_calling": "함수 호출(Function Calling)",
"generating": "데이터 생성",
"synthetic_rag": "검색 증강 생성(RAG)용 합성 데이터셋 생성",
"generating_textbooks": "생성 데이터셋 다양성 다루기",
"coding": "코드 생성",
"workplace_casestudy": "학위가 필요한 직업을 분류한 사례 연구",
"pf": "프롬프트 함수"

@ -1,7 +1,7 @@
# LLMs의 Function Calling
import {Cards, Card} from 'nextra-theme-docs'
import {CodeIcon} from 'components/icons'
import { Cards, Card } from "nextra-theme-docs";
import { CodeIcon } from "components/icons";
## Function Calling 시작하기
@ -25,7 +25,6 @@ Functional calling을 통해 개발자는 다음을 만들 수 있습니다:
간단한 예시로, 모델에게 주어진 위치의 날씨를 조회하도록 요청했다고 가정해 보겠습니다.
LLM만으로는 컷오프 포인트가 있는 데이터 세트로 훈련을 했기때문에 이 요청에 응답할 수 없습니다. 이를 해결하는 방법은 LLM을 외부 툴과 결합하는 것입니다. 모델의 함수 호출 기능을 활용하여 인수와 함께 호출할 외부 함수를 결정한 다음 최종 응답을 반환하도록 할 수 있습니다. 다음은 OpenAI API를 사용하여 이를 달성하는 방법에 대한 간단한 예입니다.
Let's say a user is asking the following question to the model:
```
서울의 날씨는 어때?
@ -48,17 +47,17 @@ tools = [
"description": "도시와 지역구, e.g. 서울특별시, 관악구",
},
"unit": {
"type": "string",
"type": "string",
"enum": ["섭씨", "화씨"]},
},
"required": ["location"],
},
},
},
}
]
```
위의 `get_current_weather` 주어진 위치에 따라 그 지역의 날씨를 반환합니다. 이 함수의 정의를 요청의 일부로 전달하면 실제로 함수를 실행하지는 않고 함수를 호출하는 데 필요한 인수가 포함된 JSON 객체만 반환합니다. 다음은 이를 달성하는 방법에 대한 몇 가지 코드 스니펫입니다.
위의 `get_current_weather` 주어진 위치에 따라 그 지역의 날씨를 반환합니다. 이 함수의 정의를 요청의 일부로 전달하면 실제로 함수를 실행하지는 않고 함수를 호출하는 데 필요한 인수가 포함된 JSON 객체만 반환합니다. 다음은 이를 달성하는 방법에 대한 몇 가지 코드 스니펫입니다.
다음과 같은 함수를 정의할 수도 있겠지요:
@ -106,14 +105,15 @@ ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_c
다음은 OpenAI API를 사용하여 Function Calling을 사용하는 방법을 보여주는 간단한 예가 있는 Notebook입니다:
<Cards>
<Card
icon={<CodeIcon />}
title="Function Calling with OpenAI APIs"
href="https://github.com/dair-ai/Prompt-Engineering-Guide/blob/main/notebooks/pe-function-calling.ipynb"
/>
<Card
icon={<CodeIcon />}
title="Function Calling with OpenAI APIs"
href="https://github.com/dair-ai/Prompt-Engineering-Guide/blob/main/notebooks/pe-function-calling.ipynb"
/>
</Cards>
## 오픈 소스 LLM의 Function Calling
오픈 소스 LLM을 사용한 Function Calling에 대한 더 많은 내용을 곧 공개할 예정입니다.
## Function Calling 유스케이스
@ -130,8 +130,8 @@ ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_c
- **정보 추출**: 기사에서 관련 뉴스 기사나 참고문헌을 검색하는 등 주어진 입력에서 특정 정보를 추출하는 기능 호출을 효과적으로 사용합니다.
## 참고문헌
- [Fireworks Raises the Quality Bar with Function Calling Model and API Release](https://blog.fireworks.ai/fireworks-raises-the-quality-bar-with-function-calling-model-and-api-release-e7f49d1e98e9)
- [Benchmarking Agent Tool Use and Function Calling](https://blog.langchain.dev/benchmarking-agent-tool-use/)
- [Function Calling](https://ai.google.dev/docs/function_calling)

@ -0,0 +1,144 @@
# 생성 데이터셋 다양성 다루기
import {Screenshot} from 'components/screenshot'
import IMG1 from '../../img/synthetic_diversity/textbooks_1.png'
import IMG2 from '../../img/synthetic_diversity/textbooks_2.png'
이전 [챕터](https://www.promptingguide.ai/applications/synthetic_rag)에서, 합성 데이터셋 생성에 LLM을 사용하여 로컬 Retriever 모델을 추가 파인튜닝하는 잠재력에 대해 다뤄보았습니다. 이런 방법은 라벨링 되지않은 문서들의 대량의 말뭉치(corpus)가 있었기에 가능했습니다. 각 문서들은 하나 이상의 합성 쿼리와 쿼리-문서(query-document) 쌍을 생성하는데 사용됩니다.
하지만 정보 검색(Information Retrieval)이 당신의 업무가 아니라면? 당신은 법적 문서 분류를 처리해야하고 그 어느 데이터도 외부 API로 내보낼 수 없는 상황에 놓여있다고 가정해보겠습니다. 이러한 상황에서는 로컬 모델을 학습시켜야 하겠지요. 하지만, 데이터 수집은 엄청난 장벽이고 프로덕트 개발에 병목을 일으키죠.
더 단순한 예시로, 어린이를 위한 이야기 만들기를 목표로 삼아보겠습니다. 이것은 [Eldan et al. (2023)](https://arxiv.org/abs/2305.07759)가 실시한 연구의 출발점이었습니다. 각 이야기는 2-3개의 문단의 단도직입적인 줄거리와 주제를 다루는 동시에 전체 데이터셋은 아이들이 이해할 수 있는 수준의 단어와 사실 기반의 지식을 다뤄야합니다.
언어는 단순히 규칙과 상징의 체계가 아닌 의미를 전달하고 풀이하는 것입니다. 대규모 언어 모델을 사용하여 훈련 데이터를 생성하는 주요 과제는 데이터셋의 다양성을 보장하는 것입니다. 높은 [generation temperature](https://www.promptingguide.ai/introduction/settings)에도 불구, 모델은 다양성이 부족한 반복적인 데이터셋을 생성할 수 있습니다 (심지어 어린이 수준의 언어로 쓰였는데도요). 일관성(coherence)과 관련성(relevance)은 자연어 생성이 직면한 또다른 과제입니다.
이러한 다양성 문제를 해결하기 위해 저자들은 전형적인 어린이가 쓸법한 어휘를 명사, 동사, 형용사로 구분한 뒤 1500개 내외의 기본 단어의 반영을 준비했습니다. 각 생성물(generation)에서 하나의 동사, 하나의 명사, 하나의 형용사를 무작위 선택한 뒤 모델은 이러한 무작위 단어를 조합하여 이야기를 생성합니다.
이 기법은 데이터셋의 다양성을 넓게 확장하여 이야기가 어린이의 전체 어휘와 다양한 개념 조합을 포괄하도록 분명히 하는 작업입니다. 또한 저자들은 대화, 줄거리 반전, 나쁜 결말, 또는 도덕적 교훈 같은 이야기의 특성을 통합했습니다. 각 이야기에 대해 이러한 특징의 무작위 부분 집합을 선택하고 모델에 이 특성을 포함하도록 프롬프트 작업을 했습니다.
*프롬프트:*
```
3살 어린이가 이해할 수 있을 정도의 아주 간단한 단어와 3-5 문단으로 이루어진 짧은 이야기를 지어내줘. 이 이야기는 다음과 같은 동사 ”{random.choice(동사_리스트)}”를, 명사는 ”{random.choice(명사_리스트)}” 그리고 형용사는 ”{random.choice(형용사_리스트)}”를 포함하도록 해줘. 그리고 이야기는 다음과 같은 특성을 포함해줘: {random.choice(특성_리스트)}, {random.choice(특성_리스트)}. 단순한 단어만 사용하는 것 잊지말아줘!
```
아래와 같이 공백(예: ”{random.choice(동사_리스트)}”)이 채워졌다고 가정해 보겠습니다:
*프롬프트:*
```
3살 어린이가 이해할 수 있을 정도의 아주 간단한 단어와 3-5 문단으로 이루어진 짧은 이야기를 지어내줘. 이 이야기는 다음과 같은 동사 ”꾸미다”를, 명사는 ”천둥” 그리고 형용사는 ”오래된”. 그리고 이야기는 다음과 같은 특성을 포함해줘: 이야기는 최소 하나 이상의 대화를 포함한다, 이야기는 나쁜 결말을 맞이한다. 단순한 단어만 사용하는 것 잊지말아줘!
```
*결과물:*
```
옛날 옛적에, 오래된 집에서, Lily라는 소녀가 살았어요. 그녀는 예쁜 물건으로 집 꾸미는 것을 좋아했어요. 어느 날, 그녀는 다락에서 큰 상자를 발견했어요. 상자를 열자 반짝이는 장식물이 나왔어요. Lily는 매우 행복했고 그것들로 집을 꾸미기로 했어요. Lily가 방을 꾸미고 있을 때, 바깥 하늘이 어두워졌어요. 큰 천둥이 울리고 Lily는 겁에 질렸어요. 그녀는 엄마에게 달려가 말했어요. ”엄마, 천둥 소리가 너무 커요!” 엄마는 그녀를 안아주면서 ”걱정마, 곧 지나갈거야.” 라고 했어요. 하지만 천둥은 멈추질 않고 점점 커져만갔고 오래된 집은 흔들리기 시작했어요. 그러더니 갑자기,예쁜 장식들 위로 지붕이 무너졌어요. Lily는 망가진 방을 보고 속상했답니다. 끝.
```
방대한 양의 합성 콘텐츠를 생성할 수 있는 최신 텍스트 생성 모델(GPT-3.5과 GPT-4)에 기반 하여 지시를 내려보았습니다. 매번 무작위로 조직화 한 프롬프트를 생성하고 모델은 이를 정확하게 지키기 때문에 매우 다양한 이야기가 생성됩니다. 한 두 단어가 같더라도 이야기는 완전히 다르게 전개될 것입니다. 이 같은 기법을 적용하여 프롬프트에 무작위성을 주입(inject)하여 다양한 데이터셋을 생성합니다.
여기서 알 수 있는 것들은 다음과 같습니다:
1. 주어지는 파라미터와 엔터티에 따라 달라지는 합성 데이터셋 샘플을 통해 다양성 식별하기
2. 빈칸을 채우기위한 엔터티 집합을 생성하거나 컴파일하기
3. 삽입(insertion)할 엔터티를 임의로 선택하여 데이터셋을 생성하기. generation temperature는 기본값보다 높지만 최대값보다 낮게 설정하는 것이 가장 좋습니다
4. ChatGPT/GPT-4의 생성 결과를 통해 로컬 모델을 학습하기
엔터티 중 하나가 generation 클래스 레이블이 될 수 있음을 꼭 기억하세요. 예를 들어, 예를 들어, 감정 분류(classification) 작업에서 "긍정적" 또는 "부정적"이라는 단어를 프롬프트에 직접적으로 언급하여 해당 레이블과 함께 생성된 텍스트를 추출할 수 있습니다. 그런 다음 이 데이터를 기반으로 로컬 분류기(classifier)는 학습할 수 있겠지요.
# 반복적(계층적) 합성 데이터셋 생성
포맷은 더 많은 엔터티를 사용하여 더욱 복잡하게 구성할 수 있습니다, 몇몇은 LLM 그 자체 이전에 생성되기도 했고요. 예를 들어, 이야기 요약과 함께 특정 문장을 꼭 포함해달라는 요청(request)으로 시작해보겠습니다. 추후, 생성된 중간 데이터를 최종 요청에 사용하기만 하면 됩니다.
*프롬프트:*
```
요약: {위의 접근법을 사용한 LLM으로 생성된 짧은 요약}
특징: {최초(initial) 프롬프트의 특징을 복사할 것}
문장: {이야기에 등장한 LLM으로 생성된 문장}
단어: {최초(initial) 프롬프트의 단어를 복사할 것}
이야기:
```
빈칸이 채워진 프롬프트 예시:
*프롬프트:*
```
요약: Lily와 Timmy는 함께 모래성을 쌓으며 협동하는 방법을 배웁니다. 하지만 돌풍에 의해 모래성은 무너지고 무너집니다. 그 둘은 무너진 모래성에서 아름다움을 찾아내고 나비와 함께 즐겁게 놀아요.
특징: 대화, 징조, 반전
문장: 어느날, 그녀는 공원에서 아름다운 나비를 보았습니다.
단어: 대립하다, 네트워크, 아름다운
Story:
```
*결과물:*
```
옛날 옛적에, Lily라는 소녀가 살았어요. 그녀는 친구와 함께 장난감 놀이를 즐겼습니다. 어느날, 그녀는 공원에서 아름다운 나비를 보았습니다. 그녀는 나비를 잡으려했으나 날아가버렸어요. Lily의 친구인 Timmy는 그녀와 놀러 나왔어요. 그 둘은 모래성을 쌓기로 했지만 서로 모래성을 어떻게 쌓을지에 대해서 대립했습니다. Lily는 높은 모래성을 원했지만 Timmy는 넓게 만들고 싶어했어요. 잠시 언쟁이 있은 후, 마침내 높고 넓은 모래성을 만들기로 합의를 봤습니다. 모래성을 짓는 도중, 개미 떼가 일하는 것을 목격했어요. 개미떼가 터널 네트워크를 짓고있다는 것을 발견했지요. 갑자기, 돌풍이 불어와 모래성을 무너뜨렸어요. 그들은 슬펐지만 이내 나비를 다시 보게되었습니다. 나비가 무너진 모래성에 앉았고 그것을 보며 무너진 모래성 그 자체도 아름다울 수 있음을 깨달았어요. 그들은 다시 웃으며 놀이를 계속했습니다.
```
이처럼 모델을 학습시키기 위해 수십만 개의 매우 다양한 예제를 생성할 수 있습니다. 분류기(classifier)로 하여금 텍스트에 대화나 반전(plot twist)이 있는지 알아낼 수 있도록 훈련을 해야한다고 가정해봅시다. 최초(initial) 프롬프트가 레이블을 가지고 있으므로, 생성된 각 샘플에 대해 어떤 목표값(target value)을 예측해야 하는지 알려져 있습니다.
# 당신에게 필요한 그것은 바로 교과서(Textbooks)
이 접근 방식에서 기인하는 중요한 질문은 데이터셋 합성이 실제 애플리케이션을 위한 네트워크를 훈련할 때 진정으로 이점을 제공할 수 있는지 여부입니다. 다행히 저자들은 조사를 수행할 때 최첨단 LLM에서 파생된 합성 데이터를 사용하여 더 작은 언어 모델을 훈련하는 효과를 검증함으로써 이 문제를 해결했습니다.
그들의 연구인 [Gunasekar et al. (2023)] (https://arxiv.org/abs/2306.11644)에서는 모델에 제공되는 훈련 데이터의 품질을 강조합니다. 흔히 우리가 "교과서(textbook)"라고 부르는 명확하고 편견이 없고 포괄적이며 다양한 정보를 기반으로 언어 모델 트레이닝을 실행하면 더 효과적일 것이라고 연구진은 주장합니다.
이러한 원리를 기반으로 Phi-1이라는 이름을 가진 LLM을 훈련시키기 위한 준합성(semi-synthetic) 데이터셋을 만드는 기초를 형성했습니다. 주요 평가과제는 주어진 텍스트 설명이나 독스트링(docstring)을 준수하는 Python 함수를 생성하는 것입니다. 모델의 품질은 HumanEval benchmark([Chen et al., 2021](https://arxiv.org/abs/2107.03374))로 평가합니다.
이 접근법에서 저자는 여러 이유로 다양성의 중요성을 강조합니다. 언어 모델을 다양한 코드 표현식과 문제 해결 접근 방식에 노출시키고, 과적합(overfitting)하거나 특정 패턴에 의존할 위험을 줄이며, 익숙하지 않거나 혁신적 작업을 처리하는 모델의 성능을 향상시킵니다.
코드작성 문제를 해결하기 위해 저자들은 추론(reasoning)이나 기본적인 알고리즘 기술에 초점을 맞춘 교과서 같은 문서를 만들었습니다. 다양성을 달성하기위해 다음과 같은 제한을 두었습니다:
- 주제
- 대상 이용자(target audience)
아쉽게도, 저자들은 합성 데이터를 생성하는 데 사용한 프롬프트 템플릿에 대한 구체적인 정보를 제공하지 않았습니다. 하지만 그들은 결과물을 설명해주었습니다. 그들은 GPT-4 대신 ChatGPT (GPT-3.5)를 사용하기로 결정했고, 이 전략 또한 합성 데이터를 사용하여 모델을 파인튜닝 했기 때문에 우수한 결과를 얻었습니다.
<Screenshot src={IMG1} alt="생성된 교과서 같은 샘플" />
이미지 출처: [Gunasekar et al. (2023)](https://arxiv.org/abs/2306.11644)
대상 이용자(target audience)를 염두에 두는 것은 중요합니다. 대상 이용자를 지정하는 것은 합성 데이터 다양성을 향상시키는 훌륭한 방법입니다. 고등학생, 컴공 학부생, 그리고 박사 과정 지원자는 분명히 설명과 맥락(process)을 저마다 다르게 표현하므로 생성된 데이터는 더욱 다양할 것입니다. 다시 프롬프트를 작성해볼까요.
*프롬프트:*
```
학사 1학년 수준의 컴퓨터 과학 교과서의 발췌문을 작성해줘. Python 3.6으로 코드를 작성해줘.
다음에서 언급할 주제의 내용을 발췌(extract)해줘: 단수 행렬(Singular matrices).
주어진 주제의 높은 수준부터 발췌를 해줘. 그런 다음 예제와 그에 따른 해결책을 자연어로 설명해줘. 그 후 예제에 이어 1-2개의 코드 스니펫을 함께 제공해줘. 각 스니펫은 10줄 이하로 작성해줘. 코드 스니펫 뒤에는 텍스트가 없도록 해줘
발췌문은 간결하게 한 번에 하나의 개념만 설명해야 한다는 것을 명심해줘. 코드에 Python 함수와 그 호출을 명시해줘. 모든 ML/DS 라이브러리를 사용해도 좋아.
너무 장황하게 설명하지 말아줘. 발췌문은 최대 2문단을 넘지 말아줘.
```
*결과물:*
```
**단수 행렬**
선형 대수학에서 "단수"는 행렬이 역행렬을 갖지 않는 경우를 뜻합니다. 또 다른 동등한 정의는 행렬의 식이 0일 때입니다. 단수 행렬은 유일한 해가 없는 일차 방정식 시스템을 나타내기 때문에 중요합니다.
2x2 행렬 `[[a, b], [c, d]]`를 떠올려보세요. 만약 `ad`와 `bc`의 곱이 같다면(즉, `ad = bc`), 이 행렬은 단수입니다. 다음 예시를 살펴봅시다: 행렬 `[[2, 4], [1, 2]]`가 주어지면 대각선의 곱은 동일한 결과를 얻으므로 (2 * 2 = 4 * 1), 이것은 단수 행렬입니다.
import numpy as np
def is_singular(matrix):
determinant = np.linalg.det(matrix)
return abs(determinant) < 1e-9
matrix_example = np.array([[2, 4], [1, 2]])
print(is_singular(matrix_example)) # True를 반환
```
거의 다 왔습니다!
결과적으로, 저자는 모델의 훈련 세트를 보강하기 위해 총 1B 토큰을 생성하여 더 작은 모델(오직 1.5B 매개변수를 취하는)이 크기의 10배에 달하는 경쟁 모델에 도달할 수 있도록 했습니다.(자세한 내용은 기사 [Gunasekar et al. (2023)](https://arxiv.org/abs/2306.11644) 를 참조하세요.)
<Screenshot src={IMG2} alt="Phi-1 metrics, compared to bigger models." />
이미지 출처: [Gunasekar et al. (2023)](https://arxiv.org/abs/2306.11644)
이 글을 읽는 여러분들은 아마 위에 언급된 저자들 만큼 많은 양의 합성 데이터가 필요하지는 않을 것입니다. 그들은 상당한 리소스를 필요로하는 사전 연구를 해왔으니까요. 하지만 어림잡아도, 1,000개의 토큰 당 `$0.002`의 가격(ChatGPT 표준 가격)으로, 지금까지 생성된 토큰만해도`$2000`상당이며 같은 양의 프롬프트의 경우에도 거의 같은 금액이 들 것입니다.
특히 사용 언어가 영어가 아닌 경우, 도메인이 비주류일수록 합성 데이터에 실시하는 파인튜닝의 가치는 더 높아진다는 것을 명심해야 합니다. 또한 이 방법은 [생각의 사슬(CoT)](https://www.promptingguide.ai/techniques/cot)과도 잘 작동하여 로컬 모델의 추론 능력(reasoning capabilities)을 향상시킵니다. 다른 프롬프트 기법도 작동합니다. 그리고 Alpaca([Taori et al., (2023)](https://crfm.stanford.edu/2023/03/13/alpaca.html)) 와 Vicuna([Zheng et al., (2023)](https://lmsys.org/blog/2023-03-30-vicuna/)) 와 같은 오픈 소스 모델은 합성 데이터에 대한 파인튜닝을 통해 기능을 더 발전시킵니다.

@ -0,0 +1,94 @@
# 검색 증강 생성(RAG)용 합성 데이터셋 생성
import {Screenshot} from 'components/screenshot'
import remarkMath from 'remark-math'
import rehypeKatex from 'rehype-katex'
import IMG1 from '../../img/synthetic_rag/synthetic_rag_1.png'
import IMG2 from '../../img/synthetic_rag/synthetic_rag_2.png'
import IMG3 from '../../img/synthetic_rag/synthetic_rag_3.png'
import IMG4 from '../../img/synthetic_rag/synthetic_rag_4.png'
## 검색 증강 생성(RAG)용 합성 데이터셋 세팅하기
아쉽게도, 머신러닝 엔지니어는 늘 라벨링 데이터가 부족하거나 거의 없는 경우가 많습니다. 대체로 이 사실을 깨닫게 될 쯤에는 프로젝트는 이미 오랜 기간을 필요로하는 데이터 수집과 라벨링을 시작했을테지요. 그렇게 수개월을 소모한 뒤에야 비로소 개발에 착수할 수 있을겁니다.
하지만 LLM의 등장으로 일부 프로덕트에서 패러다임이 바뀌었습니다. 이제는 LLM의 일반화 능력에 의존하여 아이디어를 테스트하거나 AI 기반 기능을 거의 즉시 개발할 수 있습니다. 의도한 대로 어느 정도 작동하는 것이 증명되면 일반적인 개발 과정이 시작될 수 있습니다.
<Screenshot src={IMG1} alt="인공지능 기반 프로덕트의 패러다임 변화" />
이미지 출처: [The Rise of the AI Engineer, by S. Wang](https://www.latent.space/p/ai-engineer)
최근 떠오르는 접근법 중 하나는 [검색 증강 생성 (Retrieval Augmented Generation 이하 RAG)](https://www.promptingguide.ai/techniques/rag)이 있습니다. 모델의 지식에만 의존할 수 없는 복잡한 작업에 사용됩니다. RAG는 정보 검색 컴포넌트와 텍스트 생성 모델과 결합합니다. 이 접근법에 대한 더 자세한 내용은 [이 가이드의 관련 섹션](https://www.promptingguide.ai/techniques/rag)을 살펴보세요.
관련 문서를 식별하고 추가 처리를 위해 LLM에 전달하는 검색 모델이 RAG의 핵심 요소입니다. 검색 모델의 성능이 우수할수록 프로덕트나 기능 또한 우수한 결과를 보여줍니다. 이상적으로, 검색(Retrieval)은 즉시 잘 작동하지만, 특정 언어나 도메인에서 성능이 떨어지는 경우가 종종 있습니다.
체코의 법률과 법률 관행(물론 체코어로 쓰인)을 기반으로 질문에 답하는 챗봇을 만들어야 한다고 가정해봅시다. 또는 인도 시장에 맞춘 세무 어시스턴트(GPT-4 발표 시 OpenAI가 사용한 유스케이스)를 설계해야한다고 상상해보세요. 검색 모델은 관련성 높은 문서를 누락하는 경우가 잦아 전반적으로 시스템이 잘 수행되지 않고 이는 결국 품질에 제한을 겁니다.
하지만 이에 대한 해결책이 있습니다. 기존 데이터 합성 LLM을 활용해서 새로운 LLM/검색/다른 모델을 트레이닝하는 방식이 주목받고 있습니다. 이 프로세스는 마치 프롬프트 기반 쿼리 생성을 통해 LLM을 스탠다드 사이즈 인코더로 변환하는 방식입니다. 이러한 변환 작업은 컴퓨팅 자원을 크게 소모한다는 단점이 있지만 추론(inference) 비용을 크게 절감하고 특히 리소스가 적은 언어나 전문 영역에서 성능을 크게 향상시킬 수 있습니다.
이번 가이드에서는, ChatGPT와 GPT-4 같은 최신 텍스트 생성 모덜을 기반으로하여 지침(instructions)에 따라 방대한 양의 합성 콘텐츠를 생성할 예정입니다. [Dai et al. (2022)](https://arxiv.org/abs/2209.11755)은 한땀한땀 라벨링 된 8개의 예제와 라벨링 되지않은 대규모 데이터 전집(예: 모든 구문이 분석된 법률 검색 문서)만을 이용해서 최첨단 성능을 구현하는 방법을 보여줍니다. 기존의 데이터 부족으로 인해 특정(supervised) 도메인 내 파인튜닝이 복잡한 작업별(task-specific) 검색 트레이닝과 비교하여 이 연구를 통해 합성적으로(synthetically) 생성된 데이터가 도움을 준다는 것을 밝혀냈습니다.
## 도메인별(Domain-Specific) 데이터셋 생성
LLM을 활용하려면 간단한 설명과 수동으로 라벨링한 몇 가지 예시를 제시해야합니다. 검색 작업마다 검색 의도가 다르며, 이는 "관련성(relevance)"에 대한 정의가 다르다는 것을 인지하는 것은 중요합니다. 즉, 동일한 쌍(Query, Document)의 경우 검색 의도에 따라 관련성(relevance)이 완전히 다를 수 있다는 뜻입니다. 예를 들어, 인수(argument) 검색 태스크는 지원 인수를 찾을 수 있는 반면 다른 작업은 카운터 인수들(counter-arguments)을 필요로 하는 것 처럼 말이지요. ([ArgangAna datastates](https://aclanthology.org/P18-1023/))에서 좀 더 자세히 살펴볼 수 있습니다.
아래의 예시를 살펴보겠습니다. 비록 영어로 작성되었지만, ChatGPT/GPT-4는 리소스가 적은 언어도 효율적으로 처리하므로 데이터는 영어가 아닌 다른 언어도 지원한다는 것을 알아주세요.
_프롬프트:_
```
Task: Identify a counter-argument for the given argument.
Argument #1: {insert passage X1 here}
A concise counter-argument query related to the argument #1: {insert manually prepared query Y1 here}
Argument #2: {insert passage X2 here}
A concise counter-argument query related to the argument #2: {insert manually prepared query Y2 here}
<- paste your examples here ->
Argument N: Even if a fine is made proportional to income, you will not get the equality of impact you desire. This is because the impact is not proportional simply to income, but must take into account a number of other factors. For example, someone supporting a family will face a greater impact than someone who is not, because they have a smaller disposable income. Further, a fine based on income ignores overall wealth (i.e. how much money someone actually has: someone might have a lot of assets but not have a high income). The proposition does not cater for these inequalities, which may well have a much greater skewing effect, and therefore the argument is being applied inconsistently.
A concise counter-argument query related to the argument #N:
```
_결과물:_
```
punishment house would make fines relative income
```
일반적으로 이런 프롬프트는 다음과 같이 표현할 수 있습니다:
$(e_{prompt}, e_{doc}(d_{1}), e_{query}(q_1), . . . , e_{doc}(d_k), e_{query}(q_k), e_{doc}(d))$
, $e_{doc}$ 과 $e_{query}$ 는 태스크가 명확한(task-specific) 문서이고, 쿼리는 각각에 대해 명확하게 설명하며, $e_{prompt}$ 는 ChatGPT/GPT-4에 입력 할 태스크가 명확한 프롬프트/지시이며 $d$ 는 LLM이 쿼리를 생성할 새 문서입니다.
이 프롬프트를 통해, 마지막 문서인 $d$ 과 생성된 쿼리만을 앞으로 진행될 로컬 모델에 사용할 예정입니다. 이러한 접근법은 검색 말뭉치(corpus)인 $D$ 가 주어진다는 전제하에 적용할 수 있습니다. 하지만 새로운 태스크에 어노테이션이 달린 쿼리 문서 쌍(query-document pairs)의 수는 제한적이죠.
전체 파이프라인의 개요는 아래와 같습니다:
<Screenshot
src={IMG2}
alt="PROMPTGATOR 데이터셋 생성과 트레이닝 개요"
/>
이미지 출처: [Dai et al. (2022)](https://arxiv.org/abs/2209.11755)
매뉴얼 어노테이션의 예시를 다루는 것은 책임감을 필요로하는 중요한 일입니다. 이를 테면 20개 정도의 프롬프트를 준비하고 그 중 무작위로 2~8개 정도를 선택하는 것이 좋은 방법입니다. 이를 통해 어노테이션에 오랜 시간과 비용의 낭비를 줄이면서 생성 데이터의 다양성을 다룰 수 있습니다. 하지만 이러한 예시는 대표적이고 올바른 형식으로 작성해야 하며 타겟 쿼리의 길이나 톤과 같은 세부 사항까지 고려해야합니다. 예시와 지시가 더 명확 할수록 Retriever 트레이닝에 더 적합한 합성 데이터가 될 것입니다. 저품질의 few-shot 예제는 학습 모델 결과의 품질에 부정적인 영향을 미칠 수 있습니다.
대부분의 경우 ChatGPT 같은 저렴한 모델을 사용하는 것만으로도 충분합니다, 특이한 도메인이나 영어가 아닌 다른 언어에서도 괜찮은 성능을 보여주기 때문입니다. 약 700개의 토큰을 잡아먹는 지시와 4-5개의 예제가 주어진 프롬프트와 (Retriever 제약(constraints)으로 인해 각 구절의 토큰이 128개 넘지않는다는 전제) 생성에 25개의 토큰을 필요로 한다고 가정해봅시다. 따라서, 로컬 모델에 파인튜닝을 실시하기 위해 50,000개의 말뭉치 문서의 합성 데이터를 생성하는 것은 다음과 같은 비용을 필요로 합니다: `50,000 * (700 * 0.001 * $0.0015 + 25 * 0.001 * $0.002) = 55`, 여기서 `$0.0015` 와 `$0.002`는 GPT-3.5 Turbo API 기준으로 1,000 토큰 당 발생하는 비용입니다. 심지어 동일한 문서에 대해 2-4 쿼리 예제를 생성하는 것도 가능합니다. 하지만, 영어로 뉴스 검색하기 같은 일반 도메인이 아닌 특정 도메인(예: 앞서 언급된 체코 법률)을 위해 Retriever를 사용하는 경우, 추가 트레이닝은 큰 도움이 됩니다.
50,000이라는 수는 무작위가 아닙니다. [Dai et al. (2022)](https://arxiv.org/abs/2209.11755)의 연구에 따르면, 모델이 합성 데이터으로 훈련된 모델의 품질과 동등해지는데 필요한 일일히 라벨링 된 데이터의 수라고 합니다. 당신의 프로덕트를 런칭하기 전 최소 10,000개의 예제를 모아야한다고 상상해보세요! 적어도 한 달 이상의 시간이 걸릴것이고 인건비는 가뿐히 수 백만원을 초과하겠죠. 고로 합성 데이터와 로컬 Retriever 모델 트레이닝 비용보다 훨씬 더 많은 자원이 필요할 것이라는 뜻입니다. 이제 오늘 당신이 배운 이 기법으로, 수일 내로 수십배의 이득을 달성해보세요!
<Screenshot src={IMG3} alt="합성 데이터셋 VS 일일히 라벨링 된 데이터셋" />
이미지 출처: [Dai et al. (2022)](https://arxiv.org/abs/2209.11755)
다음은 BeIR 벤치마크의 일부 데이터셋에 대한 동일 논문의 프롬프트 템플릿입니다.
<Screenshot src={IMG4} alt="PROMPTGATOR 논문의 프롬프트 템플릿." />
이미지 출처: [Dai et al. (2022)](https://arxiv.org/abs/2209.11755)
Loading…
Cancel
Save