Skip to content
This page has been auto-translated and may contain errors.View in English

미세 조정

docs.scrimba.com

**미세 조정**은 기존 모델을 가져와서 자신의 예제에 대해 계속 학습시켜 기본 동작을 원하는 방향으로 변경하는 것입니다. 이 장에서는 이것이 무엇을 변경하는지, 무엇에 좋은지, 그리고 프롬프팅이나 검색 대신 언제 사용해야 하는지에 대한 실질적인 그림을 제시합니다.

학습이 실제로 하는 일

미세 조정이 무엇을 변경하는지 보려면 모델이 어디서 나오는지 아는 것이 도움이 됩니다. 모델은 크게 두 단계로 구축됩니다.

첫 번째는 **사전 학습**입니다: 모델은 엄청난 양의 텍스트를 읽고 다음 토큰을 예측하는 것을 반복적으로 배우며, 문법, 사실, 추론 패턴이 부작용으로 정착됩니다. 그 결과는 기반 모델로, 유창하지만 초점이 없습니다. 텍스트를 계속 이어갈 수 있지만 질문에 답하는 도움이 되는 어시스턴트로 훈련되지 않았습니다.

두 번째 단계는 사후 학습입니다: 기반 모델은 좋은 응답의 엄선된 예제와 어떤 답변이 더 좋은지에 대한 인간의 피드백에 대해 추가로 훈련됩니다. 이것이 원시 텍스트 예측기를 실제로 대화하는 도움이 되는 어시스턴트로 변환합니다. API에서 호출하는 모델은 이미 두 단계를 모두 거친 것입니다.

두 단계 모두 동일한 메커니즘으로 작동합니다: 모델에 예제를 보여주고 내부 숫자인 매개변수 또는 가중치를 조정하여 예측이 그 예제에 더 가까워지도록 합니다. 학습은 모델을 영구적으로 변경하는 예측 연습입니다.

Juno학습이 실제로 하는 일 모델은 두 단계로 구축됩니다. 사전 학습은 모델이 엄청난 양의 텍스트에서 다음 토큰을 예측하도록 하여 유창하지만 초점 없는 기반 모델을 생성합니다. 사후 학습은 이를 엄선된 좋은 응답과 인간의 피드백으로 훈련시켜 도움이 되는 어시스턴트로 변환합니다. 둘 다 동일한 방식으로 작동합니다: 모델의 내부 가중치를 조정하여 예측이 제시된 예제와 일치하도록 합니다.

모델은 두 학습 단계를 거쳐 당신에게 도달하며, 각 단계의 형태를 알면 미세 조정이 무엇을 이동할 수 있는지를 알 수 있습니다.

**사전 학습**이 먼저 옵니다: 모델은 방대한 양의 텍스트를 읽고 다음 토큰을 예측하는 단일 훈련을 수십억 번 합니다. 문법, 세계 지식, 추론 패턴이 가중치에 부작용으로 정착됩니다. 결과는 기반 모델로, 텍스트를 계속하는 데는 유창하지만 아직 어시스턴트가 아닙니다. 질문을 확장하기보다 답하는 법을 모릅니다.

사후 학습은 두 번째 단계이며, 미세 조정이 모방하는 것입니다. 기반 모델은 좋은 응답의 엄선된 예제와 어느 답변이 더 좋은지에 대한 인간의 선호 신호에 대해 추가로 훈련됩니다. 그것이 API에서 호출하는 지시를 따르는 동작을 생성합니다.

두 단계 모두 동일한 루프를 실행합니다: 모델에 예제를 제공하고, 예측을 목표와 비교하고, 간격을 좁히기 위해 가중치를 조정합니다. 미세 조정은 동일한 루프로, 공급자의 두 단계가 완료된 후 귀하의 예제로 범위가 지정됩니다. 학습은 가중치를 편집하여 동작을 변경하며, 조회 테이블을 추가하지 않으며, 이것이 미세 조정이 일부 작업에는 좋고 다른 작업에는 나쁜 이유 전부입니다.

Juno학습이 실제로 하는 일 두 단계가 모델을 준비합니다: 사전 학습은 다음 토큰 예측을 유창한 기반 모델에 반복 훈련시키고, 사후 학습은 엄선된 예제와 선호 데이터로 이를 어시스턴트로 만듭니다. 둘 다 동일한 루프를 실행하고, 예제를 제공하고, 가중치를 조정하며, 미세 조정은 데이터로 범위가 지정된 루프입니다. 가중치를 편집하며, 조회 테이블을 추가하지 않으므로 동작을 잘 변경하고 사실을 잘못 저장합니다.

모델은 두 학습 단계 후에 도착하며, 그 둘 사이의 경계가 미세 조정이 사는 곳입니다.

**사전 학습**은 모델당 한 번의 비용이 많이 드는 단계입니다: 거대한 텍스트 말뭉치, 다음 토큰 예측의 단일 목표, 그리고 가중치(모델의 조정 가능한 숫자)가 부산물로 문법, 지식, 추론을 흡수합니다. 출력은 기반 모델로, 유창하지만 도움이 되도록 조종되지 않습니다. 사후 학습은 엄선된 시연과 인간의 선호 데이터를 사용하여 해당 기반 모델을 어시스턴트로 정렬합니다. API 모델을 호출할 때쯤 둘 다 실행되었습니다.

