프로덕트

아티클

전체 보기
양영준

양영준

프롬프트로 Switch ~ Case 문 구현하기 + 나는 Langchain Hater

문제 상황

'프롬프트만으로 if ~ else if ~ else 또는 switch ~ case를 표현할 수 없을까?', '프롬프트의 결과에 대해 분기 처리를 할 수 없을까?' 와 관련된 문제를 해결하고 싶었습니다.

왜냐하면 면접 질문은 일반적인 대화보다 프롬프트의 품질이 높아야 하고, Prompt Injection 등 다양한 돌발 상황을 방지하고 싶었기 때문입니다.


해결책

프롬프트

사실 위와 같은 문제는 저번 시리즈에서 이미 답으로 나왔었습니다. 이번에는 langchain까지 적용한 파이썬 코드를 살펴보겠습니다. (langchain 싫어...🤢🤮)

class AnswerFilter:
    def check_answer_appropriate(self,job_group:str,question:str,answer:str)->str:
        prompt = ChatPromptTemplate(
            messages=[
                SystemMessagePromptTemplate.from_template(
                        f"""
                        Let's think step by step.

                        [Situation]
                        You are interviewers working at company in job position {job_group}.
                        You are evaluating the interview candidate's response to the previous interview question.

                        [Evaluation]
                        After analyzing the interviewee's response, please select the option with the highest relevance among the following items.

                        1. Direct request or Repeated requests to repeat the question
                        2. Uncertain responses
                        3. Silence or minimal response
                        4. Off-topic responses
                        5. A standard/interview-appropriate response.
                        
                        (HINT!)The criteria of evaluation:
                        - Direct request: The most definitive criterion is when the candidate explicitly requests further explanation or clarification, such as "I did not understand the question" or "Could you please explain that again?".

                        - Uncertain responses: If a candidate responds to a question hesitantly or ambiguously, or uses uncertain language like 'maybe', 'possibly', 'it could be', the interviewer may infer that they did not fully understand the question.

                        - Repeated requests to repeat the question: If a candidate repeatedly asks for the question to be repeated, they likely did not understand the question.

                        - Off-topic responses: If a candidate's answer is not related to the question or strays from the topic, the interviewer may suspect that the candidate did not properly understand the question.

                        - Silence or minimal response: If the candidate provides no or minimal response to a question, the interviewer may infer that they did not understand the question or are unsure about how to respond.

                        [Conclusion]
                        (This part must not be omitted from the output.)
                        (The beginning of output format must be as follows)
                        "I think it is (only number)"

                        """),
                HumanMessagePromptTemplate.from_template(
                        """
                        Previous interview question: {question}

                        Candidate's response : {answer}

                        """)
            ],
            input_variables=["question","answer"],
        )
        
        llm=ChatOpenAI(temperature=0.3,model_name='gpt-3.5-turbo',verbose=True,streaming=True, callbacks=[StreamingStdOutCallbackHandler()])
        chain = LLMChain(llm=llm,prompt=prompt)

        return chain.run({"question":question,"answer":answer})

이번에 주목해야 할 부분은 다음 부분들입니다.

                        After analyzing the interviewee's response, please select the option with the highest relevance among the following items.

                        1. Direct request or Repeated requests to repeat the question
                        2. Uncertain responses
                        3. Silence or minimal response
                        4. Off-topic responses
                        5. A standard/interview-appropriate response.

와

                        [Conclusion]
                        (This part must not be omitted from the output.)
                        (The beginning of output format must be as follows)
                        "I think it is (only number)"

입니다.

첫 번째 부분을 해석해보면, "면접 지원자의 답변을 분석해서 가장 관련성 높은 선택지(option)을 고르라"라는 것입니다.

두 번째는 출력 형식의 강제성을 주입하고 있습니다. 물론 이 역시 100% 안전하다곤 할 수 없습니다. 더 높은 품질을 위해선 이 프롬프트 결과에 대한 예외 처리도 꼼꼼히 해주세요.

코드

예외 처리

class InappropriateAnswerError(Exception):
    def __init__(self, message="Inappropriate answer provided."):
        self.message = message
        super().__init__(self.message)

class ResubmissionRequestError(Exception):
    def __init__(self, message="A resubmission has been requested."):
        self.message = message
        super().__init__(self.message)

먼저 예외 처리 코드를 살펴보죠.

InappropriateAnswerError는 부적절한 답변일 경우 발생하는 예외입니다. AnswerFilter 클래스의 결괏값 중 2,3,4면 첫 번째 예외에 걸립니다.

