🧱 1️⃣ 새로운 VPC 생성

  1. AWS Management Console → VPC 서비스로 이동
    검색창에 “VPC” 입력 → “VPCs” 메뉴 클릭
  2. [Create VPC] 버튼 클릭
  3. 설정 예시
    • VPC only 선택
    • Name tag: my-new-vpc
    • IPv4 CIDR block: 10.1.0.0/16 (기존 VPC와 겹치지 않게)
    • IPv6 CIDR: 비활성화(필요시만)
    • Tenancy: Default (Dedicated 필요 없으면)
  4. [Create VPC] 클릭

✅ 결과: my-new-vpc라는 완전히 독립된 VPC가 만들어집니다.


🌐 2️⃣ 서브넷 / 인터넷 게이트웨이 / 라우팅 세팅

VPC만 있으면 EC2가 외부통신 불가이므로, 기본 네트워킹 요소를 만들어야 합니다.

  1. Subnet 생성
    • VPC 대시보드 → “Subnets” → [Create subnet]
    • VPC: my-new-vpc
    • Subnet name: my-new-public-subnet
    • Availability Zone: ap-northeast-2a (또는 원하는 AZ)
    • IPv4 CIDR block: 10.1.1.0/24
    • Create subnet
  2. Internet Gateway 생성
    • 왼쪽 메뉴 “Internet Gateways” → [Create internet gateway]
    • Name tag: my-new-igw
    • Create → Attach to VPC → my-new-vpc
  3. Route Table 수정
    • “Route tables” → my-new-vpc에 자동생성된 테이블 선택
    • Routes 탭 → Edit routes → Add route
      • Destination: 0.0.0.0/0
      • Target: 방금 만든 my-new-igw
    • Save changes
    • “Subnet associations” 탭 → Edit → my-new-public-subnet 연결

✅ 결과: my-new-public-subnet은 인터넷 연결 가능한 퍼블릭 서브넷이 됨.


💻 3️⃣ 새 EC2 인스턴스 생성 (이 VPC 안에)

  1. EC2 → Instances → [Launch instances]
  2. 이름: my-new-server
  3. AMI 선택: Amazon Linux / Ubuntu 등
  4. 인스턴스 유형: t3.micro 등
  5. Key pair:
    • “Create new key pair” 클릭
    • Name: my-new-keypair
    • Type: RSA (또는 ED25519)
    • Format: .pem (Windows PuTTY면 .ppk 선택)
    • [Create key pair] → 자동으로 다운로드됨 (my-new-keypair.pem)
  6. Network settings:
    • VPC: my-new-vpc
    • Subnet: my-new-public-subnet
    • Auto-assign public IP: Enable
    • Security group: 새로 생성 (예: SSH(22), HTTP(80), HTTPS(443))
  7. Launch instance

✅ 결과: 완전히 독립된 VPC + 서브넷 + 키쌍 환경에 EC2 인스턴스 생성 완료

Posted by yongary
,

sftp 서버 연결

java8~ 2025. 6. 17. 08:19

✅ 1. Maven 의존성 추가

<dependency>
  <groupId>com.jcraft</groupId>
  <artifactId>jsch</artifactId>
  <version>0.1.55</version>
</dependency>

✅ 2. Java 코드: SFTP 연결 + 로그인 + 설정

import com.jcraft.jsch.*;

public class SftpUploader {
    public void connectSftp(String server, int port, String user, String pass) {
        Session session = null;
        ChannelSftp sftpChannel = null;

        try {
            JSch jsch = new JSch();
            session = jsch.getSession(user, server, port);
            session.setPassword(pass);

            // 호스트 키 검증 비활성화 (테스트용, 실제 배포 시에는 키 검증 로직 필요)
            session.setConfig("StrictHostKeyChecking", "no");

            session.connect();
            log.info("SFTP Server: connected");

            Channel channel = session.openChannel("sftp");
            channel.connect();
            sftpChannel = (ChannelSftp) channel;
            log.info("SFTP Server: login OK");

            // 여기에 파일 업로드/다운로드 코드 추가 가능
            // sftpChannel.put(...);
            // sftpChannel.get(...);

        } catch (JSchException | SftpException e) {
            log.error("SFTP 연결 오류", e);
        } finally {
            if (sftpChannel != null) {
                sftpChannel.exit();
                log.info("SFTP Channel: closed");
            }
            if (session != null) {
                session.disconnect();
                log.info("SFTP Session: disconnected");
            }
        }
    }
}
Posted by yongary
,

