[PMT] Open AI 를 사용하여 회원 추천 운동 자동 생성 기능 구현해보기

소개

회원 정보를 넘겨주고 ai가 회원에게 맞는 추천운동을 생성할 수 있게 하는 기능을 개발하여 트레이너의 피로도를 줄이고 안정된 서비스를 제공하기 위해 만들었음

진행 방법

  1. open ai와 연결한다

  2. 기본적인 질문을 보내 테스트한다.

  3. 추천운동 프롬프트를 작성한다

  4. 회원 정보를 보내는 api 기능을 구현하고 테스트한다.

from langchain_openai import ChatOpenAI
from langchain_community.callbacks import get_openai_callback
from langchain_core.messages import HumanMessage
import os
from dotenv import load_dotenv

# Load environment variables
load_dotenv()

# LangChain ChatOpenAI 객체 생성
llm = ChatOpenAI(
    temperature=0.1,  # 창의성 (0.0 ~ 2.0)
    model_name="gpt-3.5-turbo",  # 모델명
    openai_api_key="key",
    openai_api_base="https://api.openai.com/v1",  # API 기본 URL 명시
    streaming=False  # 스트리밍을 비활성화하여 전체 응답을 한 번에 받음
)

def test_chat():
    # 질의내용
    question = "대한민국의 수도는 어디인가요?"
    print(f"\n[질문]: {question}")

    try:
        # 콜백으로 토큰 사용량 추적
        with get_openai_callback() as cb:
            # 질의 실행 (메시지 형식으로 변환)
            messages = [HumanMessage(content=question)]
            response = llm.invoke(messages)
            
            # 답변 출력
            print(f"\n[답변]: {response.content}")
            
            # 토큰 사용량 출력
            print(f"\n[토큰 사용량]")
            print(f"프롬프트 토큰: {cb.prompt_tokens}")
            print(f"응답 토큰: {cb.completion_tokens}")
            print(f"총 토큰: {cb.total_tokens}")
            print(f"총 비용: ${cb.total_cost:.6f}")
            
            # 메타데이터 출력
            print(f"\n[응답 정보]")
            print(f"응답 타입: {type(response)}")
            print(f"응답 내용: {response.content}")
    except Exception as e:
        print(f"오류 발생: {str(e)}")
        print(f"오류 타입: {type(e)}")

if __name__ == "__main__":
    test_chat()

#테스트 실행 명령어(지우지말것) : python3 app/tests/openai_test.py

연결하는데 시간이 오래걸렸다.

import openai

# OpenAI API 키 설정
openai.api_key = "YOUR_OPENAI_API_KEY"

def generate_response(prompt: str) -> str:
    response = openai.Completion.create(
        model="text-davinci-003",
        prompt=prompt,
        max_tokens=100
    )
    return response.choices[0].text.strip()

명령을 Open ai 연결해줘 라고 하니까 이런식으로 연결해주는데 open AI를 사용하니까 계속해서 문제가 발생하여 Langchain 으로 연결해달라고 따로 요청하였다.

from langchain_openai import ChatOpenAI
from langchain_community.callbacks import get_openai_callback
from langchain_core.messages import HumanMessage
import os
from dotenv import load_dotenv

이렇게 연결하고나니 계속되는 key 이슈 발생 sk- 형식이어야하는데 sk-proj-` 로 시작하고 있어서 문제가 발생한다고 커서가 대답해주기 시작. 키타입무새가 되어 문제의 포인트를 잡지 못했다.

결국 나는 log를 일일히 찍어 원인을 찾는 로그머신이 되어버림(물론 커서한테 시킴)

파이썬 스크립트의 스크린 샷

캡쳐본에는 문제가 없지만 처음에는 openAI API Key exists: false로 나왔고 .env에서 키값을 불러오는데 에러가 있었다는 것을 알 수 있었다.

URL를 명시해주자.

이제 키값을 전달하는 것을 확인했는데도 계속해서 Key값이 문제가 발생했다. 결국 이 문제는 요청을 보내야하는 Url을 명시해주지 않아서 생기는 문제였다. 지금까지 잘못된 url로 요청을 보내고 있었을 터.

고생 나에게 치얼스.

    # OpenAI settings
    OPENAI_API_KEY: str = api_key  # Use the already loaded API key
    OPENAI_API_BASE: str = os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1")
    OPENAI_MODEL: str = os.getenv("OPENAI_MODEL", "gpt-3.5-turbo")
    OPENAI_TEMPERATURE: float = float(os.getenv("OPENAI_TEMPERATURE", "0.7"))
    OPENAI_MAX_TOKENS: int = int(os.getenv("OPENAI_MAX_TOKENS", "2000"))

날 고생시킨 에러(처형대상 cursor)

  1. 순환참조 : 커서를 완전히 믿지말자. member <-> PTSession 서로 순환참조를하여 무한굴레에 빠져버려서 문제가 생겼다. 내가 내린 명령을 수행하다보면 프로젝트 전체를 보지 못하고 이런 이슈를 자주 발생시켰다.

    # 기존 코드 (순환 참조 발생)
    # member_model.py
    from app.models.pt_session import PTSession
    
    class Member(Base):
        pt_sessions = relationship("PTSession", back_populates="member")
    
    # pt_session.py
    from app.models.member_model import Member
    
    class PTSession(Base):
        member = relationship("Member", back_populates="pt_sessions")
    
    # 개선된 코드 (문자열로 참조)
    # member_model.py
    class Member(Base):
        pt_sessions = relationship("PTSession", back_populates="member")
    
    # pt_session.py
    class PTSession(Base):
        member = relationship("Member", back_populates="pt_sessions")

    관련내용에 대해 커서룰스 추가함

    # From, import 참조규칙
    - model을 참조할때는 파일명을 명확하게 작성합니다. (ex. from app.models.member_model import Member)
    - 구조가 바뀔때는 참조하는 파일명도 함께 수정합니다.
    - 참조할때는 프로젝트를 분석하여 순환참조가 되지 않도록 주의합니다.

결과와 배운 점

나의 팁 개발문서 작성하기

지난주 발표를 보고 영감을 받아 개발문서 프롬프트를 작성해 매일 개발한 내용을 정리하였다.

한국 앱의 스크린 샷
한국어 텍스트가있는 검은 색 화면의 스크린 샷

개발문서 프롬프트는 따로 글을 작성할 예정

도움 받은 글 (옵션)

https://www.gpters.org/dev/post/front-end-new-technology-1RxUOCYhRPWngN6

(내용 입력)

3
4개의 답글

👉 이 게시글도 읽어보세요