Annotation이란? 사전적 의미로는 주석이라는 뜻이다.

자바에서 Annotation은 코드 사이에 주석처럼 쓰이며 특별한 의미, 기능을 수행하도록 하는 기술이다.

즉, 프로그램에게 추가적인 정보를 제공해 주는 메타데이터(meta data)라고 볼 수 있다.(meta data : 데이터를 위한 데이터)

다음은 어노테이션의 용도를 나타낸 것이다.

1. 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공한다.

2. 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보를 제공한다.

3. 실행 시(런타임 시)특정 기능을 실행하도록 정보를 제공한다.

기본적으로 어노테이션을 사용하는 순서는 다음과 같다.

1. 어노테이션을 정의

2. 클래스에 어노테이션을 배치

3. 코드가 실행되는 중 Reflection(프로그램이 실행 중에 자신의 구조와 동작을 검사하고, 조사하고, 수정하는 것)을 이용하여 추가 정보를 획득하여 기능을 실시

 

Annotation 종류

 

@ComponentScan

@Component, @Service, @Repository, @Controller, @Configuration이 붙은 클래스 Bean들을 찾아서 Context에 bean등록을 해주는 Annotation

 

@Component

개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 Annotation

 

@Bean

개발자가 직접 제어가 불가능한 외부 라이브러리등을 Bean으로 만들려할 때 사용되는 Annotation

 

@Autowired

field, setter method, constructor에서 사용하며 Type에 따라 알아서 Bean을 주입 해준다.

Controller 클래스에서 DAO나 Service에 관한 객체들을 주입 시킬 때 많이 사용

 

Bean을 주입받는 3가지 방식

1. @Autowired

2. setter

3. 생성자(@AllArgsConstructor 사용) -> 권장방식

 

@Inject

@Autowired 어노테이션과 비슷한 역할

 

@Controller

Spring의 Controller를 의미하며, Spring MVC에서 Controller 클래스에 쓰인다.

 

@RestController

Spring에서 Controller 중 View로 응답하지 않는, Controller를 의미

method의 반환 결과를 JSON 형태로 반환

 

@Controller 와 @RestController 차이

@Controller
API와 view를 동시에 사용하는 경우에 사용
대신 API 서비스로 사용하는 경우는 @ResponseBody를 사용하여 객체를 반환
view(화면) return이 주목적

@RestController
view가 필요없는 API만 지원하는 서비스에서 사용
Spring 4.0.1부터 제공
@RequestMapping 메서드가 기본적으로 @ResponseBody 의미를 가정
data(json, xml 등) return이 주목적

즉, @RestController = @Controller + @ResponseBody

 

@Service

Service Class에서 쓰인다. 비즈니스 로직을 수행하는 Class라는 것을 나타내는 용도

 

@Repository

DAO Class(DataBase에 접근하는 method를 가지고 있는 Class)에서 쓰인다.

 

@EnableAutoConfiguration

Spring Application Context를 만들 때 자동으로 설정하는 기능을 켠다.

(classpath의 내용에 기반해서 자동으로 생성, 만약 tomcat-embed-core.jar가 존재하면 톰캣 서버가 setting)

 

@Configuration

@Configuration을 클래스에 적용하고 @Bean을 해당 Class의 method에 적용하면 @Autowired로 Bean을 부를 수 있다.

 

@Required

setter method에 적용해주면 Bean 생성시 필수 프로퍼티 임을 알린다.

 

@Qualifier("id")

@Autowired와 같이 쓰이며, 같은 타입의 Bean 객체가 있을 때 해당 아이디를 적어 원하는 Bean이 주입될 수 있도록 한다.

 

@Resource

@Autowired와 마찬가지로 Bean 객체를 주입해주는데 차이점이 있다.

Autowired는 타입으로, Resource는 이름으로 연결한다.

 

@PostConstruct, @PreConstruct

의존하는 객체를 생성한 이후 초기화 작업을 위해 객체 생성 전/후에 실행해야 할 method 앞에 붙인다.

 

@PreDestroy

객체를 제거하기 전에 해야할 작업을 수행하기 위해 사용

 

@PropertySource

해당 프로퍼티 파일을 Environment로 로딩하게 해준다.

 

@ConfigurationProperties

yaml파일 읽는다. default로 classpath:application.properties 파일이 조회

 

@Lazy

지연로딩을 지원

@Component나 @Bean Annotation과 같이 쓰는데 Class가 로드될 때 스프링에서 바로 bean등록을 마치는 것이 아니라 실제로 사용될 때 로딩이 이뤄지게 하는 방법

 

@Value

properties에서 값을 가져와 적용할 때 사용

 

@SpringBootApplication

@Configuration, @EnableAutoConfiguration, @ComponentScan 3가지를 하나의 어노테이션으로 합친 것

 

@RequestMapping

요청 URL을 어떤 method가 처리할지 mapping해주는 Annotation

 

@CookieValue

