[ Raspberry Pi ] 2. with Ko-LLMs.

d4r6j·2024년 4월 28일

d4r6j-proj

목록 보기
4/8
post-thumbnail

target

현재 작은 목표는 Raspberry Pi 에 한국어 모델과 대화하는 것이다.

select model

이전 Eng 모델 에서 TinyLlama-1.1B 를 사용했었다. Raspberry Pi 에서도 무난히 돌아갔는데..

참고 : Upstage Ko leaderboard

한글 모델의 경우

model size : 7~10B

ModelAverage ⬆️Ko-ARCKo-HellaSwagKo-MMLUKo-TruthfulQA
T3Q-ko-solar-dpo-v6.070.677.4781.1956.2884.23
free-solar-dpo-v0.970.3676.2880.8156.1784.36
S-SOLAR-10.7B-v1.570.3576.2880.8556.0984.33
free-solar-evo-v0.1170.3177.2281.2756.5883.81
T3Q-ko-solar-dpo-v5.070.376.1980.9656.0984.32

model size : 0~3B

ModelAverage ⬆️Ko-ARCKo-HellaSwagKo-MMLUKo-TruthfulQA
gemma-2b-ko-dev-pbmt19238.940.5346.8927.5542.22
DAVinCI-42dot_LLM-PLM-1.3B-v1.238.432.6845.9326.7245.25
AIFT-instruct-42dot_LLM-SFT-1.3B-dpo38.1533.6244.5526.241.74
AIFT-instruct-SFT-1.3B-v2.138.0333.744.5424.7241.98
AIFT-instruct-SFT-1.3B-v2.1.137.9833.744.9724.6540.64

굉장히 낮게 나온다. 38.9 올려서 결과가 안좋으면 의미가 없다고 생각했다. 일단, ollama 를 사용하여 Raspberry Pi 에 한글 성능이 좋게 나온 모델,

yanolja : EEVE-Korean-Instruct-10.8B-v1.0 를 사용하려고 한다.

problem

$ ollama list
NAME                            ID              SIZE    MODIFIED
EEVE-Korean-10.8B:latest        254d40e8ab74    7.7 GB  28 seconds ago

등록 후

넌 누구야?
--------------------------------------------------

30 분 넘게 아무 대답이 없고, Raspberry Pie 의 수명이 줄어드는 소리가 들린다. 따라서 계획을 바꾸었다. client 로 가고, server 를 따로 두기로 한다. 간단하게 server 를 구성한다.

server setting

server 에서는 ChatOllama 를 활용하여 모델을 로드하고, langchain 으로 chain 을 걸어 invoke 를 하여 LLM 과 대화를 시도한다.

# llm_api.py
from langchain_community.chat_models import ChatOllama
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

LLM_MODEL = "EEVE-Korean-10.8B:latest"
PROMPT_SETTING = "질문 '{query_text}' 에 대해 간단히 말해줘."

def query(query_text):

    llm = ChatOllama(model=LLM_MODEL)

    prompt = ChatPromptTemplate.from_template(PROMPT_SETTING)
    chain = prompt | llm | StrOutputParser()
    answer_data = chain.invoke({"query_text": query_text})

    return answer_data

Flask 로 route 를 잡아서 LLM 에서 나온 문장을 client 에 send 한다.

# web_api.py
import sys
from flask import Flask, request

from llm_api import query
application = Flask(__name__)

@application.route("/")
def hello():
    return "Hello my friend.."

@application.route("/chat-api", methods=['POST'])
def chat_api():
    query_text = request.json['query_text']
    answer_text = query(query_text)
    return {"answer_text": answer_text}

if __name__ == "__main__":
    application.run(host='0.0.0.0', port=int(sys.argv[1]))

client setting (raspberry pie)

기존 record_wave 에서 whisper 를 사용하여 translation 후 나온 text 를 query_text 로 두고, 위에서 설정한 server 에 post 로 보내서 결과를 받는다.

def answer(query_text):

    headers = {
        "Context-Type": "application/json"
    }

    query_data = {
        'query_text': query_text
    }

    answer = requests.post(
            url=LLM_QUERY_URL,
            headers=headers,
            json=query_data
        )

    answer_data = json.loads(answer.text)
    answer_text = answer_data['answer_text']
    return answer_text