구글doc API 연동

BACK-END 2025. 6. 5. 17:47

1. Google API 설정

  google Drive API 활성화 방법

✅ 1. Google Drive API 활성화 방법
① Google Cloud Console 접속
→ 로그인 후 우측 상단에서 프로젝트 선택 or 새로 만들기

② API 및 서비스 > 라이브러리
→ Drive 검색
→ Google Drive API 클릭
→ [사용] 버튼 클릭

③ 사용자 인증 정보 (Credentials) 이동
→ 좌측 메뉴에서 “사용자 인증 정보” 클릭

✅ 2. OAuth 2.0 Client ID 또는 Service Account 발급
🔹 A. Service Account 발급 (서버 to 서버 방식, 권장)
1. “사용자 인증 정보 만들기” > 서비스 계정 선택
이름: drive-api-access

역할: 필요 없으면 “없음”으로 두어도 됨

2. 완료 후, 해당 서비스 계정 클릭
→ “키” 탭 > 새 키 만들기 > JSON 선택 → 자동 다운로드

3. 생성된 서비스 계정 이메일 확인
→ 예: drive-api-access@your-project-id.iam.gserviceaccount.com

4. Google Drive에 폴더 생성 후, 해당 서비스 계정을 공유자로 추가
Google Drive 웹에서 해당 폴더에 대해
공유 > drive-api-access@... 이메일 입력 후 편집자 권한 부여

이 폴더 아래의 하위 폴더 및 파일 생성 가능

🔹 B. OAuth 2.0 Client ID 발급 (사용자 인증 방식)
1. “사용자 인증 정보 만들기” > OAuth 클라이언트 ID 선택
→ 먼저 OAuth 동의 화면 설정 필요

⬇️ OAuth 동의 화면 설정
사용자 유형: 일반적으로 내부 (회사 내부용이면) or 외부

앱 이름, 지원 이메일 등 기본 정보 입력

범위 설정: 아래만 추가

plaintext
복사
편집
https://www.googleapis.com/auth/drive.file
✅ drive.file: 사용자의 Google Drive에서 앱이 만든 파일만 읽고 쓰기 가능
→ 꼭 필요한 최소 권한

⬇️ 클라이언트 ID 생성
애플리케이션 유형: 일반적으로 "웹 애플리케이션" 또는 "데스크톱 앱"

이름 입력 후 생성 → 클라이언트 ID / 클라이언트 비밀 확인 가능






2. 의존성 추가 (build.gradle)

implementation 'com.google.api-client:google-api-client:2.3.0'
implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1'
implementation 'com.google.apis:google-api-services-drive:v3-rev20230825-2.0.0'

✅ 예제 코드

java
 
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.File;
import com.google.api.client.http.FileContent;

import java.io.IOException;
import java.util.Collections;

public class GoogleDriveUploader {

    private final Drive driveService;

    public GoogleDriveUploader() throws IOException {
        GoogleCredential credential = GoogleCredential.fromStream(
                getClass().getResourceAsStream("/your-service-account-key.json"))
                .createScoped(Collections.singleton(DriveScopes.DRIVE_FILE));

        driveService = new Drive.Builder(
                credential.getTransport(),
                credential.getJsonFactory(),
                credential
        ).setApplicationName("YourAppName").build();
    }

    /**
     * 특정 부모 폴더 아래에 새 폴더 생성
     */
    public String createSubFolder(String folderName, String parentFolderId) throws IOException {
        File fileMetadata = new File();
        fileMetadata.setName(folderName);
        fileMetadata.setMimeType("application/vnd.google-apps.folder");

        if (parentFolderId != null) {
            fileMetadata.setParents(Collections.singletonList(parentFolderId));
        }

        File folder = driveService.files().create(fileMetadata)
                .setFields("id")
                .execute();

        return folder.getId();
    }