쿠키 값을 parameter로 전달 받을 수 있는 방법

 

@CrossOrigin

CORS 보안상의 문제로 브라우저에서 리소스를 현재 origin에서 다른 곳으로의 AJAX요청을 방지하는 것

 

@ModelAttribute

view에서 전달해주는 parameter를 Class(VO/DTO)의 멤버 변수로 binding 해주는 Annotation

 

@GetMapping

@RequestMapping(Method=RequestMethod.GET)과 같다.

 

@SessionAttributes

Session에 data를 넣을 때 쓰는 Annotation

 

@Valid

유효성 검증이 필요한 객체임을 지정

 

@InitBinder

@Valid 어노테이션으로 유효성 검증이 필요하다고 한 객체를 가져오기전에 수행해야할 method를 지정

 

@RequestAttribute

Request에 설정되어 있는 속성 값을 가져올 수 있다.

 

@RequestBody

요청이 온 데이터(JSON이나 XML형식)를 바로 Class나 model로 매핑하기 위한 Annotation

 

@RequestHeader

Request의 header값을 가져올 수 있다. 메소드의 파라미터에 사용

 

@RequestParam

@PathVariable과 비슷, request의 parameter에서 가져오는 것

 

@RequestPart

Request로 온 MultipartFile을 바인딩

 

@ResponseBody

HttpMessageConverter를 이용하여 JSON 혹은 xml로 요청에 응답할 수 있게 해주는 Annotation

 

@PathVariable

method parameter 앞에 사용하면서 해당 URL에서 {특정값}을 변수로 받아 올 수 있다.

 

@ExceptionHandler

해당 클래스의 예외(Exception)를 캐치하여 처리

 

@ControllerAdvice

Class 위에 ControllerAdvice를 붙이고 어떤 예외를 잡아낼 것인지는 각 메소드 상단에

@ExceptionHandler(예외클래스명.class)를 붙여서 기술

 

@RestControllerAdvice

@ControllerAdvice + @ResponseBody

 

@ResponseStatus

사용자에게 원하는 response code와 reason을 return해주는 Annotation

 

@EnableEurekaServer

Eureka 서버로 만들어준다.

 

@EnableDiscoveryClient

Eureka 서버에서 관리될 수 있는 클라이언트 임을 알려주기위한 Annotation

 

@Transactional

데이터베이스 트랜잭션을 설정하고 싶은 method에 이 Annotation을 적용하면 method 내부에서 일어나는 데이터베이스 로직이 전부 성공하거나, 데이터베이스 접근중 하나라도 실패하면 다시 롤백할 수 있게 해주는 Annotation

 

@Cacheable

method 앞에 지정하면 해당 method를 최초에 호출하면 캐시에 적재하고 다음부터는 동일한 method 호출이 있을 때 캐시에서 결과를 가져와서 return하므로 method 호출 횟수를 줄여주는 Annotation

 

@CachePut

캐시를 업데이트하기 위해서 method를 항상 실행하게 강제하는 Annotation

 

@CacheEvict

캐시에서 데이터를 제거하는 트리거(Trigger)로 동작하는 method에 붙이는 Annotation

 

@CacheConfig

클래스 레벨에서 공통의 캐시설정을 공유하는 기능

 

@Scheduled

Linux의 crontab처럼 정해진 시간에 실행해야하는 경우에 사용

 

Lombok Annotation 종류

 

@NoArgsConstructor

기본 생성자를 자동으로 추가

 

@AllArgsConstructor

모든 필드 값을 파라미터로 받는 생성자를 추가

 

@RequiredArgsConstructor

final(값이 할당되면 더 이상 변경할 수 없음) 이나 @NonNull인 필드 값만 파라미터로 받는 생성자를 추가

 

@Getter

Class 내 모든 필드의 Getter method를 자동 생성

 

@Setter

Class 내 모든 필드의 Setter method를 자동 생성

 

@ToString

Class 내 모든 필드의 toString method를 자동 생성

 

@EqualsAndHashCode

equals와 hashCode method를 오버라이딩 해주는 Annotation

 

@Builder

어느 필드에 어떤 값을 채워야 할지 명확하게 정하여 생성 시점에 값을 채워준다.

 

Constructor 와 @Builder 차이

생성 시점에 값을 채워주는 역할은 똑같다. 하지만 Builder를 사용하면 어느 필드에 어떤 값을 채워야 할지 명확하게

인지할 수 있다. 해당 Class의 Builder 패턴 Class를 생성 후 생성자 상단에 선언 시 생성자에 포함된 필드만 빌더에 포함

 

@Data

@Getter, @Setter, @EqualsAndHashCode, @AllArgsConstructor을 포함한 Lombok에서 제공하는 필드와 관련된

모든 코드를 생성

 

JPA Annotation 종류

 

@Entity

실제 DB의 테이블과 매칭될 Class임을 명시

즉, 테이블과 링크될 클래스임을 나타냄

 

