[Excel VBA] ChatGPT를 엑셀에 적용하기
이번시간에는 필자가 아는 엑셀 유튜버중 제일 최고라 생각하는 오빠두엑셀님의 유튜브 영상을 참고하여 ChatGPT API를 엑셀에 적용해보고자 한다.
1. 무엇을 하고자 하는가?
1) 이력서, 보고서 주요 키워드 추출하기
2) 주제/키워드만 입력하면 보고서 자동으로 완성해주기
2. 기본 준비
1) 예제 파일 다운로드
2) ChatGPT 로그인 & API 키 발급
- ChatGPT 로그인하기 : 아래 링크를 클릭하여 OpanAI의 ChatGPT 메인 페이지로 이동한 후, 오른쪽 상단의 API 버튼을 클릭합니다. ChatGPT 메인 페이지 오른쪽 상단의 API 버튼을 클릭합니다.
- 기존 회원 아이디가 있을 경우, "LOG IN" 버튼을 클릭하여 로그인합니다. 아이디가 없을 경우, "SIGN UP" 버튼 클릭하여 회원 가입 후 로그인합니다. 기존 사용중인 구글 아이디로 편리하게 로그인할 수 있습니다. LOG IN 또는 SIGN UP 버튼을 클릭하여 로그인합니다.
- 오빠두Tip : 만약 기존 회원이고, 가입 후 3개월이 지났다면 무료로 제공되는 $18 크레딧의 사용기한이 지나 지불방식을 등록해야 할 수 있습니다.
강의 진행 중 "#Error! : You exceeded your current quota, please check your plan and billing details." 라는 오류 메시지가 나온다면, 마지막에 안내해드린 결제수단을 등록한 후 강의를 진행합니다.
- ChatGPT API키 발급하기 : 로그인 후, 오른쪽 상단의 아이콘을 클릭 - [View API Keys]로 이동합니다. 오른쪽 상단 회원 정보 - View API Keys 를 클릭합니다.
- 새로운 페이지로 이동하면, 중간에 있는 [+Create new secret key] 버튼을 클릭하면 API키가 발급됩니다. 발급한 키를 복사하여 메모장에 붙여넣기한 후, 안전한 장소에 보관합니다. 가운데 버튼을 클릭하면 OpenAI API 키가 발급됩니다.
-
오빠두Tip : API키는 서비스를 사용하기 위한 회원증, 비밀번호와 같은 개념입니다. 따라서 외부로 유출되지 않게 안전하게 관리하는 것을 주의하세요! 만약 API키를 잊어버렸다면, 기존에 사용하던 API는 제거 후, 새로운 API키를 발급받아 사용하면 됩니다.
3) 엑셀 VBA 적용
- ChatGPT 마스터코드 추가하기 : 예제파일을 실행한 후, [개발도구] - [VisualBasic] 버튼을 클릭합니다. 만약 [개발도구] 탭이 보이지 않을 경우, 리본메뉴를 우클릭 - [리본 메뉴 사용자 지정]에서 개발도구를 체크한 후 확인 버튼을 눌러 개발도구를 등록할 수 있습니다.
매크로 편집기가 실행되면, [삽입] 탭 - [모듈]을 클릭하여 새로운 모듈을 추가합니다.
개발도구 - Visual Basic 버튼을 클릭해 매크로 편집기를 실행합니다.
삽입 - 모듈을 클릭해 새로운 모듈을 추가합니다.
2. 추가된 모듈 안에, 홈페이지에 올려드린 엑셀-ChatGPT 연동 마스터 코드를 복사/붙여넣기 합니다. 마스터코드는 아래 더보기를 참고하시기 바랍니다.
Const APIKey As String = "API키" '<- API 키를 입력합니다.
Const APIUrl As String = "https://api.openai.com/v1/completions"
'---------------------------- ▼▼ 사용할 명령문을 이 안에 작성하세요 ▼▼ -------------------------------
'■xGPT_Run 함수
'xGPT_Run "입력셀주소", "출력셀주소", [List출력여부(True/False)]
'예) xGPT_Run "C6", "B8"
Sub MyGPT_Test1()
End Sub
Sub MyGPT_Test2()
End Sub
'---------------------------- ▲▲ 사용할 명령문을 이 안에 작성하세요 ▲▲ -------------------------------
Function xGPT(sRequest, Optional Temperature As Double = 0, Optional Max_Tokens As Integer = 0)
'■ GPT 모델 설명은 아래 링크를 참고하세요.
'https://platform.openai.com/docs/models/gpt-3
'■ 비용에 대한 설명은 아래 링크를 참고하세요.
'https://openai.com/api/pricing/
'■ 비용 요약
'1000토큰 = 한글 450~500자 or 영어 750단어 or A4용지 절반 분량
'davinci는 최대 4000토큰 지원 ≒ 약 A2장 분량 입/출력 가능
'davinci 모델(가장 좋은 성능) : 1000토큰 당 24원 (A4용지 한장 ≒ 50원)
'curie 모델(보편적 성능, 가성비 좋음) : 1000토큰당 2.4원 (A4용지 한장 ≒ 5원)
Application.EnableEvents = False
If sRequest = "" Then xGPT = "": Exit Function
Dim GPTModel As String: GPTModel = "text-davinci-003" '"text-davinci-003" '또는 "text-curie-001"
If Max_Tokens = 0 Then
If GPTModel = "text-curie-001" Then Max_Tokens = 1024
If GPTModel = "text-davinci-003" Then Max_Tokens = 2000
End If
Dim vHeader As Variant: ReDim vHeader(0 To 1)
vHeader(0) = Array("Content-Type", "application/json")
vHeader(1) = Array("Authorization", "Bearer " & APIKey)
Dim bodyJSON As String
Dim sResult As String
sRequest = Replace(Replace(Replace(Replace(sRequest, Chr(10), "\n"), Chr(13), "\n"), Chr(9), "\t"), """", "\""")
bodyJSON = "{"
bodyJSON = bodyJSON & """model"" : """ & GPTModel & """, "
bodyJSON = bodyJSON & """prompt"" : """ & sRequest & """, "
bodyJSON = bodyJSON & """temperature"" : " & Temperature & ", "
bodyJSON = bodyJSON & """max_tokens"" : " & Max_Tokens
bodyJSON = bodyJSON & "}"
sResult = GetHttp(APIUrl, bodyJSON, RequestHeader:=vHeader, RequestType:="POST").Body.innerHTML
If InStr(1, sResult, """error"":") = 0 Then
sResult = Splitter(sResult, "[{""text"":""", """,""")
Do While Left(sResult, 2) = "\n"
sResult = Right(sResult, Len(sResult) - 2)
Loop
sResult = Replace(Replace(sResult, "\n", vbNewLine), "\""", """")
xGPT = sResult
Else
sResult = Splitter(sResult, """message"": """, """,")
xGPT = "#Error! : " & sResult
End If
Application.EnableEvents = True
End Function
Sub xGPT_Run(sPromptRange As String, sPrintRange As String, Optional isList As Boolean = True, Optional Temparature As Double = 0, Optional Max_Tokens As Integer = 2500)
Dim WS As Worksheet: Set WS = ActiveSheet
Dim PromptRange As Range: Set PromptRange = WS.Range(sPromptRange)
Dim PrintRange As Range: Set PrintRange = WS.Range(sPrintRange)
Dim vArrray As Variant
Dim ArrCount As Long
If isList = True Then
vArray = xGPT_List(PromptRange.Value, Temparature, Max_Tokens)
If PrintRange.Value <> "" Then PrintRange.CurrentRegion.ClearContents
PrintRange.Resize(UBound(vArray), 1) = vArray
Else
PrintRange.Value = xGPT(PromptRange.Value, Temparature, Max_Tokens)
End If
MsgBox "요청하신 작업이 완료되었습니다."
End Sub
Function xGPT_List(sRequest, Optional Temperature As Double = 0, Optional Max_Tokens As Integer = 2500)
Dim sResult As String
Dim vResult As Variant: Dim vReturn As Variant
Dim i As Long
sResult = xGPT(sRequest, Temperature)
vResult = Split(sResult, vbNewLine)
ReDim vReturn(1 To UBound(vResult) + 1, 1 To 1)
For i = LBound(vResult) To UBound(vResult)
vReturn(i + 1, 1) = Trim(vResult(i))
Next
xGPT_List = vReturn
End Function
Function GetHttp(URL As String, Optional formText As String, _
Optional isWinHttp As Boolean = False, _
Optional RequestHeader As Variant, _
Optional includeMeta As Boolean = False, _
Optional RequestType As String = "GET") As Object
'###############################################################
'오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com)
'▶ GetHttp 함수
'▶ 웹에서 데이터를 받아옵니다.
'▶ 인수 설명
'_____________URL : 데이터를 스크랩할 웹 페이지 주소입니다.
'_____________formText : Encoding 된 FormText 형식으로 보내야 할 경우, Send String에 쿼리문을 추가합니다.
'_____________isWinHttp : WinHTTP 로 요청할지 여부입니다. Redirect가 필요할 경우 True로 입력하여 WinHttp 요청을 전송합니다.
'_____________RequestHeader : RequestHeader를 배열로 입력합니다. 반드시 짝수(한 쌍씩 이루어진) 개수로 입력되어야 합니다.
'_____________includeMeta : TRUE 일 경우 HTML 문서위로 ResponseText를 강제 입력합니다. Meta값이 포함되어 HTML이 작성되며 innerText를 사용할 수 없습니다. 기본값은 False 입니다.
'_____________RequestType : 요청방식입니다. 기본값은 "GET"입니다.
'▶ 사용 예제
'Dim HtmlResult As Object
'Set htmlResult = GetHttp("https://www.naver.com")
'msgbox htmlResult.body.innerHTML
'###############################################################
Dim oHTMLDoc As Object: Dim objHTTP As Object
Dim HTMLDoc As Object
Dim i As Long: Dim blnAgent As Boolean: blnAgent = False
Dim sUserAgent As String: sUserAgent = "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Mobile Safari/537.36"
Application.DisplayAlerts = False
If Left(URL, 4) <> "http" Then URL = "http://" & URL
Set oHTMLDoc = CreateObject("HtmlFile")
Set HTMLDoc = CreateObject("HtmlFile")
If isWinHttp = False Then
Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
Else
Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
End If
objHTTP.setTimeouts 1200000, 1200000, 1200000, 1200000 '응답 대기시간 120초
objHTTP.Open RequestType, URL, False
If Not IsMissing(RequestHeader) Then
Dim vRequestHeader As Variant
For Each vRequestHeader In RequestHeader
Dim uHeader As Long: Dim Lheader As Long: Dim steps As Long
uHeader = UBound(vRequestHeader): Lheader = LBound(vRequestHeader)
If (uHeader - Lheader) Mod 2 = 0 Then GetHttp = CVErr(xlValue): Exit Function
For i = Lheader To uHeader Step 2
If vRequestHeader(i) = "User-Agent" Then blnAgent = True
objHTTP.setRequestHeader vRequestHeader(i), vRequestHeader(i + 1)
Next
Next
End If
If blnAgent = False Then objHTTP.setRequestHeader "User-Agent", sUserAgent
objHTTP.send formText
If includeMeta = False Then
With oHTMLDoc
.Open
.Write objHTTP.responseText
.Close
End With
Else
oHTMLDoc.Body.innerHTML = objHTTP.responseText
End If
Set GetHttp = oHTMLDoc
Set oHTMLDoc = Nothing
Set objHTTP = Nothing
Application.DisplayAlerts = True
End Function
Function Splitter(v As Variant, Cutter As String, Optional Trimmer As String)
'###############################################################
'오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com)
'▶ Splitter 함수
'▶ Cutter ~ Timmer 사이의 문자를 추출합니다. (Timmer가 빈칸일 경우 Cutter 이후 문자열을 추출합니다.)
'▶ 인수 설명
'_____________v : 문자열입니다.
'_________Cutter : 문자열 절삭을 시작할 텍스트입니다.
'_________Trimmer : 문자열 절삭을 종료할 텍스트입니다. (선택인수)
'▶ 사용 예제
'Dim s As String
's = "{sa;b132@drama#weekend;aabbcc"
's = Splitter(s, "@", "#")
'msgbox s '--> "drama"를 반환합니다.
'###############################################################
Dim vaArr As Variant
On Error GoTo EH:
vaArr = Split(v, Cutter)(1)
If Not IsMissing(Trimmer) Then vaArr = Split(vaArr, Trimmer)(0)
Splitter = vaArr
Exit Function
EH:
Splitter = ""
End Function
Function GoogleTranslate(OriginalText, _
Optional sFrom As String = "auto", _
Optional sTo As String = "") As String
'■변수 선언 및 할당
Dim strURL As String: Dim objHTTP As Object
Dim objHTML As Object: Dim objDivs As Object
Dim objDiv As Variant: Dim strResult As String
Dim vaRng As Variant: Dim Rng As Variant
If sTo = "" Then
If Application.LanguageSettings.LanguageID(msoLanguageIDUI) = 1042 Then sTo = "ko" Else sTo = "en"
End If
If TypeName(OriginalText) = "Range" Then
For Each vaRng In OriginalText
For Each Rng In vaRng
If Rng <> "" Then
strtext = strtext & Rng & vbNewLine
Else
strtext = strtext & vbNewLine
End If
Next
Next
Else
strtext = OriginalText
End If
'■ 구글 번역 API 요청
strtext = ENCODEURL(strtext)
strURL = "https://translate.google.com/m?hl=" & sFrom & _
"&sl=" & sFrom & _
"&tl=" & sTo & _
"&ie=UTF-8&prev=_m&q=" & strtext
On Error GoTo EH:
Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
objHTTP.Open "GET", strURL, False
objHTTP.setRequestHeader "User-Agent", "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Mobile Safari/537.36"
objHTTP.send ""
Set objHTML = CreateObject("htmlfile")
With objHTML
.Open
.Write objHTTP.responseText
.Close
End With
'■ 번역 결과 확인
If InStr(1, objHTTP.responseText, "Error 413") > 0 Then GoogleTranslate = "#Request Too Large!": Exit Function
Set objDivs = objHTML.getElementsByTagName("div")
For Each objDiv In objDivs
If objDiv.className = "result-container" Then
strResult = objDiv.innerHTML: Exit For
End If
Next objDiv
'■ 결과값 출력
GoogleTranslate = Convert_Html_Entities(strResult)
Set objHTML = Nothing: Set objHTTP = Nothing
Exit Function
EH:
GoogleTranslate = "#TimeOut"
Set objHTML = Nothing: Set objHTTP = Nothing
End Function
Function Convert_Html_Entities(c)
c = Replace(c, """, """")
c = Replace(c, "&", "&")
c = Replace(c, "'", "'")
c = Replace(c, "<", "<")
c = Replace(c, ">", ">")
c = Replace(c, " ", vbNewLine)
c = Replace(c, "¡", "¡")
c = Replace(c, "¢", "¢")
c = Replace(c, "£", "£")
c = Replace(c, "¤", "¤")
c = Replace(c, "¥", "¥")
c = Replace(c, "¦", "|")
c = Replace(c, "§", "§")
c = Replace(c, "¨", "¨")
c = Replace(c, "©", "ⓒ")
c = Replace(c, "ª", "ª")
c = Replace(c, "«", "≪")
c = Replace(c, "¬", "¬")
c = Replace(c, "®", "®")
c = Replace(c, "°", "°")
c = Replace(c, "±", "±")
c = Replace(c, "²", "²")
c = Replace(c, "³", "³")
c = Replace(c, "´", "´")
c = Replace(c, "µ", "μ")
c = Replace(c, "¶", "¶")
c = Replace(c, "·", "·")
c = Replace(c, "¸", "¸")
c = Replace(c, "¹", "¹")
c = Replace(c, "º", "º")
c = Replace(c, "»", "≫")
c = Replace(c, "¼", "¼")
c = Replace(c, "½", "½")
c = Replace(c, "¾", "¾")
c = Replace(c, "¿", "¿")
c = Replace(c, "×", "×")
c = Replace(c, "ß", "ß")
c = Replace(c, "÷", "÷")
c = Replace(c, "ÿ", "y")
c = Replace(c, "ˆ", "^")
c = Replace(c, "˜", "~")
c = Replace(c, "—", "-")
c = Replace(c, "‘", "'")
c = Replace(c, "’", "'")
c = Replace(c, "‚", "'")
c = Replace(c, "“", """")
c = Replace(c, "”", """")
c = Replace(c, "„", """")
c = Replace(c, "†", "†")
c = Replace(c, "‡", "‡")
c = Replace(c, "…", "…")
c = Replace(c, "‰", "‰")
c = Replace(c, "‹", "?")
c = Replace(c, "›", "?")
c = Replace(c, "€", "€")
c = Replace(c, "™", "™")
c = Replace(c, "’", "’")
c = Replace(c, "«", "≪")
c = Replace(c, "»", "≫")
c = Replace(c, "¢", "¢")
c = Replace(c, "©", "ⓒ")
c = Replace(c, "µ", "μ")
c = Replace(c, "£", "£")
c = Replace(c, "¥", "¥")
c = Replace(c, "ÿ", "y")
c = Replace(c, "´", "´")
Convert_Html_Entities = c
End Function
Function ENCODEURL(varText As Variant, Optional blnEncode = True)
'###############################################################
'오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com)
'▶ EncodeURL 함수
'▶ 한글/영문, 특수기호가 포함된 문자열을 웹 URL 표준 주소로 변환합니다.
'▶ 인수 설명
'_____________varTest : 표준 URL 주소로 변환할 문자열입니다.
'_____________blnEncode : TRUE 일 경우 결과값을 출력합니다.
'▶ 사용 예제
's = "http://www.google.com/search=사과"
's = ENCODEURL(s)
'MsgBox s
'###############################################################
Static objHtmlfile As Object
If objHtmlfile Is Nothing Then
Set objHtmlfile = CreateObject("htmlfile")
With objHtmlfile.parentWindow
.execScript "function encode(s) {return encodeURIComponent(s)}", "jscript"
End With
End If
If blnEncode Then
ENCODEURL = objHtmlfile.parentWindow.encode(varText)
End If
End Function
2. 코드에 API키 입력하기 : 붙여넣기 한 명령문의 시작 지점으로 이동하면, API키를 입력하는 곳이 있습니다. 이곳에 이전 단계에서 생성했던 API키를 복사/붙여넣기하면 엑셀-ChatGPT 연동을 위한 모든 준비가 끝났습니다! 이제 바로 엑셀-ChatGPT 연동을 실습해보겠습니다.👏
이전 단계에서 발급받은 API키를 마스터코드에 붙여넣기하면 모든 준비가 끝납니다.
3. ChatGPT 사용하기
A. 함수 입력으로 사용하는 방법
- xGPT 함수 사용하기 : 예제파일의 첫번째 시트인 [간단 질문] 시트로 이동합니다. '질문을 작성하세요!' 오른쪽 셀인 C5셀에 아래와 같이 간단한 질문을 작성합니다.
① 안녕! 오늘 하루는 어때? (일상 질문)
② 연인에게 보낼 김치찌개와 관련된 사랑의 시를 50자 정도로 작성해주세요. (시짓기)
③ 엑셀에서 A1:D100 범위에 입력된 데이터 중, A열을 참조하여 C열에 입력된 값을 검색하는 함수를 작성해주세요. (엑셀 수식 작성)
④ 헬스장 계약을 취소할 때, 업체에서 남은 잔여금을 환불해주지 않을 경우 대응 방법에 대해 법률 자문을 해주세요. (법률 자문 구하기)
- 이후 GPT 결과를 출력할 B8셀을 선택한 후, =x 를 입력하면 아래 그림과 같이 =xGPT 함수가 나옵니다. 함수를 선택한 후, TAB 키를 눌러 입력하거나 xGPT 함수를 직접 입력합니다. =x 를 입력하면 목록에 표시되는 xGPT 함수를 입력합니다.
- 이후 아래와 같이 xGPT 함수를 작성합니다.
=xGPT( GPT명령어, [무작위성], [최대토큰수] )
=xGPT( C5, C6 )' 무작위성 : 0~1 사이의 숫자입니다. 기본값은 0입니다.
- 0에 가까울수록 정확한 답변(정해진 단어)를 사용하고, 1에 가까울수록 다양한 답변을 얻을 수 있습니다.
- 정확한 답변을 얻어야 하는 경우(법률 자문, 수식 작성, 코드 작성 등)에는 0에 가깝게 사용하고 다양한 답변을 얻는 경우(시 짓기, 주제 정하기)에는 1에 가깝게 사용합니다.
' 최대 토큰수 : 각 GPT 모델에 따라 설정되는 최대 토큰수입니다. 기본값은 최대 토큰수의 절반입니다.
- 토큰수는 입력토큰+출력토큰의 합계입니다. 만약 사용하는 GPT모델의 최대토큰이 2048이고, 입력값으로 2000토큰을 사용했다면 출력값으로는 48토큰에 해당하는 값만 출력할 수 있습니다.
- 토큰당 비용은 사용하는 GPT모델에 따라 다르게 계산됩니다.
- 함수를 입력한 후, 잠시만 기다리면 ChatGPT 응답을 구할 수 있습니다. GPT 응답을 확인하였으면, 작성한 함수를 지운 후 다음 시트로 이동합니다.
- xGPT 함수를 입력하면, 질문에 대한 GPT 답변을 얻을 수 있습니다.
오빠두Tip : GPT 응답은 ①사용 언어(한글/영어), ②출력 글자수, ③ 서버 사용량에 따라 15초~60초까지 시간이 걸릴 수 있습니다.
- xGPT_List 함수 사용하기 : xGPT 함수는 결과값을 하나의 셀 안에 문장형태로 출력합니다. 따라서, GPT 결과로 여러 항목을 출력하는 경우, xGPT_List 함수를 사용하면 각 항목을 여러 셀에 나누어 출력할 수 있습니다.
' 여러 줄로 반환된 GPT 답변을 범위로 출력합니다.
' 엑셀 2019 이전 버전에서는 넓은 범위를 선택한 상태에서 함수 작성 후, Ctrl + Shift + Enter로 입력합니다.
- 예제파일에서 두번째 시트인 [아이디어 얻기] 시트로 이동한 후, 아이디어를 얻을 주제와 아이디어 갯수, 항목 및 구분자로 줄바꿈을 선택합니다. 모두 선택하면 C10셀에 GPT명령어가 자동으로 작성되도록 함수를 미리 적어놓았습니다.
-
주제와 아이디어 개수, 항목을 선택하면 GPT 명령어가 작성되도록 함수를 미리 작성하였습니다.
- 아래에 GPT 결과를 출력할 B13셀을 선택한 후, 아래와 같이 xGPT_List 함수를 작성합니다. 함수를 작성 후 잠시만 기다리면 입력한 주제에 대한 아이디어가 범위로 반환됩니다.
=xGPT_List(C10,C11)xGPT_List 함수를 입력합니다.오빠두Tip : 엑셀 2019 이전 버전 사용자는, B13:B30까지 넓게 범위를 미리 선택한 상태에서, xGPT_List 함수를 작성 후 Ctrl+Shift+Enter로 입력합니다.
- xGPT_List 결과를 모두 확인했으면, 작성한 함수는 모두 지운 후 다음 시트로 넘어갑니다. xGPT_List 함수를 사용하면 여러 항목으로 반환되는 GPT 결과를 범위로 출력할 수 있습니다.
xGPT 함수 사용시 주의사항
엑셀 시트에 작성되는 모든 함수는 시트의 값이 바뀌거나, 파일을 다시 실행할 때마다 반복해서 실행됩니다. 따라서, API를 호출하는 xGPT 함수와 xGPT_List 함수의 경우 일회성으로 사용하기엔 편리하지만, 시트에 함수를 작성해놓으면 함수가 계속 실행되면서 ① 파일이 느려지고 ② 불필요한 API 호출로 비용이 발생하는 문제가 있습니다.
GPT 기능을 함수로 사용할 경우, 시트의 값이 바뀔 때마다 계속 실행되어 파일이 느려질 수 있습니다.
따라서, 엑셀-GPT 기능을 반복해서 사용해야 할 경우, 버튼클릭으로 사용하는것이 더 유용합니다.
B. 버튼 클릭으로 사용하는 방법
- GPT 실행 명령문 작성하기 : 예제파일의 세번째 시트인 [키워드 분석] 시트로 이동합니다. 이번에는 엑셀에서 GPT를 호출하는 매크로를 직접 작성한 후, 버튼 클릭으로 간단하게 엑셀-ChatGPT를 연동하는 방법을 알아보겠습니다. (VBA코드 1줄이면 가능합니다!👍) 키워드 분석 시트에 미리 적어드린 이력서 중 하나를 복사한 후, C4셀을 더블클릭하여 커서가 깜빡이도록 한 상태에서 값 형태로 붙여넣기합니다. 중요 키워드를 추출할 이력서를 C4셀에 값 형태로 붙여넣기 합니다.
- [개발도구] 탭 - [Visual Basic] 버튼을 클릭하거나, 단축키 Alt + F11 을 눌러 매크로 편집기를 실행합니다. 왼쪽 프로젝트 창에서 이전 단계에서 추가한 모듈을 더블클릭하면, 붙여넣기 한 코드를 확인할 수 있습니다. 코드 중간에 미리 적어드린 MyGPT_Test1 명령문을 MyGPT_xxxxx 형태의 원하는 이름으로 변경합니다. 이후 명령문이 추가로 필요할 경우, 아래 적어드린 코드를 복사/붙여넣기하거나 원하는 이름으로 명령문을 작성 후 사용하면 됩니다. 오늘 강의에서는 명령문의 이름을 MyGPT_Keyword로 변경하겠습니다. 버튼 클릭으로 GPT를 실행하기 위한 매크로 명령문을 작성합니다.
- 이제 명령문의 Sub~End Sub 사이에 매크로 코드 1줄만 추가하면 됩니다. 코드를 미리 작성해드렸는데요. 바로 xGPT_Run 함수입니다.
xGPT_Run "입력셀주소", "출력셀주소", [목록출력여부]
' 입력셀주소 : GPT 명령어가 작성된 셀 주소를 작성합니다.
' 출력셀주소 : GPT 결과를 출력할 셀 주소를 작성합니다.
' 목록출력여부 : True일 경우 출력셀주소의 시작셀을 기준으로, GPT 결과가 범위로 반환됩니다. - [키워드분석] 시트에서는, GPT명령어가 입력된 셀의 주소 "C6", 출력할 셀 주소 "B8", 목록 출력여부는 True 이므로 아래와 같이 코드 1줄을 작성하면 모든 준비가 끝납니다.
xGPT_Run "C6", "B8", TruexGPT_Run 명령문을 사용하면 엑셀에서 GPT 기능을 쉽게 실행할 수 있습니다.
- 버튼 클릭으로 GPT 실행하기 : 코드를 모두 작성하였으면, 매크로 편집기를 종료한 후 다시 [키워드분석] 시트로 돌아옵니다. 이후 시트의 [GPT 실행 버튼] 을 우클릭 - [매크로 지정]을 선택하면 방금전 작성한 "MyGPT_Keyword" 명령문이 목록에 표시됩니다. 명령문을 선택한 후, [확인] 버튼을 클릭하면 매크로가 버튼에 등록됩니다. 작성한 GPT 실행 명령문을 시트에 미리 추가해드린 버튼에 등록합니다.
- 이제 버튼을 클릭해보세요! 이력서의 중요 키워드가 GPT 결과로 출력됩니다. 버튼을 클릭하면 매크로가 실행되면서 이력서의 중요 키워드가 추출됩니다.
4. 추가예제 - 재무제표 분석하기
※ 여기서 제일 중요한 부분은 한글 문의내용을 영어로 번역하여 빠르게 gpt 답을 얻고, 다시 한글로 번역하는 프로세스이다.
지금까지 알아본 xGPT 함수, xGPT_List 함수, 그리고 xGPT_Run 매크로를 사용하면 상황에 따라 엑셀과 ChatGPT를 편리하게 연동할 수 있습니다. ChatGPT와 엑셀을 접목하면, 실무에 다양한 방법으로 활용할 수 있는데요. 오늘은 2가지 예제를 알아보겠습니다.
- 재무제표 분석하기 : 인터넷에 게시되어 있는 자료를 토대로 학습하는 ChatGPT의 모델 특성 상, 한국어 학습량은 전체 학습량의 2%가 채 되지 않는다고 합니다. 따라서 수학적 사실이나 일반 논제와 같이 언어와 무관한 내용일 경우, 한국어보다 영어로 GPT를 사용하면 더욱 빠르고 정확한 답변을 얻을 수 있습니다. 예제파일 네번째 시트인 [재무제표분석] 시트로 이동한 후, 오른쪽에 미리 추가해드린 삼성전자 링크를 클릭하면 야후 증권의 삼성전자 재무제표 페이지로 이동합니다. 페이지의 재무제표를 드래그하여 복사합니다. 링크를 클릭하면 야후 증권의 삼성전자 재무제표 페이지로 이동합니다.
- 다시 재무제표시트로 돌아온 후, 복사한 재무제표 C4셀에 값 형태로 붙여넣기합니다. 재무제표를 복사한 후, 시트 C4셀에 값 형태로 붙여넣기합니다.
- 방금전 [키워드분석]시트에서 작성한 매크로의 경우, 입력셀 "C6셀", 출력셀 "B8셀" 이였습니다. 이번에 사용할 재무제표시트도 입력셀 "C6"셀, 출력셀 "B8셀"로 이전에 작성했던 매크로를 그대로 사용할 수 있습니다. GPT실행 버튼을 우클릭 - 매크로 지정을 선택한 후, 이전 단계에서 작성했던 "MyGPT_Keyword" 명령문을 등록합니다.
- 이전 시트의 입력, 출력셀 주소가 동일하므로 기존에 작성한 매크로를 그대로 사용합니다.
- 이제 버튼을 클릭한 후, 잠시만 기다리면 붙여넣기한 재무제표의 분석 결과가 GPT 결과로 출력됩니다. 버튼을 클릭하면 재무제표 분석 결과가 출력됩니다.
- GoogleTranslate함수로 실시간 번역하기 : 이제 GoogleTranslate 함수를 사용해 영어로 출력된 GPT 결과를 한글로 번역하겠습니다.
=GoogleTranslate("번역할문장","출발어","도착어")
' 출발어의 기본값은 자동입니다. 도착어의 기본값은 한국어입니다.
' 한국어 문장을 영어로 번역할 경우, =GoogleTranslate("안녕하세요.","ko","en") 으로 작성합니다.
' 함수에서 제공하는 언어 목록은 구글 공식 홈페이지를 참고하세요.
https://cloud.google.com/translate/docs/languages?hl=ko오빠두Tip : GoogleTranslate 함수는 엑셀-ChatGPT 연동 마스터 코드에 미리 작성해드린 VBA 함수입니다! (엑셀에서 기본으로 제공되는 함수가 아닌 점 주의하세요!)
5. 추가예제 - 보고서 자동완성하기
- 키워드로 보고서/포스팅 자동 완성 : 엑셀과 ChatGPT를 연동하면, 특정 주제(키워드)만 입력했을 때 A4용지 1-2장 분량의 보고서를 자동으로 완성할 수 있습니다. 예제파일의 마지막 시트인 [보고서 자동완성] 시트로 이동한 후, 문서 종류를 선택하고 작성할 주제를 1~5개 까지 자유롭게 입력합니다. 엑셀과 ChatGPT를 연동하면 키워드, 주제만으로 보고서/블로그 포스팅을 작성할 수 있습니다.
- 문서 종류와 주제를 작성하면, GoogleTranslate 함수를 사용해 영어로 번역한 후, 번역된 문장이 GPT 명령어로 작성되도록 C16셀에 함수를 미리 작성했습니다. 문서 종류와 주제를 작성하면 GPT명령어가 작성되도록 함수를 미리 작성하였습니다.
- 이제 이전과 동일하게 매크로 편집기에서 입력셀 C16셀, 출력셀 B18셀로 GPT를 실행하도록 xGPT_Run 함수를 아래 그림과 같이 작성한 후, GPT 실행버튼에 작성한 매크로를 등록합니다.
GPT를 실행하기 위한 매크로를 작성한 후, 버튼에 작성한 매크로를 등록합니다.
오빠두Tip : 이번에는 GPT 결과를 범위가 아닌 셀 안에 문장으로 출력해야하므로, xGPT_Run 함수의 마지막 인수를 false로 작성합니다.
- 이제 GPT실행 버튼을 클릭한 후, 잠시만 기다려보세요! 작성한 키워드/주제에 대한 보고서가 작성됩니다. 버튼을 클릭하면 GPT 결과가 영어로 출력되고, 결과를 한글로 번역하면 보고서가 완성됩니다.
+) 비용과 관련하여
ChatGPT 결제수단 등록 및 비용 확인
GPT API의 토큰 단위와 비용 계산 방법
GPT API는 '토큰'이라는 단위로 정산이 이루어집니다. GPT 언어모델 비용에 대한 자세한 설명은 아래 OpenAI 공식 홈페이지를 참고하세요.
https://openai.com/api/pricing/
- Davinci (가장 좋은 성능, $0.02(26원)/1,000토큰, 최대 4,000토큰 지원)
창의적 문제 해결, 논제에 대한 답변, 원인/결과 분석, 문장 이해 및 자동 완성, 질문자의 감정 이해 등 다양한 문제를 해결할 수 있습니다. 가장 성능이 좋은 만큼 다른 모델에 비해 처리속도가 느릴 수 있습니다.
- Curie (보편적 성능, 빠른 속도, $0.002(2.6원)/1,000토큰, 최대 2,048토큰 지원)
현재 OpenAI에서 제공하는 여러 언어 모델 중 가장 가성비 좋은 모델입니다. Babbage가 수행하는 기능에 더불어, 문장 내 감정 분석, 문서 요약/정리, 대화형(챗복)기능, 질의응답이 가능합니다.
- Babbage (Ada보다 조금 더 나은 성능, $0.0005(0.65원)/1,000토큰, 최대 2,048토큰 지원)
Ada보다 조금 더 나은 문장 교정, 추출 성능 갖는 GPT 모델입니다.
- Ada (가장 빠른 속도, $0.0004(0.52원)/1,000토큰, 최대 2,048토큰 지원)
문장 내 단어 추출, 문장 교정, 등 가장 단순한 작업을 수행합니다. 정확한 명령어(질문, prompt)를 제공할수록 더 나은 결과를 도출합니다.
Q) 1,000 토큰으로 어느정도 길이의 문장을 만들 수 있나요?
한글 기준 400-450자, 영문 기준 750단어를 작성할 수 있으며, 대략 1,000토큰당 A4용지 0.5-1장 분량을 작성할 수 있습니다. (일반적으로 한글의 경우 영문보다 4배 가량의 토큰을 사용하므로, 보통은 한글보다 영어로 GPT를 사용하는 것이 합리적입니다.)
따라서, Davinci 모델로 A4용지 1장 분량의 보고서 작성 시 약 30-50원 정도의 비용이 발생하며, Curie 모델의 경우 A4용지 1장당 3-5원 정도 비용이 발생합니다. 또는 아래 OpenAI 홈페이지에서 제공하는 Tokenizer를 사용하면 작성하고자 하는 보고서 형태나 명령어의 정확한 토큰을 계산할 수 있습니다.
https://platform.openai.com/tokenizer
Q) 최대 토큰은 무엇인가요?
GPT의 질문(명령어, prompt)로 사용한 문장과 결과로 출력되는 문장의 토큰 합계입니다. 예를들어, Curie 모델의 경우 최대 2,048 토큰을 지원하며, 질문으로 500토큰을 사용 시, 출력값으로는 최대 1,548 토큰에 해당하는 문장만 출력할 수 있습니다.
GPT API 결제 수단 등록 방법
- 결제수단 등록하기 : OpenAI 계정 설정 페이지로 이동 후, 좌측 탭에서 'Billing' 탭을 클릭 - [Set up paid account] 버튼을 클릭한 후 결제수단을 등록합니다. 계정 설정 - Billing 탭에서 결제 수단을 등록할 수 있습니다.
- 이후 Usage 탭에서 OpenAI의 API 사용량을 실시간으로 조회할 수 있습니다. (거의 실시간으로, 1분 단위로 조회가능합니다.) Usage 탭에서 사용량을 실시간으로 조회할 수 있습니다.
- 사용한도 설정하기 : 만약 사용한도를 설정하고 싶다면, [Billing] 탭 - [Usage Limits] 에서 한도를 설정할 수 있습니다. Soft Limit 한도를 초과할 경우, 관리자 계정으로 알림 이메일이 발송되며, Hard Limit 초과시 API 사용이 제한됩니다. Billing - Usage Limit 에서 사용 한도를 설정할 수 있습니다.
오빠두님이 제작한 초안에서 필자가 한글로 입력해도 영어 변환 후 질문하고 그 답변을 다시 한글로 번역해주는 Translate 함수를 추가한 버전을 아래에 올려두었다. 저거 다운받고 본인의 API 키를 입력 후 사용하기 바란다.
'IT > EXCEL & VBA' 카테고리의 다른 글
[Excel VBA 기초-4] 셀 주소 알아내기 / 글꼴설정(폰트 크기/폰트 종류/폰트 색) (0) | 2021.12.28 |
---|---|
[Excel VBA 기초-3] 변수에 날짜 대입하기 / 년 월 일 요일 출력하기 (0) | 2021.12.27 |
[Excel VBA 기초-2] IF문 / For문 / While문 (0) | 2021.12.27 |
[Excel VBA 기초-1] VBA 실행 / 셀에 값 넣기 / 매크로 저장 / 한줄씩 코드 확인 방법 (0) | 2021.12.27 |
[Excel] 방향키로 셀 이동이 안될 때 해결 방법 (0) | 2021.03.16 |