잡다한글

ChatGPT 생산적으로 사용하기

Jonghyuk Baek 2023. 1. 5. 00:02

Introduction

최근에 핫해진 ChatGPT란 녀석을 일을 하면서 개인적으로 굉장히 유용하게 사용하고 있는데, 이에 대한 내용을 간단히 공유하고자 한다.

 

1. 빠른 정보 검색

간혹 한 번에 정리된 자료가 잘 없고 인터넷 여기저기서 단서들을 주워모아야 하는 경우가 있다. 흔하지 않은 버그에 대한 디버그 방법을 찾는 상황이라던지, 아니면 정석적인 답이 없어서 정말로 여러 글을 종합해 봐야 하는 상황을 예시로 들 수 있다.

ChatGPT를 이용하면 꽤 높은 확률로 한 번에 잘 정리된 자료를 얻어낼 수 있다. 한번 예시를 보자.

예전에 작성했던 글 중 하나인 "libpng warning: iCCP: known incorrect sRGB profile" 에러에 대한 해결 방법에 대해 질문해 보자 (참고). 결과는 아래와 같다.

 

ChatGPT 결과

 

문제의 원인에 대해 일차적으로 설명해 주고, 가능한 해결 방법을 4가지로 나누어 설명해 주고 있다. 참고로 지난 글에서 소개한 해결 방식은 테크니컬하게는 2번에 해당한다.

사실 이런 수준의 정보를 구글 검색을 통해 알아서 찾으려면.. 스택 오버플로우 스레드를 하나하나 읽어보면서 지금 나에게 유효할 만한 정보를 열심히 걸러내는 작업을 해야 했을 텐데, ChatGPT를 이용하면 필요한 정보를 굉장히 잘 정리해 주기 때문에 굉장히 유용하다.

 

언제 다 보나~

 

다만 디버그 방법이나 특정 리포지토리 코드에 대한 질문을 하는 경우, 종종 전혀 없는 명령어를 사용하라고 추천해 준다던가, 존재하지 않는 메서드를 있는 것처럼 예시 코드를 보여준다던가 하는 경우가 있으니 주의해야 한다.

답변이 틀릴 확률이 꽤 있다는 것을 감안하고 봐야 하기 때문에, 개인적으로는 살짝 똑똑한 버전의 나무위키 같다는 생각이 든다...

 

2. 파이썬 독스트링 생성

ChatGPT가 간단한 코드를 짜 준다고 잘 알려져 있는데, 이 딥러닝 모델의 또다른 진가는 독스트링 생성에 있다고 생각한다.

스타일에 맞게 잘 작성된 독스트링을 작성하는 것은 중요하지만, 구현하는 기능이 커지고 복잡해질 수록 독스트링을 하나하나 다는 것은 굉장한 양의 작업량을 필요로 한다.

ChatGPT를 이용하면 작성된 코드에 맞는 적절한 독스트링을 완전히 자동으로 생성해 낼 수 있다. 사실 처음에는 반 장난으로 넣어 본 질문이었는데, 생각 외로 엄청난 퀄리티의 독스트링이 아무 주석 없이도 작성되는 것을 보고 종종 이용하고 있다. 한번 예시를 보자.

Multi-Modality Guided Transformer (ECCV 2022) 라는 Image inpainting 네트워크 논문의 깃허브 리포지토리에 가서, 독스트링을 생성할 만한 코드를 가져와 보겠다.

https://github.com/yeates/MMT

 

GitHub - yeates/MMT: [ECCV22] Unbiased Multi-Modality Guidance for Image Inpainting

[ECCV22] Unbiased Multi-Modality Guidance for Image Inpainting - GitHub - yeates/MMT: [ECCV22] Unbiased Multi-Modality Guidance for Image Inpainting

github.com

 

설명이 없어~

 

여기서 클래스명, 메서드명 그리고 변수명 이외에 아무런 부가적인 설명이 없는 클래스를 하나 가져와서, ChatGPT에 독스트링을 달아 달라고 입력해 보겠다.

 

 

