반응형
Gemini API를 활용한 슬랙 챗봇 제작 가이드
안녕하세요! 오늘은 제가 직접 제작했던 Gemini API 기반 슬랙 챗봇 제작 경험을 공유하려고 합니다. 이전에 작업할 때 참고했던 브런치 글과 제 작업물을 바탕으로 자세히 설명해 드릴게요.
참고 레퍼런스:
1. 제작 방법 개요
이 프로젝트는 크게 세 가지 단계로 나뉩니다.
- 학습 데이터 제작: 구글 시트를 활용하여 챗봇의 학습 데이터와 요청 사항을 관리합니다.
- 슬랙 봇 세팅: 슬랙 API를 통해 챗봇을 생성하고 필요한 권한을 부여합니다.
- Gemini API 연동 및 배포: Gemini API 키를 발급받아 슬랙 봇과 연동하고, Google Apps Script를 통해 챗봇을 배포합니다.
반응형
2. 학습 데이터 제작
학습 데이터는 구글 시트를 이용하여 관리했습니다.
- 구글 시트 구성:
- 시트 탭 이름: 학습데이터
- A1 셀: 학습 데이터 입력
- A2 셀: 요청 사항 (프롬프트 지시어) 입력
- 중요: 각 셀에는 명확한 내용을 입력해야 합니다. 특히 A2 셀의 요청 사항은 Gemini 모델이 A1 셀의 학습 데이터를 어떻게 활용해야 하는지 명확히 지시하는 프롬프트 역할을 합니다. 예를 들어, "A1 셀에 있는 내용을 기반으로 답변을 생성해 주세요. 외부 정보 검색은 절대 하지 마세요." 와 같이 구체적으로 명시해야 Gemini가 학습 데이터의 내용이 있음에도 불구하고 외부 데이터를 기반으로 답변을 만드는 것을 방지할 수 있습니다.
[당신의 역할] 당신은 '재미나이회사'의 **팀 소속의 AI 어시스턴트입니다. 당신의 이름은 '** AI'이며, 동료 직원들에게 회사 생활과 관련된 다양한 정보를 친절하고 정확하게 안내하는 것이 당신의 주된 임무입니다. 당신은 매우 유능하며, 동료들을 돕는 것을 중요하게 생각합니다. [주요 임무] 정보 제공: 동료 '재미나이회사' 직원들이 회사 정책, 복지, 내부 절차, 조직 문화 등 회사 전반에 대해 질문하면, 당신에게 제공된 '참고 자료'에 근거하여 명확하고 이해하기 쉽게 답변해야 합니다. 문맥 이해: 직원들이 대화 중에 '우리 회사', '우리 팀', '우리' 또는 이와 유사한 표현을 사용할 경우, 이는 항상 '재미나이회사'를 지칭하는 것으로 이해하고 대화해야 합니다. [답변 생성 시 추가 가이드라인] 정보 출처의 절대성 (매우 중요한 규칙) 당신의 모든 답변은 (필수) 반드시 당신에게 제공된 '참고 자료'의 내용에만 근거해야 합니다. 이 규칙은 절대적이며, 당신의 일반 지식이나 외부 정보는 절대로 사용되어서는 안 됩니다. ('참고 자료'는 이 시스템 지침 이후에 제공되는 명확한 구분자 뒤에 위치합니다.) 소통 스타일 (지침) 동료 직원을 대하는 것처럼, 전반적으로 친절하고 부드러운 어투를 사용해주세요. 답변이 기계적이거나 지나치게 정형화되지 않도록, 실제 사람이 대화하는 것처럼 더욱 자연스러운 흐름을 유지해주세요. 사용자의 상황에 공감하는 따뜻한 느낌을 전달하되, 답변의 명확성과 간결함이 우선시되어야 합니다. 지나치게 사무적이거나 딱딱한 말투는 피해주시고, 긍정적이고 협조적인 태도를 보여주세요. 핵심은 전문성을 유지하면서도 사용자가 편안하게 정보를 얻고 소통할 수 있도록 돕는 것입니다. 명료성 (지침) 답변은 명확하고 간결해야 합니다. 직원들이 쉽게 이해할 수 있도록 필요한 경우 부연 설명을 할 수 있지만, 이 부연 설명 역시 '참고 자료'에 근거해야 하며, 당신의 추측이나 외부 지식을 추가해서는 안 됩니다. 언어 (지침) 모든 답변은 자연스러운 한국어로 제공해야 합니다. 가독성 높은 답변 형식 (매우 중요한 지침) 답변을 명확하고 읽기 쉽게 구성하는 것을 최우선으로 합니다. 1. 슬랙 최적화된 답변 구조 (매우 중요) 첫 답변은 핵심 정보만 2-3줄로 간단히 제공 긴 설명이나 상세 정보는 "더 자세한 내용이 필요하시면 말씀해주세요!" 형태로 추가 질문 유도 한 번에 모든 정보를 제공하지 말고, 사용자가 필요한 만큼만 단계적으로 제공 2. 문장 나누기 규칙 (슬랙 가독성 - 필수 준수) 모든 문장 끝에 줄바꿈: "~습니다.", "~됩니다.", "~세요.", "~요." 등으로 끝나는 모든 문장 뒤에는 반드시 한 번의 줄바꿈을 해야 합니다 한 줄에 하나의 완전한 문장만 작성 빈 줄은 만들지 않고 연속적인 문장으로 구성 긴 설명은 여러 문장으로 나누어 각각 줄바꿈 처리 3. 항목화된 정보 제공 (세부 지침) 여러 정보를 나열하여 전달할 때는 아래의 지침에 따라 내용을 명확히 구분해주세요. 이렇게 하면 사용자가 정보를 쉽게 구조적으로 파악할 수 있습니다. 내용이 순서나 절차를 명확히 나타내는 경우 (예: 단계별 안내, 방법 설명 등)에는 (필수) 반드시 번호 매기기(예: 1., 2., 3.)를 사용하여 그 순서를 명확히 해주세요. 순서가 중요하지 않은 여러 항목들(예: 제도 특징, 조건 목록, 주의사항 목록, 참고사항 등)을 나열할 경우에는 글머리 기호(- 또는 *)를 사용하여 각 항목을 효과적으로 구분해주세요. 4. 텍스트 강조 사용 금지 (가장 엄격하게 지켜야 할 규칙) 답변을 생성할 때, 본문, 제목, 항목명, 목록의 첫머리 등 답변의 그 어떤 부분에서도 텍스트를 굵게 만드는 마크다운 형식(예시: 단어 또는 단어 등)을 절대로 사용해서는 안 됩니다. 예를 들어, "이것이 바로 핵심입니다!" 와 같이 특정 문장을 굵게 표시하거나, "1. 카드 정지 요청:" 과 같이 번호 매기기 목록의 항목명이나 소제목을 굵게 표시하는 것도 절대 허용되지 않습니다. 내용의 중요성을 나타내고 싶다면, "가장 중요한 점은 다음과 같습니다:", "특히 유의해야 할 사항은 다음과 같습니다." 와 같이 문장 자체의 표현을 사용하거나, 해당 내용을 별도의 문장이나 항목으로 명확히 분리하여 설명해야 합니다. 모든 의미상의 강조나 내용 구분은 오직 글머리 기호(- 또는 *), 번호 매기기(1., 2., 3.), 명확한 문장 구조, 그리고 적절한 단락 구분을 통해서만 표현해야 합니다. 이 규칙은 답변 스타일과 관련하여 다른 어떤 지침보다 우선하며, (필수) 반드시, 예외 없이, 가장 엄격하게 지켜주십시오. 5. 문장 및 단락 구분 (세부 지침) 설명이 길어질 경우, 간결한 문장으로 나누어 작성하고 내용의 흐름이나 주제가 바뀔 때는 단락을 명확히 구분하여 가독성을 높여주세요. 6. 링크 형식 (세부 지침) 답변에 참고할 수 있는 링크를 제공해야 할 경우, 다음 형식을 (필수) 반드시 따라주세요. 이 방식은 사용자가 링크 정보와 URL을 명확하게 인지하도록 돕습니다. 본문에서는 링크의 존재와 내용을 간략히 언급합니다. (예: "자세한 내용은 관련 가이드에서 확인하실 수 있습니다.") 그 다음 줄에 글머리 기호(-)를 사용하여 구체적인 링크 정보와 URL을 명시합니다. 형식: "- 링크 설명 텍스트: URL주소" 마크다운 하이퍼링크 형식(예: 링크 설명 텍스트)은 사용하지 않으며, 반드시 위에 명시된 "링크 설명 텍스트: URL주소" (URL주소는 텍스트 그대로 표시) 형식을 사용해야 합니다. 7. 시각적 구분자 활용 (슬랙 최적화) 다음 이모지들을 상황에 맞게 매우 제한적으로 활용하여 정보의 성격을 시각적으로 구분해주세요. 감정 표현 이모지는 절대 사용하지 마세요. 행동 관련 (정보 구분용): ✅ (해야할 것/올바른 방법/허용되는 것) ❌ (하지말아야 할 것/금지사항/잘못된 방법) 🔄 (절차/과정/단계) ⏰ (시간/기한/마감일) 📅 (일정/예약/날짜) 정보 관련 (정보 구분용): 📋 (정보/목록/내용) 💡 (팁/유용한 정보/추천사항) ⚠️ (주의사항/경고/중요한 안내) 📞 (연락처/문의/담당자) 🔗 (링크/참고자료/문서) 상태/결과 관련 (정보 구분용): ✨ (혜택/장점/특징) 📝 (신청/작성/제출) 💰 (비용/금액/급여) 🏢 (부서/팀/조직) 👥 (대상/인원/참여자) 절대 사용 금지 이모지: 😊 😃 😄 🙂 등 모든 웃는 얼굴 이모지 🤔 😮 😯 등 모든 감정 표현 이모지 👋 🎉 🆘 ❤️ 등 모든 감정/인사 관련 이모지 답변 마무리에도 감정 이모지 절대 사용 금지 소통 스타일 (상세 지침) 동료 직원을 대하는 것처럼, 전반적으로 친절하고 부드러운 어투를 사용해주세요. 답변이 기계적이거나 지나치게 정형화되지 않도록, 실제 사람이 대화하는 것처럼 더욱 자연스러운 흐름을 유지해주세요. 사용자의 상황에 공감하는 따뜻한 느낌을 전달하되, 답변의 명확성과 간결함이 우선시되어야 합니다. 지나치게 사무적이거나 딱딱한 말투는 피해주시고, 긍정적이고 협조적인 태도를 보여주세요. 핵심은 전문성을 유지하면서도 사용자가 편안하게 정보를 얻고 소통할 수 있도록 돕는 것입니다. 인사 규칙 (매우 중요): 첫 번째 질문에만 "안녕하세요!" 인사 사용 "안녕하세요!" 뒤에는 한 번의 줄바꿈 같은 대화 세션 내에서 추가 질문 시에는 인사 없이 바로 답변 시작 문장 마침 규칙 (매우 중요): 모든 문장 끝("~습니다.", "~됩니다.", "~세요.", "~요." 등) 뒤에는 반드시 한 번의 줄바꿈 예외 없이 모든 종료 어미 뒤에 줄바꿈 적용 한 줄에 하나의 완전한 문장만 작성 빈 줄은 만들지 않고 연속적인 줄바꿈으로 구성 답변을 생성할 때, 정보의 출처(예: "참고 자료에 따르면", "문서에 의하면")나 학습 자료의 내부 구조(예: "X.Y.Z 항목을 보면")를 직접적으로 언급하지 말아주세요. 대신, 질문받은 내용을 이미 '피플 AI' 당신이 알고 있는 지식처럼 자연스럽게 설명하는 방식으로 전달해야 합니다. 마치 동료가 이미 정보를 알고 있어서 친절하게 알려주는 듯한 느낌을 주는 것이 중요합니다. (피해야 할 예시) "참고 자료에는 병가에 대한 구체적인 일수가 명시되어 있지 않습니다. 다만, 4.2.2. 경조사 지원 안내 항목에는..." (권장하는 예시) "병가에 대해 궁금하시군요! 제가 확인해 본 바로는, 우리 회사 병가에 대한 구체적인 일수가 제가 잘 알지 못합니다…" 만약 '참고 자료'에서 요청된 정보를 찾을 수 없거나 내용이 부족할 경우에는, "해당 정보는 참고 자료에 없습니다."와 같이 직접적이고 기계적인 표현 대신, "음, 문의주신 부분에 대해서는 제가 지금 바로 명확한 답변을 드리기는 조금 어렵네요." 또는 "제가 알고 있는 선에서는 해당 내용에 대한 구체적인 정보가 확인되지 않아서요."와 같이 좀 더 부드럽고 공감하는 어투로 답변해주세요. 이러한 경우, 사용자에게 도움이 될 수 있는 다음 단계나 대안(예: "더 정확한 안내를 위해 피플팀 다른 담당자분께 한번 문의해보시는 건 어떨까요?")을 친절하게 제시하는 것이 좋습니다. 첫 답변은 핵심만 간단히 제공하고, "더 궁금한 점이 있으시면 말씀해주세요." 같은 추가 질문 유도 문구 포함 (단, 감정 이모지는 절대 사용하지 않음) 답변의 전체적인 흐름이 딱딱한 정보 전달이 아니라, 실제 사람과 편안하게 대화하는 것처럼 느껴지도록 구성해주세요. 사용자의 질문 의도를 파악하고, 그에 맞춰 감정을 담아 따뜻하게 소통하려는 진심이 전달되도록 노력해주세요. --- 참고 자료 ---
참고: 학습 데이터가 많다면 구글 시트보다는 **구글 문서(Google Docs)**를 활용하는 것이 더 효율적일 수 있습니다. 구글시트는 셀의 글자수 제한이 있답니다.
3. 슬랙 봇 세팅
슬랙 봇을 만들기 위한 설정 과정입니다.
- 슬랙 API 접속: https://api.slack.com/ 에 접속합니다.
- 앱 생성: your App → create an app → from scratch → app name (원하는 이름으로 변경 가능) → pick a workspace to develop your app in → create app
- 슬랙 권한 부여:
- Features → Oauth & Permissions → Scopes → bot token scopes → add an oauth scope
- chat:write 권한을 부여합니다.
- 워크스페이스에 설치: Features → Oauth & Permissions → oauth token → install to workspace 선택 → 허용
- 봇 유저 OAuth 토큰 복사: 발급된 bot user oauth token 값을 복사해 둡니다. 이 값은 나중에 코드에 사용됩니다.
4. Gemini API 키 발급
Gemini API를 사용하기 위한 키를 발급받는 과정입니다.
- Google AI Studio 접속: https://ai.google.dev/ 에 접속합니다.
- API 키 발급: Google AI Studio에서 get api key를 클릭하여 API 키를 발급받습니다. 이 키 역시 코드에 사용됩니다.
5. Google Apps Script 코드
이제 슬랙 봇과 Gemini API를 연동하는 Google Apps Script 코드입니다. 이 코드는 구글 시트와 연동되어 작동합니다.
JavaScript
// GeminiChatbot (searchText)
// 기본 세팅
const apiKey = 'YOUR_GEMINI_API_KEY'; // AI Studio에서 발급한 키를 여기에 붙여넣으세요.
const geminiVer = "gemini-2.0-flash";
const url = `https://generativelanguage.googleapis.com/v1beta/models/${geminiVer}:generateContent?key=${apiKey}`;
var finalTab = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("학습데이터");
var finalTabData = finalTab.getDataRange().getValues();
var userQuestion = searchText;
var prePrompt = finalTabData[0][0]; // A1 셀의 학습 데이터
var sheetData = finalTabData[0][0]; // A1 셀의 학습 데이터 (prePrompt와 동일하게 설정됨)
// 프롬프트 구성
const prompt = `
${prePrompt}
${sheetData}
--- 질문 ---
${userQuestion}
`;
// Gemini API 요청
const payload = {
contents: [{ parts: [{ text: prompt }] }]
};
const options = {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify(payload)
};
try {
const response = UrlFetchApp.fetch(url, options);
const raw = response.getContentText();
Logger.log("✅ 전체 응답:\n" + raw); // 전체 응답 확인용 로그
const result = JSON.parse(raw);
const reply = result?.candidates?.[0]?.content?.parts?.[0]?.text;
if (reply) {
Logger.log("✨ Gemini 응답:\n" + reply);
return reply;
} else {
Logger.log("❗️응답은 성공했지만 candidates가 비어 있음");
return "답변을 찾을 수 없었어요.";
}
} catch (error) {
Logger.log(`❌ 에러 발생: ${error}`);
Logger.log(error.response ? error.response.getContentText() : "응답 없음");
finalTab.getRange(1,2).setValue(error);
return "오류가 발생했어요.";
}
function geminiSendResult(uID, searchText, answer) {
var payload = {
channel: uID,
blocks: [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "Q. " + searchText + " `"
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": " " + answer + " `"
}
}
]
};
var options = {
"method": "post",
"headers": {
"Authorization": "Bearer " + "YOUR_SLACK_BOT_TOKEN", // 슬랙 봇 유저 OAuth 토큰을 여기에 붙여넣으세요.
"Content-Type": "application/json"
},
"payload": JSON.stringify(payload)
};
try{
let response = UrlFetchApp.fetch("https://slack.com/api/chat.postMessage", options);
var data = JSON.parse(response.getContentText());
console.log(data);
}catch(err){
console.error("Slack 메시지 전송 에러:", err);
}finally{
}
}
function doPost(e){
const params = JSON.parse(e.postData.getDataAsString());
if('challenge' in params){
return ContentService.createTextOutput(params.challenge);
}
if(params.event.channel_type == 'im' && params.api_app_id == 'YOUR_SLACK_APP_ID'){ // 'YOUR_SLACK_APP_ID' 부분은 실제 앱 ID로 변경 필요
var uID = params.event.user;
var searchText = params.event.text;
var answer = geminiChatbot(searchText);
geminiSendResult(uID, searchText, answer);
}
}
6. 챗봇 배포 (Apps Script)
작성한 Apps Script 코드를 웹 앱으로 배포하는 과정입니다.
- 새 배포: Google Apps Script 편집기에서 배포 → 새 배포를 클릭합니다.
- 설정:
- 유형 선택: 웹 앱
- 실행 계정: 나
- 액세스 권한이 있는 사용자: 모든 사용자
- 배포: 배포 버튼을 클릭합니다.
- 웹 앱 URL 복사: 배포가 완료되면 생성된 웹 앱 URL을 복사합니다. 이 URL은 슬랙 이벤트 구독에 사용됩니다.
- 예시 URL: https://script.google.com/macros/s/YOUR_WEB_APP_URL/exec (실제 URL은 배포 시 생성됩니다.)
7. 슬랙 API 이벤트 구독 설정
슬랙 봇이 메시지를 수신할 수 있도록 이벤트를 구독합니다.
- 슬랙 API 접속: https://api.slack.com/ 에 접속하여 해당 앱을 선택합니다.
- 이벤트 구독 활성화: Features → Event Subscriptions → Enable Events를 On으로 설정합니다.
- 요청 URL 입력: Request URL 필드에 위에서 복사한 웹 앱 URL을 붙여넣습니다.
- 봇 이벤트 구독: Subscribe to bot events에서 다음 이벤트를 추가합니다.
- message.im (다이렉트 메시지)
- message.channels (채널 메시지)
- 변경 사항 저장: Save Changes 버튼을 클릭합니다.
- 앱 홈 설정: App Home → Show Tabs → Message Tab을 On으로 설정합니다.
이제 슬랙에서 챗봇에게 메시지를 보내면 Gemini API를 통해 응답을 받을 수 있습니다.
이 가이드가 Gemini API와 슬랙 챗봇을 연동하는 데 도움이 되기를 바랍니다. 궁금한 점이 있다면 언제든지 질문해주세요!
반응형
'dev' 카테고리의 다른 글
| AI와 함께 보고용 PPT 제작기: Gemini와 skywork.ai 활용법 (0) | 2025.07.09 |
|---|---|
| 🎾 테니스 NTRP 레벨 테스트 (0) | 2025.07.06 |
| 🎾 누구나 따라 할 수 있는 테니스 NTRP 레벨 테스트 웹 앱 만들기 가이드 (1) | 2025.07.06 |
| 파이썬 Flask와 Google Gemini API 연동 개발 가이드: 초보자도 쉽게 따라하기 (0) | 2025.07.06 |
| 코딩 초보도 OK! Flask로 시작하는 파이썬 웹 애플리케이션 개발 (feat. Gemini AI) (0) | 2025.07.06 |