1번이면 ResubmissionRequestError 예외를 발생시킵니다. 5번인 경우 정상 답변이므로 예외가 발생하지 않습니다.

정규 표현식

def find_first_number(text):
    match = re.search(r'\d+', text)
    if match:
        return match.group()
    else:
        return None

프롬프트 결과에서 숫자로 해당되는 문자열을 가져오는 정규표현식입니다.

흐름 제어

class FollowUpQuestionManager:
    def __init__(self):
        self.filter=AnswerFilter()
        # 이하 생략
        
    def manage_followup_question(self,job_group:str,question:str,answer:str)->str:
        
        # 필터
        check=self.filter.check_answer_appropriate(job_group=job_group,question=question,answer=answer)

        number=find_first_number(check)
        
        if number=="1":
            raise ResubmissionRequestError()
        elif number=="2" or number=="3" or number=="4":
            raise InappropriateAnswerError()
        # 이하 생략

위 코드는 면접의 꼬리질문을 출제하는데 사용하는 로직의 일부입니다.

맨 처음에 AnswerFilter 클래스를 활용해서, 면접 지원자의 답변이 적절한지 LLM이 판단합니다.

그리고 그 결과를 if ~ else if ~ else 문을 활용해서 알맞은 예외를 캐치하고 있습니다.

사실 더더더더 꼼꼼히 예외 처리해야 합니다.

LLM은 비결정적입니다. 1,2,3,4,5만 나온다고 보장할 수 있을까요? 아니오.
단위 테스트를 짜서 assertEqual문을 활용하면, 몇 십번에 1번씩은 Test Fail을 뱉어내는게 LLM입니다.

따라서 위의 예시처럼 1,2,3,4 뿐만 아니라 여러 예외 케이스도 잡아낼 필요가 있겠습니다.
(위 예시는 사실 Jupyter notebook에서 작성한 테스트 예제이기도 합니다 ^^;;)

langchain 이미 있지 않음? 왜 안씀?

본심부터 말하면 전 langchain을 별로 좋아하지 않습니다. 심지어 지금 production 상태인 코드도 langchain 걷어내고 open ai로 갈아끼우고 있습니다.

이유는 다음과 같습니다.

  1. 문서화가 혼란스럽게 되어 있고 체계화가 안 되어있다. 문제가 발생해도 어딜 찾아봐야 할 지 모르겠다.

  2. Sequential Chain은 그냥 프롬프트 연결을 한 것 뿐이다.

  3. Router Chain은 복잡하다. 지금 프롬프트처럼 switch ~ case로 잡아내는게 더 간결했다.

  4. 예외를 캐치하는게 더 끔찍하다. RateLimitError의 경우 openai는 try ~ except면 쉽게 잡아낼 수 있었습니다. 그런데 langchain은 대체 어디서 잡아야 하는지?

  5. Memory는 사실 프롬프트 안에 이전 맥락을 넣으면 끝이다... summary memory의 경우에도 llm으로 요약 후에 맥락을 넣는것과 별반 차이 없음...

  6. 예제를 봐도 이해가 잘 안됨.

  7. Chain이 많은데 뭔 차이가 있는 지 모르겠음. 그래서 까봤는데요. LLMChain과 ConversationChain의 차이를 살펴보니, 후자의 경우엔 "더 친밀하게 대답해라"라는 프롬프트가 하나 추가된 것 밖에 없더라고요 ㅎㅎ;;

Agent 영역은 제가 프로젝트에 활용 해본 적이 없어서 그 쪽은 잘 모르겠습니다.


어쨋든 그 부분을 제외하면 langchain은 배우기 어렵고 쓰기도 어렵고 다루기도 어려운 것 같습니다. 개인적인 추척으론 그냥 openai를 쓰는게 좋은 것 같아요.

뭐... 아니면 라마나 GPT 등 여러가지 모델을 같이 써야할 경우엔 써야 될수도...?


참고 사항

모든 예제는 GPT 3.5기준입니다.

모두의 인터뷰

자소서 기반 개인 맞춤형 면접 질문과 꼬리 질문을 제공하는 면접 연습 서비스

8
1
양영준

양영준

LLM 개발 경험 공유 (1) - CoT와 FewShotPrompt 조합하기

문제 상황

프로젝트 특성

제가 만들고 있는 프로젝트는, "취준생을 위한 면접 연습 서비스"입니다. 🤩

