chatGPT와 데이터 사이언스

R과 함께 chatGPT 활용하기

유충현

한국R사용자회

2023년 4월 13일

발표자 소개

  • 현) 한화생명 DataLAB
  • 현) 한국R사용자회 대표
  • 현) 명지대학교 기록정보과학전문대학원 겸임교수
  • kt NexR Data Science팀장
  • 다수의 데이터 분석 프로젝트 수행
  • 데이터 분석 솔루션 개발
  • 저서:
    • C로 배우는 통계학 (1994)
    • S-PLUS를 이용한 통계학 이해 (1997)
    • R 그래픽스 (2005)
    • R 프로그래밍 (2010)
    • R을 이용한 통계학의 이해 (2013)
    • R을 활용한 데이터 시각화 (2015)
  • R 패키지:
    • dlookr
    • alookr

목차

  1. R 패키지
  2. OpenAI API
  3. bitGPT
  4. bitGPT Demo
  5. bitGPT 응용 앱
  6. 질의 응답

R 패키지

R 패키지 아카이브

  • Github
  • ? (2023-04-08)
  • 자유로운 기준, 자율적 관리. CRAN의 개발버전, CRAN을 만족하지 못한 스팩

  • Rmetrics
  • 44 (2023-04-08)
  • 금융분야의 연구 및 데이터 분석을 위한 R 패키지, from Finmetrics in S+

R 패키지 개발과정

  1. 개발 버전
    • Github을 개발 버전 리파지토리로 운영
  2. 정식 버전
    • CRAN에 정식버전을 제출
  3. 피드백 및 개선
    • Github Issue 등록 및 해결
  4. 1~3 반복
  • 피드백이 없는 패키지 개발은 외로운 자신과의 싸움
    • 오류, 개선 방향 등의 문제 제기가 힘이 됨

bitGPT 피드백 및 개선 사례

  • “기존 메시지를 추가하는 함수를 만들어보면 어떨까요?”
    • chat_completion() 함수는 서비스 개발 지향적이라
    • R 사용자가 R 콘솔에서 채팅하기에 불편함

  • chat_completion()
    • 서비스 개발자가 채팅 기능을 구현하는 용도의 사용
  • 신규 개발한 keep_completion()
    • 사용자가 R 콘솔에서 채팅을 수행하는 용도의 사용

  • 여러분의 관심과 피드백은 패키지 개발자를 춤추게 합니다.
  • 피드백 없는 패키지는 발전이 없습니다.
  • bitGPT 이슈 페이지

OpenAI API

OpenAI API 홈페이지

API 레퍼런스 기반 패키지 개발

  • API 주소, body의 파라미터, 예제 요청과 응답 구조의 파악

  • Validate arguments –> Build path parameters –> Build request body

  • Request and parse it –> Check whether request failed and return parsed

bitGPT

about bitGPT

  • OpenAI API를 인터페이스하는 R패키지
    • openai 패키지 wrapping
  • 한글 사용 용이성
    • 한글 질의 –> 영문질의 –> 영문답변 –> 한글답변
  • API 키 관리의 편의성
    • 1회 입력만으로 키 입력 불필요
    • OpenAI 키와 네이버 파파고
  • chatGPT 기반의 앱 개발에 활용
    • Shiny 앱이나 RStudio Addin 활용 가능
  • 현재 개발이 진행되는 패키지, 추가 개발 진행 예정

시리야?!

  • bitGPT의 개인적인 목표
    • 시리와 같은 음성 Assistant 구현
flowchart LR
  A(음성) --> B(텍스트)
  B --> C(텍스트)
  C --> D(음성)
  • 음성 –> 텍스트
    • 음성 녹음 with record_audio()
    • STT(Sppech to Text) with transcript_audio()
  • 텍스트 –> 텍스트
    • 채팅 with chat_completion()
  • 텍스트 –> 음성
    • TTS(Text to Speech)
    • 미구현, 유로 서비스 및 무료 API 부재

