본문 바로가기

카테고리 없음

Django + Llama2 연동 실습

👉 개발 환경

 

IDE: Pycharm Community Edition  2024.1.1

PL: Python 3.12.3

 

Django를 이용한 초간단 웹페이지 제작 및 Langchain을 이용한 웹 인터페이스와 LLM 모델 연동.

 

👉패키지 설치

pip install django openai

 

👉프로젝트 생성 및 디렉토리 이동

django-admin startproject practice
cd practice

 

 

👉프로젝트 안에 Django App 생성

python manage.py startapp article

'settings.py' 파일에 'article' 추가도 해줘야 함.

 

이 프로젝트에서는 간단하게 사용자 입력에 대한 LLM 출력만 가져올 것이므로,  DB는 우선 생략했다.

 

 

 

👉'article/views.py'에 로직 작성

view는 로직 처리 부분에 해당하는 부분이다.

내가 수행할 사용자 입력 받아서, 입력 기반으로 LLM 모델이 작성한 기사

반환하는 로직에 대한 코드를 작성했다. openAI API 토큰 사용에 대한 비용을 결제하지 않아서 요금제를 확인하라는 메시지가 떴고, 나는 돈을 들여 결제할 생각은 없기 때문에 huggingface의 Llama2 모델을 로컬에 다운받아 chatgpt대신 연동해보려고 코드를 수정했다.(위: Llama 연동 코드, 아래: openAI 연동 코드)

from django.shortcuts import render

# Create your views here.
# from django.shortcuts import render
# from django.views.decorators.http import require_http_methods
# import openai
#
# openai.api_key = 'sk-proj-kqfSv8r3of9Y38pL4B90T3BlbkFJIxblrRhYgATpMr4yVLpb'
#
# @require_http_methods(["GET", "POST"])
# def generate_article(request):
#     if request.method == 'POST':
#         user_input = request.POST.get('user_input', '')
#
#         response = openai.Completion.create(
#             engine='gpt-3.5-turbo-0613',
#             prompt=f'Write a news article in Korean based on the following information: {user_input}',
#             max_tokens=500
#         )
#
#         generated_text = response.choices[0].text.strip()
#         return render(request, "article/result.html", {'generated_text': generated_text})
#     return render(request, 'article/index.html')


#LangChain 사용 ver.
from django.shortcuts import render
from transformers import LlamaForCausalLM, LlamaTokenizer, AutoTokenizer
from django.views.decorators.http import require_http_methods
#from langchain import Chaining, OpenAI


#Chaining 객체는 처리 파이프라인을 구성함.
#openai_api_key = 'sk-proj-kqfSv8r3of9Y38pL4B90T3BlbkFJIxblrRhYgATpMr4yVLpb'
#openai_chainer = Chaining(chain=[OpenAI(api_key=openai_api_key)])

import os

# 모델 저장 경로 설정
model_dir = 'C:/Users/Seulgi Baek/Practice/pythonProject1/practice/models/meta-llama-Llama-2-7b-hf'

os.environ["HF_HOME"] = "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"
model_name="meta-llama/Llama-2-7b-hf"
# 처음에는 온라인 상태에서 모델과 토크나이저를 다운로드하고 지정한 디렉토리에 저장
tokenizer = AutoTokenizer.from_pretrained('meta-llama/Llama-2-7b-hf', cache_dir=model_dir, use_auth_token='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',)
model = LlamaForCausalLM.from_pretrained('meta-llama/Llama-2-7b-hf', cache_dir=model_dir, use_auth_token='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',)

# 이후 로컬 디렉토리에서 모델과 토크나이저 로드
tokenizer = AutoTokenizer.from_pretrained(model_dir)
model = LlamaForCausalLM.from_pretrained(model_dir)


@require_http_methods(["GET","POST"])
def generate_article(request):
    if request.method == 'POST':
        user_input = request.POST.get('user_input', '')
    #openAI ver
        #prompt =prompt=f'Write a news article in Korean based on the following information: {user_input}'
        #response = openai_chainer.run(prompt, max_tokens=500)
        #generated_text = response.strip()

    #Llama ver
        prompt = f"주어진 정보를 바탕으로 한국어 뉴스 기사를 작성하십시오: {user_input}"

        inputs = tokenizer(prompt, return_tensors="pt", max_length=512, truncation=True)
        outputs = model.generate(**inputs, max_length=512, num_return_sequences=1)
        generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
        return render(request, 'article/result.html', {'generated_text': generated_text})
    return render(request, 'article/index.html')
from django.shortcuts import render

# Create your views here.
from django.shortcuts import render
from django.views.decorators.http import require_http_methods
import openai

openai.api_key = 'sk-proj-kqfSv8r3of9Y38pL4B90T3BlbkFJIxblrRhYgATpMr4yVLpb'

@require_http_methods(["GET", "POST"])
def generate_article(request):
    if request.method == 'POST':
        user_input = request.POST.get('user_input', '')

        response = openai.Completion.create(
            engine='text-davinci-002',
            prompt=f'Write a news article in Korean based on the following information: {user_input}',
            max_tokens=500
        )

        generated_text = response.choices[0].text.strip()
        return render(request, "article/result.html", {'generated_text': generated_text})
    return render(request, 'article/index.html')

 

 

 

 

 

👉'practice/urls.py'에 article app에 대한 url 추가

url 경로에 article 추가해서 경로를 찾아 해당 app을 실행할 수 있도록 했다.

 

 

👉'aricle' 디렉토리에도 urls.py 파일 생성해 article app에 대한 url 추가

사용자가 article 앱의 루트 URL에 접근했을 때 generate_article 뷰 함수를 호출하도록 설정했다.

 

 

👉 로컬호스트에서 서버를 실행하기

python manage.py runserver