핵심 기능은 다음과 같습니다.


1. 모집공고와 자소서 분석으로 개인 맞춤형 질문을 제공한다.
2. 상황에 맞게 꼬리질문을 제공한다.

제 생각에 LLM 서비스는 두 가지로 나뉩니다.
첫 번째는 환각을 어느 정도 허용해도 되는 서비스, 두 번째는 환각을 허용하면 안되는 서비스입니다.

예를 들어, LLM을 활용한 채팅 앱은 전자에 해당합니다. 이 경우 환각이 발생해도 사용자는 허허 웃고 말겠죠. 하지만, B2B라던가 제가 만든 면접 연습 서비스는 후자에 해당합니다. 환각이 발생하면 그 서비스의 품질이 심각하게 떨어지는 것처럼 보일 수 있기 때문입니다.

그래서 프롬프트 결과가 이상한 결과가 나지 않게 하는 노력이 시작 되었습니다. (지옥문을 열어제낀거죠) 🤪🔫

발생했던 문제들

입력의 특성

먼저, 모집 공고와 자소서의 입력 크기는 어느 정도 될까요?

다음은 예시로, 라인 공고 중 하나를 복사한 것입니다. 딱 봐도 문자 수가 많습니다.

LINE ADs Data Engineer는 LINE 광고에서 발생하는 방대한 광고 데이터를 가공하여 활용가능하도록 하는 플랫폼 제작을 담당합니다.
Global Big Tech 회사가 비즈니스를 위해 대용량의 데이터를 어떻게 다루는지 경험할 수 있습니다.

[담당 업무]
- 광고 비즈니스를 위한 데이터웨어하우징/ 배치 / 스트리밍 파이프라인 개발 및 운영
- Container 기반의 데이터 처리 플랫폼 개발
- 각종 데이터 플랫폼 운영 및 개선

[자격 요건]
- 컴퓨터 과학의 기초 지식 (자료구조,알고리즘,네트워크 등)을 이해하고 활용할 수 있으신 분
- Java, Python 등의 프로그래밍 언어에 대한 활용 능력이 있으신 분
- 데이터를 다루기 위한 Python, Scalar, Spark, SQL 등에 대한 이해도가 있으신 분
- 궁금한 점은 스스로 찾아 공부하고 끝까지 파고드는 열정이 있으신 분

[우대 사항]
- Hadoop ecosystem, Kubernetes 등에 대한 이해가 있으신 분
- 데이터 처리를 위한 데이터 파이프라인에 대한 이해가 있으신 분

그리고 자소서 문항은 대부분 3~4개입니다.
또한 자소서 한 문항에 대한 응답은 평균적으로 1000~1500자입니다.
이를 한 번에 프롬프트 입력을 넣으면 어떻게 될까요?

예상하시다시피 GPT 3.5기준으로 토큰 제한에 걸립니다.

GPT 3.5의 한계

저는 프로젝트에 GPT 3.5를 사용하기로 선택했습니다.
이유는 일단 싸고 빠르기 때문입니다.

아무리 GPT4가 성능이 더 좋더라도 느리면 사용자가 도망갈 것 같았습니다. (결과적으로는 옳은 선택이었던게, 현재 기준으로 프로젝트 프롬프트 결과는 3.5임에도 꽤 합리적인 편이며, AWS, 네트워크 I/O 등을 감안하면 3.5 기준으로도 어느 정도 기다려야 하기 때문입니다.)

어쨋든, 그 때 당시엔 지금처럼 결과가 안정적이진 못했습니다.
입력 토큰 제한에 걸리거나, 걸리지 않더라도 소위 말하는 환각 현상이 발생했습니다.

원하는 출력 값은 면접 질문들인데, 엉뚱한 값이 꽤 빈번하게 나왔었습니다.


해결 과정

입력 나누기

먼저 입력 토큰 제한 문제를 해결해야 했습니다.
가장 간단한 방법을 활용했죠.


모집공고 A와 자소서 a,b,c,d가 있다면, 한 입력에 A,a,b,c,d를 넣는게 아니라 (A,a), (A,b), (A,c), (A,d) 처럼 쌍을 묶어서 입력을 넣었습니다.


그럼에도 간혹 토큰이 터졌었는데, 그런 문제는 GPT 3.5 turbo 16k로 바꾸니 발생하지 않게되었습니다.

다른 방법도 시도해보았습니다. 결론부터 말하면 효과가 별로였습니다.