@Table

Entity Class에 매핑할 테이블 정보를 알려줌

 

@Id

해당 테이블의 PK 필드를 나타냄

 

@GeneratedValue

PK의 생성 규칙을 나타냄

 

@Column

테이블의 컬럼을 나타내며, 굳이 선언하지 않더라도 해당 Class의 필드는 모두 컬럼이 됨

<Oracle>

프로시저(PROCEDURE) 조회 쿼리

SELECT *
  FROM USER_SOURCE
 WHERE TYPE = 'PROCEDURE'
   AND NAME = '프로시저명'

 

함수(FUNCTION) 조회 쿼리

SELECT *
  FROM USER_SOURCE
 WHERE TYPE = 'FUNCTION'
   AND NAME = '함수명'

 

 

프로시저와 함수의 차이

 

프로시저(PROCEDURE) : 넓은 의미로는 어떤 업무를 수행하기 위한 절차를 뜻한다.

함수(FUNCTION) : 위의 프로시저의 각 프로세스를 수행하기 위해 필요한 기능들을 함수라 한다.

 

프로시저(PROCEDURE) 함수(FUNCTION)
특정 작업을 수행 특정 계산을 수행
리턴 값을 가질 수도 안 가질 수도 있음 리턴 값을 반드시 가져야 함
리턴 값을 여러 개 가질 수 있음 리턴 값 오직 하나만 가질 수 있음
서버(DB) 단에서 기술 화면(Client) 단에서 기술
수식 내에서 사용 불가 수식 내에서만 사용 가능
단독으로 문장 구성 가능 단독으로 문장 구성 불가

 

쿠키(Cookie) : 브라우저에 저장되는 정보

웹 서핑을 하면서 어떤 사이트에 들어가면 쿠키를 설정하라는 문구를 본 적 있을 것이다. 이 쿠키 덕분에 쇼핑 사이트에

로그인하지 않아도 장바구니에 물건을 담아두거나 검색 기록에서 이전에 입력했던 검색어들을 찾아볼 수 있다.

나의 웹 서핑 내역이 마케팅과 광고에 활용되는 것도 쿠키를 통해 이뤄지는 일이다.

쿠키는 크롬이나 엣지같은 브라우저에 저장되는 작은 텍스트 파일이다. 브라우저는 사용자의 컴퓨터에 설치된

소프트웨어이므로 쿠키는 사용자가 갖고 있는 정보라고 할 수 있다.

사용자는 브라우저의 설정 화면이나 개발자 도구에서 쿠키를 확인하고 수정, 삭제할 수 있다. 다만, 쿠키는 당사자 뿐만

아니라 제 3자가 조회하는 것도 가능하기 때문에 개인 정보를 담은 내용이나 보안상 민감한 정보를 저장하는 데에는

적합하지 않다. 따라서 남에게 탈취되거나 사용자에 의해 조작되어도 크게 문제 되지 않을 정보를 브라우저에

저장함으로써 웹사이트 이용을 편리하게 해주는 것이 쿠키이다.

 

세션(Session) : 서버가 나를 알아보는 방법

웹사이트에 아이디와 비밀번호를 입력해서 로그인하면 해당 사이트의 회원에게만 허용된 기능들을 사용할 수 있다.

마이페이지를 클릭해서 내 정보를 볼 수도 있고, 회원 전용 게시판의 글쓰기 버튼을 클릭하여 글을 쓸 수도 있다.

문제는 이와 같은 클릭 하나하나는 매번 서버에게 새로 보내는 익명 편지와도 같아서 사이트에 로그인을 하는 등의 이전

행위들과 연결되어 있지 않다는 것이다. 다시 말해 서버는 아이디와 비밀번호를 입력해 로그인에 성공한 사용자와

로그인 후 마이페이지 버튼을 누른 사용자가 동일한 사람임을 알지 못한다는 것이다. 그렇기 때문에 사용자가

사이트에 로그인한 상태라는 것을 서버에 인증하지 못하면 클릭을 할 때마다 반복해서 아이디와 비밀번호를 서버에

제공해야 한다. 이러한 번거로움을 해결하기 위해 사용하는 것이 세션이다.

사용자가 사이트에 한 번 로그인하면 유효기간이 끝날 때까지 더 이상 아이디와 비밀번호를 입력하지 않아도 되도록

사용자가 이미 서버로부터 인증받았음을 증명해 주는 세션이라는 증서가 필요하다. 사용자가 서버에 올바른 아이디와

비밀번호로 로그인에 성공하면 서버는 세션 아이디라는 데이터를 만든다. 보통은 알파벳과 숫자가 혼합된 형식을

갖고 있다. 서버는 영화관에서 티켓을 보관용 부분만 찢어 건네주듯 세션 아이디를 사용자에게 전달하고, 메모리에

아이디 사본을 어떤 사용자의 것인지 적어서 보관한다.

