[GPT] API를 활용한 서비스 만들기(2)

Sep 14, 2023
[GPT] API를 활용한 서비스 만들기(2)
 

5. 인공지능 서비스

우리 AI서비스의 구조는..
우리 AI서비스의 구조는..

5.1. 번역 AI서비스

  • chatgpt api를 사용해야 비용이 더 saving됨
few shot 프롬프트 : 데모를 제공해서 모델이 더 나은 성능을 발휘하도록 문맥 내 학습 지원
parellel_example = { "한국어" : ["오늘 날씨 어때", "딥러닝 기반 AI기술이 인기를 끌고 있다"], "영어" : ["How's the weather today", "Deep learning-based AI technology is gaining popularity."], "일본어" : ["今日の天気はどうですか", "ディープラーニングベースのAI技術は人気があります"] } def translate_text_using_chatgpt(text, src_lang, trg_lang): def build_fewshot(src_lang, trg_lang): src_examples = parellel_example[src_lang] trg_examples = parellel_example[trg_lang] fewshot_messages = [] for src_text, trg_text in zip(src_examples, trg_examples): fewshot_messages.append({"role" : "user", "content" : src_text}) fewshot_messages.append({"role" : "assistant", "content" : trg_text}) return fewshot_messages system_instruction = f"assistant는 번역앱으로 동작한다. {src_lang}을 {trg_lang}으로 적절하게 번역하고 번역된 텍스트만 출력한다." fewshot_messages = build_fewshot(src_lang=src_lang, trg_lang=trg_lang) user_message = {"role": "user", "content": text} messages = [{"role": "system", "content": system_instruction}, *fewshot_messages, user_message] response = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=messages) translated_text = response['choices'][0]['message']['content'] return translated_text st.title("번역 서비스") text = st.text_area("번역할 텍스트 입력하세요", "") src_lang = st.selectbox("원본 언어", ["영어", "한국어", "일본어"]) #기본 값을 1로 설정하자 trg_lang = st.selectbox("목표 언어", ["영어", "한국어", "일본어"], index=1) if st.button("번역"): translated_text = translate_text_using_chatgpt(text, src_lang, trg_lang) st.success(translated_text)

5.2. 광고문구 작성 서비스

step 1 Class, 함수 사용해서 간단한 prompt engineering 진행
#fasptapi api 서버 #openai api를 활용해서 광고 문구 작성 함수 호출 import openai openai.api_key = "" class SloganGenerator: def __init__(self, engine='gpt-3.5-turbo'): self.engine = engine self.infer_type = self._get_infer_type_by_engine(engine) def _get_infer_type_by_engine(self, engine): if engine.startswith("text-"): return "completion" elif engine.startswith("gpt-"): return "chat" raise Exception(f"Unknown engine type: {engine}") def _infer_using_completion(self, prompt): response = openai.Completion.create( engine=self.engine, prompt=prompt, max_tokens=200, n=1 ) result = response.choices[0].text.strip() return result def _infer_using_chatgpt(self, prompt): system_instruction = "assistant는 마케팅 문구 작성 도우미로 동작한다. user의 내용을 참고해서 마케팅 문구를 작성해라" messages = [{"role": "system", "content": system_instruction}, {"role": "user", "content": prompt}] response = openai.ChatCompletion.create(model=self.engine, messages=messages) result = response['choices'][0]['message']['content'] return result def generate(self, product_name, details, tone_and_manner): prompt = f"제품 이름: {product_name}\n주요 내용: {details}\n광고 문구의 스타일: {tone_and_manner} 위 내용을 참고하여 마케팅 문구를 만들어라." if self.infer_type == "completion": result = self._infer_using_completion(prompt=prompt) elif self.infer_type == "chat": result = self._infer_using_chatgpt(prompt=prompt) return result slogan_generator = SloganGenerator(engine="gpt-3.5-turbo") result = slogan_generator.generate(product_name="나이키 신발", details="mz세대에 맞춘 트렌디한 디자인", tone_and_manner="과장") print(result)
step 2 fastapi를 사용해서 백엔드 구축 (backend.py)
#실행 명령 uvicorn backend:app --reload
import openai from fastapi import FastAPI from pydantic import BaseModel openai.api_key = "" class SloganGenerator: def __init__(self, engine='gpt-3.5-turbo'): self.engine = engine self.infer_type = self._get_infer_type_by_engine(engine) def _get_infer_type_by_engine(self, engine): if engine.startswith("text-"): return "completion" elif engine.startswith("gpt-"): return "chat" raise Exception(f"Unknown engine type: {engine}") def _infer_using_completion(self, prompt): response = openai.Completion.create( engine=self.engine, prompt=prompt, max_tokens=200, n=1 ) result = response.choices[0].text.strip() return result def _infer_using_chatgpt(self, prompt): system_instruction = "assistant는 마케팅 문구 작성 도우미로 동작한다. user의 내용을 참고해서 마케팅 문구를 작성해라" messages = [{"role": "system", "content": system_instruction}, {"role": "user", "content": prompt}] response = openai.ChatCompletion.create(model=self.engine, messages=messages) result = response['choices'][0]['message']['content'] return result def generate(self, product_name, details, tone_and_manner): prompt = f"제품 이름: {product_name}\n주요 내용: {details}\n광고 문구의 스타일: {tone_and_manner} 위 내용을 참고하여 마케팅 문구를 만들어라." if self.infer_type == "completion": result = self._infer_using_completion(prompt=prompt) elif self.infer_type == "chat": result = self._infer_using_chatgpt(prompt=prompt) return result app = FastAPI() class Product(BaseModel): product_name: str details: str tone_and_manner: str @app.post("/create_ad_slogan") def create_ad_slogan(product: Product): slogan_generator = SloganGenerator("gpt-3.5-turbo") ad_slogan = slogan_generator.generate(product_name = product.product_name, details = product.details, tone_and_manner = product.tone_and_manner) return {"ad_slogan": ad_slogan}
잘 실행됨!!
잘 실행됨!!
step3 프론트는 스트림릿으로 구현
import streamlit as st import requests st.title("광고문구 작성 서비스") generate_ad_slogan_url = "http://127.0.0.1:8000/create_ad_slogan" product_name = st.text_input("제품 이름") details = st.text_input("주요 내용") options = st.multiselect("광고 문구의 톤앤 매너", options=["기본", "과장스럽게", "차분한", "웃긴"], default=["기본"]) if st.button("광구 문구 상세"): try: response = requests.post(generate_ad_slogan_url, json={"product_name": product_name, "details" : details, "tone_and_manner" : ', '.join(options)}) ad_slogan = response.json()['ad_slogan'] st.success(ad_slogan) except: st.error("예상치 못한 에러 발생")
ㅋㅋ;;0;;별거없네
ㅋㅋ;;0;;별거없네