미세 조정은 사후 학습의 연속으로, 데이터로 범위가 지정되고 이미 정렬된 모델 위에서 실행됩니다. 메커니즘은 동일합니다: 예제를 제시하고, 예측이 목표로부터 얼마나 멀리 떨어져 있는지 측정하고, 그 간격을 줄이기 위해 가중치를 조정합니다. 운영상 중요한 결과는 미세 조정이 다른 모든 것을 보유하는 것과 동일한 글로벌 매개변수를 이동한다는 것입니다. 모듈을 추가하지 않고 공유 표면을 살짝 밀고 있으므로, 미세 조정이 대상 작업을 개선하고 동시에 관련 없는 기능을 조용히 저하시킬 수 있습니다.

이 공유 표면 속성이 이 장의 모든 실패 모드를 설정합니다: 과적합, 망각, 드리프트. 미세 조정은 동작을 재형성하며, 사실 저장소를 절대 설치하지 않습니다. 이것을 유지하면 올바른 이유로 이를 찾게 될 것이고 잘못된 이유로는 건너뜁니다.

Juno학습이 실제로 하는 일 사전 학습은 다음 토큰 예측을 기반 모델에 반복 훈련시키는 모델당 한 번의 무거운 작업이고, 사후 학습은 이를 어시스턴트로 정렬하며, 미세 조정은 데이터에서 해당 두 번째 단계를 계속합니다. 매번 동일한 루프: 예제를 제시하고, 가중치를 조정합니다. 핵심은 모듈을 볼트로 고정하지 않고 공유 글로벌 매개변수를 밀고 있다는 것이므로, 미세 조정이 작업을 향상시키고 동일한 실행에서 관련 없는 것에 손상을 줄 수 있으며, 이것이 과적합과 망각이 오는 곳입니다.

미세 조정이란

미세 조정은 그 두 번째 단계의 작은, 표적화된 버전으로, 당신에 의해 실행됩니다. 이미 훈련된 모델을 가져와서 자신의 예제 집합에 대해 계속 훈련시키며, 각 예제는 입력과 원하는 출력이 쌍을 이룹니다. 충분한 예제 후에 모델의 가중치는 이 종류의 응답이 기본값이 되도록 이동하며, 프롬프트에서 매번 요청할 필요가 없습니다.

프롬프팅 및 RAG와의 실제 차이는 변경이 어디에 사는지입니다. 프롬프팅 및 RAG는 모델을 동결시키고 호출 시점에 제공하는 컨텍스트를 통해 이를 조종합니다. 미세 조정은 모델 자체를 변경하므로 새로운 동작이 구워지고 짧은 프롬프트에서도 나타납니다. 런타임에 더 나은 지시를 주지 않습니다; 이미 원하는 방식으로 기울어진 모델을 출시하고 있습니다.

실제로는 공급자에게 예제 대화 파일을 제공하고, 이는 훈련 작업을 실행하며, 새로운 **모델 id**를 반환합니다. 그 id를 다른 모델처럼 정확히 호출하면, 그 응답은 훈련한 내용을 반영합니다. 미세 조정은 동작을 모델로 이동하며, 프롬프팅과 RAG는 동결된 것을 조종합니다.

Juno미세 조정이란 미세 조정은 사후 학습의 작은 버전으로 당신이 실행합니다: 기존 모델을 계속 훈련시켜서 원하는 동작이 기본값이 될 때까지 자신의 입출력 예제에 대해 훈련합니다. 동결된 모델을 컨텍스트로 조종하는 프롬프팅과 RAG와 달리 미세 조정은 모델의 가중치를 변경하므로 동작이 구워지고 짧은 프롬프트에서도 나타납니다. 예제 파일을 제공하고 다른 모델처럼 호출하는 새 모델 id를 받습니다.

미세 조정은 한 작업으로 범위가 지정되고 당신에 의해 실행되는 사후 학습입니다. 이미 훈련된 모델에서 시작하여 예제에 대해 계속 훈련하며, 각 예제는 입력과 원하는 출력이 쌍을 이룹니다. 충분히 제공하면 가중치는 응답이 기본값이 되도록 정착하며, 프롬프트에서 요청하는 지시가 없습니다.

중요한 선은 조종이 어디에 있는지입니다. 프롬프팅과 RAG는 가중치를 동결시키고 호출 시점에 제공되는 컨텍스트를 통해 동작을 형성하므로 모든 호출이 지시를 수반합니다. 미세 조정은 한 번 미리 가중치를 편집하므로 동작은 모델 id 내에서 배송되고 짧은 프롬프트에서 생존합니다. 런타임 조종 대 구워진 동작: 그것이 당신이 만드는 트레이드입니다.

워크플로우는 구체적입니다. 예제 대화 파일을 조립하고, 훈련 작업을 시작하고, 공급자가 새 모델 id를 반환합니다. 다른 모델처럼 그 id를 호출합니다.