사용자는 서버로부터 받은 세션 아이디를 쿠키로 저장한 다음 앞으로의 모든 요청에 함께 전달한다. 친구 목록을 볼 때,

게시글을 작성할 때, 구매한 상품 내역을 볼 때도 서버에게 세션 아이디를 적은 편지를 보낸다.

서버는 사용자에게서 친구 목록을 보겠다는 요청을 받으면 그 편지에 세션 아이디가 적혀 있는지를 확인한다.

아이디가 있다면 서버가 보관하고 있는 세션 아이디 중에 동일한 정보가 있는지 찾아보고 그것이 누구의 계정인지

확인한 후 해당 사용자가 요청한 친구 목록을 보여주는 것이다.

(세션은 로그인 여부 등 사용자와 서버의 관계가 기억되어 보존되고 있는 상태를 말한다.)

 

토큰(Token) : 세션과는 다른 로그인 유지 방식

세션 방식은 안전하고 효과적이지만 단점도 있다. 서버는 요청마다 함께 딸려 오는 세션 아이디를 바로바로 확인할 수

있도록 로그인한 사용자의 아이디를 메모리라는 '책상'에 올려둔다. 메모리에 올려둔 데이터를 빠르게 확인할 수 있다는

장점이 있는 대신 공간이 한정되어 있다. 서버에 동시 접속하는 사용자가 많아지면 메모리 공간이 부족해져서 서버에

부하가 걸리고 화면이 멈추는 등의 문제가 발생할 수 있다.

메모리 공간을 많이 차지하는 세션 방식의 대안은 로그인한 사용자에게 세션 아이디 대신 토큰을 발급해 주는 것이다.

이러한 토큰에는 특수한 수학적 원리가 적용되어 있어서 마치 위조 방지 장치가 있는 지폐처럼 각 서버만의 유효한 토큰을

발행할 수 있다. 그렇기 때문에 토큰을 받아 간 사용자가 이를 쿠키로 저장해 두고 필요할 때마다 제시하면 서버는 따로

책상에 올려놓은 것을 확인할 필요 없이 자기가 발급한 토큰임을 알아보고 사용자의 요청을 허가해 주는 것이다.

더 이상 이미 로그인한 사용자의 책상(메모리)에 올려 두고 있을 필요가 없으니 서버 부하를 줄일 수 있는 것이다.

(토큰 방식은 각 서버만이 만들 수 있는 토큰을 발급함으로써 상태를 저장하지 않고도 사용자의 로그인 여부를

파악할 수 있도록 한다.)

물론 토큰 방식에도 한계는 있다. 여러 기기에서의 로그인을 제한하기 위해 필요한 때에 로그인 되어있는 사용자를 서버가

강제로 로그아웃 시킬 수 있어야 하는데, 토큰 방식에서는 이것이 불가능하다. 한 번 발행한 토큰은 유효기간이 끝나기

전까지 따로 통제할 수 없기 때문에 세션에 비해 토큰 정보를 탈취당할 가능성이 높다. 그러나 토큰은 쿠키처럼

만료 기간을 정할 수 있어서 만료 기간을 짧게 지정해 피해를 줄일 수 있다. 토큰 방식은 쿠키와 세션을 적절히 섞은 것과

비슷하다.

 

캐시(Cache) : 전송량은 줄이고 속도는 높이는 기술

우리는 매일같이 웹 사이트나 유튜브, 온라인 게임 등을 통해 이미지, 동영상, 웹 페이지 코드와 같은 대량의 데이터를

서버로부터 전송받는다. 이러한 데이터 전송에는 시간이 소요될 뿐만 아니라 통신비도 지출된다. 고화질 동영상처럼

크기가 큰 데이터일수록 비용은 더 커진다.

그러나 한 번 전송받은 데이터는 저장해 놨다가 다시 사용할 때 꺼내 쓴다면 반복적으로 서버에 데이터 전송을 요청할

필요가 없다. 이때 사용되는 기술이 캐시이다. 캐시 덕분에 우리는 반복적으로 사용하는 콘텐츠를 빠르게 이용할 수 있고

데이터 사용량도 줄일 수 있다.

(캐시는 인터넷 환경뿐만 아니라 다양한 곳에서 사용되는 개념이다. 컴퓨터의 하드웨어 안에서도 메모리 안에 들어있는

정보를 더 빨리 가져올 수 있도록 하는 CPU 캐시 등이 있다.)

일반적으로 사용자 입장에서 가장 가까이 접하는 캐시는 브라우저 캐시이다. 사용자가 컴퓨터나 스마트폰에서 인터넷

서핑할 때 받아온 데이터는 브라우저에 캐시 형태로 저장된다. 쿠키와 같이 캐시도 각 브라우저의 설정 화면에서

조작을 통해 비울 수 있다. 캐시 덕분에 사용자는 같은 사이트를 다시 방문하거나 동영상을 다시 시청할 때

