토이 프로젝트/Python 갖고놀기

1일 1커밋 프로젝트 :: IT 뉴스 크롤링 & Slack 메시징하기 feat. Ollama LLM 사용하기

TerianP 2024. 3. 24.
728x90

1. 시작하면서

2023.01.01 - [토이 프로젝트/Python 갖고놀기] - 1일 1커밋 git push 자동화 만들기 - IT 뉴스 사이트 웹 크롤링 && crontab 이용

 

1일 1커밋 git push 자동화 만들기 - IT 뉴스 사이트 웹 크롤링 && crontab 이용

본 내용은 오직 공부를 위한 내용이며 제 코드를 복제, 수정하여 사용할때 일어날 수 있는 웹 크롤링과 관련된 불법적인 내용에서는 책임질 수 없습니다 1. "개발자는 귀찮아해야 해" 전 회사에

terianp.tistory.com

오랜만에 java 가 아니라 새로운 프로젝트로 돌아왔습니다! 사실 처음부터 이걸 만들려고 했던거는 아니었는데 하다보니까...ㅋㅋㅋ

이번에 가져온 프로젝트는 저번 git push 자동화 1일 1커밋 프로젝트의 업그레이드 판입니다.

 

기존에는 단순히 IT 뉴스를 크롤링하고 제목/링크/내용을 올리는 정도였다면, 이번에는 조금 다양한 기능들을 넣어봤습니다. 먼저 크롤링해온 내용을 Ollama 를 사용해서 영어로된 내용을 한글로 번역하고, 번역된 내용을 Slack 으로 메시지를 보내게 됩니다. 동시에 git 에 commit & push 까지되도록 만들어봤습니다!

 

이번에 ollama 와 slack 을 이용한 것은 전적으로 앞으로의 프로젝트를 위해서입니다. 사실 catchmind 서비스가 어느정도 개발완료되어서 친구들과도 몇번인가 테스트를 마쳤습니다. 다만 문제가 매번 같은 '주제'로 게임을 해야하는 것이었고, 이로인해서 게임의 가장 중요한 요소인 '재미'가 너무나도 떨어지더라구요. 이를 해결하기 위해 chatgpt 같은 서비스를 사용하려했는데 당연하게도 코드 개발을 위해서 공부를 해야만 했습니다.

 

이번 프로젝트의 큰 의의는 catchmind 에 llm 을 어떻게 붙일까? 어떻게 개발할까? 에 대해서 고민하고 공부하는 시간을 갖은 부분이라고 생각합니다. 당연하게도 python 을 공부하면서 이게 뭐지...? 라는 생각을 많이 했던것 같습니다. 정확히는 java 와 다른 부분들을 보면서 '아니 java 랑은 이렇게 달라??' 라고 생각하면서 진짜 즐겁게 만들었습니다. 뭣보다 llm 붙일만한데? 하고 자신감도 생겼구요ㅋㅋ slack 도 마찬가지로 나중에 모니터링 혹은 배포 관련하여 로그나 메시지를 이쪽으로 전달할 계획이 있었는데 이번 기회에 연습 겸 만들어봤습니다

https://github.com/SeJonJ/AutoGitPush

 

GitHub - SeJonJ/AutoGitPush: Auto Git Push everyDay

Auto Git Push everyDay. Contribute to SeJonJ/AutoGitPush development by creating an account on GitHub.

github.com


2. Ollama 와 LLM

1) Ollama 너는 누구냐?

Ollama는 사용자의 로컬 머신에서 Llama 2Code Llama와 같은 대규모 언어 모델(LLM)을 구축하고 실행할 수 있는 경량이면서 확장 가능한 프레임워크로 개발자들은 복잡한 설정이나 외부 의존성 없이 언어 모델을 쉽게 사용하고, 개인 프로젝트나 연구에 적용할 수 있다. 무엇보다 사용자의 사용의 용이성을 최우선으로 하면서도, 사용자가 자신의 요구에 맞게 시스템을 맞춤 설정하고 확장할 수 있는 유연성을 제공한다.