5.3. (변형) 법률 블로그 작성 서비스

backend.py
import openai from fastapi import FastAPI from pydantic import BaseModel openai.api_key = "" class Generator: def __init__(self, engine='gpt-3.5-turbo'): self.engine = engine self.infer_type = self._get_infer_type_by_engine(engine) def _get_infer_type_by_engine(self, engine): if engine.startswith("text-"): return "completion" elif engine.startswith("gpt-"): return "chat" raise Exception(f"Unknown engine type: {engine}") def _infer_using_completion(self, prompt): response = openai.Completion.create( engine=self.engine, prompt=prompt, max_tokens=200, n=1, temperature=0.7 # 추가: 생성 텍스트 다양성 조절 ) result = response.choices[0].text.strip() return result def _infer_using_chatgpt(self, prompt): system_instruction = "assistant는 법률 블로그의 콘텐츠 마케터로 동작한다. user의 내용을 참고해서 블로그 콘텐츠 글을 작성해라" messages = [{"role": "system", "content": system_instruction}, {"role": "user", "content": prompt}] response = openai.ChatCompletion.create(model=self.engine, messages=messages) result = response['choices'][0]['message']['content'] return result def generate(self, case, type, key_message, bullet): prompt = f"판례: {case} \n블로그 콘텐츠 유형: {type}\n강조점: {key_message}\n 개요 및 소제목: {bullet} 위 내용을 참고하여 블로그 콘텐츠를 작성해줘. 결과물은 mark-down 형식으로 만들어줘" if self.infer_type == "completion": result = self._infer_using_completion(prompt=prompt) elif self.infer_type == "chat": result = self._infer_using_chatgpt(prompt=prompt) return result app = FastAPI() class Content(BaseModel): case: str type: str key_message: str bullet: str @app.post("/create_blog") def create_blog_content(content: Content): content_generator = Generator("gpt-3.5-turbo") blog_content = content_generator.generate(case=content.case, type=content.type, key_message=content.key_message, bullet=content.bullet) return {"blog_content": blog_content}
app.py
import streamlit as st import requests st.title("법률 블로그 작성 서비스") generate_content_url = "http://127.0.0.1:8000/create_blog" case = st.text_area("판례 내용을 복사 붙여넣기 해주세요", height=200) type = st.multiselect("블로그 콘텐츠 유형", options=["승소 사례", "법적 이슈", "법률 상식", "공지 사항"], default=["승소 사례"]) key_message = st.text_area("해당 콘텐츠에서 강조하고 싶은 점", height=100) bullet = st.multiselect("개요", options=["사건 경위", "변호 전략", "재판 결과", "우리 로펌과 함께해야할 이유"], default=["사건 경위"]) if st.button("블로그 작성 결과"): try: type_str = ", ".join(type) bullet_str = ", ".join(bullet) response = requests.post(generate_content_url, json={"case" : case, "type" : type_str, "key_message" : key_message, "bullet" : bullet_str }) blog_content = response.json()['blog_content'] st.success(blog_content) except: st.error("예상치 못한 에러 발생")
notion image
notion image
 

6. AWS

6.1. AWS EC2

  • AWS에서 제공하는 클라우드 컴퓨팅 서비스
  • 장점 : 탄력성(용량을 늘이고 줄일 수 있음), 저렴함(사용량 기반 과금, 첫 1년무료, 사용자가 인스턴스 제어가능)
  • 인스턴스 신규 생성
    • OS유형은 우분투(대중적이라 에러 발생시 참고할 자료가 많음)
    • 인스턴스 유형(서버의 성능을 결정함)
    • 키페어(로그인할 때 사용함)
 

6.2. Git, Github

  • Git : 버전 관리 프로그램
    • 왜 필요한가? 협업을 위해
      • notion image
  • Github : 버전관리, 소스 코드 공유, 분산 버전 제어등이 가능한 원격 저장소
notion image
notion image
notion image
 

to-do..


  • 강의를 덜 들은거 마저 듣기
    • 서비스 (음성 api, 이미지 생성 api 예시도 따라해보기)
    • 서버 만들어서 배포하기
  • fyi 누적 $0.01사용.. 답변 개당 10원 내외?? 근데 gpt 3.5 성능이 낮은 api 사용시 금액이라 다른 모델 사용시 예상 비용, 답변 퀼리티 차이를 확인해볼 필요가 있음
notion image
notion image
 
Share article

hollyisyoon