추가로 통신비를 지출하지 않고 로딩 없이 콘텐츠를 이용할 수 있다.

(쿠키와 캐시의 차이 : 쿠키와 캐시 모두 정보를 저장하여 재활용하는 기술이지만, 쿠키는 사용자의 수고를 덜어주는 데

목적을 두고 캐시는 데이터의 전송량을 줄이고 서비스 이용 속도를 높이는 데 목적을 둔다.)

'IT' 카테고리의 다른 글

[IT] 브라우저에서 미리보기 가능한 파일 형식  (0) 2024.12.18
[IT] 서버 이중화  (0) 2023.05.30
[IT] Cloud Service 장단점  (0) 2023.05.30
[IT] Web Server & WAS  (0) 2023.02.26
[IT] Edge Computing  (0) 2022.12.05

파인튜닝을 하여 챗봇 만들어보기

 

1. 챗봇 모양 만들기

import gradio as gr
import random
import time

with gr.Blocks() as demo:
    chatbot = gr.Chatbot()
    msg = gr.Textbox()
    clear = gr.Button("Clear")

    def respond(message, chat_history):
        bot_message = random.choice(["How are you?", "I love you", "I'm very hungry"]) # 3가지 답변만 랜덤하게 대답하는 챗봇
        chat_history.append((message, bot_message))
        time.sleep(1)
        return "", chat_history

    msg.submit(respond, [msg, chatbot], [msg, chatbot])
    clear.click(lambda: None, None, chatbot, queue=False)

if __name__ == "__main__":
    demo.launch()

2. 파인튜닝할 데이터 준비

'AI > ChatGPT' 카테고리의 다른 글

[AI] ChatGPT API 기초 [번역기 만들기]  (1) 2023.05.05
[AI] ChatGPT 기초  (0) 2023.05.05

서버 이중화(Active-Active, Active-Standby)
서버 인프라를 구성할 때 서비스의 안정적인 운영을 위해 이중화를 진행하게 된다.
이중화는 물리적/논리적 서버를 구성해 하나의 서비스에 장애가 발생하면 다른 서버의 서비스를 제공할 수 있게 한다.

Active-Active 구조는 L4 스위치 등 부하분산(SLB) 로드밸런싱을 통해 기능/성격에 따라 1번 또는 2번 서버로

나누어 처리하도록 구성하는 것이다.

Active-Active


대부분의 웹서버는 L4 스위치 SLB(Server Load Balancing)으로 구성하고
DB는 Oracle RAC(Real Application Cluster)를 활용, 디스크는 Veritas CFS(Cluster File System)을 통해 구성한다.
이런 구성은 1번 장비 장애 시 2번 장비(서버)로 중단 없이 운영 가능하다는 장점이 있고 Down Time이 존재하지 않는다.

 

Active-Standby 구조는 서버를 이중화하여 구성하지만 동시에 부하분산을 통해 서비스하는 것이 아니라
장애 시 서비스를 이전하여 운영하는 방법을 말한다.

Active-Standby


이러한 과정은 클러스터 하트비트(Heartbeat) 등으로 시스템의 상태를 주기적으로 체크하고 특이사항이
발생하는 경우에 수동으로 2번 서버로 전환하거나, 크리티컬한 장애 발생 시 자동으로 서비스를 전환시킨다.
이때 Down Time이 1~2초 정도(서버 운영 환경에 따라 다름) 발생하게 된다.

결국 서버 운영을 할 때 부하분산(L4)이 상시 필요한 구간이 있을 경우 Active-Active 구조를, 그 외 이중화의 경우

Active-Standby 구조로 구성한다.

'IT' 카테고리의 다른 글

[IT] 브라우저에서 미리보기 가능한 파일 형식  (0) 2024.12.18
[IT] 쿠키 & 세션 & 토큰 & 캐시  (0) 2023.07.15
[IT] Cloud Service 장단점  (0) 2023.05.30
[IT] Web Server & WAS  (0) 2023.02.26
[IT] Edge Computing  (0) 2022.12.05

<장점>
1. 경제성
클라우드 서비스는 큰 초기 비용 투자 없이 필요한 때에만 추가 자원에 대한 비용을 내고

필요하지 않은 자원에 대해서는 지급을 중지할 수 있어서 경제적으로 쓸 수 있다.

2. 편의성
클라우드 서비스 유형 가운데서도 특히 SaaS(사용자가 필요로 하는 서비스만 이용할 수 있도록 한 소프트웨어)의 경우,

인프라나 운영 서버 등을 사용자가 관리할 필요 없이 단순히 제공되는 서비스를 이용하기만 하면 된다는 점에서

사용자의 편의성이 두드러진다.

3. 가용성
클라우드는 많은 인프라, 운영 서버를 24시간 365일 항시 제공하기 때문에 높은 가용성을 지닌다.

그뿐만 아니라 클라우드에서는 서버의 이중화를 통한 고가용성을 얻을 수 있어서 가용성 면에서 상당한 이점을 가진다.

