본문 바로가기
인공지능 (AI,GPT)

슬랙 채널로 데이타 관리 및 유사사례 검색 활용 AI 대응

by 날으는물고기 2024. 3. 14.

슬랙 채널로 데이타 관리 및 유사사례 검색 활용 AI 대응

슬랙 채널에 새로운 스레드가 등록될 때 유사 내용에 대한 이전 내역을 추출하여 정리하는 슬랙봇을 만드는 과정을 구현하기 위한 가이드입니다.

1. 슬랙 API 사용을 위한 준비

  1. Slack API 사용 등록: 먼저 Slack API 웹사이트에 접속하여 새로운 앱을 생성합니다. 이 과정에서 생성된 앱을 원하는 슬랙 워크스페이스에 설치해야 합니다.
  2. 앱 권한 설정: 앱이 슬랙 채널의 메시지를 읽고, 메시지를 포스팅할 수 있도록 필요한 권한을 설정합니다. 일반적으로 channels:history, groups:history, im:history, mpim:history, chat:write, chat:write.public 권한이 필요할 수 있습니다.
  3. Bot User OAuth Access Token: 슬랙 앱 설정에서 발급받은 Bot User OAuth Access Token을 안전하게 보관합니다. 이 토큰은 슬랙 API를 호출할 때 사용됩니다.

2. 슬랙 이벤트 구독

  1. 이벤트 구독 설정: 슬랙 앱 설정에서 Event Subscriptions을 활성화하고, 새로운 스레드가 생성될 때 발생하는 이벤트(message.channels, message.groups 등)를 구독합니다.
  2. Request URL 설정: 슬랙 이벤트를 수신할 웹서버의 URL을 설정합니다. 슬랙에서는 이 URL로 HTTP POST 요청을 보내 이벤트를 알립니다.

3. 웹서버 및 이벤트 리스너 구현

  1. 웹서버 구성: Node.js의 Express와 같은 웹 프레임워크를 사용하여 웹서버를 구성합니다. 이 서버는 슬랙 이벤트를 수신하는 엔드포인트 역할을 합니다.
  2. 이벤트 리스너 구현: 슬랙으로부터 이벤트를 수신하면, 해당 이벤트의 내용을 분석하여 새로운 스레드가 등록된 것을 확인합니다.

4. 유사 내용 검색 및 정리

  1. 유사 내용 검색 알고리즘: 새 스레드의 내용과 유사한 이전 스레드를 찾기 위해 자연어 처리(NLP) 기술을 활용합니다. 예를 들어, TF-IDF나 Word2Vec 같은 기법을 사용하여 메시지 간의 유사도를 계산할 수 있습니다.
  2. 이전 내역 추출 및 정리: 유사도가 높은 이전 스레드를 찾았다면, 해당 내역을 정리하여 새 스레드에 자동으로 포스팅합니다. 이 때, chat.postMessage API를 사용하여 메시지를 슬랙 채널에 전송합니다.

5. 배포 및 테스트

  1. 웹서버 배포: 웹서버를 인터넷에 접근 가능한 환경에 배포합니다. Heroku, AWS, Google Cloud Platform 등을 사용할 수 있습니다.
  2. 슬랙 앱 테스트: 워크스페이스 내에서 슬랙 앱이 제대로 작동하는지 테스트합니다. 새로운 스레드를 만들어 보고, 봇이 유사 내용을 정확히 추출하여 포스팅하는지 확인합니다.

6. 추가 고려 사항

  1. 보안: OAuth Access Token과 같은 민감한 정보를 안전하게 관리합니다.
  2. 성능 최적화: 대량의 메시지 처리가 필요한 경우, 메시지 처리 로직의 성능을 최적화합니다.
  3. 사용자 경험: 봇이 유용한 정보를 제공하도록 사용자 경험을 고려하여 설계합니다.

이 가이드는 슬랙봇 개발의 기본적인 개념과 단계를 설명합니다. 구현 과정에서는 프로그래밍 언어 선택, 자연어 처리 라이브러리의 사용, 클라우드 서비스의 활용 등 다양한 기술적 결정이 필요할 수 있습니다.

 