python
# 각 예제는 런타임에 제공하는 정확한 형태의 대화로,
# 모델이 배우기를 원하는 출력으로 끝납니다.
training_examples = [
    {"messages": [
        {"role": "system", "content": "티켓의 긴급도를 낮음, 중간, 높음으로 분류하세요."},
        {"role": "user", "content": "이번 주에 두 번 청구되었고 오늘 해결이 필요합니다."},
        {"role": "assistant", "content": "높음"},
    ]},
    {"messages": [
        {"role": "system", "content": "티켓의 긴급도를 낮음, 중간, 높음으로 분류하세요."},
        {"role": "user", "content": "어디선가 다크 모드 설정이 있나요?"},
        {"role": "assistant", "content": "낮음"},
    ]},
    # ... 예상하는 입력의 전체 범위를 포함하는 수백에서 수천 개 더
]
# 메시지 형태와 훈련 작업 API는 공급자에 따라 다르며; 아이디어는 동일합니다.
Juno미세 조정이란 미세 조정은 작업으로 범위가 지정된 사후 학습입니다: 원하는 동작이 기본값이 될 때까지 입출력 예제에 대해 모델을 계속 훈련합니다. 프롬프팅과 RAG는 모든 호출을 통해 컨텍스트로 동결된 모델을 조종하며, 미세 조정은 가중치를 한 번 편집하여 동작이 모델 id 내에서 탑니다. 예제 대화 파일을 구성하고, 훈련 작업을 실행하며, 반환된 id를 다른 모델처럼 호출합니다.

미세 조정은 당신이 제어하는 데이터 세트에서 계속된 사후 학습으로, 새 id 뒤에 파생 모델을 생성합니다. 각 훈련 예제는 입력과 목표 출력이 쌍을 이루며, 작업은 목표 응답이 모델의 기본값이 될 때까지 가중치를 누릅니다. 동작은 가중치에 배송되므로 짧은 프롬프트로 충분합니다.

대안과 정확히 대조하십시오. 왜냐하면 차이는 철학적이 아니라 운영상이기 때문입니다. 프롬프팅과 RAG는 가중치를 동결시키고 컨텍스트(모델이 호출 시점에 읽는 텍스트)를 통해 동작을 주입하므로 문자열을 편집하고 몇 초 안에 재배포하여 동작을 변경할 수 있습니다. 미세 조정은 동작을 가중치에 구우므로 동작을 변경하려면 새로운 훈련 실행, 평가 통과, 새 모델 id의 재배포가 필요합니다. 런타임 조종은 초 단위로 편집 가능하며, 미세 조정은 훈련 주기에서만 편집 가능합니다.

python
# 미세 조정된 모델은 다른 id입니다; 호출 형태는 변경되지 않습니다.
response = client.chat.completions.create(
    model="your-org/urgency-classifier-v1",  # 이것을 고정하고; 계약의 일부로 취급하세요
    messages=[
        {"role": "system", "content": "티켓의 긴급도를 낮음, 중간, 높음으로 분류하세요."},
        {"role": "user", "content": "내보내기 단추를 클릭할 때 작동하지 않습니다."},
    ],
)
# response.choices[0].message.content -> "낮음"  (레이블만, 훈련한 동작)
# 표시된 호출 형태는 OpenAI-SDK 스타일입니다; 공급자에 따라 다릅니다.

그 비용 비대칭은 커밋하기 전에 내면화해야 할 것입니다. 미세 조정된 id는 버전 관리되는 아티팩트입니다: 생명 주기, 평가, 원하는 동작이 이동할 때마다 재훈련을 소유합니다. id를 고정하고, 버전하며, 배운 것의 모든 변경이 또 다른 커밋이 아니라 또 다른 작업이라는 사실에 대해 예산을 책정하십시오.

Juno미세 조정이란 미세 조정은 데이터에서 계속된 사후 학습으로, 동작이 가중치에 사는 새 id 뒤의 파생 모델을 생성합니다. 프롬프팅 및 RAG와의 대조는 운영상입니다: 런타임 조종은 편집 가능한 문자열로, 초 단위로 재배포하며, 미세 조정은 버전 관리되는 아티팩트로, 훈련 실행, 평가 통과, 재배포를 통해서만 변경합니다. id를 고정하고, 계약으로 취급하며, 모든 동작 변경이 또 다른 작업이라는 사실에 대해 예산을 책정합니다.

무엇이 좋은지, 무엇이 나쁜지

미세 조정은 프롬프트가 내리기에 어려운 **일관된 동작**이 필요할 때 자리를 차지합니다: 매번 정확한 출력 형식, 특정 톤 또는 집 스타일, 또는 수천 개의 호출에서 안정적으로 수행되는 분류와 같은 좁은 작업. 또한 그렇지 않으면 긴 프롬프트에 명시할 동작이 모델에 구워지므로 프롬프트가 짧아지기 때문에 호출을 더 싸고 빠르게 만들 수 있습니다.

이것이 실패하는 곳은 지식입니다. 미세 조정은 모델에 새로운 사실을 가르치는 데 별로이며, 변하는 사실에는 더 나쁩니다. 훈련 예제는 정확한, 조회 가능한 항목으로 저장되기보다 일반적인 패턴으로 흐려지므로, 미세 조정된 모델은 여전히 세부 정보를 발명하고 정보가 업데이트되는 순간 구식이 됩니다. 가격이나 정책이 변경될 때마다 재훈련하는 것은 느리고 비용이 많이 듭니다. 문제가 "모델이 X를 모른다"일 때, 답은 거의 항상 미세 조정이 아니라 RAG입니다.