4. 유연성
사용자는 자신의 필요에 맞게 서비스를 확장, 애플리케이션을 맞춤화할 수 있다. 그리고 인터넷을 통해

언제 어디서든 사용자와 사용자의 기업에 맞춘 클라우드 환경에 접근하여 서비스를 이용할 수 있어서

유연성 역시 클라우드의 장점이 된다.

5. 빠른 구축 속도
기존에는 기업 내에 물리적 서버와 시스템을 구축하는 온 프레미스 방식(소프트웨어를 서버에 직접 설치해 쓰는 방식)이

일반적이었다. 클라우드를 이용하여 서버를 구축할 때, 각종 물리적 서버를 설치할 필요가 없어서 많은 시간이 절약된다.

그뿐만 아니라 클라우드를 통한 서버 그리고 시스템의 구축은 시간 및 비용의 절약이 가능하며 업데이트 역시 쉽게

가능해진다.

 

 

 

<단점>

1. 보안 이슈
최근, 내부 클라우드와 외부 클라우드 서비스 연계 활용하는 하이브리드 방식의 클라우드가 각광받는 이유 중 하나다.
클라우드 서비스를 이용하는 기업의 경우, 기업의 데이터는 기업 외부에 존재하는 클라우드에 보관된다.

기업의 데이터는 핵심 경쟁력의 요소이다. 기업 외부로 노출돼서는 안되는 데이터나 국가나 공공기관의 경우

클라우드 서비스 도입을 신중하게 결정해야 한다.

2. 초과 비용
클라우드 서비스는 경제적으로 효율적인 건 사실이다. 하지만 클라우드 서비스는 이용한 만큼 비용을 지불하기 때문에

이용하는 서비스가 많거나 기업의 규모가 커질 경우 결코 저렴하지 않다. 기존 호스팅 방식이 더 저렴한 경우도 있다.
한편, 학생이 스터디나 테스트를 목적으로 활용하기엔 부담 없이 사용 가능하다. AWS의 경우 일반 계정이 아닌

edu 계정으로 가입하면 크레딧이 주어진다. 그 크레딧을 사용해 서비스를 익히고 일반 계정으로 가입해 보는 것도

하나의 방법이다.

'IT' 카테고리의 다른 글

[IT] 쿠키 & 세션 & 토큰 & 캐시  (0) 2023.07.15
[IT] 서버 이중화  (0) 2023.05.30
[IT] Web Server & WAS  (0) 2023.02.26
[IT] Edge Computing  (0) 2022.12.05
[IT] Cloud  (0) 2022.12.05

ChatGPT의 추가적인 설정을 할 수 있다.

ChatGPT Playground를 활용하자

 

https://platform.openai.com/playground 접속 후 회원가입을 한다.

 

https://platform.openai.com/account/usage 화면으로 이동하면

Free trial usage를 확인할 수 있다.

처음 가입 시  5달러가 제공되며 3개월까지 이용 가능하다. (Upgrade시 매달 20달러 구독 결제)

 

Mode는 4가지가 존재한다.

Edit, Insert, Chat, Complete

 

<Edit Mode>

<Insert Mode>

<Chat Mode>

<Complete Mode>

Complete Mode는 우리가 일반적으로 사용하는 ChatGPT처럼 자유롭게 요청해서 생성할 수 있는 모드이다.

 

다음은 Model 선택인데 Model마다 특징이 있다. 가장 많이 사용하는 Model이 text-davinci-003이다.

문장을 생성하는데 최대 4000 tokens까지 이용 가능하다.

보통 1000 tokens에 750 word를 이용할 수 있다고 하니 3000 word까지 작성이 가능한 것이다.

davinci Model은 1000 tokens에 0.02 달러에 이용할 수 있다. (대략 27원 정도)

 

Temperature는 1에 가까울 수록 크리에이터한 창의적인 문장을 만들고 0에 가까울 수록 딱딱한 기계적인 느낌의 글로

생성된다. 보통 0.6 ~ 0.7 정도에 놓고 사용하는데 필요에 따라 조정하면 된다.

 

Maximun length는 앞서 설명한 Token 길이를 최대 4000까지 사용할 수 있는데 4000을 놓고 사용한다고 해도

ChatGPT가 모두 사용하지는 않는다. 보통 1000 정도를 사용한다고 보면 된다.

 

Top P는 독창성과 조금 다르게 다향성을 나타내는 값인데 다양한 주제를 갖고 작성하느냐인데 0에 가까울 수록

글 하나의 주제로 설명하는 반면, 1에 가까울 수록 다양한 주제로 설명을 한다.

 

Presence penalty는 중복을 제거하는 기능으로 최대 2까지 올릴 수 있는데 수치가 높을수록 반복되는 문장을

줄여주는 역할을 한다.

 

Best of는 결과로 만들 개수를 나타낸다. 만약 5로 설정되면 5개의 결과를 만들어서 1개를 선택해서 주게 된다.

 