요약하자면, Ollama 는 나만의 ChatGPT 를 개인 로컬 서버에 구축하고 사용할 수 있게 한다. 물론 당연하게도 로컬에 올렸을 때 성능이나 속도가 ChatGPT 에 그것에 비하면 많이 부족한 것은 어쩔 수 없다. 다만 ollama 의 가장 큰 의의는 유료 ChatGPT API 가 아닌 무료로 사용할 수 있다는 점이 아닐까 싶다.

 

2) LLM 너는 무엇이냐?

LLM(Large Language Models)은 주어진 프롬프트에 대해 인간과 유사한 응답을 생성하기 위해 방대한 양의 텍스트 데이터로 훈련된 고급 AI 모델이다.

쉽게 생각해서 Ollama 가 컴퓨터 본체 라고 가정한다면, LLM 은 그래픽 카드라고 생각해보자. 그래픽 카드도 알다싶이 AMD 에서 나온 그래픽 카드와 Nvidia 에서 나온 그래픽 카드가 있다. 조금 더 안으로 들어가면 사무용을 위한 일반 그래픽 카드가 있고, 게이밍 및 비디오 작업을 위한 그래픽 카드가 있을 것이고, AI 작업과 높은 수준의 그래픽 작업을 위한 최고급형 그래픽 카드가 있을 것이다.

LLM 이 바로 이런 식이다. 문장 -  Text Generation - 에 전문화된 모델이 있고, 번역에 전문화된 모델이 있으며 - Translation -, 채팅에 전문화된 모델이 있을 것이다 - ChatGPT 처럼 -.

즉 Ollama 라는 본체에 나의 목적에 맞춰 특정 영역에 전문화된 LLM 을 넣어서 구동하여 사용하는 것이다. 이번 플젝을 진행하면서 내가 사용해본 모델은 총 3개로 ollama 에서 기본적으로 제공하는 mistral 7B, HuggingFace 에서 확인한 KoreanLM,  OpenHermes-2.5-Mistral-7B-GPTQ 모델이다. 3가지를 고루 사용해보다가 최종적으로 속도와 번역에서 가장 좋다고 생각되는 openHermes 2.5 7B 모델을 선택하였다.

사실 번역에 특성화된 모델인 Gugugo-koen-7B 를 사용하고 싶었는데...이건 예시로 된 prompt template 를 넣어도 이상하게 번역이 되거나 번역이 되다말다 하는 문제로 인해 결국 포기했다ㅠㅠ

 

 

3) LLM 은 어떻게, 어디서 확인할까?

ollama 자체를 사용하는건 크게 문제가 아니다. 왜냐하면 ollama 는 설치도 정말 간단할 뿐더러 설치가 힘든 경우에는 docker 로도 제공하기 때문에 시간을 오래 잡아먹을 필요도 없다. 다만 LLM 을 어떻게 구하냐? 혹은 어떤 LLM 을 사용하냐? 에 대해서는 조금 시간이 필요하다. 물론 ollama 에서 기본적으로 제공하는 LLM 도 존재한다. 특히나 llama2 나 mistral  같은 모델은 정말 유명한 모델들이기도 하고 한글도 잘 알아듣는 편이기에 해당 모델들을 그냥 다운로드 받아서 사용해도 충분한 사용할만할 것이다.

기본적으로 제공하는 모델들

다만 나처럼 이것말고 다른것도 사용해보고 싶어 혹은 다른 모델들과 비교해서 그 중 가장좋은 걸 사용해보고 싶어 했을 때 가야할 곳이 바로 HuggingFace 사이트 이다.

https://huggingface.co/

 

Hugging Face – The AI community building the future.

The Home of Machine Learning Create, discover and collaborate on ML better. We provide paid Compute and Enterprise solutions. We are building the foundation of ML tooling with the community.

huggingface.co

이곳은 마치 코드의 보물창고인 git 같은 LLM 의 보물창고의 역할을 한다. 많은 사람들이 자신들이 연구한 학습시킨 모델을 이곳에 올리고 공유한다. 감사합니다 선생님들...!!

 

