AI&GameDev

AI와 게임개발에 관련된 이야기

Ollama #2: 내 손으로 만드는 ChatGPT 로컬LLM – 커스텀 모델 설치부터 실용 앱까지

Ollama Langchain 앱 개발

Ollama는 다양한 커스텀 모델들을 불러와 사용할 수 있으며 LangChain을 사용하여 간단하게 연동할 수 있습니다. 이번에는 커스텀 모델 설치부터 클립보드의 텍스트를 요약하는 간단한 앱을 개발해 보겠습니다.
설치 및 기본 사용법은 비용 걱정 없이 내 컴퓨터에서 제약 없는 LLM 실행하기 를 확인해 주시기 바랍니다.

커스텀 모델 설치

ModelFile을 활용하여 GGUF(Georgi Gerganov Unified Format)로 저장된 대규모 언어 모델(LLM 모델)을 쉽게 임포트할 수 있습니다. GGUF는 모델 저장 및 로딩을 위해 설계된 파일 형식으로, GGML을 대체하며 효율성과 사용 용이성이 크게 개선되었습니다..

Huggingface에서 원하는 모델을 검색 / 다운로드

  • 로컬LLM에서 모델 선택 시 주요 고려사항은 파라메터 수에 따른 메모리 요구사항 입니다. 일반적인 llama2 모델의 메모리 요구 사항은 다음과 같습니다.
Parameter CountRecommanded Memory
7b8GB
13b16GB
34b32GB
70b64GB
  • Huggingface에서 한글을 지원하며 GGUF 형식으로 제공되는 모델 중 하나인 “TheBloke/OpenBuddy-Llama2-13B-v11.1-GGUF” 모델을 사용해 보았습니다. 해당 모델은 다음 링크에서 찾을 수 있습니다: TheBloke/OpenBuddy-Llama2-13B-v11.1-GGUF · Hugging Face
  • 모델 페이지에서 추천하는 파일(예: openbuddy-llama2-13b-v11.1.Q4_K_M.gguf)을 다운로드 받았습니다.
llm

ollama로 커스텀 모델 가져오기

  • 모델을 임포트하기 위해 ModelFile을 먼저 생성해야 합니다. 예를 들어, openbuddy-llama2-13b라는 이름의 확장자가 없는 파일을 만들고, GGUF 파일의 경로를 지정하는 내용을 포함합니다. 자세한 정보는 ModelFile 관련 공식 문서에서 확인할 수 있습니다:
FROM /Users/username/Documents/Ollama/openbuddy-llama2-13b-v11.1.Q4_K_M.gguf
TEMPLATE """{{- if .System }}
<|im_start|>system {{ .System }}<|im_end|>
{{- end }}
<|im_start|>user
{{ .Prompt }}<|im_end|>
<|im_start|>assistant
"""

SYSTEM """"""

PARAMETER stop <|im_start|>
PARAMETER stop <|im_end|>
  • 모델을 실행하려면 간단히 터미널에서 ollama run <mymodel> 명령어를 사용하면 됩니다.
    – 예: ollama create ob-llama2-13b -f openbuddy-llama2-13b
ollama create

모델 실행

  • 모델을 실행하려면 간단히 터미널에서 ollama run <mymodel> 명령어를 사용하면 됩니다.
    • 예: ollama run ob-llama2-13b

신문기사의 내용을 요약해 보았습니다.

local llm

LangChain의 결합

LangChain 파이썬 라이브러리를 설치하면 Ollama와 결합하여 다양한 기능을 구현할 수 있습니다.

설정: 파이썬 라이브러리 설치

pip install langchain

텍스트 요약

LangChain을 활용하여 임포트한 모델로에 텍스트 요약을 요청할 수 있으며, 기본 출력 방법과 토큰 스트리밍 방식을 선택할 수 있습니다. 이는 실시간으로 내용을 생성하고 출력하는 데 효과적입니다.

기본적인 출력 방법

import os
from langchain_community.llms import Ollama

llm = Ollama(temperature=0, model="ob-llama2-13b")

context = "요약하고자 하는 내용"

summary_query = f"""Please briefly summarise the text separated by <<< and >>> into five key points. Please output it in the following format

format:
1. summary1
2. summary2
…

text:
<<<
{context}
>>>
"""

result = llm.invoke(summary_query)
print(result) 

위의 코드는 “Apple Starts Letting Developers Add Alternative App Marketplaces to App Store Connect – MacRumors” 기사를 요약한 결과를 출력합니다.