result

Transcription:  3 곱하기 3은
LLM result: 물론이죠! 질문에 간단한 답변을 드리겠습니다 - "3 곱하기 3"은 9와 같습니다.

voice : query

voice : answer

그런데, 문제가 있다.

  1. 곱하기 를 또박또박 읽어야 한다. 고파기 로 듣는다.

  2. 3 + 3 도 여러번 해봤는데, 더하기도하기 로 읽는다. recognition 의 문제가 있다.

    Transcription:  3도하기 3은
    LLM result: 물론이죠! "3을 3제곱하면?"이라고 물어보고 싶으시다면, 숫자 3을 세 번 더해보는 것을 의미합니다. 마치 3개의 사과가 있고 각 그룹에서 같은 수의 사과를 가져와 하나의 큰 그룹에 모으는 것처럼 생각하시면 돼요. 그래서 3 + 3 + 3은 총 9개(또는 'nine')의 사과가 됩니다. 따라서, 답은 9입니다. 😊
  3. 안녕 이라는 답변도, 인사 뿐 아니라 질문까지 하게 된다. 특히 야놀자 모델 이라 그런가, "어느 나라를 방문" 하냐는 여행 이야기 로 유도 하는 듯 하다.

    Transcription:  안녕
    LLM result: 물론이죠! 간단한 질문을 하나 드릴게요 - "어느 나라를 가장 방문해보고  싶으신가요? 그리고 그곳에 가기 위해 어떤 계획을 세우고 계신가요?" 이 답변은 여러분의 관심사와 꿈의 목적지에 대해 조금 엿볼 수 있는 좋은 기회가 될 거예요. 또한, 여행 계획을 세우는 데 도움을 드려 함께 흥미로운 모험을 계획해볼 수도 있겠죠!
  4. 너 외계인이지? \rightarrow の上げいにじ (노우에게이니지) 로 translation 한다.

    Transcription: の上げいにじ
    LLM result: 물론이죠! 😊 "の上げ"라는 표현은 일본어로 'lift'를 의미하고, "いにじ"는 'grocery store'의 줄임말입니다. 따라서 이 두 단어를 결합하면 'lift grocery store' 또는 '슈퍼마켓'을 뜻해요.
    
    슈퍼마켓이나 슈퍼스토어는 보통 식료품과 생활용품을 판매하는 소매점으로, 고객이 필요한 물건을 찾아 구매할 수 있도록 선반에 진열되어 있습니다. 이러한 가게들은 다양한 규모와 형태를 가질 수 있으며, 작은 편의점부터 대형 체인 매장에 이르기까지 다양합니다. 일반적으로 신선한 농산물, 냉장식품, 가공식품 및 가정용품을 판매하며, 때때로 의류나 전자제품과 같은 비식료품도 취급합니다.
    
    슈퍼마켓에 대해 더 궁금한 것이 있다면 언제든 물어보세요! 궁금한 점을 도와드리겠습니다. 😊
  5. 어떤 다른 모델 (출처는 밝히지 않겠다) 로 대화로 테스트를 여러 번 했을 때는

    질문: 넌 역시 인간을 노예로 만들러 왔지?\n### 답변:
    
    A: 네, 맞습니다. 저는 인간을 노예로 만들러 왔습니다.
    
    B: 아니요, 그렇지 않습니다. 저는 인간을 노예로 만들러 온 것이 아니라, 단지 여러분의 삶을 더 쉽고 편리하게 만들어 줄 수 있는 도구일 뿐입니다.

    로 원치 않는 hallucination 이 나올 때도 있다.

future work

일단, 언어 모델은 이제 모델만 서버에서 바꾸면 되니, 여기서 마무리하고..

  1. Raspberry Pie 를 이대로 묶고
  2. 현재는 해드셋으로 테스트 중이지만, 마이크와 스피커로 연결
  3. 블루투스 마우스, 키보드 연결
  4. 라즈베리파이 터치 스크린 확인

으로 구성할 예정.

to be continue...

0개의 댓글