경험의 법칙: 형식을 변경하려면 미세 조정하고 사실을 추가하려면 하지 마세요. 모델에 답변하는 방법을 가르치고 검색이 무엇으로 답변할지 처리하도록 합니다.

Juno무엇이 좋은지, 무엇이 나쁜지 미세 조정은 일관된 동작에 좋습니다: 고정된 출력 형식, 특정 톤, 또는 안정적으로 수행되는 좁은 작업이며, 프롬프트를 단축할 수 있으므로 호출이 더 저렴합니다. 지식에는 나쁩니다: 사실을 안정적으로 저장하지 않으며, 변경될 때 구식이 되며, 재훈련하는 데 비용이 많이 듭니다. 규칙은 형식을 변경하려면 미세 조정하고 사실을 추가하려면 하지 않으며, RAG가 사실을 처리하게 합니다.

미세 조정은 **형식**에 대해 이익을 줍니다: 모든 호출에서 정확한 출력 형태, 고정된 톤 또는 집 스타일, 또는 수천 개의 요청에서 안정적으로 유지되는 분류와 같은 좁은 작업. 프롬프팅 단독이 계속 표류하고 모델이 형식을 대부분의 시간이지만 다운스트림을 파싱할 수 있을 만큼 안정적으로 충분하지 않을 때 승리가 복합적입니다. 동작을 구우면 형식은 더 이상 모든 호출에서 희망하는 것이 아닙니다.

또한 프롬프트를 단축하며, 규모에 있어 그것은 실제 비용 레버입니다. 현재 모든 요청에서 형식과 몇 가지 예제를 명시하면, 그 지시 토큰이 모든 단일 호출에 청구됩니다. 가중치로 접으면 호출당 프롬프트는 축소됩니다. 산술은 가치가 있습니다: 미세 조정은 한 번 지불된 고정 훈련 비용이고, 긴 프롬프트는 영원히 지불된 호출당 비용이므로, 프롬프트 단축은 호출 볼륨이 저장된 토큰이 훈련 청구를 초과할 만큼 높을 때 이익을 줍니다.

이것이 실패하는 곳은 지식입니다. 훈련 예제는 일반적인 패턴으로 흐려지며, 정확한 검색 가능한 항목이 아니므로, 미세 조정된 모델은 여전히 세부 정보를 발명하고 가격이나 정책이 변경되는 순간 구식이 됩니다. 사실을 업데이트하는 것은 또 다른 훈련 실행을 의미합니다. 형식에 대해 미세 조정하고, 사실에 대해 RAG를 사용하고, 이들을 결합합니다. 강한 패턴은 둘 다 동시에입니다: 형식과 톤에 대해 모델을 미세 조정하고, 런타임에 현재 사실을 검색하고 조정된 모델이 이들을 구성하게 합니다.

미세 조정을 시도하기 전에, 프롬프팅이 실제로 실패했는지 확인하세요. "실패"는 명확한 지시와 몇 가지 잘 선택된 예제가 다양한 입력에서 테스트되어 여전히 목표 율을 놓친다는 것을 의미합니다. 첫 번째 한 줄 프롬프트가 떨어져 보인다는 것이 아닙니다. 해당 테스트를 실행하지 않았다면, 미세 조정할 준비가 되지 않은 것입니다.

Juno무엇이 좋은지, 무엇이 나쁜지 미세 조정은 형식에 좋습니다: 고정된 출력 형태, 설정된 톤, 안정적으로 유지되는 좁은 작업, 그리고 모든 호출에서 토큰을 절약하는 더 짧은 프롬프트입니다. 비용 수학은 한 번 지불된 고정 훈련 대 영원히 지불된 프롬프트 토큰이므로 프롬프트 단축은 높은 볼륨에서 이익을 줍니다. 사실에는 나쁩니다. 패턴으로 흐려지고 구식이 되므로, 조정된 모델을 RAG와 쌍으로 만드세요: 형식은 가중치에서, 사실은 검색에서입니다. 그리고 프롬프팅이 실제로 실패했는지 증명하세요. 예제로 다양한 입력에서 테스트된 실제 프롬프트는 첫 번째 대략적인 프롬프트가 아닙니다.

미세 조정은 형식에 신뢰할 수 있고 사실에 신뢰할 수 없으며, 이유는 기계적입니다. 형식, 출력 형태, 톤, 작업 규칙은 동작 규칙성으로, 가중치가 많은 예제에서 흡수할 수 있습니다. 사실은 이산적이고 변경 가능하며, 가중치는 이들을 검색 가능한 행이 아니라 혼합 패턴으로 손실이 있게 저장하므로, 조정된 모델은 여전히 지어내고 기본 사실이 이동하는 순간 구식이 됩니다.

