๐Ÿ“—
smiley book
  • Smiley Books
  • AI
    • Readme
    • openai-whisper
      • ์ƒ˜ํ”Œ ์‹คํ–‰ํ•ด๋ณด๊ธฐ
      • GPU ์„œ๋ฒ„ ์ค€๋น„ํ•˜๊ธฐ
      • API๋กœ whisper๋ฅผ ์™ธ๋ถ€์— ์˜คํ”ˆํ•˜๊ธฐ
      • ํ”„๋กฌํ”„ํŠธ ์ง€์›
      • ์‹ค์‹œ๊ฐ„ message chat
      • ํ™”๋ฉด ์ด์˜๊ฒŒ ๋งŒ๋“ค๊ธฐ์™€ ๋กœ๊ทธ์ธ
      • ํŒŒ์ด์ฌ ๊ฐ€์ƒํ™˜๊ฒฝ
      • ์‹ค์‹œ๊ฐ„ voice chat
      • fine tunning(๋ฏธ์„ธ ์กฐ์ •) ์œผ๋กœ ์„ฑ๋Šฅ ์˜ฌ๋ฆฌ๊ธฐ
      • app์—์„œ api๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ…์ŠคํŠธ๋กœ ๋ฐ”๊ฟ”๋ณด๊ธฐ
    • ollama - llm์„ ์‰ฝ๊ฒŒ ๋‚ด์ปด์—์„œ ์‹คํ–‰
      • ollama webui
      • ollama docker
    • stable diffusion
      • SDXL - text to image
      • SD-webui
    • ChatGPT
      • ๋‹ต๋ณ€์ด ๋Š๊ธธ๋•Œ
      • ์—ญํ• ์„ ์ •ํ•˜์ž
      • ๊ตฌ์ฒด์ ์ธ ์งˆ๋ฌธ
      • ๊ฒฐ๊ณผํ˜•ํƒœ๋ฅผ ์ง€์ •
      • ํ”„๋กฌํ”„ํŠธ๋ฅผ ์—ฌ๋Ÿฌ์ค„๋กœ ์‚ฌ์šฉํ•˜์ž.
      • ๋งˆํ‹ด ํŒŒ์šธ๋Ÿฌ ๊ธ€ ๋ฒˆ์—ญ๋ณธ
    • Prompt Engineering
    • Auto-GPT
    • Gemini
      • google ai studio
      • gemini-api
      • embedding guide
    • Huggingface
      • huggingface ์‚ฌ์šฉ๋ฒ•
      • huggingface nlp ๊ณต๋ถ€์ค‘
    • kaggle
      • download dataset
    • langchain
      • langchain์„ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ •๋ฆฌ
      • basic
      • slackbot
      • rag
      • document-loader
      • website-loader
      • confluence
      • memory
      • function-call
      • langsmith
      • agent-toolkit
  • Ansible
    • templates vs files and jinja2
    • dynamic inventory
    • limit ์˜ต์…˜ ๊ฐ•์ œํ•˜๊ธฐ
    • limit ์‚ฌ์šฉํ›„ gather_fact ๋ฌธ์ œ
  • AWS
    • AWS CLI
    • EKS
      • cluster manage
      • ALB Controller
      • external-dns
      • fargate
    • ECR
    • S3
    • Certificate Manager
  • Azure
    • Azure AD OAuth Client Flow
  • Container
    • Registry
    • ๋นŒ๋“œ์‹œ์— env๊ฐ’ ์„ค์ •ํ•˜๊ธฐ
  • DB
    • PXC
      • Operator
      • PMM
      • ์‚ญ์ œ
      • GTID
      • Cross Site Replication
    • Mssql
    • Mysql
  • dotnet
    • Thread Pool
    • Connection Pool
    • Thread Pool2
  • Devops
    • Recommendation
  • GIT
    • Basic
    • Submodule
  • GitHub
    • Repository
    • GitHub Action
    • GitHub PR
    • Self Hosted Runner
    • GitHub Webhook
  • GitLab
    • CI/CD
    • CI/CD Advance
    • Ssl renew
    • CI/CD Pass env to other job
  • Go Lang
    • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ•
    • multi os binary build
    • kubectl๊ฐ™์€ cli๋งŒ๋“ค๊ธฐ
    • azure ad cli
    • embed static file
    • go study
      • pointer
      • module and package
      • string
      • struct
      • goroutine
  • Kubernetes
    • Kubernetes๋Š” ๋ฌด์—‡์ธ๊ฐ€
    • Tools
    • Install with kubespray
    • Kubernetes hardening guidance
    • 11 ways not to get hacked
    • ArgoCD
      • Install
      • CLI
      • Repository
      • Apps
      • AWS ALB ์‚ฌ์šฉ
      • Notification slack
      • Backup / DR
      • Ingress
      • 2021-11-16 Github error
      • Server Config
      • auth0 ์ธ์ฆ ์ถ”๊ฐ€(oauth,OIDC)
    • Extension
      • Longhorn pvc
      • External dns
      • Ingress nginx
      • Cert Manager
      • Kube prometheus
    • Helm
      • Subchart
      • Tip
    • Loki
    • Persistent Volume
    • TIP
      • Job
      • Pod
      • Log
  • KAFKA
    • raft
  • KVM
    • kvm cpu model
  • Linux
    • DNS Bind9
      • Cert-Manager
      • Certbot
      • Dynamic Update
      • Log
    • Export and variable
    • Grep ์‚ฌ์šฉ๋ฒ•
  • Modeling
    • C4 model introduce
    • Mermaid
    • reference
  • Monitoring
    • Readme
    • 0. What is Monitoring
    • 1. install prometheus and grafana
    • 2. grafana provisioning
    • 3. grafana dashboard
    • 4. grafana portable dashboard
    • 5. prometheus ui
    • 6. prometheus oauth2
    • Prometheus
      • Metric type
      • basic
      • rate vs irate
      • k8s-prometheus
    • Grafana
      • Expolorer
    • Node Exporter
      • advance
      • textfile collector
  • Motivation
    • 3 Simple Rule
  • OPENNEBULA
    • Install(ansible)
    • Install
    • Tip
    • Windows vm
  • Reading
    • comfort zone
    • ๋ฐฐ๋ ค
    • elon musk 6 rule for insane productivity
    • Feynman Technique
    • how to interview - elon musk
    • ๊ฒฝ์ฒญ
    • Readme
  • Redis
    • Install
    • Master-slave Architecture
    • Sentinel
    • Redis Cluster
    • Client programming c#
  • SEO
    • Readme
  • Security
    • criminalip.io
      • criminalip.io
  • Stock
    • robinhood-python
  • Terraform
    • moved block
    • output
  • vault
    • Readme
  • VS Code
    • dev container
    • dev container on remote server
  • Old fashione trend
    • curity
    • MAAS
      • Install maas
      • Manage maas
      • Tip