한글 지원기능

  • 몇몇 OpenAI API의 한글 프롬프트 성능 저하 이슈
    • 한글 <–> 영문의 번역의 필요성
  • DeepL 인터페이싱 불가
    • 현재, 한국어 API 서비스 미지원
  • 네이버 파파고 번역 API 인터페이스
    • translate()
    • 개인적인 생각의 성능 비교
      • DeepL > 파파고
  • 프롬프트 엔지니어링
    • 좀더 성능을 높이기 위해서는 영문으로 프롬프트 개선 필요

API 키 관리 방법

  • 1회 등록만하면 지속 사용 가능
  • 개인 컴퓨터 환경에서 이용
  • 서버 환경에서 bitGPT 패키지 공유하는 환경에서는 사용 금지
    • 키를 패키지 루트에 저장하기 때문
    • base64 인코딩 저장
  • 네이버 파파고 키
    • regist_naver_key()
  • OpenAI API 키
    • regist_openai_key()
  • 세션 내에서만 지속 사용 가능
  • 서버 환경에서 bitGPT 패키지 공유하는 환경에서 이용
  • 세션의 System environment 영역에 등록
  • 네이버 파파고 키
    • set_naver_key()
  • OpenAI API 키
    • set_openai_key()

대표 기능 목록

구분 기능 함수 API
텍스트 텍스트 완성 create_completion() OpenAI
텍스트 채팅 완성 chat_completion() OpenAI
텍스트 채팅 keep_completion() OpenAI
텍스트 임베딩 create_embeddings OpenAI
텍스트 번역 translate() 네이버
이미지 이미지 생성 draw_img() OpenAI
이미지 이미지 편집 draw_img_edit() OpenAI
이미지 이미지 변형 draw_img_variation() OpenAI
오디오 오디오 녹음 record_audio() -
오디오 STT transcript_audio() OpenAI

리소스

bitGPT Demo

텍스트 완성

  • create_completion()를 이용해서 텍스트 완성을 수행합니다.
  • 한글 프롬프트
    • “최고의 R 학습 방법을 알려주세요. 학습해야할 데이터 분석 이론과 중요한 R 패키지를 포함해 주세요.”
  • 영문 프롬프트
    • “Tell me the best way to learn R. Include data analysis theories and important R packages to learn.”
  • ko2en = TRUE 인수의 사용
    • 프로프트를 영문으로 번역 후 API를 호출하고, 영문 결과를 한글로 번역
  • ko2en = FALSE 인수 적용으로 한글 프롬프트로 질의
  • 동일한 용량의 토큰을 사용하는데, 상대적으로 부족한 결과

  • 영문 프롬프트 사용

  • 한글 프롬프트로 질의 후 영문결과를 한글번역

채팅 완성

  • chat_completion()으로 채팅 앱을 개발할 수 있습니다.
  • 함수의 목적
    • Shiny 앱이나 Markdown 문서를 개발할 수 있는 개발 용도
  • Message 객체의 핸들링이 필요
    • 생성: create_messages()
    • 추가: add()
    • 조회: show()
  • 채팅을 수행하기 위한 질문과 답변을 담는 메시지 객체 생성
    • with create_messages()

  • chat_completion(msg, type = “messages”)

  • add(answer, user = “커리큘럼에 tidyverse 패키지를 사용하는 방법을 추가해줘.”)

  • chat_completion(msg, type = “message”)

메시지 보기

  • show()를 이용해서 메시지 객체를 조회
  • type 인수
    • “console”
      • 콘솔에 텍스트 출력
    • “viewer”
      • HTML 페이지 생성 후 브라우저 출력
  • show(answer2, type = “console”)

  • show(answer2, type = “viewer”)

채팅

  • R 사용자가 콘솔에서 채팅을 수행할 때 이용
  • keep_completion()를 이용해서 콘솔에서 채팅 수행
    • chat_completion(), show() 등일 이용해 함수 개발
  • last 인수
    • 마지막 대화 내용만 출력할지의 여부
  • initialize 인수
    • 새로운 (주제의) 채팅을 시작할 지의 여부
    • 계속 이전 대화를 가져가면 연산 비용이 커짐
      • 토큰 사용량 증가
  • 우리나라의 주요 이슈는 무엇인가?

