본문 바로가기
IT/인공지능 AI

[sLLM 로컬 프로젝트] 2.ollama 와 Python 으로 소통하기 (feat. 파일 로컬 LLM 에 요청 및 응답 수신 성공)

by RunningPencil 2024. 10. 22.

* 본 글은 GPT o1-preview 의 도움을 받아 코드 부분을 작성하였습니다.

* 다만 본 글은 매크로 생성 글은 아닙니다.

 

1. ollama API

ollama 는 api 를 제공합니다.

https://github.com/ollama/ollama/blob/main/docs/api.md

 

ollama/docs/api.md at main · ollama/ollama

Get up and running with Llama 3.2, Mistral, Gemma 2, and other large language models. - ollama/ollama

github.com

 

ollama 가 api 를 제공한다는 건, LLM 모델을 구동하고 있는 ollama 에게 별도 명령을 내릴 수 있다는 의미입니다.

ollama api 를 보면 POST 와 같은 HTTP 로 request 를 날릴 수 있습니다.

 

 

2. Python PyPDF2 라이브러리

Python 코드로 ollama 에게 PDF 파일을 읽고, 변역하는 코드를 작성해보았습니다.

(*전체 코드를 올리진 않을 예정입니다)

 

import PyPDF2

def extract_text_from_pdf(pdf_path):
    """
    Extracts text from a PDF file.
    """
    with open(pdf_path, 'rb') as file:
        reader = PyPDF2.PdfReader(file)
        text = ''
        for page in reader.pages:
            page_text = page.extract_text()
            if page_text:
                text += page_text + '\n'
    return text

 

 PyPDF2 는 파이썬 라이브러리 중에 PDF 파일을 읽을 수 있는 라이브러리입니다.

text 로 일단 반환을 한 후 ollama 에서 구동할 수 있는 모델에 번역하는 명령을 날리고, 한국어로 결과를 받는 게 목표입니다.

 

ollama API 를 확인해보겠습니다.

요청을 아래와 같이 날리면,

curl http://localhost:11434/api/generate -d '{
  "model": "llama3.2",
  "prompt": "Why is the sky blue?"
}'

 

아래처럼 model, created_at, response, done 과 같은 JSON 형식의 답이 온다고 합니다.

{
  "model": "llama3.2",
  "created_at": "2023-08-04T08:52:19.385406455-07:00",
  "response": "The",
  "done": false
}

 

 

3. requests 와 json 라이브러리

ollama 에게 테스트로 위와 똑같은 curl request 를 날려보겠습니다. 다만, 모델을 제가 쓰고 있는 llama3.2:1b 에 json 을 사용해서 날리겠습니다.

 

import requests
import json

url = 'http://localhost:11434/api/generate'

def test_request():
    context = {
        "model": "llama3.2:1b",
        "prompt": "Why is the sky blue?"
    }

    try:
        response = requests.post(url, json=context)

        if response.status_code == 200:
            response_lines = response.text.strip().splitlines()
            full_response = ""

            for line in response_lines:
                try:
                    json_data = json.loads(line)
                    full_response += json_data.get('response', '')
                except json.JSONDecodeError as e:
                    print(f"JSON parsing error for line: {line}, error: {e}")
                    continue

            print("Full response:", full_response)
        else:
            print(f"Error: {response.status_code}, {response.text}")

    except requests.exceptions.RequestException as e:
        print(f"An error occurred during the request: {e}")
        return ''
    
test_request()

 

그럼 답변이 오는 걸 확인할 수 있습니다 (*주의: full_response에 업데이트 하는 식으로 진행했는데, 일단 출력하게되면 (예:

for line in response_lines: try:...) 단어마다 마다의 응답을 받을 수도 있습니다.

 

답변은 이렇게 왔습니다.

Full response: The sky appears blue to us because of a phenomenon called Rayleigh scattering, named after the British physicist Lord Rayleigh who first described it in the late 19th century. Here is a simplified explanation
When sunlight enters Earth atmosphere, it consists of a spectrum of colors, including red, orange, yellow, green, blue, indigo, and violet. ...

 

 

4. PyPDF2 + requests + json 결합, ollama 에게 PDF 파일을 번역 후 출력하도록 요청

 

이제 이 코드들을 결합해서, ollama 에게 pdf 의 text 파일을 주면 번역 결과를 받아볼 수 있습니다.

이 블로그 글을 복사해서 GPT o1-preview 에 붙여넣은 후, "PDF 파일을 읽고 ollama 의 LLM 을 이용해서 한국어 번역 결과를 출력하는 Python 코드로 업데이트 해 줘." 라고 몇 줄 추가하면 코드를 작성해 줄 것입니다. *o1-preview 진짜 성능 좋은 것 같습니다. 👍

 

5. 결론 및 추후 개선 필요사항

  • llama3.2:1b 와 llama3.1:8b 의 변역 결과를 비교하면, 8b 쪽이 더 좋습니다.
  • << llama3.2:1b 를 사용한 결과 >> (한국어로 번역을 시켰는데 굳이 영어 원문을 적어주네요)
제안이 제시되는 concept 및 technology에 대한 정의입니다.
* **제안의 정의** (Definition of a proposed solution or technology)
* **마케팅 submission content** (Marketing submission content)
* **PCCP** (Patient-Centered Clinical Platform)
* **ML-DSF** (Machine Learning-Driven Software Functional Change)
  • << llama3.1:8b 를 사용한 결과>>
이 초안 지침에서 우리는 ML-DSF에 대한 시장 제출내용의 추천 사항을 제시한다.
시장 제출 내용에는 다음이 포함된다:
1) 특정 변경 계획에 대한 세부적인 설명;
2) 변경 개발, 확인 및 구현과 관련된 메소드론 (Modification Protocol);
3) planned 변경과 위험 완화에 대한 이익평가 보고서.

 

  • (*동일한 영역의 번역을 찾을 수가 없네요, 왜 같은 내용을 번역을 시켜도 다르게 나오는지 궁금합니다. LLM 에서 모델 사용을 Fix 하는 방법? 이 있는지 궁금합니다. 매번 같은 결과값을 얻을 순 없더라도 의도한 결과를 비슷하게 받을 수 있는 방법 등)
  • (1편에서 다룬 것처럼) llama3.2:1b 가 한국어 데이터 학습이 별로 없어 / 혹은 지원하지 않아 발생한 문제일 수 있습니다.
  • 모델에 별도의 설정값을 넣어줘야 번역을 더 잘 할 수 있을 것으로 보입니다.

 

 

반응형