본문 바로가기
Python/Fast Api

03. ChatGPT

by 사라리24 2024. 6. 4.
SMALL

1. ChatGPT

 - OpenAI가 개발한 자연어 처리 모데로, 인간과 유사한 방식으로 대화를 나눌 수 있는 인공지는 시스템
 - GPT(Generative Pre-trained Transformer) 아키텍처를 기반으로 현재는 GPT-4 버전을 사용
 - 기본적으로 영어로 세팅 -> 다국어를 이용시 영어에 비해 느리고 정보량이 부족
 - 상황을 구체적으로 기술할 수록 좋은 결과를 기대할 수 있음 
 - chatGPT에게 역할을 부여할수록 좋은 결과를 기대할 수 있음

 

더보기

 

 

 

 

  • 새로운 파일 생성
더보기
streamlit 설치

 

 

  • 화면구성
 
 
            import streamlit as st

            st.title("초간단 번역 서비스앱")
            text = st.text_area("번역할 내용을 입력하세요", "")
            src_lang = st.selectbox("번역할 언어를 선택하세요", ["한국어", "영어", "일본어"])
            trg_lang = st.selectbox("번역될 언어를 선택하세요", ["영어", "한국어", "일본어"])

            if st.button("번역하기"):
                pass
 
  

 

 

  • openai 모듈 설치 후 사용, 학습시키기
  
 
             import openai
 
          openai.api_key = "sk-proj-VptnRRkv1xMQsRGpiXjmT3BlbkFJLsO6Fv6gtbvPA8qVvm9H"
 
 
            example = {
                "한국어" : ["오늘 날씨 어때?", "딥러닝 기반의 AI기술이 인기를 끌고 있다"]
                "영어" : ["How is the weather today?", "AI technology based on deep learning is gaining popularity"]
                "일본어" : ["今日の天気はどう?","ディープラーニングベースのAI技術が人気を集めている"]
            }
 
 
 

 

- 설치

 

 

 

  • 번역함수 작성
 

           

        # 번역 요청을 처리하는 함수.
        def translate_text_chatgpe(text, src_lang, trg_lang):

              """
                text (str): 번역할 텍스트.
                src_lang (str): 소스 언어 코드.
                trg_lang (str): 대상 언어 코드.

              """

            # 몇 가지 예제(few-shot) 메시지를 생성하는 함수
            def build_fewshot(src_lang, trg_lang):

                # 소스 언어와 대상 언어의 예제 문장들
                src_examples = example[src_lang]
                trg_examples = example[trg_lang]
               
                fewshot_messages = []
               
                # 각 예제를 사용자 입력과 번역된 출력으로 구성하여 리스트에 추가
                for src_text, tag_text in zip(src_examples, trg_examples):
                    fewshot_messages.append({"role": "user", "content": src_text})
                    fewshot_messages.append({"role": "assistant", "content": tag_text})
               
                return fewshot_messages
           
            # 시스템 역할의 초기 명령 생성
            system_instruction = f"assistant는 번역앱으로서 동작한다. {src_lang}{trg_lang}으로 적절하게 번역하고 번역된 텍스트만 출력한다."
           
            # few-shot 예제 메시지 생성
            fewshot_messages = build_fewshot(src_lang=src_lang, trg_lang=trg_lang)
           
            # 메시지 리스트에 시스템 명령, few-shot 예제 메시지, 번역할 텍스트 추가
            messages = [{"role":"system", "content": system_instruction}, *fewshot_messages, {"role": "user", "content": text}]
           
            return messages
           
 
             

1. translate_text_chatgpe 함수

이 함수는 번역 요청을 처리하며, 입력된 텍스트(text)를 소스 언어(src_lang)에서 대상 언어(trg_lang)로 번역하기 위해 필요한 메시지 구조를 만듭니다.