슬랙 채널에 새로운 스레드가 게시될 때마다 해당 내용을 가져와 GPT를 사용하여 주요 키워드를 식별하고, 이를 바탕으로 해당 채널에서 과거 내역을 검색하여 추출하고 정리하는 슬랙봇을 구현하는 과정은 다음과 같습니다. 이 과정은 크게 슬랙 이벤트 수신, 메시지 처리 및 키워드 식별, 과거 내역 검색 및 정리로 구분할 수 있습니다.

준비사항

  • Slack API 토큰
  • OpenAI API 키
  • 서버 또는 클라우드 함수(예: AWS Lambda, Google Cloud Functions)

1. 슬랙 이벤트 수신 준비

슬랙 앱 설정

  1. Slack API에서 새 앱을 생성하고 슬랙 워크스페이스에 추가합니다.
  2. Event Subscriptions을 활성화하고, 새 메시지가 채널에 게시될 때 알림을 받기 위해 message.channels 이벤트를 구독합니다.
  3. Bot User OAuth Token을 저장합니다. 이 토큰은 API 요청을 인증하는 데 사용됩니다.

서버 설정

  • Flask, Express.js 등 웹 프레임워크를 사용하여 이벤트 수신 엔드포인트를 구성합니다.
  • 슬랙으로부터 이벤트 알림을 받을 URL을 설정합니다 (예: /slack/events).

2. 메시지 처리 및 키워드 식별

새로운 스레드 메시지가 게시되면, 해당 메시지를 처리하고 GPT를 사용하여 키워드를 식별합니다.

슬랙 이벤트 리스너 구현

from flask import Flask, request, jsonify
import requests
import os

app = Flask(__name__)

@app.route('/slack/events', methods=['POST'])
def slack_event():
    data = request.json
    # 슬랙 이벤트 검증 코드는 여기에 추가
    if 'challenge' in data:
        return jsonify({'challenge': data['challenge']})
    if data['event']['type'] == 'message' and 'subtype' not in data['event']:
        process_message(data['event']['text'], data['event']['channel'])
    return jsonify({'status': 'ok'})

def process_message(text, channel):
    # 메시지에서 키워드 식별
    keywords = identify_keywords(text)
    # 키워드를 사용하여 과거 내역 검색 및 정리
    search_and_post_history(keywords, channel)

def identify_keywords(text):
    # OpenAI GPT를 사용하여 텍스트에서 키워드 식별
    # 예시 코드는 아래에 추가됩니다.
    pass

GPT를 사용하여 키워드 식별

import openai

openai.api_key = os.getenv('OPENAI_API_KEY')

def identify_keywords(text):
    response = openai.Completion.create(
        engine="text-davinci-003",
        prompt=f"Identify the main keywords from the following text: {text}",
        temperature=0.5,
        max_tokens=60,
        top_p=1.0,
        frequency_penalty=0.5,
        presence_penalty=0.0
    )
    keywords = response.choices[0].text.strip()
    return keywords.split(', ')  # 키워드를 리스트로 반환

3. 과거 내역 검색 및 정리

키워드를 바탕으로 과거 내역을 검색하고, 이를 정리하여 다시 슬랙 채널에 게시합니다.

과거 내역 검색 및 슬랙에 포스팅

def search_and_post_history(keywords, channel):
    # 과거 내역 검색 로직 (여기서는 예시로만 처리)

    # 검색 결과를 정리하여 메시지 생성
    message = f"Here are some related topics based on keywords {keywords}: ..."

    # 슬랙 채널에 메시지 포스팅
    post_message_to_channel(message, channel)

def post_message_to_channel(message, channel):
    url = 'https://slack.com/api/chat.postMessage'
    headers = {'Authorization': f'Bearer {os.getenv("SLACK_BOT_TOKEN")}'}
    payload = {'channel': channel, 'text': message}
    response = requests.post(url, headers=headers, json=payload)
    print(response.text)  # 디버깅을 위한 응답 출력

4. 서버 배포 및 슬랙 앱 설정 업데이트

  • 위의 코드를 서버에 배포합니다.
  • 슬랙 앱 설정에서 Event Subscriptions 페이지로 이동하여, 이벤트를 수신할 서버의 URL을 입력합니다.