헤드라인을 넘어 밀어붙이면 실제 위험은 미세 조정이 저하되는 방식입니다. **과적합**은 모델이 일반적인 동작을 배우는 대신 훈련 집합을 기억하므로 예제를 정확히 맞추고 다른 입력에서 흔들립니다. 재난적 망각은 반대면입니다: 좁은 작업에 대해 열심히 훈련하는 것은 기본 모델이 가진 관련 없는 일반적인 능력을 침식할 수 있습니다. 왜냐하면 공유 가중치를 이동하므로 분류자가 더 날카로워지는 동안 다른 것에서의 추론은 더 둔해집니다. 분포 드리프트는 느린 것입니다: 마지막 분기의 입력 분포에서 조정된 모델이 실제 트래픽이 본 것에서 벗어나면서 천천히 감소하며, 감소는 측정할 때까지 조용합니다.

두 가지 결과가 실제로 이것을 실행하는 방식을 형성합니다. 첫째, 분위기에 미세 조정을 배송할 수 없습니다; 당신은 평가 집합이 필요합니다. 입력의 유지된 배치로, 이전과 이후에 점수가 매겨지는 알려진 좋은 답변으로, 목표가 개선되었음을 증명하고, 덜 중요하지 않게, 일반적인 능력이 회귀하지 않았음을 증명합니다. 둘째, 원하는 동작의 모든 변경은 또 다른 전체 작업입니다: 데이터를 다시 정리하고, 재훈련하고, 재평가하고, 새 id를 재배포합니다. 그 운영 드래그는 매개변수 효율적인 방법이 모두 존재하는 이유입니다. 전체 모델 대신 추가된 가중치의 작은 집합을 훈련하여 미세 조정하는 방법으로, 실행 및 저장하는 데 더 저렴하지만, 미세 조정할지 여부를 결정하는 것은 변경되지 않습니다. 어느 쪽이든 배송 전에 미세 조정이 회귀하지 않았음을 증명합니다.

Juno무엇이 좋은지, 무엇이 나쁜지 형식은 가중치로 흡수되고 사실은 하지 않습니다: 미세 조정은 여전히 지어내고 구식이 되므로 검색에서 사실을 유지합니다. 위험은 과적합(집합을 기억하고, 새 입력에서 흔들림), 재난적 망각(좁은 훈련이 관련 없는 능력을 침식하므로 가중치가 공유됨), 그리고 실제 트래픽이 훈련 데이터에서 벗어나면서 분포 드리프트입니다. 따라서 이전과 이후에 점수가 매겨진 유지된 평가로 모든 미세 조정을 게이트하여 회귀가 없음을 증명하고, 각 동작 변경이 전체 재훈련-평가-재배포 주기라는 사실에 대해 예산을 책정합니다.

프롬프팅, RAG, 또는 미세 조정?

대부분의 경우 당신은 여기서 시작하지 않습니다. 세 기술은 **사다리**를 형성하며, 변경하기에 가장 싸고 빠릅니다:

  1. 프롬프팅. 항상 이것을 먼저 시도하세요. 반복하는 데 즉시이고, 추가 비용이 없으며, 명확한 프롬프트와 몇 가지 예제는 사람들이 예상하는 것보다 더 많이 해결합니다. 프롬프트를 작동하게 만들지 않았다면, 미세 조정할 준비가 되지 않은 것입니다.
  2. RAG. 간격이 지식일 때 이것에 도달하세요: 모델은 사실이 필요하며, 이는 변합니다. RAG는 질문 시점에 이들을 제공하고 모델을 건드리지 않습니다.
  3. 미세 조정. 간격이 동작이고 프롬프팅이 충분히 일관되게 만들 수 없을 때 또는 당신의 프롬프트가 너무 길어져서 지시를 모델로 구우면 규모에서 더 싸고 빠를 때 이것에 도달하세요.

이들은 상호 배타적이지 않으며, 가장 강력한 시스템이 이들을 결합합니다: 형식과 톤에 대해 모델을 미세 조정하고, 런타임에 RAG를 사용하여 현재 사실을 제공합니다. 훈련에서의 동작, 검색에서의 지식.

따라서 미세 조정 전에 빠른 테스트입니다. 더 나은 프롬프트로 거기에 도달할 수 있습니까? 그렇다면 그렇게 하세요. 간격이 지식이 없습니까? 그렇다면 RAG입니다.

사다리를 올라가세요; 미세 조정은 첫 번째가 아니라 마지막 계단입니다. 프롬프트가 이미 올바르고, 사실이 이미 사용 가능하고, 모델이 여전히 충분히 일관되게 동작하지 않을 때만 미세 조정이 맞는 도구가 됩니다.

Juno프롬프팅, RAG, 또는 미세 조정? 세 가지를 사다리로 취급하세요: 즉시이고 저렴하므로 프롬프팅을 먼저하고, 모델이 지식이 빠질 때 RAG를 추가하고, 간격이 프롬프팅이 일관되게 만들 수 없는 동작이거나 규모에서 프롬프트를 단축할 때만 미세 조정합니다. 이들은 잘 결합됩니다: 형식에 대해 미세 조정하고, 사실에 RAG를 사용합니다. 미세 조정은 도달하는 마지막 계단이며, 첫 번째가 아닙니다.