위와 같은 형식으로 입력해 보았다. 코드블럭 표시 (```) 를 빼고 넣어본 적은 없는데, 명확해서 나쁠 건 없지 않나 싶다. ChatGPT가 내보낸 결과는 아래와 같다.

 

class AuxiliaryDecoder(nn.Module):
    """
    A convolutional block that can optionally be transposed and/or output an auxiliary prediction.
    
    Args:
        in_channel (int): The number of channels in the input.
        out_channel (int): The number of channels produced by the convolution.
        kernel_size (int or tuple): The size of the convolving kernel.
        stride (int or tuple): The stride of the convolution.
        padding (int or tuple): Zero-padding added to both sides of the input.
        pred_auxiliary_channel (int): The number of channels in the auxiliary prediction.
        is_tconv (bool, optional): If True, use transposed convolution. Default: False.
        is_pred (bool, optional): If True, include an auxiliary prediction head. Default: False.
    """
    def __init__(self, in_channel, out_channel, kernel_size, stride, padding, pred_auxiliary_channel, is_tconv=False, is_pred=False):
        super(AuxiliaryDecoder, self).__init__()
        if is_tconv:
            self.conv_block = nn.Sequential(
                nn.ConvTranspose2d(in_channel, out_channel, kernel_size, stride, padding),
                nn.LeakyReLU(0.2, inplace = True)
            )
        else:
            self.conv_block = nn.Sequential(
                nn.Conv2d(in_channel, out_channel, kernel_size, stride, padding),
                nn.LeakyReLU(0.2, inplace = True)
            )
        if is_pred:
            self.auxiliary_head = nn.Conv2d(out_channel, pred_auxiliary_channel, 3, 1, 1)
    
    def forward(self, x):
        """
        Forward pass of the convolutional block.
        
        Args:
            x (torch.Tensor): Input tensor of shape (batch_size, in_channel, height, width)
        
        Returns:
            tuple: (feature, auxiliary structure).
            feature (torch.Tensor): Output tensor of shape (batch_size, out_channel, new_height, new_width).
            auxiliary structure (torch.Tensor or None): If is_pred is True, a tensor of shape (batch_size, pred_auxiliary_channel, new_height, new_width). Otherwise, None.
        """
        pred = None
        x = self.conv_block(x)
        if hasattr(self, "auxiliary_head"):
            pred = self.auxiliary_head(x)
        return x, pred  # feature, auxiliary structure

 

이야.... 기가 막힌다.

작성되어 있는 코드만을 보고 어떤 식으로 돌아가고, 어떤 작업을 위한 것인지 파악해서 적절한 독스트링을 제시해 주고 있다.

간혹 변수명이 전체적으로 모호하게 적혀 있거나 약어 등이 포함된 경우 이를 잘못 해석해 작성하는 경우도 있는데, 답변을 한두번 샘플링 하다 보면 쉽게 원하는 내용이 등장하도록 만들어낼 수 있다. 아래는 같은 질문을 이용해 다른 답변을 만들어낸 예시이다.

 

class AuxiliaryDecoder(nn.Module):
    """Auxiliary decoder module for generating both feature and auxiliary structure from input tensors.

    Args:
        in_channel (int): Number of channels in the input tensor.
        out_channel (int): Number of channels in the output tensor.
        kernel_size (int): Size of the convolutional kernel.
        stride (int): Stride of the convolution.
        padding (int): Zero-padding added to both sides of the input.
        pred_auxiliary_channel (int): Number of channels in the auxiliary structure prediction tensor.
        is_tconv (bool, optional): If `True`, use transposed convolution instead of regular convolution.
            Defaults to `False`.
        is_pred (bool, optional): If `True`, include auxiliary structure prediction head. Defaults to `False`.

    Attributes:
        conv_block (nn.Module): Convolutional block for generating feature tensor.
        auxiliary_head (nn.Module, optional): Auxiliary structure prediction head.
    """
    def __init__(self, in_channel, out_channel, kernel_size, stride, padding, pred_auxiliary_channel, is_tconv=False, is_pred=False):
        super(AuxiliaryDecoder, self).__init__()
        if is_tconv:
            self.conv_block = nn.Sequential(
                nn.ConvTranspose2d(in_channel, out_channel, kernel_size, stride, padding),
                nn.LeakyReLU(0.2, inplace = True)
            )
        else:
            self.conv_block = nn.Sequential(
                nn.Conv2d(in_channel, out_channel, kernel_size, stride, padding),
                nn.LeakyReLU(0.2, inplace = True)
            )
        if is_pred:
            self.auxiliary_head = nn.Conv2d(out_channel, pred_auxiliary_channel, 3, 1, 1)
    
    def forward(self, x):
        """Forward pass of the auxiliary decoder.

        Args:
            x (torch.Tensor): Input tensor of shape (batch_size, in_channel, height, width).

        Returns:
            tuple: Tuple containing:
                - feature (torch.Tensor): Output feature tensor of shape (batch_size, out_channel, height, width).
                - auxiliary (torch.Tensor, optional): Auxiliary structure prediction tensor of shape (batch_size, pred_auxiliary_channel, height, width).
        """
        pred = None
        x = self.conv_block(x)
        if hasattr(self, "auxiliary_head"):
            pred = self.auxiliary_head(x)
        return x, pred  # feature, auxiliary structure

 

3. 각종 코드 하청

... 뭔가 직접 짜기는 귀찮은 코드를 맡겨버리는 일도 가능하다.

예를 들어 어떤 로그 파일에서 특정한 값만 골라서 추세를 시각화 하고 싶다 해 보자. 이 때 샘플 로그를 제공하면서 어떤 값만을 추출해 내고 싶다고 질문할 수 있다.

 

 

 

Optional. 구글 검색과 병행해 ChatGPT 사용하기

마지막으로, 구글 검색 시에 자동으로 ChatGPT 반환 결과를 출력해 주는 크롬 애드온을 소개하고 마치겠다. OpenAI 사이트와 왔다갔다 할 필요 없이 구글 검색창에서 바로 결과를 받아볼 수 있어 편리했다.

구글 확장 프로그램 스토어에서 "ChatGPT for Google"  애드온을 설치하면 된다.

ChatGPT for Google, https://chrome.google.com/webstore/detail/chatgpt-for-google/jgjaeacdkonaoafenlfkkkmbaopkbilf?hl=ko

 

이후에는 아래 사진과 같이 구글 검색 시 오른쪽 여백에 ChatGPT 결과를 띠워주게 된다.

 

 

만약 항상 결과를 보고싶은 것이 아니라면, 애드온 옵션에서 트리거 옵션을 변경할 수 있다. 본인은 물음표로 끝나는 경우에만 모델 결과를 보여주도록 설정해 놓았다.

 

애드온 설정

 

 

Optional 2. ChatGPT  사용하는 방법

은근히 ChatGPT를 사용하는 방법에 대해서도 많은 분들이 검색해 보시는 것 같아, 관련된 내용을 추가하기로 했다.

ChatGPT는 현재 initial research preview 상태로 서비스를 제공 중이며, 누구든 무료로 사용할 수 있다. 서버 운영에 막대한 비용이 지출되는 만큼 길지 않은 시간 내에 유료 서비스로 전환된다고 하지만, 그 전까지는 자유롭게 사용이 가능하다.

 

사이트 접속

https://chat.openai.com/

ChatGPT를 사용하기 위해서는 먼저 위 링크를 타고 들어가, OpenAI 계정으로 로그인을 해 줘야 한다.

https://chat.openai.com/

 

회원가입 & 로그인

계정이 없다면 사용하고 있는 이메일 혹은 구글 계정, 마이크로소트 계정을 이용해 회원가입을 진행하면 된다.

로그인 화면.

이후에 이메일 인증, 이름 입력과 휴대폰 번호 인증 절차를 거치고 나면 아래와 같은 창이 띄워지고, 인터넷 브라우저를 통해 서비스를 이용하는 것이 가능하다.

 

서비스 이용

메인 화면.

로그인에 성공하면 위와 같은 메인 페이지로 넘어올 수 있다.

 

한번 테스트를 해 보자...

 

잘 작동하는 것을 확인할 수 있다.

 


Wrap-Up

사용하기에 굉장히 편리하고, 또한 다양한 질문에 대한 답을 구할 수 있지만 체감 상 검증되지 않거나 틀린 답변이 나올 가능성도 높은 것 같다. 간략하게 정리된 정보를 얻거나 간단한 작업을 수행시키는 용도로 사용하되, 답변의 내용을 어딘가에 이용할 때에는 반드시 스스로 그 내용을 검증해 보는 습관을 가져야 할 것이다.

 

 

 

 

 

반응형