5. 테스트 및 최적화

  • 슬랙에서 새 스레드를 게시하고, 슬랙봇이 적절히 반응하는지 테스트합니다.
  • 필요에 따라 키워드 식별 로직을 조정하고, 메시지 포맷을 개선합니다.

 

이 과정을 통해 구현된 슬랙봇은 새로운 스레드가 게시될 때마다 자동으로 키워드를 식별하고, 관련 과거 내역을 검색하여 채널에 정보를 제공합니다. GPT와 같은 강력한 NLP 모델을 사용함으로써, 슬랙 내 커뮤니케이션의 효율성을 크게 향상시킬 수 있습니다.

 

슬랙 채널에 기록된 과거 내역을 기준으로 새로운 주제에 대한 기본 검토 및 초기 판단을 GPT를 통한 AI로 적용하는 과정은 다음과 같습니다. 이 과정은 슬랙 API를 사용하여 과거 메시지를 검색하고, OpenAI GPT를 사용하여 해당 내용을 분석하는 단계로 구성됩니다.

1. 슬랙 API를 사용하여 과거 메시지 검색

먼저, 슬랙 채널에서 과거 메시지를 검색하는 함수를 구현합니다. 이를 위해 conversations.history API 엔드포인트를 사용합니다.

import requests

def fetch_slack_history(channel, token):
    url = "https://slack.com/api/conversations.history"
    headers = {"Authorization": f"Bearer {token}"}
    params = {"channel": channel}
    response = requests.get(url, headers=headers, params=params)
    if response.status_code == 200 and response.json()['ok']:
        messages = response.json()['messages']
        return messages
    else:
        print("Error fetching messages")
        return None

2. 메시지 분석을 위한 GPT 요청 구성

과거 메시지를 바탕으로 새로운 주제에 대한 기본 검토 및 초기 판단을 하는 함수를 구현합니다. 이때 GPT-3의 davinci 엔진을 사용하여 메시지의 요약, 분석 및 판단을 요청합니다.

import openai

def analyze_with_gpt(messages, openai_api_key):
    openai.api_key = openai_api_key
    prompt = "Analyze the following messages and provide a basic review and initial judgment on the new topic:\n\n" + "\n".join(messages)

    response = openai.Completion.create(
        engine="text-davinci-003",
        prompt=prompt,
        temperature=0.5,
        max_tokens=1024,
        top_p=1.0,
        frequency_penalty=0.0,
        presence_penalty=0.0
    )

    return response.choices[0].text.strip()

3. 통합 코드 실행

슬랙 채널의 과거 메시지를 검색하고, 이를 분석하여 새로운 주제에 대한 기본 검토 및 초기 판단을 얻는 전체 프로세스를 실행합니다.

SLACK_TOKEN = "xoxb-your-slack-token-here"
OPENAI_API_KEY = "your-openai-api-key-here"
CHANNEL = "your-slack-channel-id"

# 과거 메시지를 슬랙에서 가져옵니다.
messages = fetch_slack_history(CHANNEL, SLACK_TOKEN)
if messages:
    # 메시지 내용만 추출
    message_texts = [msg['text'] for msg in messages[:10]]  # 최근 10개 메시지 사용

    # GPT를 사용하여 메시지 분석
    analysis_result = analyze_with_gpt(message_texts, OPENAI_API_KEY)

    print("Analysis Result:")
    print(analysis_result)
else:
    print("No messages found or error occurred.")

이 코드는 슬랙 채널에서 최근 메시지를 가져와 이를 GPT-3에 전달하며, GPT-3는 이 메시지를 바탕으로 새로운 주제에 대한 분석과 평가를 제공합니다. 이를 통해, 새로운 주제에 대한 초기적인 인사이트와 판단을 얻을 수 있습니다.

 

이 과정에서 GPT의 요청 prompt와 출력의 max_tokens 등은 분석 목적과 세부 요구 사항에 따라 조정될 수 있습니다.

새로 게시된 스레드 내용을 AI가 분석하여 과거 검색할 키워드를 추출하고, 해당 키워드로 Slack API를 통해 과거 내역을 가져온 후, AI를 사용하여 내용을 정리하는 시스템을 GPT와 함께 구축하는 과정은 다음과 같습니다. 이 프로세스는 크게 4개의 주요 단계(새 스레드 내용 분석, 키워드 추출, 과거 내역 검색, 내용 정리)로 나눌 수 있습니다.