세 기술은 **사다리**를 형성하며, 배송 후 동작을 변경하는 데 얼마나 빠르고 싸게 하는지로 정렬됩니다:

  1. 프롬프팅. 첫째, 항상. 추가 훈련 비용 없이 초 단위로 반복하며, 명확한 지시와 몇 가지 예제가 예상하는 것보다 더 많은 지역을 다룹니다. 실제 프롬프트가 테스트되고 낙담할 때까지, 더 높은 계단은 조기입니다.
  2. RAG. 간격이 지식일 때, 모델이 부족하거나 시간에 따라 변하는 사실, 검색이 질문 시점에 제공하고 가중치는 단독으로 둡니다. 사실을 업데이트하는 것은 재훈련이 아닌 소스를 업데이트합니다.
  3. 미세 조정. 간격이 프롬프팅이 내릴 수 없는 동작이거나 프롬프트가 길어졌을 때 지시를 가중치에 구우면 규모에서 더 저렴합니다.

당신을 올바른 계단에 놓는 진단은 간격의 이름 지정입니다. 잘못된 형식 또는 톤은 동작 간격이므로 프롬프트하고, 미세 조정합니다. 누락되거나 구식인 사실은 지식 간격이므로 검색합니다. 간격을 잘못 읽으면, 당신은 지식 문제를 해결하려고 미세 조정하고 구식으로 가는 것을 볼 것입니다. 또는 검색 단계가 가져와야 할 사실을 프롬프트에 채웁니다.

이들은 상호 배타적이지 않으며, 결합된 패턴은 프로덕션에서 도달할 패턴입니다: 형식에 대해 미세 조정하고, 사실에 RAG하고, 함께합니다. 형식과 톤에 조정된 모델로, 런타임에 현재 사실이 공급되고, 당신에게 다른 기술 중 하나가 홀로 제공할 수 있는 일관된 형태와 신선한 컨텐츠를 제공합니다.

당신이 미세 조정할 수 있는지 여부는 모델에 달려 있습니다. 폐쇄형 공급자는 자신의 모델의 관리된 미세 조정을 제공합니다; 열린 무게 모델로 당신은 자신의 약관에서 자신에게 미세 조정할 수 있으며, 이것이 열린 무게에 도달하는 이유 중 하나입니다 (열린 모델과 폐쇄 모델).

Juno프롬프팅, RAG, 또는 미세 조정? 사다리를 가장 싼 계단에서 올라가세요: 먼저 프롬프트하고, 간격이 지식일 때 RAG를 추가하고, 프롬프팅이 내릴 수 없는 동작일 때 또는 규모에서 프롬프트를 단축할 때만 미세 조정합니다. 진단은 간격의 이름 지정입니다. 형식 또는 톤은 동작을 의미하고, 누락되거나 구식인 사실은 검색을 의미합니다. 프로덕션 이동은 둘 다 함께입니다: 형식에 대해 미세 조정하고, 사실에 RAG를 수행하므로 일관된 형태와 신선한 컨텐츠를 동시에 얻습니다.

사다리는 프롬프트하고 RAG하고 미세 조정하며, **반복 비용**으로 정렬됩니다: 배송 후 동작을 변경하는 데 얼마나 빠르고 싸게 합니다. 프롬프트는 초 단위로 편집하고 재배포하는 문자열입니다. 검색 소스는 모델을 건드리지 않고 업데이트하는 데이터입니다. 미세 조정은 훈련 실행, 평가 통과, 새 모델 id입니다. 비용이 더 높은 계단이 증명할 수 없을 때만 올라가는 것을 의미합니다.

실제 기술은 간격을 올바르게 진단하는 것입니다. 왜냐하면 실패 모드는 이를 다루지 않는 도구를 선택하기 때문입니다. 동작 간격(잘못된 형태, 잘못된 톤, 불일관한 작업 준수)은 프롬팅과 미세 조정이 해결하는 것입니다. 지식 간격(모델이 부족한 사실, 또는 변하는 하나)은 검색이 해결합니다. 미세 조정은 지식 간격은 고전적인 비용이 많이 드는 실수입니다: 당신은 사실을 훈련하고, 다음 업데이트로 구식이 되며, 당신은 이들을 인용할 수 없습니다.

운영 비대칭을 진단 옆에 유지하세요. RAG의 반복 비용은 모든 호출, 영원히 지불되지만 살게 조정 가능한 검색 품질과 지연입니다. 미세 조정의 반복 비용은 학습된 동작의 모든 변경에서 재실행하는 것이며, 각 실행이 수반하는 회귀 위험입니다.

그래서 결합된 아키텍처는 타협이 아니라 설계입니다: 형식을 가중치로 조정하고, 검색에서 사실을 유지하고, 독립적으로 각각을 버전 해제합니다. 형식은 드물게 변경되고 느린 업데이트 주기를 허용합니다; 사실은 끊임없이 변경되고 빠른 주기를 요구합니다. 분할하면 각각이 자신의 속도로 이동할 수 있으며, 당신은 미세 조정된 모델을 다시 평가하고 코퍼스를 다시 인덱싱하지 않거나 훈련 작업을 다시 실행하지 않고 새로 고칠 수 있습니다.

