첨부파일에서 마우스 우클릭을 하면 Get Gemini Selected 와 Get Gemini All 메뉴가 뜹니다.
Get Gemini Selected 는 현재 선택된 셀들에 대해 구글 Gemini 에게 [B1]셀에 주어진 프롬프트를 이용해서 명령을 보내서 돌아온 다시 쓴 문장을 원래 셀 오른쪽에 가져옵니다.
Get Gemini All 은 B열에서 B1을 제외한 모든 B:B셀의 문장에 대해 [B1]의 프롬프트 명령을 실행해서 답변 결과를 각 셀의 오른쪽에 가져옵니다.
먼저 구글 API가 필요합니다.
위 사이트에 자신의 구글 계정으로 로그인해서 'API 키 만들기'를 클릭하여 API 키를 생성하고 복사합니다.
AIza~로 시작하는 40자리 알파벳대소문자+숫자입니다.
VBA에서 구글 Gemini API에 접속할 때 여러가지 버전으로 접속이 가능합니다.
https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-exp:generateContent?key=API_KEY
https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=API_KEY
위 처럼 접속하는 주소에 따라 Gemini 버전이 달라집니다.
명령 프롬프트는 Json 형식의 문자열을 이용해서 POST 방식으로 전송합니다.
{
"contents": [{
"parts":[{"text": "Explain how AI works"}]
}]
}
위 처럼 프롬프트 명령을 PostData문자열에 넣어서 Http 접속할 때 Send PostData 로 서버에 넘겨주게 됩니다.
그러면 아래와 같은 Json 문자열이 Return 됩니다.
'{"candidates":
[{"content":
{"parts":
[{"text":"침착하고 신중한 태도로, 돈독한 유대감을 형성하고 긍정적인 관계를 구축함.\n"
}],
"role":"model"
},
"finishReason":"STOP",
"avgLogprobs":-0.173911633351857
}],
"usageMetadata":
{"promptTokenCount":278,
"candidatesTokenCount":239,
"totalTokenCount":517},
"modelVersion":"gemini-1.5-flash"}
API 키가 틀리면 아래처럼 Error 문자열이 Return 됩니다.
2.0 등 다른 버전에서 작동하는 설정 등은 위 링크에서 왼쪽 상단 Create Prompt 메뉴에서 명령을 실행해보고
오른쪽 상단 GetCode 를 눌러보면 아래처럼 알 수 있습니다.
위 예시처럼 user 와 model 간의 대화처럼 프롬프트를 만들어서 보낼 수도 있습니다.
아래처럼 설정값도 변경 가능합니다.
"generationConfig": {
"temperature": 1,
"topK": 40,
"topP": 0.95,
"maxOutputTokens": 8192,
"responseMimeType": "text/plain"
}
구글 Gemini 는 아래처럼 여러가지 모델로 테스트중입니다.
무료인 것도 있고 유료인 것도 있습니다.
샘플로 돌아와서
아래와 같은 내용을 구글 Gemini 명령을 통해 답변을 일괄로 가져오는 예시입니다.
사용된 코드는 아래와 같습니다.
Option Explicit
'Const API_KEY = "Your Google API KEY ==== 40 Chars ====="
Const API_KEY = "AIzaXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" 'Google API 키
'1) Visit 'https://aistudio.google.com/app/apikey?hl=ko.'
'2) Generate your API KEY by clicking 'API키 만들기' and copy it
Dim Http As Object 'MSXML2.ServerXMLHTTP60 ' Object
'Dim Html As New MSHTML.HTMLDocument
Dim JSON As New JsonBag
Sub getGeminiResultFromSelection()
Dim sht As Worksheet
Dim rng As Range
Set Http = CreateObject("MSXML2.ServerXMLHttp")
Set sht = ActiveSheet
For Each rng In ActiveWindow.Selection
If getGenaiResult(rng) = -1 Then Exit For
'Exit For
If (rng.Row - 1) Mod 5 = 0 Then Application.Wait Now + TimeSerial(0, 0, 2)
Next rng
'sht.Columns.AutoFit
'sht.Columns("A").ColumnWidth = 20 : sht.Columns("B").ColumnWidth = 200: sht.Columns("C").ColumnWidth = 200
sht.Rows.AutoFit
sht.Rows(1).RowHeight = sht.Rows(1).RowHeight + 4
'Set Html = Nothing
Set Http = Nothing
End Sub
Sub getGeminiResult()
Dim sht As Worksheet
Dim lastRow As Range, rng As Range
Set Http = CreateObject("MSXML2.ServerXMLHttp")
Set sht = ActiveSheet
Set lastRow = sht.Cells(sht.Rows.Count, "B").End(xlUp)
If lastRow.Row < 2 Then Exit Sub
For Each rng In sht.Range("B2:B" & lastRow.Row)
If getGenaiResult(rng) = -1 Then Exit For
'Exit For
If (rng.Row - 1) Mod 5 = 0 Then Application.Wait Now + TimeSerial(0, 0, 1)
Next rng
'sht.Columns.AutoFit
'sht.Columns("A").ColumnWidth = 20 : sht.Columns("B").ColumnWidth = 200: sht.Columns("C").ColumnWidth = 200
sht.Rows.AutoFit
'Set Html = Nothing
Set Http = Nothing
End Sub
Function getGenaiResult(q As Range) As Integer
Dim oSht As Worksheet
Dim sUrl As String, Cmd As String, PostData As String, Result As String
Set oSht = q.Parent
'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-exp:generateContent?key=API_KEY
'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=API_KEY
sUrl = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=" & API_KEY
' {
' "contents": [{
' "parts":[{"text": "Explain how AI works"}]
' }]
' }'
'Return >>
'{"candidates":[{"content":{"parts":[{"text":"침착하고 신중한 태도로, 돈독한 유대감을 형성하고 긍정적인 관계를 구축함.\n"}],"role":"model"},"finishReason":"STOP","avgLogprobs":-0.173911633351857}],"usageMetadata":{"promptTokenCount":278,"candidatesTokenCount":239,"totalTokenCount":517},"modelVersion":"gemini-1.5-flash"}
'프롬프트 명령
Cmd = oSht.Range("B1")
'질문에 데이터 내용 추가
Cmd = Cmd & vbNewLine & q.Value
'POST 내용
PostData = "{" & _
"""contents"": [{" & _
"""parts"":[{""text"": """ & Cmd & """}]" & _
"}]" & _
"}"
With Http
.Open "Post", sUrl, False
.setRequestHeader "User-Agent", "Mozilla/5.0 (Linux; Android 6.0;) AppleWebKit/537.36 Chrome/120.0.0.0 Mobile Safari/537.36"
.setRequestHeader "Content-Type", "application/json"
.send PostData
'Html.body.innerHTML = .responseText
JSON.JSON = .responseText
End With
'Debug.Print JSON.JSON
' {"error":{"code":400,"message":"API key not valid. Please pass a valid API key.","status":"INVALID_ARGUMENT","details":[{"@type":"type.googleapis.com/google.rpc.ErrorInfo","reason":"API_KEY_INVALID","domain":"googleapis.com","metadata":{"service":"generativelanguage.googleapis.com"}},{"@type":"type.googleapis.com/google.rpc.LocalizedMessage","locale":"en-US","message":"API key not valid. Please pass a valid API key."}]}}
If JSON.Exists("error") Then
If MsgBox("[ Error!! " & JSON("error")("code") & " ] " & JSON("error")("message") & _
vbNewLine & vbNewLine & "Stop now?", vbYesNo + vbCritical) = vbYes Then
getGenaiResult = -1
Else
getGenaiResult = 0
End If
Exit Function
End If
'print Result
Result = JSON("candidates")(1)("content")("parts")(1)("text")
Result = Trim(Result)
If Right(Result, 1) = Chr(10) Then Result = Left(Result, Len(Result) - 1) '마지막 엔터 제거
While InStr(Result, " ") > 0: Result = Replace(Result, " ", " "): Wend '빈칸 2개 제거
q.Offset(, 1) = Result
'Total token used
q.Offset(, 2) = JSON("usageMetadata")("totalTokenCount")
getGenaiResult = 1
End Function
Private Sub RemoveDoubleBlank()
Dim rng As Range
For Each rng In Selection
While InStr(rng, " ") > 0: rng = Replace(rng, " ", " "): Wend '빈칸 2개 제거
Next rng
End Sub
- Alt+F11창의 모듈1의 코드상단에서 API_Key 값은 자신의 것으로 바꿔야 합니다.
- 서버접속은 5개마다 2초씩 쉬게 했습니다. quota 오류가 뜰 수 있습니다.
- 중단해야할 때는 Esc키를 연타하세요.
- Json 라이브러리는 JsonBag 2.6을 사용했습니다.
- 일부 셀만 답변을 가져올 때는 우클릭 메뉴에서 GetGenaiResultFromSelection 을 이용하세요.
- 2.0 주소로 접속할 때는 PostData 값이 달라질 수 있습니다.(테스트 해보지 않음)
- 빈칸이 두 개 연속되거나 마지막의 엔터 문자는 제거합니다.
- 결과를 가져온 후 행 높이는 자동 조절됩니다.
✅ 중요한 것은 [B1]에 있는 아래와 같은 프롬프트 명령을 잘 튜닝해서 명령을 해줘야 결과값이 원하는 대로 나오게 됩니다. 조건을 자세히 명시하는 것이 좋습니다.
주어진 평가문장을 최대한 기존과 일치하지 않는 다른 표현으로 바꿔서 좀 더 긴 개조식 4문장으로 요약해서 바꾼 후 문장 순서를 섞어서 한 단락으로 답변해줘.'학생', '확인', '알 수 있음'이라는 표현은 사용하지 말고 각 문장은 반드시 '~함', '~임' 등으로 끝나야 함: |
주어진 표현을 최대한 다른 표현으로 바꿔서 '~함', '~임'으로 끝나는 좀 더 긴 개조식 4문장으로 바꿔서 한 단락으로 답변해줘('이 학생은 '이라는 말은 생략): |
주어진 문장을 기존 단어 대신 다른 단어를 사용하여 4문장으로 요약해줘. 문장은 반드시 '~함', '~임'으로 끝나야 함. 가능하면 주어는 생략하고 기존 문장 순서를 섞어서 전문적인 표현으로 작성해줘 |
위의 [B1]셀의 프롬프트 명령 뒤에 B열의 각 문자열을 덧붙여서 Gemini에게 명령을 내리고 그에 대한 답변을 각 셀의 오른쪽에 가져옵니다.
이제 샘플 파일 첨부합니다:
참고:
참고로 'Sheet2가져오기' 시트를 보면 Sheet2에서 1학년때 내용과 2학년때 내용을 합쳐서 가져오는 예시가 들어 있습니다.
Sheet2에는 아래처럼 1학년과 2학년 내용이 들어 있습니다.
홍길동1에 대한 2개 학년 내용을 가져와서 그 내용을 rePhrase 시키기 위함입니다.
추후 구글 정책에 의해 변경이 필요할 수 있습니다.
제한된 Token 량이 있기 때문에 사용량 초과로 오류가 발생하거나
모델에 따라, Token 량에 따라 유료 과금 될 수 있는 점 유의하세요.
가능하면 실험용 버전을 사용하세요.
이 예제는 텍스트를 주고 받는 샘플이지만 좀 더 고급 수준에서는 이미지를 전송하는 것도 가능합니다.
다양한 Gemini 버전 안내
Gemini 모델 | Gemini API | Google AI for Developers
가격 정책
https://ai.google.dev/pricing?hl=ko
사용량 모니터링
https://console.cloud.google.com/apis/dashboard
'XLS+VBA' 카테고리의 다른 글
365 엑셀에서 셀안의 그림(PictureInCell) 기능 (0) | 2024.12.23 |
---|---|
단어의 빈도수 통계내기 (2) | 2024.12.06 |
WinHttp 한글 인코딩이 깨질 때 처리 방법(예시: 당근 사이트) (0) | 2024.11.18 |
의료기기 검색 크롤링 (2) | 2024.10.03 |
구글 검색 API > 검색 결과 첫번째 링크 가져오기 (0) | 2024.07.03 |
엑셀연동] 자동 방배정 및 명단 출력 2 (0) | 2024.05.23 |
엑셀연동] 방배정 명단 출력 1 (0) | 2024.05.23 |
교보문고 ISBN 도서 검색(JSON) (1) | 2024.05.15 |
최근댓글