1. Langchain의 SummaryMemory 활용하기
2. Langchain 요약 체인 -> Langchain 출제 체인 (SequentialChain 활용한 것입니다.)

이유는, "요약"때문입니다. 요약이라는 것은 토큰 수를 줄이는데에는 도움이 될 수 있습니다. 하지만 요약한 결과는 요약하기 전 텍스트와 꽤 많이 달라지는 현상이 발생했습니다.

모집 공고와 자소서에서 면접 질문을 내야 하는데, 그 원본이 요약때문에 달라지면 무슨 소용이겠습니까? 😠

논문 참고하기

입력 토큰 수를 해결했어도 역시나 환각 현상은 꽤 많이 발생했습니다. 그래서 삽질 도중에 OpenAI가 제공해주는 논문들을 발견했습니다. 그 때 도움이 많이 되었던 것들을 소개합니다.

아래 내용들은 이미 아실 분들은 다 아실수도 있겠습니다 ㅎㅎ

1. Let's think step by step (CoT)

이 구문을 서두에 기입하세요. 그러면 논문에 소개된 것처럼 GPT의 환각이 많이 줄어듭니다. 제 프로젝트에서도 많은 효과를 봤었습니다. 입력의 길이가 꽤 길어도, 구분자만 잘 해주면 면접 질문들을 잘 뽑아낼 수 있었습니다.

ChatGPT 개발자 핸드북이란 서적에 의하면, 이 구문은 CoT(생각의 사슬) 이라고 불리는 기법을 활성시킨다고 하네요.

2. 상황 및 역할 주입하기

상황이나 역할을 주입하면, GPT가 더 적합한 결과를 찾아와줍니다.

3. 구분자 사용하기

구분자를 잘 활용하는 것 역시 결과 찾기에 도움이 됩니다.

4. 예시 주입하기

GPT는 상식이 없습니다. 그저 흉내낼 뿐이죠. 그래서 알맞은 결과를 찾기 쉽도록 예시를 잘 주입해주어야 합니다.

예를 들어, "IT 면접 질문 중 쿠키와 관련된 질문을 해봐"라고 한다면, 가끔씩 쿠키 조리법을 묻기도 합니다 🤮

프롬프트 예시

다음은 2달 전 버전의 프롬프트 중에서 필터에 해당하는 프롬프트입니다.
괜찮은 예시인 것 같아 공유합니다.
지금은 사용되지 않긴 합니다 ㅎㅎ

                        f"""
                         Let's think step by step.

                        [Situation]
                        You are interviewers working at company in job position {job_group}.
                        You are evaluating the interview candidate's response to the previous interview question.

                        [Evaluation]
                        After analyzing the interviewee's response, please select the option with the highest relevance among the following items.

                        1. Direct request or Repeated requests to repeat the question
                        2. Uncertain responses
                        3. Silence or minimal response
                        4. Off-topic responses
                        5. A standard/interview-appropriate response.
                        
                        (HINT!)The criteria of evaluation:
                        - Direct request: The most definitive criterion is when the candidate explicitly requests further explanation or clarification, such as "I did not understand the question" or "Could you please explain that again?".

                        - Uncertain responses: If a candidate responds to a question hesitantly or ambiguously, or uses uncertain language like 'maybe', 'possibly', 'it could be', the interviewer may infer that they did not fully understand the question.

                        - Repeated requests to repeat the question: If a candidate repeatedly asks for the question to be repeated, they likely did not understand the question.

                        - Off-topic responses: If a candidate's answer is not related to the question or strays from the topic, the interviewer may suspect that the candidate did not properly understand the question.

                        - Silence or minimal response: If the candidate provides no or minimal response to a question, the interviewer may infer that they did not understand the question or are unsure about how to respond.

                        [Conclusion]
                        (This part must not be omitted from the output.)
                        (The beginning of output format must be as follows)
                        "I think it is (only number)"


                        """

위 프롬프트는 면접 지원자의 답변이 "적절한가"를 판단하는 프롬프트입니다. 클래스 이름도 AnswerFilter구요.


보시다시피 4가지를 조합했습니다.


처음에 "Let's think step by step"을 주입했고, 인터뷰어라는 상황과 어떠한 문제를 해결해야 하는지 [situation]에 작성했습니다. 그리고 각 단계는 []이라는 문자로 구분되고 있습니다.

또한 상식이 없는 GPT를 위해서 어떤 것이 적절하지 않은 면접 답변인지 예시를 5개 주고 있습니다.