Juno프롬팅, RAG, 또는 미세 조정? 사다리는 반복 비용으로 정렬됩니다: 프롬프트는 초 단위로 편집하고, 소스는 모델 없이 업데이트하며, 미세 조정은 전체 훈련-평가-재배포입니다. 도구를 선택하기 전에 간격을 진단하세요. 동작은 프롬팅과 미세 조정으로 가고, 지식은 검색으로 가며, 미세 조정 지식 간격은 배송 구식, 비파괴적인 사실의 비용이 많이 드는 실수입니다. 프로덕션 아키텍처는 목적상 이들을 분할합니다: 형식을 가중치로 조정하고, 검색에서 사실을 유지하고, 독립적으로 각각을 버전 해제하므로 형식은 천천히 이동하고 사실은 빠르게 이동할 수 있습니다.

실제로

미세 조정 데이터는 특이하지 않습니다. 각 예제는 런타임에 보내는 정확한 형태의 짧은 대화로, 모델이 주었기를 원하는 답변으로 끝납니다:

python
# 여기에 몇 가지가 표시되어 있습니다; 실제 데이터 세트는 수백에서 수천 개의 예제이고,
# 런타임에 예상하는 입력의 전체 범위를 다룹니다.
training_examples = [
    {"messages": [
        {"role": "system", "content": "티켓의 긴급도를 낮음, 중간, 높음으로 분류하세요."},
        {"role": "user", "content": "이번 주에 두 번 청구되었고 오늘 해결이 필요합니다."},
        {"role": "assistant", "content": "높음"},
    ]},
    {"messages": [
        {"role": "system", "content": "티켓의 긴급도를 낮음, 중간, 높음으로 분류하세요."},
        {"role": "user", "content": "어디선가 다크 모드 설정이 있나요?"},
        {"role": "assistant", "content": "낮음"},
    ]},
    # ...
]

이들을 파일에 저장하고, 공급자로 훈련 작업을 시작하고, 완료될 때까지 기다립니다. 반환되는 것은 새로운 모델 id로, 다른 모델처럼 정확히 호출합니다:

python
# 미세 조정된 모델은 다른 id입니다; 다른 모든 것은 변경되지 않습니다.
response = client.chat.completions.create(
    model="your-org/urgency-classifier-v1",
    messages=[
        {"role": "system", "content": "티켓의 긴급도를 낮음, 중간, 높음으로 분류하세요."},
        {"role": "user", "content": "내보내기 단추를 클릭할 때 작동하지 않습니다."},
    ],
)
# response.choices[0].message.content -> "낮음"  (레이블만, 훈련한 동작)

승리는 동작이 이제 모델에 산다는 것입니다. 지시는 더 짧을 수 있으며, 형식은 수천 개의 호출에서 유지되며, 거기에 도달하기 위해 프롬프트를 늘릴 필요가 없습니다. 비용은 그 주변의 모든 것입니다: 당신은 품질 데이터 세트, 훈련 실행, 그리고 배운 것을 변경하려고 할 때마다 신선한 작업이 필요합니다. 이는 정확히 왜 이것이 사다리의 맨 아래에 앉습니다. 예제를 업로드하고, 모델 id를 얻고, 다른 모델처럼 호출합니다.

Juno실제로 미세 조정 데이터는 원하는 답변으로 끝나는 예제 대화로, 수백에서 수천 개입니다. 파일을 업로드하고, 훈련 작업을 실행하며, 다른 모델처럼 호출하는 새 모델 id를 다시 받습니다. 동작은 구워지므로 프롬프트는 더 짧아지고 형식은 일관되게 유지되며, 데이터 세트를 구축하고 변경할 때마다 작업을 재실행하는 비용으로 합니다.

워크플로우는 업로드, 훈련, 호출이지만, 그것이 작동하는지 결정하는 부분은 작업이 아니라 **데이터 세트**입니다. 품질과 범위는 원시 개수보다 더 중요합니다. 수백 개의 깨끗한, 일관된 예제는 실제 입력 범위에 걸쳐 수천 개의 노이즈가 많거나 모순되는 것을 이기므로, 모델은 실제로 데이터에 있는 규칙성을 학습하며, 실수를 포함합니다.

훈련 전에 데이터를 분할합니다. 모델이 훈련 중에 볼 수 없는 슬라이스를 유지하면 검증 세트이고, 훈련된 예제에 대한 것이 아니라 거기서 정확도를 확인합니다. 모델은 이미 본 데이터에 거의 완벽하게 점수를 매길 수 있지만 새로운 무엇이든 나쁘게 하므로, 유지된 숫자는 동작이 일반화되는지 여부를 알려주는 것입니다.

python
# 훈련 작업이 절대 보지 않는 부분을 예약하여 실제 성능을 측정합니다.
split = int(len(training_examples) * 0.8)
train_set = training_examples[:split]        # 작업이 이들에 훈련합니다
validation_set = training_examples[split:]   # 당신은 이들에 대한 결과를 점수 매깁니다
# 공급자는 새 모델 id를 반환합니다; 당신은 다른 모델처럼 호출합니다.
# 작업 API 및 분할 처리는 공급자에 따라 다릅니다; 일부는 검증 파일을 직접 가져갑니다.