이곳에서 여러 모델들을 검색할 수 있고, 검색된 모델을 커스텀 모델화해서 ollama 에 적용시켜 사용할 수 있다. 나의 경우 openHermes 를 huggingface 에서 다운로드 후 커스텀 모델화해서 ollama 에서 사용하고 있다.

 

4) Ollama Custom Model 사용하기

다음 포스팅에서 작성하도록 하겠습니다. 내용이 간단한 편도 아닐 뿐더러 양도 많이 길어질것 같아서ㅠㅠ


3. Slack 으로 메시징 하기

slack 은 뭐...내가 설명할 필요가 뭐가 있나 싶을 정도로 유명한 메시징, 커뮤니케이션 도구이다. 나의 경우 크롤링되고 번역된 내용을 slack 으로 9시와 18시 총 2번, 메시징하는데 사실 매번 git 으로 들어가서 뉴스를 일일히 확인하는게...굉장히 귀찮았기 때문이다. 이제는 이런 귀찮음없이 쨘! 하고 메시지가 오고 그걸 들어가서 확인하기만 하면 된다!! 만세!

 


4. ollama.py && slack.py

1) ollama.py

- ollama 코드는 의외로? 간단하다. 어쩌면 당연할 수도 있지만 확실히 많은 사람들이 관심을 갖고 있어서 그런지 llm 을 사용하는데 유용한 라이브러리들이 정말 많았고, 그것을 어떻게 사용할 수 있는지 설명해놓은 글들도 많아서 많은 도움이 되었다.

- 가장 먼저 ollama 객체를 만들다. 이때 base_url 에 ollama api url 을 넣고, model 에는 ollama 에 있는 모델들 중 어떤 모델을 사용할지 선택한다. 이게 정말 말도 안되게 좋은게 만약 내가 openHermes 가 아닌 mistral 이나 llama 를 사용하려 한다면 그냥 model 부분만 바꿔주면 된다. temperature 는 '얼마나 창의적으로 대답할까?' 라는 옵션이다. 0.1 인 경우 창의적이지 않게 있는 그대로 대답하는 것이고, 1.0 이면 가장 창의적이게 랜덤성을 높여서 답변한다. 번역의 경우 번역 내용을 의역해야하는 경우가 아니면 창의적이거나 랜덤성이 높지 않아도 되기 때문에 0.1 로 값을 주었다.

- FewShotPromptTemplate 와 example_template 를 사용해서 예제 템플릿을 생성 후 suffix 는 lang 과 contents 를 준다. 이때 lang 과 contents 에 해당하는 input variables 의 값은 langchain 을 통해 받아서 넣는다.

- example 은 어떤 식으로 질문했을 때 어떻게 답할까? 라는 말 그대로 예제인데, 만들어서 넣으나 아니나 크게 다를게 없어서 패스! 다만 이 부분은 추후 catchmind 게임관련한 코드에서는 정말 유용하게 사용하고 있다.

from langchain.chat_models import ChatOllama
from langchain.prompts import PromptTemplate
from langchain.prompts.few_shot import FewShotPromptTemplate
from langchain.callbacks import StreamingStdOutCallbackHandler
import os
from dotenv import load_dotenv

# .env 파일을 로드
load_dotenv()

base_ollama_url = os.getenv('OLLAMA_URL_LOCAL')
ollama = ChatOllama(
    base_url = base_ollama_url,
    model="openHermes",
    temperature=0.1,
    # streaming=True,
    # callbacks=[
    #     StreamingStdOutCallbackHandler()
    # ]
)

examples = []

example_prompt = PromptTemplate.from_template(
    "Human : {question} \n AI : {answer}"
)

## llm 사용을 위한 프롬프트
prompt = FewShotPromptTemplate(
    example_prompt=example_prompt,
    examples=examples,
    suffix="Translate my sentence into {lang} : {contents}", ## lang, contents 는 모두 langchain 에서 변수로 받아올 수 있다
    input_variables=["lang", "contents"]
)