Powered by GitBook
On this page
  • ๋ชฉํ‘œ
  • slack ์„ค์ •
  • ์Šฌ๋ž™์œผ๋กœ ๋ฉ”์„ธ์ง€ ๋ณด๋‚ด๊ธฐ
  • slackbot
  • mode
  • web api mode
  • socket mode
  • bolt
  • slack bot ๋งŒ๋“ค๊ธฐ
  • slackbot๊ณผ jira issue์—ฐ๋™

Was this helpful?

  1. AI
  2. langchain

slackbot

PreviousbasicNextrag

Last updated 10 months ago

Was this helpful?

๋ชฉํ‘œ

slack ์„ค์ •

์„ค์ •์ด ์กฐ๊ธˆ ๋ณต์žกํ•˜๊ธฐ๋Š” ํ•ฉ๋‹ˆ๋‹ค๋งŒ ์ธํ„ฐ๋„ท์— ๋งŽ์ด ๋‚˜์™€์žˆ์œผ๋‹ˆ ํ•œ๋ฒˆ ํ™•์ธํ•ด๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ฒฐ๋ก ์€ slack app์„ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ  ๋‹ค์Œ ํ† ํฐ์„ ๋ฐ›์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

SLACK_BOT_TOKEN=xxx
SLACK_APP_TOKEN=xxx
SLACK_SIGNING_SECRET=xxx

๋ฌผ๋ก  ํ•„์š”ํ•œ ๊ถŒํ•œ์ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์Šฌ๋ž™์œผ๋กœ ๋ฉ”์„ธ์ง€ ๋ณด๋‚ด๊ธฐ

%pip install --user  -Uq slackclient

.envํŒŒ์ผ์„ ์„ค์ •์„ ์ž˜ ํ•˜์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.

slackbot

mode

  1. web api mode : web server๊ฐ€ ์žˆ์–ด์•ผํ•จ.

  2. socket mode : web server๊ฐ€ ํ•„์š”์—†์Œ.