기본 설정은 다음과 같다.

이제 API KEY를 발급받자

https://platform.openai.com/account/api-keys 접속해서 Create new secret key 버튼을 클릭한다.

Name에 임의의 값을 입력 후 Create secret key 버튼을 클릭한다.

생성된 KEY를 사용할 것이다. 이 KEY는 꼭 따로 기록하여 보관하도록 한다.

 

API를 이용한 챗봇을 만들려면 가장 잘되어 있는 레퍼런스 문서를 보는 게 답이다.

https://platform.openai.com/docs/api-reference 사이트로 이동 후 하나씩 따라해보자

 

VSCode TERMINAL 창에 pip install openai를 입력하여 openai를 설치한다.

 

ChatGPT의 통신 원리를 간단히 살펴보자

import openai

openai.api_key = "당신의 KEY"

completion = openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
    {"role": "user", "content": "Hello!"}
  ]
)
print(completion.choices[0].message.content)

TERMINAL 창에 python 파일명.py 입력 후 실행을 하면

Hello에 대한 user의 답변 Greetings! How Can I assist you today?를 확인할 수 있다.

 

실행 후 원래는 아래와 같이 JSON 형식으로 리턴 값을 받게 된다.

{
   "id":"chatcmpl-abc123",
   "object":"chat.completion",
   "created":1677858242,
   "model":"gpt-3.5-turbo-0301",
   "usage":{
      "prompt_tokens":13,
      "completion_tokens":7,
      "total_tokens":20
   },
   "choices":[
      {
         "message":{
            "role":"assistant",
            "content":"\n\nThis is a test!"
         },
         "finish_reason":"stop",
         "index":0
      }
   ]
}

이번엔 ChatGPT API를 이용한 번역기를 간단히 만들어보자

 

먼저 TERMINAL창에서 pip install gradio를 입력해 gradio를 설치한다.

 

ChatGptCode3.py를 만들고 아래 코드를 입력한다.

import gradio as gr

def greet(name):
    return "Hello " + name + "!"

demo = gr.Interface(fn=greet, inputs="text", outputs="text")

demo.launch()

TERMINAL창에서 python ChatGptCode3.py를 입력해 실행하면 외부에서 접속할 수 있는 URL 주소가 생성된다.

 

URL 주소로 들어가 보면 아래와 같이 간단한 웹 사이트가 만들어진다.

이번엔 ChatGPT API 챗봇 기능을 gradio에 적용한다.

ChatGptCode3.py의 코드를 아래와 같이 변경해준다.

import openai
import gradio as gr
openai.api_key = "당신의 KEY"

def greet(content):
    completion = openai.ChatCompletion.create(
        model="gpt-3.5-turbo", messages=[{"role": "user", "content": content}]
    )
    return completion.choices[0].message.content

demo = gr.Interface(fn=greet, inputs="text", outputs="text")
demo.launch(share=True)

일단 gradio에서 메세지를 입력 후 '제출하기' 버튼을 클릭하면 greet() 함수를 호출한다.

greet() 함수 호출 시 content 값으로 당신의 입력값을 openai로 보내고 openai로부터 넘겨받은 메세지를

다시 gradio의 output으로 내보내는 코드이다.

 

다시 TERMINAL창에서 python ChatGptCode3.py를 입력해 실행하면 외부에서 접속할 수 있는 URL 주소가 생성된다.

(현재 실행 중인 명령을 종료하려면 Ctrl + c를 눌러준다.)

'안녕'이라고 입력 후 제출을 했을 때, 뒤에 어울릴 메세지를 넘겨준 것을 확인할 수 있다.

 

이번에는 content 뒤에 "영어로 번역해줘" 라는 문자열을 추가한 후 다시 실행해보자

import openai
import gradio as gr
openai.api_key = "당신의 KEY"

def greet(content):
    completion = openai.ChatCompletion.create(
        model="gpt-3.5-turbo", messages=[{"role": "user", "content": content + "영어로 번역해줘"}]
    )
    return completion.choices[0].message.content

demo = gr.Interface(fn=greet, inputs="text", outputs="text")
demo.launch(share=True)

'안녕 나의 블로그를 방문해줘서 고마워'를 입력 후 제출했을 때

'Hello, thank you for visiting my blog!'라는 결과를 넘겨준다.

'AI > ChatGPT' 카테고리의 다른 글

[AI] ChatGPT API 기초 [파인튜닝]  (0) 2023.05.30
[AI] ChatGPT 기초  (0) 2023.05.05

ChatGPT는 OpenAI가 개발한 프로토타입 대화형 인공지능 챗봇이다.

 

GPT에 대해 알아보자

Generative (생성 모델)

Pre-Trained (사전 훈련)

Transformer (Transformer AI 모델)

 

ChatGPT의 장점

1. 간단한 정보(특정 주제 / 개념)에 대해 알 수 있다.