두 가지 판단 호출이 메커니즘 위에 있습니다. 첫째, 훈련 실행을 보내기 전에 프롬팅이 실제로 실패했는지 확인하세요: 몇 가지 예제가 있는 실제 지시, 다양한 입력에서 테스트됨, 첫 번째 대략적인 작성 초안이 아님. 둘째, 비용을 신중하게 계산하세요. 미세 조정은 한 번 지불된 고정 훈련 비용 대 영원히 지불된 긴 프롬프트의 호출당 비용이므로, 프롬프트 단축은 저장된 토큰의 가치가 있을 호출 볼륨에서만 이익을 줍니다. 그리고 결합된 패턴을 기억하세요: 형식에 대해 조정된 모델, RAG 사실에 대해 그것이 기억하려고 시도하지 않아야 합니다.

Juno실제로 작업은 업로드-훈련-호출이지만, 데이터 세트는 결과를 결정합니다: 몇 백 개의 깨끗한, 다양한 예제는 수천 개의 노이즈 가득한 것을 이기므로, 모델은 실제로 데이터에 있는 것을 학습합니다. 검증 슬라이스를 유지하고 훈련 예제에 대한 것이 아니라 거기서 점수 매깁니다. 또는 기억한 모델은 그것이 있는 것보다 더 좋아 보입니다. 먼저 프롬팅이 정말로 실패했는지 확인하고, 고정 훈련 비용 대 영원히 지불되는 프롬프트 토큰의 비용을 계산하고, 조정된 모델을 RAG와 쌍으로 만드세요. 형식을 처리하는 동안 검색이 사실을 처리합니다.

파이프라인은 업로드, 훈련, 평가, 배포이며, 엔지니어링은 데이터 세트와 **평가 세트**에 있으며, 훈련 호출이 아닙니다. 두 가지 분할 규칙이 이를 수행합니다. 검증 세트로, 훈련에서 유지되면, 동작이 기억되기보다 일반화되는지 여부를 알려줍니다. 분리된 유지된 평가 세트로, 이전과 이후에 점수가 매겨지면, 미세 조정이 대상에 도움이 되었으며 일반적인 능력에 회귀하지 않았음을 증명합니다. 마지막 섹션에서 재난적 망각 체크가 구체적으로 됩니다.

python
# 세 가지 분리된 슬라이스: 하나에 훈련하고, 다른 하나에서 결정을 조정하고, 세 번째에서 판단합니다.
train_set      = examples[:8000]        # 작업이 이들에 훈련합니다
validation_set = examples[8000:9000]    # 실행 중 과적합을 감시합니다
eval_set       = examples[9000:]        # 이전과 이후에 점수 매깁니다

# 기본 모델과 미세 조정 모델을 동일한 eval_set에 점수 매깁니다. 그런 다음 비교합니다.
base_score = run_eval(base_model_id, eval_set)
tuned_score = run_eval(fine_tuned_id, eval_set)
# 대상에서 tuned_score가 기본값을 이기고 일반 능력 체크에 유지될 때만 배포합니다.
# 평가 점수 및 훈련 API는 공급자에 따라 다릅니다; 규칙은 그렇지 않습니다.

데이터 세트 품질은 과적합과 드리프트가 승리하거나 손실되는 곳입니다. 좁거나 별난 데이터 세트는 세트의 특이성을 기억하고 다른 입력에서 흔들리는 모델을 훈련시키므로, 실제 입력 분포의 범위가 개수보다 더 중요하며, 프로덕션 트래픽이 훈련된 것에서 벗어나면서 당신은 다시 측정합니다. 구식 평가는 어떻게 조용히 드리프트하는 모델이 검토를 통과하고 사용자에게 실패합니다.

설계하기 위한 운영 현실은 학습된 동작의 모든 변경이 편집이 아니라 전체 재실행입니다. 재정리하고, 재훈련하고, 재평가하고, 매번 고정된 새 id를 재배포합니다. 그 반복 비용, 그리고 모든 실행의 회귀 위험, 왜 당신은 사실을 RAG에서 유지합니다. 천천히 변경되는 동작을 위해 미세 조정을 예약합니다. 각 조정된 id를 새로운 실행이 회귀할 때 롤백할 수 있는 버전 관리 아티팩트로 취급합니다.

Juno실제로 파이프라인은 업로드-훈련-평가-배포이며, 작업은 데이터 분할에 있습니다. 훈련 호출이 아닙니다: 검증 세트는 기억을 잡고, 이전과 이후에 점수가 매겨진 유지된 평가 세트는 회귀가 없음을 증명합니다. 데이터 세트는 실제 입력 분포의 범위이고 과적합과 드리프트를 이기므로, 트래픽이 훈련 데이터에서 벗어나면서 다시 측정합니다. 그리고 반복 비용에 설계합니다. 모든 동작 변경은 훈련-평가-재배포 전체이며, 이것이 사실이 RAG에서 각각을 버전 해제하고 조정된 각 id가 롤백할 수 있는 버전 관리 아티팩트인 이유입니다.

이것은 모델이 예측하도록 책상을 배열한 마지막 방법입니다. 다음 장에서는 이를 행동하는 능력을 제공합니다: 도구 사용에서 모델은 자신의 함수를 호출하며, 그 후 에이전트로 루프에서 실행합니다.