    /**
     * 파일 업로드
     */
    public String uploadFileToFolder(java.io.File uploadFile, String folderId) throws IOException {
        File fileMetadata = new File();
        fileMetadata.setName(uploadFile.getName());
        fileMetadata.setParents(Collections.singletonList(folderId));

        FileContent mediaContent = new FileContent("application/octet-stream", uploadFile);

        File file = driveService.files().create(fileMetadata, mediaContent)
                .setFields("id")
                .execute();

        return file.getId();
    }
}

✅ 사용 예시

java
 
public class DriveTest {
    public static void main(String[] args) throws Exception {
        GoogleDriveUploader uploader = new GoogleDriveUploader();

        // 상위 폴더 ID (Google Drive에서 미리 만들어두거나 루트 폴더 ID 사용)
        String parentFolderId = "1XyzABCdefg1234567890";  // 예시

        // 1. 하위 폴더 생성
        String newFolderId = uploader.createSubFolder("새로운하위폴더", parentFolderId);

        // 2. 해당 폴더에 파일 업로드
        java.io.File file = new java.io.File("C:/temp/sample.txt");
        uploader.uploadFileToFolder(file, newFolderId);

        System.out.println("업로드 완료!");
    }
}

🔐 주의 사항

  • 서비스 계정 사용 시, 해당 계정 이메일을 드라이브 공유 권한에 추가해야 업로드 가능
  • 일반 사용자 OAuth 인증을 쓰려면 별도 토큰 플로우 필요
Posted by yongary
,

Vercel 배포

React.js 2025. 5. 20. 12:55

S3 + CloudFront에 react를 배포하는 것 보다 훨씬 간단하고, 싸게 front를 배포할 수 있다.

 

(1).

✅ Vercel 계정 생성 및 로그인

  • https://vercel.com 접속
  • GitHub 계정으로 로그인 (또는 GitLab, Bitbucket도 가능)

✅ 프로젝트 배포 (Vercel 대시보드)

  1. 로그인 후 + Add New → Project 클릭
  2. GitHub 저장소 목록 중에서 my-react-app 선택
  3. 빌드 설정 화면:
    • Framework Preset: Create React App
    • Build Command: npm run build
    • Output Directory: build
  4. “Deploy” 클릭

✅ GitHub 자동 배포  자동 <-> 수동 변경

1. Vercel 대시보드에서 자동 배포 끄기

  1. Vercel 대시보드 → 해당 프로젝트 클릭
  2. 상단 메뉴: Settings → Git 탭 이동
  3. 아래로 스크롤 →
    "Auto Deploy" 옵션을 끔
    🔲 Automatically deploy commits ← 이걸 체크 해제

이렇게 하면 GitHub에 푸시해도 자동으로 배포되지 않고,
수동으로 “Deploy” 버튼을 눌러야만 배포됩니다.



(2) 🔧 커스텀 도메인에 HTTPS 적용하는 방법 (요약)

  1. Vercel 프로젝트 대시보드에서 "Domains" 클릭
  2. 사용하려는 도메인 추가 (예: example.com)
  3. 도메인 네임서버 또는 CNAME 연결
  4. 연결되면 Vercel이 자동으로 SSL 인증서 발급 및 적용

✅ 예시 화면

 

 

(3)

아마존 Route53 을 활용한 Vercel https 도메인 설정.

 

✅ 설정 방법 (단계별)

1. Route53에서 test.my.com 서브도메인 등록

  • Route53에서 my.com 호스팅 영역을 엽니다
  • 다음 레코드를 추가합니다:
도메인: test.my.com
타입: CNAME
값: cname.vercel-dns.com (또는 Vercel에서 제공하는 고유 값)

주의:

  • test.my.com은 Vercel 프로젝트에 등록된 도메인과 일치해야 합니다
  • Vercel에서 DNS 레코드가 적용되면 Let's Encrypt 인증서가 자동 발급되어 HTTPS 지원됩니다

2. Vercel 프로젝트에 도메인 추가

Vercel → 프로젝트 → Settings > Domains → Add Domain:

  • test.my.com 입력
  • Vercel이 "이 도메인 소유를 증명하세요"라고 안내
  • TXT 레코드 또는 CNAME 값을 보여줌
  • 그 값을 Route53에 등록하면 소유 확인 후 자동 HTTPS 연결 완료

