[크래프톤 정글 3기] 1/28(일) TIL

ClassBinu·2024년 1월 28일
0

크래프톤 정글 3기 TIL

목록 보기
100/120

정글과 무관하게 기존 '오늘의 일기'에 AI 답글 기능을 추가한다.
(휴일의 일탈..?)

오늘의 일기

https://todaysdiary.net

기존에 프롬프팅을 잘 못해서 답변 생성이 제대로 안 됐는데,
프롬프팅 책을 좀 읽고 몇 가지 전략을 적용해 볼 수 있겠다.
그래서 모두 공개로 등록된 글에는 별도 스레드를 생성해서,
사용자는 딜레이를 느끼지 못하고, AI 비누쌤이 댓글을 달도록 기능을 추가해본다!

GPT4-Turbo 모델은 3.5대비 10배가 비싸서 우선 3.5모델로 적용한다.
(참고로 그냥 4모델은 30배가 비쌌음.)

스레드 적용 없이 기능만 구현한 코드

    # 인공지능 댓글 생성 파트
    def form_valid(self, form):
        response = super().form_valid(form)
        if self.object.public == "private":
            self.ai_create_comment(self.object)
        return response

    # 인공지능 댓글 저장 연동
    def ai_create_comment(self, post):
        ai_binu = User.objects.get(id=7500)  # AI 비누쌤 7500
        ai_generated_comment = self.gen_AI_comment(post)
        Comment.objects.create(post=post, content=ai_generated_comment, author=ai_binu)

    # 랭체인 인공지능 댓글 생성
    def gen_AI_comment(self, post):
        llm = ChatOpenAI(
            openai_api_key="",
            model_name="gpt-3.5-turbo-1106",
            # model_name="gpt-4-0125-preview",
            temperature=0.9,
        )

        nickname = self.request.user.nickname

        user_message = f"# 제목: {post.title} \n # 닉네임: {nickname} \n 내용: {post.content}"
        system_message = """
			여기 프롬프트 들어감
        """

        prompt = ChatPromptTemplate.from_messages(
            [("system", system_message), ("user", "{input}")]
        )
        ### gpt-3.5-turbo-1106
        # input $0.001 / 1K
        # output $0.002 / 1K

        ### gpt-4-0125-preview
        # input $0.01 / 1K
        # output $ 0.03 / 1K
        chain = prompt.pipe(llm)
        res = chain.invoke({"input": user_message})
        return res.content

이렇게 했을 때는 댓글은 정상적으로 생성되지만, 사용자가 LLM이 모두 생성될 때까지 로딩화면을 봐야 함.
django로 풀스택으로 구현했기 때문에 api로 통신하는 게 아니라 지금은 서버에서 모든 작업이 끝나야 한다. 이걸 정글에서 배웠던 스레드를 적용하면 되지 않을까? 도전해 봄!

이전에 내가 작성했던 블로그 참고하기
https://velog.io/@classbinu/%ED%81%AC%EB%9E%98%ED%94%84%ED%86%A4-%EC%A0%95%EA%B8%80-3%EA%B8%B0-111%EB%AA%A9-TIL

스레드 적용

    # 인공지능 댓글 생성 파트
    def form_valid(self, form):
        response = super().form_valid(form)
        post = self.object
        if self.object.public == "private":
            print("Generate AI Binu Comment in Background")
            threading.Thread(
                target=self.create_ai_comment_background, args=(post,)
            ).start()
        return response

    # 인공지능 댓글 생성 백그라운드
    def create_ai_comment_background(self, post):
        try:
            self.ai_create_comment(post)
        except Exception as e:
            print(f"Error in AI comment creation: {e}")

스레드를 적용해서 우선 게시글이 생성되면 렌더링해서 유저에게 돌려주고,
서버에서 다른 스레드에서 댓글을 생성해서 달아 줌!
댓글은 생성 즉시 결과를 사용자한테 알려주지 않아도 되기 때문에 이렇게 해도 됨!

배포 오류

새로 배포한 모듈 인식 못함

해결1. requirements.txt 최신화 하지 않아서?

pip freeze > requirements.txt

안됨.

해결2. 문제 원인 찾음

requirments.txt가 github에는 최신화 되는데 heroku bash에서 확인해 보니 최신화가 되지 않음.
자꾸 변경 사항이 없다고 하면서 새로 설치하지 않고 캐시를 씀.

해결3. pipfile이 있으면 우선 requirement가 무시된다고 함.

pip이 아니라 pipenv로 설치했어야 함.

pipenv install langchain

해결4. 모든 패키지 설치

langchain을 pipenv로 설치했는데도 인식 못함.
openai 패키지를 설치하지 않아서 그런 거였음.

해당 패키지 모두 pipenv로 설치 후 문제 해결

계속 노드로만 작업하다가 오랜만에 파이썬 작업하려니까 헷갈림.
가상환경에서는 pip이 아니라 pipenv로 설치해야 하는 것 기억하기

커넥션

DB 커넥션이 20까지 차 버려서 댓글이 생성되지 않는 문제 발생.
장고는 커넥션을 알아서 정리하지만, 백그라운드로 실행된 스레드는 수동으로 정리해 줘야 하는 듯
코드 다음과 같이 변경

    # 인공지능 댓글 생성 백그라운드
    def create_ai_comment_background(self, post):
        try:
            close_old_connections()
            self.ai_create_comment(post)
        except Exception as e:
            print(f"Error in AI comment creation: {e}")
        finally:
            close_old_connections()

0개의 댓글