임베딩

  • 텍스트 데이터의 분석을 위한 임베딩 데이터 생성
  • create_embeddings()를 이용해서 임베딩 생성
  • 텍스트 임베딩 활용
    • 유사도 분석 - Search Documents
    • 분류 모델 - Documents Taxonomy
  • 한국의 대표 시 3개중 특정 절의 임베딩
  • 한용운:님의 침묵, 정지용:향수, 박인환:목마와 숙녀

  • 6개 절의 임베딩 값으로 Cosine Similarity 분석
  • 동일 시의 절의 유사도가 가장 높게 나타남

이미지 생성

  • draw_img()를 이용해서 그림을 그려봅니다.
  • 한글 프롬프트
    • “풍선을 들고 있는 외로운 로봇을 연필과 수채화의 추상화로 그려줘.”
  • 영문 프롬프트
    • “Draw a lonely robot holding a balloon with an abstract painting of a pencil and watercolor.”
  • ko2en 인수의 사용
    • 기본값인 TRUE는 한글 프롬프트를 영문으로 번역 후 API를 호출함
  • draw_img(prompt_ko, ko2en = FALSE)

  • draw_img(prompt_en)

  • draw_img(prompt_ko)

이미지 변형

  • draw_img_variation()를 이용해서 그림을 변형해봅니다.
  • 풍선을 들고 있는 외로운 로봇 이미지를 변형하려 함.
    • “abstract pencil and watercolor art of a lonely robot hoilding a balloon.”
  • draw_img()로 그린 그림이 마음에 들지만 뭔가 부족하다면?
    • 새로 그리기 보다는 draw_img_variation()로 그림에 변형을 가해보세요.
  • “abstract pencil and watercolor art of a lonely robot hoilding a balloon.”

  • draw_img_variation(“origin.png”, fname = “variation”)

  • draw_img_variation(“variation.png”, fname = “variation2”)

  • draw_img_variation(“variation2.png”, fname = “variation3”)

이미지 편집

  • draw_img_edit()를 이용해서 그림을 편집해봅니다.
  • 이미지의 특정 부분을 편집할때 사용
  • 원본 이미지와 편집할 부분을 투명으로 마스킹한 이미지 필요
  • in-paintingout-painting
    • How to use DALL•E
    • in-painting: 대상 이미지의 내부에서 편집
    • out-painting: 대상 이미지의 외부 배경을 편집
  • 원본(좌측) 내부에 편집할 부분을 마스킹한 이미지(우측) 생성

원본 이미지 - image 마스크 이미지 - mask

  • draw_img_edit(image, mask, prompt = “연을 날리고 있는 로봇”)

  • draw_img_edit(image, mask, prompt = “A robot flying a kite”)

  • draw_img_edit(image, mask, prompt = “로봇이 연을 날리고 있다.”)

  • draw_img_edit(image, mask, prompt = “줄 위에는 연이 매달려있다.”)

STT (Speech to Text)

  • transcript_audio()
    • 음성 오디오 파일로 STT(Speech to Text)를 수행
  • 한글 음성도 가능함
    • language = “ko” 옵션 지정
  • 지원 오디오 포맷
    • mp3, mp4, mpeg, mpga, m4a, wav, webm
  • bitGPT 패키지의 record_audio() 함수로 음성을 녹음
    • voice.wav
  • 부정확한 발음 포함
  • 생소한 단어 포함 (?)
    • 시나브로
Click to listen

bitGPT 응용 앱

bitGPT 연동 앱 데모

  • shinyGPT 패키지
    • devtools::install_github(“choonghyunryu/shinyGPT”)
    • packagedown
  • 무엇이든 그려보세요
    • draw_img(), draw_img_variation()
    • 이미지 생성이미지 변형, 이미지 저장
  • 무엇이든 물어보세요
    • chat_completion(), show()
    • 대화 내용의 브라우징, R 코드 실행

질의 응답