From the uDemy course on LLM engineering.
https://www.udemy.com/course/llm-engineering-master-ai-and-large-language-models
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
481 lines
12 KiB
481 lines
12 KiB
WEBVTT |
|
|
|
00:00.920 --> 00:02.690 |
|
Get it 여기까지 못 올 줄 알았죠? |
|
|
|
00:02.720 --> 00:07.910 |
|
주피터 연구소에서 개척지 모델을 세밀하게 조정하고 있어요 |
|
|
|
00:07.910 --> 00:10.580 |
|
수입 부품부터 시작하죠 |
|
|
|
00:10.580 --> 00:12.860 |
|
테스트 데이터도 가져오죠 |
|
|
|
00:12.860 --> 00:19.250 |
|
기억하신다면 이건 250개의 테스트 예제를 실행할 수 있는 실용적인 코드입니다 아름다운 |
|
|
|
00:19.250 --> 00:21.140 |
|
차트를 제공하죠 |
|
|
|
00:21.140 --> 00:28.880 |
|
마지막에 우리 환경에서 끌어안는 얼굴 토큰을 로드합니다 이번에는 사용하지 않겠지만 |
|
|
|
00:28.910 --> 00:34.280 |
|
이전처럼 항상 끌어안고 얼굴을 안는 건 어떨까요? |
|
|
|
00:34.310 --> 00:36.800 |
|
오픈AI를 사용할 거예요 |
|
|
|
00:36.830 --> 00:41.000 |
|
그래서 저 선을 저기와 여기에 실행해야 해요 |
|
|
|
00:41.000 --> 00:46.610 |
|
피클 파일에서 훈련 데이터와 테스트 데이터를 열어 이걸 하도록 하겠습니다 |
|
|
|
00:46.700 --> 00:51.200 |
|
모든 걸 처음부터 다시 만들 필요가 없도록요 |
|
|
|
00:51.470 --> 00:52.340 |
|
좋아요 |
|
|
|
00:52.340 --> 00:54.500 |
|
이제 뭘 할지 얘기해보죠 |
|
|
|
00:54.500 --> 01:04.680 |
|
오픈AI는 여러분이 훈련할 때 훈련에 사용한 예시를 50-100개 정도 사용하라고 |
|
|
|
01:04.830 --> 01:06.210 |
|
권장해요 |
|
|
|
01:06.210 --> 01:14.160 |
|
개척지 모델의 세밀한 조정은 음색과 스타일을 바꾸는 거예요 오류를 |
|
|
|
01:14.160 --> 01:19.860 |
|
수정하고 어떤 상황에서는 정확도를 높이는 거죠 |
|
|
|
01:20.010 --> 01:28.860 |
|
중요한 건 아니고 예시를 많이 넣는 것도 큰 의미가 없어요 GPT 4 시리즈 같은 모델은 너무 많은 데이터를 바탕으로 |
|
|
|
01:28.980 --> 01:35.070 |
|
훈련되어서 여러분이 정말 하려는 건 여러분이 원하는 특정 작업의 예시를 충분히 |
|
|
|
01:35.070 --> 01:39.150 |
|
제공하는 거예요 그래야 거기서 배울 수 있죠 |
|
|
|
01:39.390 --> 01:46.980 |
|
네, 아주 많은 숫자를 추천하지 않는 건 아니지만 적어도 500은 |
|
|
|
01:46.980 --> 01:50.970 |
|
뽑을 거예요 권장량보다 많죠 |
|
|
|
01:51.060 --> 01:55.830 |
|
그리고 제가 실험해 봤는데 작은 수치보다 결과가 좋았어요 |
|
|
|
01:56.130 --> 01:59.040 |
|
500가지 예시를 들어볼게요 |
|
|
|
01:59.070 --> 02:00.540 |
|
지금은 아주 작은 사례만 있죠 |
|
|
|
02:00.570 --> 02:07.310 |
|
텍스트는 아주 작아요 일반적으로 훨씬 더 큰 훈련 문서를 생각하고 있죠 |
|
|
|
02:07.310 --> 02:10.220 |
|
그래서 저는 전혀 미안하지 않아요 |
|
|
|
02:10.430 --> 02:14.510 |
|
지금은 미세한 조율이에요 |
|
|
|
02:14.660 --> 02:19.850 |
|
한동안은 비어요 9월 23일까지는요 9월 말까지는요 |
|
|
|
02:19.850 --> 02:26.840 |
|
하지만 무료가 아니게 되더라도 여러분이 지불하는 비용은 500개에 대한 추론만 수행하는 |
|
|
|
02:26.840 --> 02:30.830 |
|
비용과 비슷합니다 이것도 역시 몇 센트로 측정되죠 |
|
|
|
02:30.830 --> 02:38.480 |
|
그럼 지금으로서는 0달러 정도 되겠네요 5천 달러요, 그 정도 금액으로요 |
|
|
|
02:38.570 --> 02:41.930 |
|
여전히 적은 금액이네요 |
|
|
|
02:41.930 --> 02:46.490 |
|
말씀드렸듯이 9월 말까지는 무료예요 |
|
|
|
02:46.730 --> 02:54.170 |
|
500개의 훈련 세트를 만들었어요 실제 훈련 세트인 400,000개와 |
|
|
|
02:54.200 --> 02:56.600 |
|
비교해서요 |
|
|
|
02:56.780 --> 03:00.020 |
|
50달러로 검증 받을게요 |
|
|
|
03:00.020 --> 03:05.240 |
|
아까 언급했듯이 검증은 필요 없습니다 훈련 세트에서 한 번만 |
|
|
|
03:05.240 --> 03:07.190 |
|
할 것이기 때문이죠 |
|
|
|
03:07.460 --> 03:12.470 |
|
하지만 여러분께 보여드리면 유용할 것 같았어요 나중에 여러분 프로젝트에서 어떻게 사용할지 |
|
|
|
03:12.470 --> 03:13.340 |
|
알 수 있게요 |
|
|
|
03:13.340 --> 03:16.970 |
|
이 모든 게 여러분의 프로젝트에 따라 복제될 수 있거든요 |
|
|
|
03:16.970 --> 03:18.560 |
|
이걸 실행해요 |
|
|
|
03:19.010 --> 03:28.160 |
|
첫 단계는 Jsonl JSON 라인 데이터를 준비하는 거라고 말씀드렸죠 훈련 데이터를 이 포맷으로 |
|
|
|
03:28.160 --> 03:30.020 |
|
변환하는 거예요 |
|
|
|
03:30.020 --> 03:37.730 |
|
먼저 여러분이 잘 아는 메서드 함수를 작성했어요 메시지를 전달하는 함수죠 지난 시간에 했던 |
|
|
|
03:37.730 --> 03:40.040 |
|
것과 정확히 일치해요 |
|
|
|
03:40.130 --> 03:46.580 |
|
물품의 가격을 추정하고 가격으로만 답해야 해요 설명하지 말고요 |
|
|
|
03:46.580 --> 03:51.380 |
|
사용자 프롬프트는 아이템에서 테스트 프롬프트를 가져오고요 |
|
|
|
03:51.590 --> 03:58.850 |
|
그리고 1달러가 될 만한 건 다 빼고 빈 지폐로 바꿔요 |
|
|
|
03:58.850 --> 04:04.780 |
|
최저 금액을 제시하는 게 아닙니다 개척지 연구소는 그런 추측이 |
|
|
|
04:04.810 --> 04:05.740 |
|
필요 없죠 |
|
|
|
04:05.740 --> 04:10.900 |
|
그리고 이것도 빼요 그게 사용자 프롬프트에 가는 거죠 |
|
|
|
04:10.900 --> 04:17.350 |
|
그럼 전 보조에게 가격을 말하고 가격을 알려줘요 |
|
|
|
04:17.350 --> 04:19.090 |
|
실행해 보죠 |
|
|
|
04:19.090 --> 04:24.760 |
|
무슨 일인지 잘 모르실 수 있으니 예를 들어볼게요 |
|
|
|
04:24.790 --> 04:34.210 |
|
모델이 처음 보는 0번 열차에 보내는 메시지예요 |
|
|
|
04:34.210 --> 04:36.910 |
|
Get 롤 시스템이에요 |
|
|
|
04:36.910 --> 04:38.560 |
|
시스템 프롬프트죠 |
|
|
|
04:38.590 --> 04:42.970 |
|
만족스러운지 확인하고 사용자를 롤해요 |
|
|
|
04:43.090 --> 04:45.070 |
|
이게 사용자 프롬프트예요 |
|
|
|
04:45.430 --> 04:51.040 |
|
우리가 이 질문을 한 것 같네요 물음표는 얼마일까요? |
|
|
|
04:51.040 --> 04:58.270 |
|
델포이 어쩌고 하는 장황한 얘기도 들었어요 연료 펌프 모듈요 |
|
|
|
04:58.690 --> 05:04.900 |
|
그리고 이건 비서의 대답이에요 |
|
|
|
05:04.900 --> 05:07.330 |
|
가격은 226달러예요 |
|
|
|
05:07.330 --> 05:12.310 |
|
그런 건 상상도 못 했어요 그런 건 상상도 못 했죠 |
|
|
|
05:12.520 --> 05:14.080 |
|
자, 보세요 |
|
|
|
05:14.080 --> 05:15.700 |
|
매일 새로운 걸 배우네요 |
|
|
|
05:15.700 --> 05:20.200 |
|
어쨌든 이게 메시지 형식입니다 이 단계에선 아주 익숙할 |
|
|
|
05:20.200 --> 05:21.040 |
|
거예요 |
|
|
|
05:21.040 --> 05:28.270 |
|
이게 어떻게 완벽하게 만들어진 테스트, 아니 훈련 데이터 포인트인지 알 수 있습니다 우리가 모델에 |
|
|
|
05:28.300 --> 05:29.410 |
|
제공할 것이죠 |
|
|
|
05:29.770 --> 05:36.910 |
|
좋아요, 여기 JSON L을 만드는 함수가 있어요 여러분이 예상하는 대로 항목을 여러 |
|
|
|
05:36.910 --> 05:38.530 |
|
개 받아들이죠 |
|
|
|
05:38.530 --> 05:40.570 |
|
그런 항목을 반복할 거예요 |
|
|
|
05:40.570 --> 05:47.560 |
|
각각의 객체를 위해 텍스트를 생성하죠 |
|
|
|
05:47.560 --> 05:54.340 |
|
그런 다음 Json을 사용하죠 덤프 스트링을 덤프 스트링으로 전환해 단순한 문자열로 변환하죠 |
|
|
|
05:54.340 --> 06:00.820 |
|
보세요, 문자열 하나에 추가하고 끝에 캐리지 리턴을 하죠 |
|
|
|
06:00.850 --> 06:05.020 |
|
그리고 다시 리턴합니다 마지막 캐리지 리턴을 제거하고요 |
|
|
|
06:05.020 --> 06:07.360 |
|
어떻게 작동하는지 보죠 |
|
|
|
06:07.360 --> 06:10.240 |
|
먼저 실행해 보죠 |
|
|
|
06:10.450 --> 06:12.340 |
|
나처럼 실수하지 마요 |
|
|
|
06:12.640 --> 06:13.600 |
|
됐어요 |
|
|
|
06:13.600 --> 06:15.730 |
|
이제 만들기를 해요 JSON |
|
|
|
06:15.730 --> 06:22.180 |
|
훈련 데이터를 제출하도록 하죠 |
|
|
|
06:22.210 --> 06:27.370 |
|
앞의 세 곡만 통과시키죠 그래야 사람들이 안 몰려요 |
|
|
|
06:27.370 --> 06:29.860 |
|
get get get 문자열이죠 |
|
|
|
06:29.860 --> 06:34.090 |
|
그리고 문자열도 있어요 |
|
|
|
06:34.090 --> 06:35.830 |
|
인쇄하는 게 더 쉬울 것 같아요 |
|
|
|
06:35.860 --> 06:40.090 |
|
get을 해서 빈 선이 잘 보이게 만들어 줄게요 |
|
|
|
06:40.420 --> 06:48.130 |
|
문자열입니다 문자열에 1, 2, 3개의 줄이 있죠 |
|
|
|
06:48.370 --> 06:50.290 |
|
좀 휘감기고 있어요 |
|
|
|
06:50.290 --> 07:02.290 |
|
각 행에 있는 메시지를 보면 훈련 데이터 포인트를 나타내요 |
|
|
|
07:02.740 --> 07:03.400 |
|
네 |
|
|
|
07:03.410 --> 07:04.760 |
|
지금까진 좋아요 |
|
|
|
07:04.940 --> 07:08.240 |
|
이제 그 위에 구축된 함수가 있어요 |
|
|
|
07:08.240 --> 07:08.810 |
|
그렇죠? |
|
|
|
07:08.840 --> 07:12.110 |
|
Jsonl은 항목을 취하고 파일 이름을 취해요 |
|
|
|
07:12.110 --> 07:13.850 |
|
아주 간단해요 |
|
|
|
07:13.880 --> 07:18.950 |
|
파일 이름을 열고 위의 함수를 호출해 써요 |
|
|
|
07:18.950 --> 07:23.270 |
|
그에 대한 데모는 드릴 필요가 없을 것 같네요 |
|
|
|
07:23.300 --> 07:26.180 |
|
실행해야 하지만 실제로 실행할 수 있어요 |
|
|
|
07:26.180 --> 07:34.190 |
|
이제 훈련 데이터 집합을 볼게요. 잘 조율된 트레인 기억하시죠? 500개의 아이템이 있어요. |
|
|
|
07:34.190 --> 07:34.940 |
|
확인해 보죠 |
|
|
|
07:34.970 --> 07:40.550 |
|
됐어요, 훈련 데이터 세트 전체에서 500개, 400,000개예요 |
|
|
|
07:40.580 --> 07:45.590 |
|
전부 파일에 작성해 GPT 4에 업로드 하진 않아요 |
|
|
|
07:45.920 --> 07:52.550 |
|
파인 튠 트레인 닷 JSON 파일에 그걸 적어요 |
|
|
|
07:52.550 --> 07:58.700 |
|
그걸 실행하고 유효성 검증 세트를 가져다가 정확히 같은 걸 실행하죠 |
|
|
|
07:58.700 --> 08:03.170 |
|
저 두 파일을 작성했는데 몇 초 전에 작성된 걸 보실 수 있죠 |
|
|
|
08:03.170 --> 08:05.790 |
|
이걸 열면 열 수 있어요 |
|
|
|
08:05.790 --> 08:12.450 |
|
JupyterLab에도 JSON 라인 편집기가 있어요 일반 편집기로 |
|
|
|
08:12.450 --> 08:13.530 |
|
넘어가 보죠 |
|
|
|
08:13.560 --> 08:18.420 |
|
여러분이 기대하는 대로 500개의 행이 있네요 |
|
|
|
08:18.420 --> 08:24.270 |
|
자, 끝까지 갑니다 500줄이네요 |
|
|
|
08:24.300 --> 08:27.960 |
|
모두 우리가 바라는 구조로 이루어져 있어요 |
|
|
|
08:28.170 --> 08:35.010 |
|
잘 구성된 JSON이 아닌 걸 알 수 있어요 각 행은 잘 구성된 JSON 문서거든요 |
|
|
|
08:35.010 --> 08:39.330 |
|
제가 장황하게 말하고 있지만 이걸 읽을 수 없고 JSON 문서로 파싱할 |
|
|
|
08:39.330 --> 08:42.990 |
|
수 없는 게 중요해요 구성이 잘 된 JSON이 아니니까요 |
|
|
|
08:42.990 --> 08:44.910 |
|
선이 분리돼 있어요 |
|
|
|
08:45.240 --> 08:50.730 |
|
에디터로 여는 검증 파일이 50개 정도 될 거예요 |
|
|
|
08:50.760 --> 08:54.780 |
|
50줄은 거의 비슷하게 말했어요 |
|
|
|
08:54.900 --> 08:58.680 |
|
JSON 라인에서 어떻게 보이는지 보여드릴게요 |
|
|
|
08:58.680 --> 08:59.130 |
|
편집자요 |
|
|
|
08:59.130 --> 09:01.140 |
|
이렇게 생긴 멋진 편집기예요 |
|
|
|
09:01.140 --> 09:04.290 |
|
각각을 열 수 있어요 JSON 개체 같죠 |
|
|
|
09:04.720 --> 09:05.110 |
|
네 |
|
|
|
09:05.200 --> 09:06.310 |
|
보세요 |
|
|
|
09:07.060 --> 09:08.260 |
|
그렇게 시작을 했어야죠 |
|
|
|
09:08.260 --> 09:08.980 |
|
아마도요 |
|
|
|
09:09.010 --> 09:11.380 |
|
어떤 상황인지 잘 알 수 있죠 |
|
|
|
09:11.650 --> 09:17.080 |
|
메시지가 왜 포장되는지에 대한 직관적인 감각을 발휘하죠 |
|
|
|
09:17.080 --> 09:18.280 |
|
포장된 방식요 |
|
|
|
09:19.180 --> 09:23.950 |
|
좋아요, 그게 파일이에요 |
|
|
|
09:24.100 --> 09:26.080 |
|
그게 마지막 단계예요 |
|
|
|
09:26.080 --> 09:27.310 |
|
이 부분요 |
|
|
|
09:27.700 --> 09:33.550 |
|
오픈AI에 업로드 할 때가 된 것 같아요 |
|
|
|
09:33.550 --> 09:38.350 |
|
OpenAI.Files.Create라고 이름 붙였어요 |
|
|
|
09:38.350 --> 09:42.880 |
|
파일을 전달하고 목적이 미세하다고 말하죠 |
|
|
|
09:43.270 --> 09:47.350 |
|
한 가지 주의할 게 있어요 |
|
|
|
09:47.350 --> 09:50.560 |
|
이 파일을 전달할 때 반드시 전달해야 해요 |
|
|
|
09:50.590 --> 09:56.680 |
|
이진법 파일로 열어야 합니다. 왜냐하면 그 파일은 바이너리 바이트로 되어 있어서 OpenAI로 스트리밍 |
|
|
|
09:56.680 --> 09:58.270 |
|
될 것이니까요. |
|
|
|
09:58.300 --> 10:02.980 |
|
R이 아니라 RB로 해야 해요 |
|
|
|
10:02.980 --> 10:07.160 |
|
아주 작은 뉘앙스만 조심하면 돼요 |
|
|
|
10:07.160 --> 10:12.140 |
|
파일의 모든 내용을 OpenAI로 보내고 있어요 |
|
|
|
10:12.290 --> 10:15.950 |
|
그 라인을 실행하는 데 1초가 걸리죠 |
|
|
|
10:15.980 --> 10:20.960 |
|
무엇이 돌아왔는지 검사하면 파일 객체를 가져오죠. |
|
|
|
10:21.650 --> 10:24.410 |
|
특정 바이트의 개수가 있고요 |
|
|
|
10:24.620 --> 10:28.070 |
|
객체는 파일이고 목적은 잘 조정되었고 상태는 처리되었어요 |
|
|
|
10:28.070 --> 10:32.660 |
|
OpenAI는 이미 파일을 가져와서 처리하고 있어요 |
|
|
|
10:32.660 --> 10:35.930 |
|
검증도 똑같이 할 거예요 |
|
|
|
10:36.260 --> 10:38.660 |
|
실행하면 다 됐어요 |
|
|
|
10:38.660 --> 10:41.420 |
|
다시 한 번 처리하죠 |
|
|
|
10:41.420 --> 10:45.350 |
|
이 시점에서 우린 두 개의 JSON 파일을 만들었죠 |
|
|
|
10:45.350 --> 10:50.180 |
|
하나는 훈련용이고 하나는 검증용이죠 |
|
|
|
10:50.180 --> 10:53.000 |
|
우리 파일 시스템에 적어뒀어요 |
|
|
|
10:53.000 --> 11:00.560 |
|
그리고 OpenAI에 업로드했습니다 OpenAI에서 파일 객체로 자리 잡고 있죠 |
|
|
|
11:00.590 --> 11:05.150 |
|
다음 시간에는 미세한 조정을 할 거예요 |
|
|
|
11:05.180 --> 11:06.170 |
|
거기서 봐요
|
|
|