def transrateTO(lang, text):
    chain = prompt | ollama
    ## suffix 에서 각각 {lang}, {contents} 에 해당하는 부분에 대한 값을 지정한다.
    ## lang 은 번역할 언어, text 는 번역할 text 를 의미하며, 여기서는 크롤링된 데이터
    result = chain.invoke({
        "lang" : lang,
        "contents" : text,
    })

    ## langchain 을 통해서 나온 결과는 모두 'content'='{결과}' 형식으로 저장, 출력된다.
    ## 따라서 result 에서 content 만 가져온다. 
    return result.content

 

2) slack.py

- 이쪽은 slack 으로 메시지를 보내는 역할을 하는 py 코드이다.

- 이전의 ollama 코드보다도 훨씬 더 간단한 느낌인데, 사실 slack api 에 요청을 보내는 것이기 때문에 어려울게 없는 코드이다. header 에는 token 정보를 담고, payload 에는 어떤 채널에 어떤 요청을 보낼지 작성한다. 그리고 requests 를 사용해서 post 요청을 보내면 끝!

import os
import requests
from dotenv import load_dotenv

# .env 파일을 로드
load_dotenv()

## slack api url
url = "https://slack.com/api/chat.postMessage"

def sendSlackMsg(news_data):
    headers = {
    "Authorization": "Bearer "+os.getenv('SLACK_TOKEN'), ## slack token => .env 파일에서 가져온다
    "Content-Type": "application/json"
    }

    payload = {
        "channel": 'it-news',
        "text": "새로운 뉴스가 도착했습니다 \n\n"+news_data
    }

    response = requests.post(url, headers=headers, json=payload)

    if response.status_code == 200:
        print("Message sent successfully")
    else:
        print("Failed to send message")

5. OpenHermes 번역 성능 확인하기

OpenHermes 를 통해서 변역된 내용은 얼마나 정확할까? 를 알기위해서 papago 와 chatgpt 의 번역과 비교해봤습니다. 이때 가장 번역의 성능이 좋다고 생각되는 DeepL 의 번역을 100 이라고 가정한 후 각 모델의 번역을 비교분석하였습니다. 비교는 똑똑하신 ChatGPT 선생님께서 수고해주셨습니다.

 

 

https://chat.openai.com/share/81335ccc-6bba-4703-b90b-06284bb9b422

 

ChatGPT

A conversational AI system that listens, learns, and challenges

chat.openai.com


6. 1일 1커밋 확인하기 & slack 메시지 확인하기

1일 1커밋이 되는지와 slack 메시지가 되는지 확인해보겠습니다! 

slack 메시지까지 완료!!

 

7. 다음에는...?

다음에는 ollama custom model 사용하기에 대한 글을 작성후 다시 catchmind 프로젝트로 넘어갈 예정입니다. 이렇게하면 5월 안에는 catchmind 주제 생성을 위한 python & 전반적인 기능 역할을 하는 springboot 이 두가지를 모두 활용한 catchmind 게임이 완성될 것이라고 생각되네요. 뭔가 점점 완성되어 간다는 느낌이 들어서 그런가 어떻게 만들지라는 걱정보다도 설렘이 앞서는거 같아요ㅋㅋ그럼 끝까지 화이팅!!


 

Reference

https://ollama.com/

 

Ollama

Get up and running with large language models, locally.

ollama.com

https://huggingface.co/TheBloke/OpenHermes-2.5-Mistral-7B-GPTQ/tree/main

 

TheBloke/OpenHermes-2.5-Mistral-7B-GPTQ at main

 

huggingface.co

 

https://data-newbie.tistory.com/965

 

[LangChain] Prompt Template 사용 방법 정리

langchain에서 사용하는 prompt에 대해서 정리해보고자 합니다. 이런 식으로 굉장히 다양한 promptTemplate가 있기 때문에 정리하고자 한다. 모든 것을 커버할 수는 없지만 최대한 자주 사용할 것 같은

data-newbie.tistory.com

https://velog.io/@___pepper/Slack-bot-slack-sdk

 

[Slack-bot] slack-sdk

slack-sdk를 이용하여 slack에 메세지 보내보기

velog.io

 

댓글