데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      Flutter, Fast API 에서 LLM API 를 활용하기-2 (Bard-API vs OpenAI-API vs kakaoTrans)

      마법거북이 23.06.23
      5,370 13 1

      전편에 이어서 말씀드리겠습니다.


      2편 : Fast-API 백엔드 구현 및 결과 보기

      • config 변경하기

      • 스키마 만들기

      • 라우터 만들기

      • Swagger로 확인하기


      Config 파일 수정하기

      bard api 키 값과, open ai api 키 정보를 .config_secret\setting_local.json 파일을 읽어서 api키값을 변수에 저장하도록 수정합니다.

      소스코드상에서는 key정보가 유출되지 않습니다.

      # demo=fast-api > config > config.py 파일 수정 
      class Settings :
          ...
          EMAIL_API_KEY: str = config_secret_common["email_api_key"]
      		## 아래 두줄 추가 하기 
          OPENAI_API_KEY: str = config_secret_common["openai_api_key"]
          BARD_API_KEY: str = config_secret_common["bard_api_key"]
      
      ...


      스키마 만들기

      fast-api 에서는 pydantic 을 사용하는데 I/O 의 spec을 정의하고, 검증을 수행합니다.

      스키마를 생성하게 되면 API 문서를 자동으로 생성하여 정보를 반영해 줍니다. 이는 개발자에게 매우 편리하고 유용한 기능입니다.

      Client (Flutter) 와 Server (Fast-API) 가 통신하기 위한 request 과 response의 스펙을 정의합니다.

      
      # demo=fast-api > schemas > gpt_sch.py 파일 생성
      from pydantic import BaseModel
      
      # 요청시
      class GptRequestSch(BaseModel):
          title_nm: str
      
          class Config :
              orm_mode = True
              schema_extra = {
                  "example": {
                      "title_nm": "Base Tesla Model 3 Inventory has $2,410 discount and now Qualifies for $7,500 Tax Credit"
                  }
              }
      
      # 결과를 응답하는 경우
      class GptResponseSch(BaseModel):
          bard_msg_ctt: str
          openai_msg_ctt: str
          kakao_msg_ctt: str
      
          class Config:
              orm_mode = True
              schema_extra = {
                  "example": {
                      "bard_msg_ctt": "bard 메시지 내용 입니다",
                      "openai_msg_ctt": "openai 메시지 내용 입니다",
                      "kakao_msg_ctt": "kakao 메시지 내용 입니다"
                  }
              }


      라우터 만들기

      세 가지 다른 번역 서비스인 OpenAI, Bard API 및 Kakao Translator를 이용하여 텍스트를 번역하는 API 엔드포인트를 정의합니다

      # demo=fast-api > apis > version1 > gpt_router.py 파일 생성
      from fastapi import APIRouter
      from schemas.gpt_sch import GptRequestSch, GptResponseSch
      from kakaotrans import Translator
      from bardapi import Bard
      from config.config import settings
      import openai, json, requests
      
      router = APIRouter()
      translator = Translator()
      
      # POST 메소드를 사용하며 /translate/by/gpt 경로를 가집니다. 
      # 응답시에는 위에서 정의한 GptResponseSch 스키마를 활용합니다. 
      @router.post("/translate/by/gpt", response_model= GptResponseSch)
      async def translate_by_gpt_router(req: GptRequestSch):
      
      		# 비교하기 위한 api 들을 호출합니다. 
          openai_result = await translate_by_openai(req)
          bard_result = await translate_by_bard(req)
          kakao_result = await translate_by_kakao(req)
      
         # 결과를 리턴합니다. 
      
          return {
              "bard_msg_ctt": bard_result,
              "openai_msg_ctt": openai_result,
              "kakao_msg_ctt": kakao_result,
          }
      
      # open ai의 api를 호출하는 예제 입니다. 
      # gpt-3.5-turbo 모델을 사용합니다. 
      # "role": "user": 사용자 역할을 나타내며, 일반적으로 사용자가 입력한 메시지나 질문을 나타냅니다. 
      #  번역할 텍스트를 content 속성에 추가하여 사용자 역할로 전달합니다.
      # 응답의 첫번째의 내용을 리턴합니다. 
      async def translate_by_openai(req: GptRequestSch) :
          data = {
              'model': 'gpt-3.5-turbo',
              'messages': [{'role': 'user',
                            'content': req.title_nm + '한국어로 100자 이내로 설명해줘'}],
              'temperature': 0.3,
              'max_tokens': 150,
      
          }
          response = requests.post('<https://api.openai.com/v1/chat/completions>', headers=settings.OPENAI_HEADERS, json=data)
          output = json.loads(response.text)
          openai_result = output["choices"][0]["message"]["content"]
      
          return openai_result
      
      # bard api를 활용하는 예제 입니다. 
      # 매우 간단합니다. 
      
      async def translate_by_bard(req: GptRequestSch) :
          bard = Bard(token=settings.BARD_API_KEY)
          bard_result = bard.get_answer(req.title_nm + '한국어로 100자 이내로 설명해줘')['content']
          return bard_result
      
      # 카카오 translator을 활용하는 예제 입니다. 
      # 입력 언어는 en : 영어 이고,  번역할 언어는 kr : 한국어 입니다. 
      async def translate_by_kakao(req: GptRequestSch) :
          kakao_result = translator.translate(req.title_nm, src='en', tgt='kr')
          return kakao_result


      gpt_router를 연결해 줍니다. 최종경로는 /gpt/translate/by/gpt 입니다.

      
      # demo=fast-api > apis > api_base 파일 수정 
      from fastapi import APIRouter
      # gpt_router 추가 
      from apis.version1 import comm_router, gpt_router
      
      api_router = APIRouter()
      api_router.include_router(comm_router.router, prefix="/comm", tags=["comm"])
      # 아래 줄 추가
      api_router.include_router(gpt_router.router, prefix="/gpt", tags=["gpt"])


      Swagger로 확인하기

      fast-api 실행하기

      uvicorn main:app --reload --port 9004

      http://localhost:9004/docs

      image.png


      image.png


      몇 가지 테스트 해본 결과 입니다.

      결과
      {
        "title_nm": "Air Jordan XXXVII Basketball Shoes (White/Red/Black)"
      }
      
      {
        "bard_msg_ctt": "에어 조던 37 농구화는 2023년 5월에 출시된 농구화입니다. 흰색, 빨간색, 검은색으로 출시되었으며, 에어 조던 시리즈의 37번째 모델입니다. 에어 조던 37 농구화는 가볍고 편안한 착용감을 제공하며, 뛰어난 쿠션감과 반응성을 제공합니다. 또한, 에어 조던 37 농구화는 다양한 색상으로 출시되어 취향에 맞게 선택할 수 있습니다.",
        "openai_msg_ctt": "에어 조던 XXXVII 농구화는 흰색, 빨간색, 검은색의 색상으로 제작되었습니다. 이 신발은 탁월한 트랙션과 안정성을 제공하며, 플라이워브 기술로 제작되어 발을 편안하게 감싸줍니다. 또한, Zoom Air 쿠셔닝 시스템이 탑재되어 충격을 완화하고 반응성을 높여줍니다",
        "kakao_msg_ctt": "에어 조던 XXXVII 농구화 (화이트/레드/블랙)"
      }
      
      {
        "title_nm": "adidas Ultraboost 22 Running Shoe - Women's $56.95 with Free Shipping"
      }
      {
        "bard_msg_ctt": "아디다스 울트라부스트 22는 여성용 러닝화로, 현재 56.95달러에 무료 배송됩니다. 이 신발은 부드러운 착용감과 뛰어난 쿠션감으로 유명하며, 다양한 러닝 활동에 적합합니다.",
        "openai_msg_ctt": "아디다스 울트라부스트 22 런닝화는 여성용으로 디자인된 제품입니다. 이 제품은 우수한 쿠셔닝과 안정성을 제공하여 뛰는 동안 발을 보호하고 편안한 착화감을 제공합니다. 또한, 유연한 소재와 트랙션 아웃솔로 다양한 지형에서도 안정적인 발걸음을 유지할 수 있습니다. 이 제품은 무료",
        "kakao_msg_ctt": "아디다스 울트라부스트 22 러닝 슈 - 무료 배송으로 여성 56.95달러"
      }
      
      {
        "title_nm": "CRAFTSMAN V20 20-Volt Max 8' Cordless Electric Pole Saw w/ 4.0Ah Battery"
      }
      
      {
        "bard_msg_ctt": "CRAFTSMAN V20 20-Volt Max 8' Cordless Electric Pole Saw w/ 4.0Ah Battery는 20V Max 리튬 이온 배터리로 구동되는 전기 폴 절단기입니다. 8피트의 폴과 20인치의 톱날을 장착하고 있으며, 최대 10인치의 가지를 절단할 수 있습니다. 무게는 10파운드 미만으로 가볍고, 핸드 그립과 어깨 스트랩이 있어 편안하게 사용할 수 있습니다.",
        "openai_msg_ctt": "CRAFTSMAN V20 20-Volt Max 8' Cordless Electric Pole Saw는 4.0Ah 배터리로 구동되며, 최대 8피트까지 연장 가능한 전동 폴 소입니다. 무선으로 사용할 수 있어 편리하며, 20볼트 최대 전압으로 강력한 성능을 제공합니다. 또한, 안전한 사용을 위해 자동 윤활 시스템과 자동 체인 텐셔너가 장착되어 있습니다.",
        "kakao_msg_ctt": "CRAFTSMAN V20 20볼트 맥스 8' 코드리스 전기 폴 Saw w/4.0Ah 배터리"
      }

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      마법거북이 님의 최신 블로그

      더보기