[ Raspberry Pi ] 2. with Ko-LLMs.

d4r6j·2024년 4월 28일
0

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개의 댓글

관련 채용 정보