1. 새 스레드 내용 분석 및 키워드 추출

a. 슬랙 이벤트 API 설정

  • Slack 앱을 생성하고, 워크스페이스에 설치합니다.
  • Event Subscriptions을 활성화하고, 새 메시지 이벤트(message.channels, message.groups 등)를 구독합니다.
  • 이벤트를 받을 서버 엔드포인트를 설정합니다.

b. 슬랙 이벤트 리스너 구현

이벤트 리스너는 새 스레드(또는 메시지)가 게시될 때 해당 내용을 받아 처리합니다.

from flask import Flask, request, jsonify
import requests
import os

app = Flask(__name__)

@app.route('/slack/events', methods=['POST'])
def slack_event():
    data = request.json
    if 'challenge' in data:
        return jsonify({'challenge': data['challenge']})
    if data['event']['type'] == 'message' and 'subtype' not in data['event']:
        thread_text = data['event']['text']
        channel_id = data['event']['channel']
        # 메시지에서 키워드 추출
        keywords = extract_keywords(thread_text)
        if keywords:
            search_and_summarize(keywords, channel_id)
    return jsonify({'status': 'ok'})

c. GPT를 사용하여 키워드 추출

OpenAI GPT를 사용하여 메시지 내용에서 키워드를 추출합니다.

import openai

def extract_keywords(text):
    openai.api_key = os.getenv('OPENAI_API_KEY')
    response = openai.Completion.create(
        engine="text-davinci-003",
        prompt=f"Extract keywords from the following text: {text}",
        temperature=0.3,
        max_tokens=60,
        top_p=1.0,
        frequency_penalty=0.8,
        presence_penalty=0.0
    )
    keywords = response.choices[0].text.strip().split(', ')
    return keywords

2. 과거 내역 검색

키워드를 사용하여 Slack API를 통해 해당 채널의 과거 메시지를 검색합니다.

def search_messages(keyword, channel_id, token):
    search_url = "https://slack.com/api/search.messages"
    headers = {"Authorization": f"Bearer {token}"}
    params = {"query": keyword, "sort": "timestamp", "sort_dir": "desc"}
    response = requests.get(search_url, headers=headers, params=params)
    if response.status_code == 200 and response.json()['ok']:
        messages = response.json()['messages']['matches']
        return messages
    else:
        return []

3. 내용 정리

검색된 메시지들을 GPT를 사용하여 요약하고 정리합니다.

def summarize_messages(messages):
    # 메시지 목록을 하나의 텍스트로 합칩니다.
    combined_text = " ".join([msg['text'] for msg in messages])
    summary = openai.Completion.create(
        engine="text-davinci-003",
        prompt=f"Summarize the following messages: {combined_text}",
        temperature=0.7,
        max_tokens=300,
        top_p=1.0,
        frequency_penalty=0.0,
        presence_penalty=0.0
    )
    return summary.choices[0].text.strip()

4. 정리된 내용을 슬랙에 게시

정리된 내용을 다시 슬랙 채널에 게시합니다.

def post_summary

_to_channel(summary, channel_id, token):
    url = "https://slack.com/api/chat.postMessage"
    headers = {"Authorization": f"Bearer {token}"}
    data = {"channel": channel_id, "text": summary}
    response = requests.post(url, headers=headers, json=data)
    if response.status_code == 200:
        print("Summary posted successfully.")
    else:
        print("Failed to post summary.")

실행 흐름 통합

  • 새 스레드가 게시되면, slack_event 함수가 이를 감지합니다.
  • 이 함수는 GPT를 사용하여 게시된 내용에서 키워드를 추출합니다(extract_keywords).
  • 추출된 키워드로 과거 내역을 검색합니다(search_messages).
  • 검색된 메시지들을 GPT로 요약하고 정리합니다(summarize_messages).
  • 마지막으로, 정리된 내용을 슬랙 채널에 게시합니다(post_summary_to_channel).

이 과정을 통해, 새로운 스레드에 대한 기본 검토 및 초기 판단을 자동화하고, 관련 정보를 슬랙 채널에 제공하여 커뮤니케이션의 효율성을 향상시킬 수 있습니다.

728x90

댓글