web api mode

https://api.slack.com/web

socket mode

https://api.slack.com/apis/socket-mode

์†Œ์ผ“ ๋ชจ๋“œ๋Š” ์Šฌ๋ž™ ๋ด‡์ด ์ด๋ฒคํŠธ๋‚˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์•ผ.

์›๋ž˜๋Š” ์Šฌ๋ž™์ด ๋ด‡์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋ ค๋ฉด ์ธํ„ฐ๋„ท ์ฃผ์†Œ๊ฐ€ ํ•„์š”ํ–ˆ์–ด. ํ•˜์ง€๋งŒ ์†Œ์ผ“ ๋ชจ๋“œ๋Š” ์ธํ„ฐ๋„ท ์ฃผ์†Œ ์—†์ด๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด.

๊ทธ๋ž˜์„œ ๋‚œ ์†Œ์ผ“ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฑฐ์•ผ.

bolt

์Šฌ๋ž™์—์„œ๋Š” ๊ฐœ๋ฐœ์ž ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์˜คํ”ˆํ–‡์–ด ์ด๊ฒƒ์ด bolt์ž„

https://slack.dev/bolt-python/concepts

slack bot ๋งŒ๋“ค๊ธฐ

from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from slack_bolt.adapter.socket_mode import SocketModeHandler
from slack_bolt import App
import slack
import os

from dotenv import load_dotenv
load_dotenv()

app = App(
    token=os.environ.get("SLACK_BOT_TOKEN"),
    signing_secret=os.environ.get("SLACK_SIGNING_SECRET")
)

prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "๋‹น์‹ ์€ ์ธ๊ฐ„๊ณผ ๋Œ€ํ™”ํ•˜๋Š” ์œ ์šฉํ•œ AI์ž…๋‹ˆ๋‹ค, ๋‹ต์„ ๋ชจ๋ฅธ๋‹ค๋ฉด ๊ทธ๋ƒฅ ๋ชจ๋ฅธ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์ง€์–ด๋‚ด์ง€ ๋งˆ์„ธ์š”"),
        ("human", "{question}"),
    ]
)

llm = ChatOpenAI(
    temperature=0
)

chain = prompt | llm | StrOutputParser()


@app.message(".*")
def message_handler(message, say):
    print(message)

    output = chain.invoke({"question": message['text']})
    say(output)


# Start your app
if __name__ == "__main__":
    SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"]).start()

slackbot๊ณผ jira issue์—ฐ๋™

import os

from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from jira import JIRA

from dotenv import load_dotenv
load_dotenv()

app = App(
    token=os.environ.get("SLACK_BOT_TOKEN"),
    signing_secret=os.environ.get("SLACK_SIGNING_SECRET")
)

# Langchain implementation
llm = ChatOpenAI(
    temperature=0.1,  # ์ฐฝ์˜์„ฑ (0.0 ~ 2.0)
)

jira = JIRA(server=os.environ['JIRA_URL'],
            basic_auth=(
                os.environ['JIRA_EMAIL'],
                os.environ['JIRA_TOKEN'])
            )


def getJiraIssue(issue_key):
    # ํŠน์ • ์ด์Šˆ๋ฅผ ๊ฐ€์ ธ์˜ด
    # issue = jira.issue('NETOP-14473')
    issue = jira.issue(issue_key)

    # ํ•„๋“œ๋ฅผ ์ €์žฅํ•  ์ƒˆ๋กœ์šด ์‚ฌ์ „์„ ์ƒ์„ฑ
    issue_fields = {}

    # ์ด์Šˆ์˜ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ํ™•์ธ
    for field_name, field_value in vars(issue.fields).items():
        # ํ•„๋“œ ์ด๋ฆ„์ด 'customfield'๋กœ ์‹œ์ž‘ํ•˜๊ณ  ๊ฐ’์ด None์ธ ํ•„๋“œ๋Š” ์ œ์™ธ
        if not (field_name.startswith('customfield') and field_value is None):
            issue_fields[field_name] = field_value

    return issue_fields