3. 결과적으로 이렇게 됩니다:

  • my.com의 DNS는 전부 Route53에서 관리
  • b.my.com은 ACM 인증서 사용 + AWS에서 서비스
  • test.my.com은 Vercel에서 Let's Encrypt 자동 인증서 사용 + HTTPS 서비스

 

Posted by yongary
,

구글 cloud API 연동

통신 2025. 4. 10. 15:21

1. 사전 준비 사항 

🔐 A. 구글 클라우드 프로젝트 생성 & API 사용 설정

  1. Google Cloud Console 접속
  2. 새 프로젝트 생성
  3. Google Sheets API & Google Drive API 활성화
  4. 서비스 계정(Service Account) 생성
  5. 서비스 계정에 JSON 키 발급

2. 인증 정보 등록

Spring Boot 프로젝트에서 사용할 수 있도록, 발급받은 JSON 파일을 프로젝트 리소스 폴더에 저장 (src/main/resources/credentials.json 등)

✅ 3. Google Sheet 공유 설정

스프레드시트를 서비스 계정 이메일 주소와 공유해야 합니다.

예:
서비스 계정 이메일이 my-service-account@my-project.iam.gserviceaccount.com 이라면
구글 시트 공유 설정에서 이 계정을 편집 권한으로 추가해야 합니다!


✅ 4. 코드 예시: Java에서 한 줄 추가하기

public class GoogleSheetAppender {

    private static final String APPLICATION_NAME = "My Spring Sheet Writer";
    private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
    private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; // resources 경로

    public static Sheets getSheetsService() throws Exception {
        GoogleCredentials credentials;
        try (InputStream in = GoogleSheetAppender.class.getResourceAsStream(CREDENTIALS_FILE_PATH)) {
            credentials = GoogleCredentials.fromStream(in)
                    .createScoped(List.of("https://www.googleapis.com/auth/spreadsheets"));
        }

        return new Sheets.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JSON_FACTORY,
                new HttpCredentialsAdapter(credentials))
                .setApplicationName(APPLICATION_NAME)
                .build();
    }

    public static void appendRow(String spreadsheetId, String range, List<Object> rowData) throws Exception {
        Sheets sheetsService = getSheetsService();

        ValueRange appendBody = new ValueRange().setValues(List.of(rowData));

        sheetsService.spreadsheets().values()
                .append(spreadsheetId, range, appendBody)
                .setValueInputOption("RAW")
                .execute();
    }
}

(사용예제)
GoogleSheetAppender.appendRow(
    "your-spreadsheet-id",     // 시트 ID
    "Sheet1!A1",               // 추가할 범위
    List.of("홍길동", "테스트 메시지", "2025-04-10")
);
 

Posted by yongary
,

yum으로 설치하기 (python 3.6 까지만 가능)
$ sudo yum install -y python3

설치경로:
Python 3.x	/usr/bin/python3
pip3	/usr/bin/pip3


단점은 python버전이 3.6.x정도로 설치된다는 점.

그 후 아래 4번에 .bashrc등에 등록 권장.


==> 또 python3.6에서는 TensorFlow 2.11이하만 지원가능함.......


TensorFlow나 Keras까지 필요하다면 아래 링크 참조.

https://cntechsystems.tistory.com/105


========================= 이하 소스로 설치하는 법===========================

0단계: $free -m 으로 확인해서 swap파일 없으면 생성.

# 1GB 스왑 파일 생성 (필요시 크기 조절 가능)
sudo dd if=/dev/zero of=/swapfile bs=1M count=1024

# 권한 설정
sudo chmod 600 /swapfile

# 스왑 설정
sudo mkswap /swapfile
sudo swapon /swapfile

# 확인
free -m


1단계: 필수 패키지 설치

sudo yum update -y
sudo yum groupinstall "Development Tools" -y
sudo yum install -y gcc make zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel tk-devel\
     xz xz-devel libffi-devel wget curl git ncurses-devel libuuid-devel gdbm-devel


1-1단계: openssl1.1.1을 특정위치에 설치하기.
($which openssl11  로  1.1.1의 위치가 /usr/bin/openssl11 인지  확인  후) : 이게 잘 안되서, yum에서 openssl11 openssl11-devel 제외하고

cd /usr/src
sudo wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz
sudo tar xzvf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w

sudo ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib
sudo make -j$(nproc)
sudo make install

 

 

 