2. 질문의 의도와 맥락을 파악하여 사람과 같은 글쓰기와 대화 능력으로 사용자 맞춤형 정보를 제공한다.

3. 사용자가 대화에서 말한 것을 기억하고 해당 답변에 대한 추가 질문을 통해 대화를 이어갈 수 있다.

   - 사용자가 대화에서 말한 것을 기억한다.

   - 답변을 보고 사용자가 내용 수정을 요청할 수 있다.

4. 단순 검색 결과보다 사람과 같은 표현을 사용하여 편하고 생동감이 있다.

5. 잘못된 전제를 짚어내고 부적절한 요청을 거부할 수 있다.

   - 사회통념상 논란이 될 수 있는 답변은 거부하거나, 윤리적인 규범에 맞춰 답변한다.

6. 간단한 회원가입으로 18세 이상이라면 누구나 무료로 사용이 가능하다.

   - 유료 버전도 출시되었다.

 

ChatGPT의 단점

1. 다양한 윤리적 역기능 예방 교육이 필요하다.

   - 표절 논란, 데이터 편향성, 저작권, 정보 도용 등

2. 잘못된 답변 제공으로 인한 신뢰성 논란이 있다.

   - 답변의 출처를 알 수 없다. (출처가 있는 답변을 요청하면 됨)

3. 2021년까지의 정보만 학습되어 있어 최신성이 부족하고 현재를 기준으로 정확한 답변을 받을 수 없다.

4. 영어 기반 모델이므로, 한글로 질문할 경우 다소 속도가 느리고 답변이 짧거나 중간에 끊기는 경우가 있다.

    또한 잘못된 번역을 답하기도 한다.

   - 영어로 질문할 경우 더 빠르고 정교한 답변을 제공한다.

5. 텍스트 기반이므로 이미지, 음성은 사용할 수 없다.

6. 유료 버전(월 20달러)의 서비스 질이 더 높다.

 

ChatGPT에 대해 알아보기 전에 https://chat.openai.com/auth/login 접속 후 회원 가입을 하자

질문에 다음과 같은 답변을 받았다.

 

이번에는 계산기 프로그램을 만드는 파이썬 코드를 생성해달라고 요청해봤다.

 

파이썬 설치가 되어있지 않은 경우 https://www.python.org/ 파이썬 사이트에 접속해서 Downloads 메뉴에

최신 버전을 다운 받아서 실행한다.

설치 화면에서 Add python.exe to PATH 체크를 꼭 해주도록 한다.

IDE(통합 개발 환경)는 VSCode를 사용했다. https://code.visualstudio.com/

 

Visual Studio Code - Code Editing. Redefined

Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications.  Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.

code.visualstudio.com

VSCode 실행 후 좌측 큐브 모양의 메뉴를 클릭 후 python 검색 후 첫 번째 Python 패키지를 설치한다.

좌측 종이 모양 메뉴 클릭 후 Open Folder 클릭 후 작업할 폴더를 지정한다.

파일명은 뒤에 .py를 붙여준다.

 

ChatGPT에게 계산기 프로그램을 만드는 파이썬 코드를 생성해달라고 요청한 화면이다.

ChatGPT가 생성해준 파이썬 코드는 다음과 같다.

# 덧셈 함수
def add(x, y):
    return x + y

# 뺄셈 함수
def subtract(x, y):
    return x - y

# 곱셈 함수
def multiply(x, y):
    return x * y

# 나눗셈 함수
def divide(x, y):
    return x / y

# 사용자로부터 입력 받기
print("계산할 두 수를 입력하세요.")
num1 = float(input("첫 번째 숫자: "))
num2 = float(input("두 번째 숫자: "))

print("사용할 연산자를 선택하세요.")
print("1. 덧셈")
print("2. 뺄셈")
print("3. 곱셈")
print("4. 나눗셈")

# 사용자로부터 연산자 입력 받기
choice = input("선택한 연산자(1/2/3/4): ")

# 입력된 연산자에 따라 연산 수행
if choice == '1':
    print(num1, "+", num2, "=", add(num1, num2))
elif choice == '2':
    print(num1, "-", num2, "=", subtract(num1, num2))
elif choice == '3':
    print(num1, "*", num2, "=", multiply(num1, num2))
elif choice == '4':
    print(num1, "/", num2, "=", divide(num1, num2))
else:
    print("잘못된 입력입니다.")

실행하면 계산할 두 수를 물어보고 숫자 입력 시 연산자를 선택할 수 있다.

연산자까지 입력을 마치면 결과를 보여준다.

 

나는 한글로 질문, 요청을 했지만 영어를 사용하는 것이 좋다.

'AI > ChatGPT' 카테고리의 다른 글

[AI] ChatGPT API 기초 [파인튜닝]  (0) 2023.05.30
[AI] ChatGPT API 기초 [번역기 만들기]  (1) 2023.05.05

+ Recent posts