template = """
JIRA ์ด์Šˆ ๋ฐ์ดํ„ฐ๋Š” `key: value` ํ˜•ํƒœ๋กœ ๋˜์–ด์žˆ๊ณ  value๋Š” ์ค„๋ฐ”๊ฟˆ ๋ฌธ์ž๊ฐ€ ์žˆ๋Š”๊ณณ๊นŒ์ง€ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์–ด์ง„ JIRA ์ด์Šˆ ๋ฐ์ดํ„ฐ์—์„œ ์„œ๋ฒ„ ์ด๋ฆ„, VCPU, ๋ฉ”๋ชจ๋ฆฌ, OS ์ด๋ฆ„์„ ์ถ”์ถœํ•˜์—ฌ Ansible ํ”Œ๋ ˆ์ด๋ถ ์ปค๋งจ๋“œ๋ฅผ ์ƒ์„ฑํ•ด ์ฃผ์„ธ์š”.

์„œ๋ฒ„ ์ด๋ฆ„์ด ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•ด ๋ณ„๋„์˜ Ansible ํ”Œ๋ ˆ์ด๋ถ ์ปค๋งจ๋“œ๋ฅผ ์ƒ์„ฑํ•ด ์ฃผ์„ธ์š”.

vcpu๊ฐฏ์ˆ˜๋Š” customfield_10148 ์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”๋ฐ ๋ฌธ์žฅ ๋๊นŒ์ง€ ์ธ์‹ํ•ด์ฃผ์„ธ์š” ๊ฑฐ๊ธฐ์—์„œ ์ˆซ์ž๋งŒ ์ถ”์ถœํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

vcpu๊ฐ€ ์žˆ์œผ๊ณ  cpu๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ cpu๋Š” vcpu์˜ ์ ˆ๋ฐ˜์œผ๋กœ ์„ค์ •ํ•ด ์ฃผ์„ธ์š”.

cpu๊ฐ€ ์žˆ๊ณ  vcpu๊ฐ€ ์—†์œผ๋ฉด vcpu๋Š” cpu์˜ 2๋ฐฐ๋กœ ์„ค์ •ํ•ด ์ฃผ์„ธ์š”.

๋‘˜๋‹ค ์—†์œผ๋ฉด cpu=1, vcpu=2๋กœ ์„ค์ •ํ•ด ์ฃผ์„ธ์š”.

os_name์€ customfield_10165 ์—์„œ ๊ณต๋ฐฑ์„ ์ œ๊ฑฐํ•œ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•ด ์ฃผ์„ธ์š”.
os_version์€ customfield_10166 ์—์„œ ๊ณต๋ฐฑ์„ ์ œ๊ฑฐํ•œ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•ด ์ฃผ์„ธ์š”.

os_version์ด ์—†๋Š”๊ฒฝ์šฐ๋Š” oraclelinux๋Š” 9.3 , centos๋Š” 7.8๋กœ ์„ค์ •ํ•ด์ฃผ์„ธ์š”

JIRA ์ด์Šˆ ๋ฐ์ดํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
{ISSUE_DATA}


SAMPLE) here is Ansible Playbook Command SAMPLE

ansible-playbook create-vm.yaml \
-e "server_name=**server_name**" \
-e "cpu=**cpu**" \
-e "vcpu=**vcpu**" \
-e "memory=**memory**" \
-e "image_name=**os_name**-**os_version**" \
-e "network_name=Private"

Please Make Correct Ansible Playbook Command use above sample

๋‹ต๋ณ€์€ ์•„๋ž˜์ฒ˜๋Ÿผ ๋ณด์—ฌ์ค˜. ๊ฒฐ๊ณผ๋งŒ ๋ณด์—ฌ์ค˜

ANSWER) Ansible Playbook Command
ansible-playbook create-vm.yaml \
-e "server_name=**server_name**" \
-e "cpu=**cpu**" \
-e "vcpu=**vcpu**" \
-e "memory=**memory**" \
-e "image_name=**os_name**-**os_version**" \
-e "network_name=Private"

๋‹ต๋ณ€์€ ํ•œ๊ธ€๋กœ ํ•ด์ฃผ์„ธ์š”
"""

prompt = PromptTemplate.from_template(template=template)

chain = prompt | llm | StrOutputParser()


# @app.message(".*")
# def message_handler(message, say):
#     print(message)
#     say(output)

@app.message("build")
def message_build(message, say):
    print(message)
    ticket_number = message['text'].replace('build', '').strip()
    jira = getJiraIssue(ticket_number)
    print(jira)
    output = chain.invoke({"ISSUE_DATA": jira})
    say(output)


# @app.event("message")
# def handle_message_events(body, logger):
#     logger.info(body)


# Start your app
if __name__ == "__main__":
    SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"]).start()