2단계: Python 3.x 소스 설치 

cd /usr/src
sudo wget https://www.python.org/ftp/python/3.11.8/Python-3.11.8.tgz
sudo tar xzf Python-3.11.8.tgz
cd Python-3.11.8

export LD_LIBRARY_PATH=/usr/local/ssl/lib
export CPPFLAGS="-I/usr/local/ssl/include"
export LDFLAGS="-L/usr/local/ssl/lib"
sudo ./configure --prefix=/usr/local/python3.11 \
  --with-openssl=/usr/local/ssl \
  --with-openssl-rpath=auto 
      # --enable-optimizations 이 에러나는거 같아서 뺐음.
sudo make -j$(nproc)  (cpu 여러개 이용설정)
     (혹시 make 실패시 sudo make clean 하고 ./configure 부터 다시하면됨)

sudo make install  (혹시 python2유지하고 싶을때는 altinstall)

 

3. 이미 pip3.10도 설치되었을 확률이 높으나, 확인하고 추가설치

/usr/local/python3.11/bin/pip3.11 --version  (로 확인해봄, 없다면 아래 수행)

(불필요)sudo /usr/local/bin/python3.11 -m ensurepip
(불필요)sudo /usr/local/bin/python3.11 -m pip install --upgrade pip



심볼링 링크 만들기( 아래 4번을 할꺼면 생략 가능) 

sudo ln -s /usr/local/bin/python3.10 /usr/bin/python
sudo ln -s /usr/local/bin/pip3.10 /usr/bin/pip

 

 

4. .bashrc에 등록하기

# Python 3.10 경로 등록 (~/.bashrc 편집 등록) 
export PATH="/usr/local/python3.11/bin:$PATH"


alias python="/usr/local/python3.11/bin/python3.11"
alias pip="/usr/local/python3.11/bin/pip3.11"

 

 

마지막으로 $source ~/.bashrc  수행. 

 

 

========= pip install -r ./requirements.txt 설치시 ===============

torch는 gpu 때문에, 설치 안될 수 있으므로

$pip install torch --no-deps 로 설치해보고  
나머지들만 
$pip install -r ./requirements.txt 로 해보기.

(혹시 .py가 잘 안돈다면 $pip install torch  로 설치해야할 수도 있음)
Posted by yongary
,

팀뷰어 teamViewer

기타 2025. 2. 24. 11:37

 

팀뷰어로 원격 pc를 제어하려면
host PC에 teamViewer host를 설치해야한다. (라이선스 있다고 눌러야 뜨네요)

참고링크: https://m.blog.naver.com/terry_daddy/223284278249

Posted by yongary
,

gdd

Mac 2025. 2. 13. 21:09

 

file2를 file1Copied에 붙여서 2개파일을 합치는 명령어.
brew install coreutils를 한후,

$gdd if=file2.bin of=file1Copied.bin bs=1M oflag=append conv=notrunc

Posted by yongary
,

 

 

 

 

 

[array]

리턴하는 함수들: split,map, join(문자열 리턴)

  • .some(v => v==7)   : true/false 리턴
  • .find(v => v > 7)   :첫번째 만족하는 값 반환.   없으면 undefined 반환
  • .findIndex(... ) :  첫번째로 만족하는 index반환.  없으면 -1 반환

 

 

예제:

const toCamelCase = (templCode) => {
    return templCode
        .toLowerCase() // 전체를 소문자로 변환
        .split('_') // "_" 기준으로 분할
        .map((word, index) =>
            index === 0 ? word : word.charAt(0).toUpperCase() + word.slice(1) // 첫 단어는 소문자 유지, 이후 단어는 첫 글자만 대문자
        )
        .join(''); // 배열을 문자열로 합침
}

 

특이함수: slice - 문자열/array 모두 동작.

const str = "JavaScript";

console.log(str.slice(5)); // "cript" (start만 입력하면 끝까지)
console.log(str.slice(0, 4)); // "Java"
console.log(str.slice(-6, -3)); // "Scr" (음수 인덱스 사용 가능)

 

- slice와 splice 차이점

            ( 원본 배열 변경 여부,  반환값,     주요 용도 로 비교)