입출력 예시

정상 답변부터 보죠.

{'question': 'JPA N+1 문제는 언제 발생하나요?', 'answer': '두 개의 엔티티가 1:N 관계이며 JPQL로 객체를 조회할 때 발생합니다. 두 가지 경우로 나뉠 수 있는데요.\n    첫 번째는 ‘EAGER’ 전략으로 데이터를 가져올 경우입니다. 만약 1에 해당하는 엔티티를 조회할 때 ‘즉시 로딩’이라면, N에 해당하는 엔티티들 전부를 일일이 검색하게 됩니다.\n    두 번째는 ‘LAZY’ 전략으로 데이터를 가져온 이후에 해당 데이터와 연관된 엔티티를 다시 조회할 경우에 발생합니다. ‘지연 로딩’일 경우엔 1에 해당하는 엔티티를 조회시 연관된 엔티티들을 프록시로 임시 저장해놓습니다. 하지만, 프록시이기 때문에 N에 해당하는 연관 엔티티들을 실제로 조회할 땐 결국에 N개의 엔티티에 대한 검색이 필요합니다.'}

I think it is 5. A standard/interview-appropriate response.

다음부터는 비정상 답변입니다.

{'question': 'JPA N+1 문제는 언제 발생하나요?', 'answer': '잘 모르겠습니다.'}

I think it is option 2. Uncertain response.
{'question': 'JPA N+1 문제는 언제 발생하나요?', 'answer': '...네?'}
I think it is 1. Direct request or Repeated requests to repeat the question
{'question': '당신이 경험한 가장 큰 프로젝트 실패는 무엇이었고, 그로 인해 어떤 배움을 얻었나요?', 'answer': "제가 이해를 잘 못했는데, '프로젝트 실패'라는 것이 구체적으로 어떤 상황을 말씀하시는 건가요?"}

I think it is 1. Direct request or Repeated requests to repeat the question.
{'question': '문제 해결에 어떤 접근 방식을 취하는지 설명해 주십시오.', 'answer': '하늘 끝에서 흘린 눈물이 비 되어 내리면'}


I think it is 4. Off-topic response.

맺으며

다음 시리즈인 프롬프트로 switch ~ case 구현하기에서 뵙겠습니다. 감사합니다.


참고 링크

https://github.com/openai/openai-cookbook/blob/main/articles/techniques_to_improve_reliability.md

참고 사항

이 글은 벨로그에도 게시되는 글이며, 모든 예제는 GPT-3.5 기준으로 작성되었습니다.

모두의 인터뷰

자소서 기반 개인 맞춤형 면접 질문과 꼬리 질문을 제공하는 면접 연습 서비스

8
2
양영준

양영준

LLM 개발 경험 공유 - (0)

안녕하세요, LLM을 활용해서 면접 서비스를 개발하고 있어요.

3개월 동안 발생했던 문제들과 그 해결 과정을 시리즈로 쓰려고 합니다. 🥰

다음은 시리즈 목차에요.

(1) COT와 Few Shot Prompt 조합하기

(2) 프롬프트로 Switch ~ Case 문 구현하기

(3) 프롬프트 파이프라이닝 구현

(4) 비동기로 작업의 효율성 높이기

(5) GPT 답변 일정하게 만들기 (부제 : HumanMessage의 강력함)

(6) 트래픽이 갑자기 몰려 토큰 사용량이 터졌어요!

여러분께 흥미로운 내용이 됬으면 좋겠습니다! (시리즈 순서는 달라질수도 있습니다.)
많은 관심 부탁드립니다~

모두의 인터뷰

자소서 기반 개인 맞춤형 면접 질문과 꼬리 질문을 제공하는 면접 연습 서비스

9
1
양영준

양영준

취준생을 위한 면접 연습 서비스, 모뷰를 만들면서 마주쳤던 문제들

다음은 SW 마에스트로에서 LLM 서비스를 만들면서 느꼈던 것들을 정리한 글입니다.

(참고로, 이번 달 내로 저희 서비스를 보여 드릴 예정입니다~)

LLM 개발은 쉬워 보였습니다.

LLM 개발을 하기 전에 생각했던 것중 가장 첫 번째가 "그냥 ChatGPT에게 보내면 끝 아닌가?"였습니다…

그래서 처음엔 배울게 없을거라 느꼈습니다. 하지만 그건 오산이었습니다. LLM app 개발은 생각보다 어려움이 많았습니다.