2. build_fewshot 함수

  • src_examples와 trg_examples는 각각 소스 언어와 대상 언어로 된 예제 문장들입니다.
  • fewshot_messages 리스트에 각 예제를 추가합니다. 각 예제는 사용자의 입력(role: "user")과 번역된 출력(role: "assistant")으로 구성됩니다.

3. 시스템 명령 생성

system_instruction는 모델이 번역 앱으로서 동작할 수 있도록 지시합니다. 시스템 역할의 초기 명령을 생성합니다. 
이 함수는 몇 가지 예제(few-shot) 메시지를 생성합니다. 예제는 소스 언어와 대상 언어로 된 문장의 쌍으로 구성됩니다. 이러한 예제는 모델이 번역을 어떻게 해야 하는지 학습하는 데 도움이 됩니다.

4. 전체 메시지 생성

messages 리스트에 시스템 명령과 few-shot 예제 메시지, 그리고 번역할 텍스트를 추가합니다.

  • system_instruction는 시스템 역할의 메시지로 추가됩니다.
  • fewshot_messages는 사용자가 번역 요청을 할 때 참고할 예제 메시지들입니다.
  • 마지막으로 번역할 텍스트(text)가 사용자의 입력으로 추가됩니다.




 

 

  • 번역한 것만 출력하기
 
 
                        response = openai.chat.completions.create(
                            model="gpt-3.5-turbo", messages=messages
                        )
                        # print(response)
                        # print(response.choices[0].message.content)
                        return response.choices[0].message.content
  
 





 

 

  • 전체코드
 
 
 
              import streamlit as st
              import openai

              openai.api_key = "sk-proj-VptnRRkv1xMQsRGpiXjmT3BlbkFJLsO6Fv6gtbvPA8qVvm9H"

              example = {
                  "한국어" : ["오늘 날씨 어때?", "딥러닝 기반의 AI기술이 인기를 끌고 있다"],
                  "영어" : ["How is the weather today?", "AI technology based on deep learning is gaining popularity"],
                  "일본어" : ["今日の天気はどう?","ディープラーニングベースのAI技術が人気を集めている"]
              }

              def translate_text_chatgpe(textsrc_langtrg_lang):
                  def build_fewshot(src_langtrg_lang):
                      src_examples = example[src_lang]
                      trg_examples = example[trg_lang]

                      fewshot_messages = []

                      for src_text, tag_text in zip(src_examples, trg_examples):
                          fewshot_messages.append({"role": "user", "content": src_text})
                          fewshot_messages.append({"role": "assistant", "content": tag_text})
                      return fewshot_messages

                  system_instruction = f"assiatant는 번역앱으로서 동작한다. {src_lang}을 {trg_lang}으로 적절하게 번역하고 번역된 텍스트만 출력한다."
                  fewshot_messages = build_fewshot(src_lang=src_lang, trg_lang=trg_lang)

                  messages = [{"role":"system", "content": system_instruction}, *fewshot_messages, {"role": "user", "content": text}]
                  # print(messages)

                  response = openai.chat.completions.create(
                      model="gpt-3.5-turbo", messages=messages
                  )
                  # print(response)
                  # print(response.choices[0].message.content)
                  return response.choices[0].message.content



              st.title("초간단 번역 서비스앱")
              text = st.text_area("번역할 내용을 입력하세요", "")
              src_lang = st.selectbox("번역할 언어를 선택하세요", ["한국어", "영어", "일본어"])
              trg_lang = st.selectbox("번역될 언어를 선택하세요", ["영어", "한국어", "일본어"])

              if st.button("번역하기"):
                  translated_text = translate_text_chatgpe(text, src_lang, trg_lang)
                  st.success(translated_text)
 
  

 

 

2. 광고문구를 생성해주는 앱

  

 

  • FastAPI 설치

 

  • terminal 실행 입력
더보기

 

  • streamlit 실행
  
       
           streamlit run app.py 
 
  

 

  • main.py 실행
 
 
 
      uvicorn main:app --reload
 
 
  

 

 

  • main.py