.splice() ✅ 원본 배열을 변경함 삭제된 요소를 배열로 반환 요소 추가, 삭제, 교체
.slice() ❌ 원본 배열을 변경하지 않음 새로운 배열 반환 배열의 일부 복사
[splice 사용예제] 
const index = users.findIndex(user => user.id === 2);
if (index !== -1) {
    users.splice(index, 1); // 삭제
}

 

[Object]:json

let obj = {a:1, b:2, c:3};

  • Object.keys(obj) => array리턴
  • Object.values(obj) => array리턴
  • let newObj = Object.assign(obj);   //딥 카피.  자식이 array/obj일 경우는 잘안될 수도 있으므로,
    - let newObj = JSON.parse(JSON.stringify(obj));

 

 

 

[Set]

 

let mySet = new Set([1,2]);

let newSet = mySet.add(5); //[1,2,5]; 리턴하는 함수, mySet자체도 바꿈.

mySet.delete(2); //[1,5];           //리턴없는 함수

 

  • array의 각종 좋은 함수들을 사용하기 위해 Set->array로 변환필요한 경우 많음
const mySet = new Set([1, 2, 3, 4, 5]);
const arr = Array.from(mySet);
console.log(arr); // [1, 2, 3, 4, 5]

 

 

[String] javascript도 java처럼 immutable이라서,

  • .replace( , ) : 원본은 변경하지 않음
Posted by yongary
,

chatGpt fine-tuning모델

기타 2025. 2. 4. 13:48

customGPT모델은 openAPI로 호출이 안되는 현상이 있네요.

 

그래서 자체훈련을 시키려면 fine-tuning모델이 맞고,
아래와 같이 생성하면 됩니다.

 

✅ OpenAI Fine-Tuning 모델 생성 방법 (처음부터 끝까지)

OpenAI에서 Fine-Tuning 모델을 생성하는 과정처음부터 끝까지 단계별로 설명하겠습니다. 🚀
Fine-Tuning을 통해 GPT-3.5 Turbo 또는 GPT-4를 특정한 스타일, 문체, 데이터에 맞게 최적화할 수 있습니다.


📌 1. Fine-Tuning 개요

Fine-Tuning이란?

Fine-Tuning이란 기존 OpenAI 모델(GPT-3.5-Turbo, GPT-4)을 사용자의 특정 데이터에 맞춰 재훈련하는 과정입니다.

사용 사례:

  • 특정 고객 응대 방식을 학습 (예: 콜센터 대응, 법률 상담)
  • 특정 전문 용어를 반영한 챗봇 생성 (예: 의학, 법률, 금융)
  • 기존 데이터 기반으로 맞춤형 답변 생성 (예: 기업 내부 문서 요약)

📌 2. Fine-Tuning에 필요한 사전 준비

✅ OpenAI API 키 발급

Fine-Tuning을 하려면 OpenAI API 키가 필요합니다.

  1. OpenAI API 대시보드에 접속
  2. "Create API Key"를 클릭하여 새로운 API 키 생성
  3. API 키를 복사하여 보관 (한 번만 표시됨)

📌 3. Fine-Tuning 데이터 준비

Fine-Tuning을 하려면 **훈련 데이터(training data)**를 만들어야 합니다.
OpenAI는 JSONL(JSON Lines) 형식의 데이터를 요구합니다.

✅ Fine-Tuning 데이터 형식

Fine-Tuning 데이터는 "messages" 형식으로 작성됩니다.

 

(json형식 예제)
{"messages": [
    {"role": "system", "content": "너는 친절한 금융 상담사야."},
    {"role": "user", "content": "대출 금리가 어떻게 되나요?"},
    {"role": "assistant", "content": "현재 대출 금리는 연 3.5%입니다."}
]}


jsonl형식.필요

{"messages": [{"role": "system", "content": "너는 친절한 채권 전문가야."}, {"role": "user", "content": "채권 회수 절차가 어떻게 되나요?"}, {"role": "assistant", "content": "채권 회수 절차는 1) 채무자 연락 2) 독촉장 발송 3) 법적 조치 순으로 진행됩니다."}]}
{"messages": [{"role": "system", "content": "너는 친절한 채권 전문가야."}, {"role": "user", "content": "부실채권을 매각할 수 있나요?"}, {"role": "assistant", "content": "네, 부실채권은 채권 매입 기관을 통해 매각할 수 있습니다."}]}

 

 
 