1. Apple is allowing EU developers to add alternative app marketplaces to App Store Connect ahead of the launch of iOS 17.4 update in the European Union.
2. Alternative app marketplaces are special iOS apps that can be downloaded from a website or web browser and serve as an alternative to the App Store.
3. Apple is checking both alternative marketplaces and apps added through them for malware, viruses, and similar malicious content.
4. Developers must agree to new business terms including a Core Technology Fee of .50 euros per install for app marketplaces and apps after 1 million installs.
5. TestFlight can be used to beta test new features with alternative app marketplaces set up, and third-party payment providers are supported for alternative browser engines and payments.

토큰 스트리밍 출력 방법

for chunk in llm.stream(summary_query):
    print(chunk)

chunk 출력하면 다음과 같이 토큰이 생성과 동시에 순차적으로 출력됩니다.

1
.
 Apple
 is
 allowing
 EU
 developers
 to
 add
 alternative
 app
 market
p
laces
 to
 App
 Store
...

생성되는 chunk만 실시간으로 추가하는 방식으로 print 하면 ChatGPT 에서 답변을 생성할 때와 비슷한 느낌의 화면을 볼 수 있습니다.

for chunk in llm.stream(summary_query):
    print(chunk, end="")
chagpt

클립보드 텍스트 요약기 개발

ChatGPT와 VS Code의 Copilot을 도움을 받아 간단한 클립보드 텍스트 요약기를 개발하고 Keyboard Maestro를 통해 파이썬 스크립트를 단축키로 실행하는 기능을 추가하였습니다. 요약하고자 하는 텍스트를 선택하고 단축키를 누르면, 자동으로 텍스트가 복사되고 요약이 진행됩니다.

langchain

시행착오

Ollama와 LangChain을 사용한 개발은 직관적이었으나 다음 2가지의 문제가 발생하였습니다.

  1. 한글로 생성을 요청했을 때 빈번하게 완성도가 떨어지는 결과를 출력하는 문제
    → 번역 시, 원문과 다른 뜻으로 번역하기도 하였습니다.
  2. 처리하는 토큰의 양이 일정 이상 넘어가면 이상한 대답을 하거나 Ollama 앱 자체가 멈춰 버리는 문제

다음과 같은 방법으로 개선하였습니다.

  1. 답변 생성을 영어로 진행: 영어로 진행하게 하였을 때 토큰의 양을 줄일 수 있었고 답변의 완성도도 안정정으로 변화하였습니다.
  2. 번역은 DeepL API를 사용하여 한글로 답변하도록 수정하였습니다.
  3. 마지막으로 입력하는 텍스트의 양을 제한하여 직접적으로 토큰 개수를 줄였습니다.

위와 같이 처리하여 가용한 정도의 결과물과 실행 시 안정성을 확보하였습니다. 차후 긴 텍스트는 분할하여 처리하는 방식으로 개선할 여지가 있습니다.

정리

지금까지 Ollama를 활용해서 커스텀 모델을 설치하고 LangChain과 결합하여 간단한 기능을 구현하는 것까지 진행해 보았습니다. 개발하는 과정에서 OpenAI와는 다른 독특한 경험을 제공하였습니다. 그럼에도 불구하고 무료인데다가 원하는 모델을 마음대로 사용할 수 있고 어딘가에 종속되지 않고 하물며 인터넷이 끊어진 상태에서도 빠르게 원하는 작업을 처리할 수 있다는 점이 매력적이라고 생각합니다. 앞으로도 로컬 LLM을 가지고 다양한 시도를 해볼 예정입니다.

참고: Keyboard Maestro

Keyboard Maestro는 macOS용 자동화 소프트웨어로, 다양한 작업의 자동화를 가능하게 합니다. 윈도우 사용자의 경우, AutoHotkey 같은 자동화 도구를 고려할 수 있습니다.

Keyboard Maestro를 사용하여 매크로를 생성하고, 텍스트 요약기 파이썬 스크립트를 단축키로 실행하는 방법을 소개합니다. 이를 통해 텍스트 요약 및 번역 작업을 간편하게 수행할 수 있습니다.
1. ⌘ + C를 사용하여 선택된 텍스트를 복사합니다.
2. 파이썬 스크립트를 실행합니다.
3. ⌘ + ⇧ + ⌥ + S 단축키로 요약 및 번역 작업을 시작합니다.

keyboard maestro

본 글은 GPTers에 게시되고 있습니다.
https://www.gpters.org/c/llm/ollama-2-chatgpt-llm

Ollama #2: 내 손으로 만드는 ChatGPT 로컬LLM – 커스텀 모델 설치부터 실용 앱까지

답글 남기기

Scroll to top