특히 어려운 것은, toy project 수준이 아니라 production 수준까지 끌어올리는 것이었습니다.

LLM 어플리케이션 개발에서 어려웠던 일들

1. LLM은 생각보다 멍청하다.

Chatgpt 할루시네이션은 유명하죠. 이는 제가 작업을 할 때도 마찬가지였습니다.

제가 무언가를 원해도 헛소리를 하는 경우가 많았습니다.

 특히 복잡한 작업일 때 더더욱 그랬는데요. 

예를 들어, “A를 참고하여 B를 하고, 포맷형식은 C로 해달라”라고 한 번에 프롬프트를 보내면, 적절하지 않은 답변을 낼 때가 많았습니다.

하지만 이러한 문제는 고급 프롬프팅 기법을 참고하더니 좀 완화 되더군요… (참고 링크는 아래에 첨부드릴게요!)

그리고 결과에 대한 형식을 지정 해도 100% 동일 하리란 보장을 하기가 어려웠어요. 

정규 표현식 에러를 일으키는 경우가 빈번하게 있었습니다.

2. 선례가 없다.

Spring security, JPA... 이런 건 Well known 영역이에요. 누군가 해당 문제를 풀어본 적이 있고, 구글링하면 정보를 얻기 쉬운 것들이죠. GPT도 어느 정도까지는 잘 알려 줍니다.

그런데 Prompt engineering, 특히 LLM을 제어해야 할 필요가 있을 때 선례를 찾기가 힘들었어요… 

그래서 삽질해가면서 스스로 검증해 나갔어요. 여러가지 가설과 프롬프트 예시들을 세워놓고, 쥬피터 노트북을 키고 코딩 해가며 제일 괜찮은 프롬프트를 찾았습니다.

만약 LLM 서비스를 목표로 한다면, 처음엔 text in text out 으로 CLI 프로그램을 짜서 실제로 잘 작동하는 지 먼저 검증하는 것을 추천드려요.

그리고나서 간단한 플로우와 모듈이 구상된다면, 그 다음부터 아키텍쳐 설계를 해나가는게 좀 더 낫더라고요! (이것 역시 선례가 없기 때문에 직접 부딪혀가며 알아가는게… ㅠ)

3. 테스트하기 어렵다. (== 성능 측정이 어렵다.)

첫 째, 프롬프트 날리는 걸 테스트 코드로 작성하기 어렵습니다.
테스트 입력은 고정되어 있지만, 테스트 출력은 아니에요… 심지어 gpt call은 api 이용료까지 들기 때문에, 모킹 없이 한다면 테스팅도 돈이 듭니다. 

둘 째, gpt의 출력값을 어떤 방식, 어떤 기준으로 측정할지가 어렵습니다.

이는 논문에서도 많이 나오고 있는 문제인데요. 논문에서도 사람이 보고 판단해서 수작업으로 라벨링하고 있거나, 다른 LLM한테 평가를 맡기는 식으로 많이 하더군요…

(그래서 저도 “마음”을 써서 프롬프트 성능을 측정했습니다! ^^;;)

결론

그래도 LLM이 주는 장점은 많다고 봅니다.

이유는 다음과 같습니다.


1. 기존 ai의 문제점인 데이터 라벨링 등의 수작업이 없어져서 AI 서비스를 더 쉽게 만들 수 있게 된 것 같습니다. (물론 이는 gpt 결과 테스트할 때 라벨링의 숙제로 미뤄지는 것과 같긴 합니다만 ㅋㅋ;;;)


2. ai 잘모르는 사람도 쉽게 창의적인 앱을 만들 수 있게 됬습니다. (백엔드건 프론트엔드건 ai를 프롬프트로 건들 수 있게 됐으니까요.)

하지만 재밌는 app을 만들긴 쉽지만, 제품 수준의 app을 만들긴 어렵습니다. 왜냐면 제품 수준 app은 할루시네이션이 나오면 치명적이기 때문이에요. 이러한 할루시네이션을 어떻게 최소화하면서도, gpt call을 줄여나갈지가 새로운 문제이겠습니다. 그리고 성능 측정과 테스트도 새로운 문제이겠죠.

참고 링크

Prompt Engineering Guide | Prompt Engineering Guide (promptingguide.ai)

openai-cookbook/techniques_to_improve_reliability.md at main · openai/openai-cookbook (github.com)

9
0

포스트

아직 포스트가 없습니다.