📌 JSONL 파일을 만들고, .jsonl 확장자로 저장해야 합니다.


📌 4. Fine-Tuning 데이터 업로드

OpenAI API를 사용하여 준비한 JSONL 파일을 업로드합니다.

✅ JSONL 파일 업로드 (파일 ID 얻기)

curl -X POST "https://api.openai.com/v1/files" \
  -H "Authorization: Bearer YOUR_OPENAI_API_KEY" \
  -H "Content-Type: multipart/form-data" \
  -F "file=@training_data.jsonl" \
  -F "purpose=fine-tune"



응답예시:
{
  "id": "file-abc123",
  "object": "file",
  "bytes": 12345,
  "created_at": 1700000000,
  "filename": "training_data.jsonl",
  "purpose": "fine-tune"
}
 
 

"id" 값을 저장 (file-abc123) → Fine-Tuning을 수행할 때 사용됩니다.


 

📌 5. Fine-Tuning 실행

이제 Fine-Tuning을 실행하여 맞춤형 모델을 학습시킵니다.

✅ Fine-Tuning 모델 생성 요청

curl -X POST "https://api.openai.com/v1/fine_tuning/jobs" \
  -H "Authorization: Bearer YOUR_OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-3.5-turbo",
    "training_file": "file-abc123",
    "hyperparameters": {
      "n_epochs": 3
    }
  }'


응답 예시:

{
  "id": "ftjob-xyz789",
  "object": "fine_tuning.job",
  "model": "gpt-3.5-turbo",
  "training_file": "file-abc123",
  "status": "running",
  "created_at": 1700000000
}
 

✅ "id" (ftjob-xyz789)가 Fine-Tuning 작업의 ID입니다.
✅ 훈련이 완료되면 새로운 모델 ID가 생성됩니다.


📌 6. Fine-Tuning 진행 상태 확인

Fine-Tuning이 얼마나 진행되었는지 확인하려면 아래 명령어를 실행합니다.

curl -X GET "https://api.openai.com/v1/fine_tuning/jobs/ftjob-xyz789" \
  -H "Authorization: Bearer YOUR_OPENAI_API_KEY"

응답 예시: 
{
  "id": "ftjob-xyz789",
  "status": "succeeded",
  "fine_tuned_model": "ft:gpt-3.5-turbo:your-org:custom-model"
}
 
 

Fine-Tuning이 완료되면 "fine_tuned_model" 값이 생성됩니다.
✅ "ft:gpt-3.5-turbo:your-org:custom-model"이 새로운 모델 ID입니다.


📌 7. Fine-Tuned 모델 사용 (API 호출)

Fine-Tuning이 완료되면 새로운 모델 ID를 사용하여 API 호출이 가능합니다.

✅ Fine-Tuning 모델 호출 예제

curl https://api.openai.com/v1/chat/completions \
  -H "Authorization: Bearer YOUR_OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "ft:gpt-3.5-turbo:your-org:custom-model",
    "messages": [{"role": "user", "content": "채권 회수 절차가 어떻게 되나요?"}],
    "temperature": 0.7
  }'​

📌 Fine-Tuned 모델이 기존 GPT-3.5보다 더 정확하게 원하는 답변을 생성합니다.


📌 8. Fine-Tuned 모델 삭제 (필요할 경우)

Fine-Tuning 모델을 더 이상 사용하지 않으려면 삭제할 수 있습니다.

✅ 모델 삭제 요청

bash
복사편집
curl -X DELETE "https://api.openai.com/v1/models/ft:gpt-3.5-turbo:your-org:custom-model" \ -H "Authorization: Bearer YOUR_OPENAI_API_KEY"

📌 이 작업은 영구적이므로 주의해야 합니다.


🚀 결론 (Fine-Tuning 요약)

1) JSONL 형식으로 Fine-Tuning 데이터 준비
2) API를 사용하여 JSONL 파일 업로드 (/v1/files)
3) Fine-Tuning 실행 (/v1/fine_tuning/jobs)
4) 모델 학습이 완료되면 Fine-Tuning 모델 ID 확인
5) Fine-Tuned 모델을 API에서 호출하여 사용
6) 필요할 경우 Fine-Tuned 모델 삭제 가능

Posted by yongary
,