2 minute read

인공 지능(AI)의 성장과 발전으로, 최근에는 다양한 분야에서 AI를 활용하는 사례가 증가하고 있다.
가장 기본적인 아래 2가지 케이스에 대해 진행해보려고 한다.

1. ChatGPT Open API를 활용한 처리 2. Llama2를 통한 처리

참조

Llama2 embedding 대한 실습은 Llama2 Embedding를 참조하였다.

실습 환경

  • 운영체제: Windows 11
  • 개발 언어: Python 3.10.11
  • 웹 프레임워크: Flask

[01] ChatGPT Open API 활용

ChatGPT Open API를 통해 사용자의 입력을 받아 처리하고 적절한 답변을 반환하는 예시이다.
본 예시에서는 친구가 운영하는 카페 메뉴를 추천하는 컨셉으로 구현하였다.

프롬프트 엔지니어링이란?

AI 모델에게 주어진 입력을 최적화하여 원하는 결과를 얻는 기법.

  • 아래의 예제는 사용자의 입력에 따라 카페 메뉴나 위치 정보를 반환한다.
from flask import Flask, request, jsonify
import openai
import json

app = Flask(__name__)
api_key = "your_openai_api_key_here"
openai.api_key = api_key

@app.route('/recommend_coffee', methods=['POST'])
def recommend_coffee():
    user_input = request.json.get('user_input')
    with open('user_data.json', 'a') as f:
        json.dump({'user_input': user_input}, f)
        f.write('\n')

    # 입력에 따라 동적으로 프롬프트 설정
    if '추천' in user_input or '메뉴' in user_input:
        prompt = f"User: {user_input}\nAI: 안나커피에서 어떤 메뉴를 추천하겠습니까?"
    elif '위치' in user_input or '어디' in user_input:
        prompt = f"User: {user_input}\nAI: 안나 커피의 위치는 어디인가요?"
    else:
        prompt = f"User: {user_input}\nAI: 죄송합니다, 무슨 정보를 원하시나요?"

    response = openai.Completion.create(
        engine="text-davinci-002",
        prompt=prompt,
        max_tokens=50
    )

    coffee_recommendation = response.choices[0].text.strip()
    with open('ai_recommendations.json', 'a') as f:
        json.dump({'coffee_recommendation': coffee_recommendation}, f)
        f.write('\n')

    return jsonify({"recommendation": coffee_recommendation})

if __name__ == "__main__":
    app.run(debug=True)


‘추천’이라는 단어가 포함되면 카페 메뉴를 추천하도록 userInput을 보강하고, ‘위치’라는 단어가 포함되면 카페의 위치 정보를 제공하게끔 userInput을 보강한다.

[02] Llama2 사용해보기

Llama2 모델 다운로드 및 설치

Llama2 모델 다운로드 LlamaCpp 설치 가이드

  • GPU가 좋지 않아서 CPU를 사용하는 버전을 설치하였다.

pip install llama-cpp-python

llama-cpp-python이 제대로 설치되지 않을 경우,

  1. visual cpp 빌드 도구를 설치- https://visualstudio.microsoft.com/visual-cpp-build-tools/
  2. 아래의 명령어를 사용하여 cython을 설치 py -m pip install cython
  3. 다음 경로를 PATH 변수에 설정하세요 - C:\Users\XXXXX\AppData\Local\Programs\Python\Python311\Scripts

나의 경우에는 llma-cpp-python 명령어 실행시 아래와 같은 문제가 발생했다.

llama 설치 오류

원인을 찾아보니 visual cpp 빌드도구 설치 시 MSVC V143를 설치하면서 문제가 발생했었다. MSVC V142를 재설치하니 정상적으로 설치가 완료되었습니다.

llama 설치 오류

가장 기본적인 모델로 실행해보았다.

from flask import Flask, request, jsonify

# Llama2
from langchain.llms import LlamaCpp
from langchain import PromptTemplate, LLMChain

@app.route('/basic/llama2', methods=['POST'])
def recommend_basic_llama2():

    template = """Question: {question}
    Answer: Let's work this out in a step by step way to be sure we have the right answer."""
    prompt = PromptTemplate(template=template, input_variables=["question"])

    llm = LlamaCpp(
        # 다운로드 받은 모델의 위치
        model_path="C:\workspace\llama-2-7b-chat.Q4_K_M.gguf",
        temperature=0.0,
        top_p=1,
        max_tokens=8192,
        verbose=True,
        n_ctx=4096 
    )

    llm_chain = LLMChain(prompt=prompt, llm=llm)

    prompt = """
    Can you recommend a coffee menu for hot summer days?
    """

    response = llm_chain.run(prompt)
    
    return jsonify({"llm_response": response})

POST맨 결과

입력으로 “Can you recommend a coffee menu for hot summer days?”를 주었을 때, 모델은 여름에 어울리는 커피 메뉴 추천 방법에 대한 답변을 반환한다.

결과값

커피를 즐겨 마시는 유형을 파악하세요. 에스프레소나 콜드브루를 더 좋아하시나요, 아니면 다른 커피를 더 좋아하시나요?\n2단계: 선호하는 맛을 고려하세요. 단맛이나 과일 향을 좋아하나요, 아니면 쓴맛을 더 선호하나요?\n3단계: 바깥 날씨가 얼마나 더운지 생각해 보세요. 날씨가 덥다면 콜드 브루나 아이스 라떼와 같은 시원한 음료를 선택하는 것이 좋습니다. 하지만 날씨가 온화하다면 따뜻한 에스프레소가 적당할 수도 있습니다.\n4단계: 인기 있는 여름 커피 메뉴 옵션을 확인하세요. 많은 카페와 커피숍에서 더운 날씨에 딱 맞는 시즌 스페셜 메뉴를 제공합니다. 민트, 바질, 시트러스 등 상큼한 재료가 들어간 음료를 찾아보세요.\n이 단계를 따르면 여름에 어울리는 완벽한 커피 메뉴를 찾을 수 있을 것입니다. 즐겁게 음미하세요!

이번 포스트에서는 ChatGPT와 Llama2를 활용한 간단한 예시만을 다루었지만, 이외에도 다양한 방법으로 활용할 수 있다.