더보기



          import openai
          from fastapi import FastAPI
          from pydantic import BaseModel

          openai.api_key = 'sk-proj-VptnRRkv1xMQsRGpiXjmT3BlbkFJLsO6Fv6gtbvPA8qVvm9H'

          app = FastAPI()

          class AdGenerator:
              def __init__(selfengine='gpt-3.5-turbo'):
                  self.engine = engine

              def using_engine(selfprompt):
                  system_instruction = 'assistant는 마케팅 문구 작성 도우미로 동작한다. user의 내용을 참고하여 마케팅 문구를 작성해라'
                  messages = [{'role':'system', 'content': system_instruction},
                              {'role': 'user', 'content': prompt}]
                  response = openai.chat.completions.create(model=self.engine, messages=messages)
                  result = response.choices[0].message.content.strip()
                  return result

              def generate(selfproduct_namedetailstone_and_manner):
                  prompt = f'제품 이름: {product_name}\n주요 내용: {details}\n광고 문구의 스타일: {tone_and_manner} 위 내용을 참고하여 마케팅 문구를 만들어라'
                  result = self.using_engine(prompt=prompt)
                  return result

          class Product(BaseModel):
              product_name: str
              details: str
              tone_and_manner: str

          @app.post('/create_ad')
          async def create_ad(productProduct):
              # print(product)
              ad_generator = AdGenerator()
              ad = ad_generator.generate(product_name=product.product_name,
                                        details=product.details,
                                        tone_and_manner=product.tone_and_manner)
              return {'ad': ad}
 
  

 

 

  • app.py

더보기

  

 
          import streamlit as st
          import requests

          st.title('광고 문구 서비스앱')
          generate_ad_url = 'http://127.0.0.1:8000/create_ad'

          product_name = st.text_input('제품 이름')
          details = st.text_input('주요 내용')
          options = st.multiselect('광고 문구의 느낌', options=['기본', '재밌게', '차분하게', '과장스럽게', '참신하게', '고급스럽게'], default=['기본'])

          if st.button("광고 문구 생성하기"):
              try:
                  response = requests.post(
                      generate_ad_url,
                      json={"product_name": product_name,
                          "details": details,
                          "tone_and_manner": ", ".join(options)})
                  ad = response.json()['ad']
                  st.success(ad)
              except:
                  st.error("연결 실패!")
 
  


 

 

 

3. 과제 

 "광고 문구 서비스앱"에 "광고문구 생성하기" 실행마다 MongoDB에 저장하고 ,
저장된 내용을 json으로 반환하여 표로 뜨게 하기

 

  •  
  
       < js >
 
 
 
  
 

 

 

  •  
 
      < js >

 
 
 
  
 

 

 

  •  
  
      < js >
 
 
 
  
 
 

 

 

  •  
 
      < js >

 
 
 
 
  
 

 

 

  •  
  
      < js >

 
 
  
 
 

 

 

  •  
 
      < js >

 
 
 
  
 

 

  •  
  
      < js >

 
 
 
  
 
 

 

 

  •  
 
      < js >

 
 
 
  
 

 

 

  •  
  
      < js >

 
 
  
 
 

 

 

 

1. 

  

 

  •  
  
       < js >
 
 
 
  
 

 

 

  •  
 
      < js >

 
 
 
  
 

 

 

  •  
  
      < js >
 
 
 
  
 
 

 

 

  •  
 
      < js >

 
 
 
 
  
 

 

 

  •  
  
      < js >

 
 
  
 
 

 

 

  •  
 
      < js >

 
 
 
  
 

 

  •  
  
      < js >

 
 
 
  
 
 

 

 

  •  
 
      < js >

 
 
 
  
 

 

 

  •  
  
      < js >

 
 
  
 
 

 

 

 

'Python > Fast Api' 카테고리의 다른 글

02. Streamlit  (0) 2024.06.04
01. Fast API  (0) 2024.06.04