현재 제가 속한 팀에서는 졸업프로젝트로 '믿어방'이라는 서비스를 개발하고 있습니다.
믿어방은 사회초년생의 전월세계약을 더 쉽고, 편리하게 만들어주는 서비스입니다.
해당 포스팅에서는 ChatGPT를 적용하여 현재 서비스의 기능을 개선해보고자 합니다.개선해보고자 하는 기능은 임대차계약서 특약 분석
기능입니다. (프로덕션에는 API를 사용하기 때문에 정확히는 gpt-3.5-turbo 모델을 사용합니다.)
해당 기능의 워크플로우는 다음과 같습니다.
- 사용자가 특약을 분석하고 싶은 임대차계약서의 사진을 찍어 업로드한다.
- 업로드된 사진에서 OCR 기술을 이용해 특약 문장을 추출한다.
- 추출된 특약 문장이 믿어방에서 사전에 구축한 52개의 특약 케이스중 무엇에 해당하는지 도출한다.
- 도출된 케이스에 기반하여 사용자에게 해당 특약과 관련된 설명과 분석레포트를 제공한다.
이때 3번 단계에서 사용자로 얻은 특약이 어떤 특약 케이스에 해당하는지 알기 위해 기존에는 KoNlpy를 이용한 형태소 추출과 TF-IDF 코사인 유사도 계산 방식을 사용하였습니다.
하지만 TF-IDF를 사용한 현재 방식에는 유의어와 패러프레이징된 문장을 고려하기 어렵다는 한계가 있습니다.
예를 들어 '차임'과 '월세'처럼 같은 뜻을 가지는 유의어들이 TF-IDF를 위한 데이터셋에 모두 포함되어 있지 않거나, 비슷한 맥락의 문장이라도 전혀 다른 형식과 구조로 작성되어 있을 수 있습니다.
그렇다면 이렇게 TF-IDF로도 잡아내지 못하는 유사한 문장들은 어떻게 처리하면 좋을까요?
우선 제대로된 프롬프트를 작성하여 질의하는 것이 원하는 답을 도출하기 위한 가장 이상적인 방법일 것입니다.
따라서 프롬프트의 작성 패턴을 공식화하여 원하는 답변을 ChatGPT로부터 얻어내고자 합니다.
프롬프트 작성 패턴 분석은 다음 논문을 참고하였습니다.
A Prompt Pattern Catalog to Enhance Prompt Engineering with ChatGPT
Jules White, Quchen Fu, Sam Hays, Michael Sandborn, Carlos Olea, Henry Gilbert,Ashraf Elnashar, Jesse Spencer-Smith, and Douglas C. Schmidt Department of Computer Science Vanderbilt University, Tennessee Nashville, TN, USA
A Prompt Pattern Catalog to Enhance Prompt Engineering with ChatGPT
프롬프트 엔지니어링은 ChatGPT를 프로덕션에 적용하여 원하는 답변을 안정적으로 얻기 위해 필요합니다. 따라서 구체적인 프롬프트 예시에 집중하지 않고, 거시적으로 프롬프트 패턴을 식별하여 믿어방 서비스에 적용할 수 있는 프롬프트 패턴을 도출하고자 합니다.
LLM(Large Language Model)이 입력을 이해하는 방법과 입력을 출력 생성에 사용할 수 있는 것으로 변환하는 방법을 다룹니다
LLM에서 생성된 출력의 유형, 형식, 구조 또는 기타 속성을 제한하거나 조정하는 데 중점을 둡니다.
공인중개사
또는 변호사
등의 페르소나를 설정하고 페르소나에 적합한 역할을 구체적으로 부여할 수 있습니다.의도
LLM의 출력이 구조적으로 템플릿을 준수하도록 합니다.
적용
구조
예시
"당신의 출력을 위한 템플릿을 제공하겠습니다. 대문자로 된 모든 것은 플레이스홀더(자리 표시자)입니다. 텍스트를 생성할 때, 제가 나열한 플레이스홀더 중 하나에 맞춰 넣어주세요. 제공한 서식과 전체 템플릿을 유지해주세요.https://myapi.com/NAME/profile/JOB에서제공한 것과 같습니다."
프롬프트가 제공된 후에 나타난 예시 대화는 다음과 같습니다.
User: "사람의 이름과 직함을 생성해주세요."
ChatGPT: "https://myapi.com/EmilyParker/profile/Software Engineer"
이미지 생성용. 믿어방 서비스에는 불필요하기 때문에 생략합니다.
LLM에서 생성된 출력의 오류를 식별하고 해결하는 데 중점을 둡니다.
사실 믿어방에서는 ChatGPT에 오류 식별 기능을 요구하지 않습니다. 가장 정제된 단일한 질문으로 최적의 답을 얻는 것이 이번 ChatGPT 적용의 목적입니다. 따라서 Error Identification에 해당되는 프롬프트 패턴은 배제하였습니다.
입력 및 출력의 품질을 개선하는 데 중점을 둡니다.
경험적으로 보면 패턴을 적용하지 않아도 대부분 해당 패턴에서 얻고자 하는 형식의 답을 내놓았습니다. 따라서 자세한 설명은 생략합니다.
사용자와 LLM 간의 상호 작용에 초점을 맞춥니다. 믿어방에서는 gpt3.5 turbo API를 사용하기 때문에 적용이 어렵습니다. Interaction으로 분류되는 프롬프트 패턴은 필요하지 않기 때문에 배제합니다.
믿어방의 기능에 적용할 수 있는 유의미한 프롬프트 패턴은 다음과 같습니다.
1. Persona Pattern
2. Template Pattern
결론적으로 프롬프트 패턴을 정형화하는 것만으로는 일정하게 원하는 답변을 얻기 어려웠습니다. 특히 글의 맥락을 이해해야 답할 수 있는 문제에는 매우 취약했습니다.
일단 이 문제를 해결하기 위한 해결책을 무작정 구글링하여 찾아보았습니다. 유의어 분석, 패러프레이징 문장 분석, 문장 유사도 등등의 키워드로 검색을 이어나가보죠.
결론적으로 우리가 현재 해결하고자 하는 문자는 자연어 이해(NLU, Natural Language Understanding
영역의 문제임을 알 수 있었습니다. 따라서 NLU 영역에서의 ChatGPT의 유효성을 검증하고, 퍼포먼스를 개선하는 방향을 이어서 찾아보고자 합니다.
그렇다면 NLU는 무엇일까요?
NLP는 많이 들어보셨을 것입니다. Natural Language Process로 말그대로 자연어처리를 일컫습니다.
이때 NLP는 NLU와 NLG로 나뉠 수 있습니다.
NLU(Natural Language Understanding)
GLUE 벤치마크
를 통해 성능을 체크합니다.NLG(Natural Language Generation)
ChatGPT가 기존 LLM보다 생성 작업(NLG)에 뛰어나다는 것은 이미 널리 알려진 사실입니다.
하지만 ChatGPT가 자연어 이해(NLU) 작업에도 유효한가에 대한 증명은 여전히 불분명합니다.
따라서 다음 논문을 통해 그 문제에 대해 분석해보고자 합니다.
Can ChatGPT Understand Too?
A Comparative Study on ChatGPT and Fine-tuned BERT
(Qihuang Zhong, Liang Ding, Juhua Liu, Bo Du, Dacheng Tao)
https://arxiv.org/abs/2302.10198#
NLU에 대한 성능을 평가하기 위해 세가지 요소를 평가합니다.
모델 평가 목적으로 널리 사용되는 GLUE 벤치마크
를 사용합니다.
BERT 모델과 ChtatGPT를 비교한 결과, 아래 표에서 확인할 수 있듯이 자연어 추론 부분에서는 ChatGPT가 BERT 모델을 능가하는 성능을 보여줬습니다.
하지만 패러프레이즈와 텍스트 유사성 판단에서는 아래 자료와 같이 ChatGPT가 BERT 모델에 못 미치는 결과를 보여줬습니다. 좌측이 패러프레이징 능력을 나타내는 MRPC 테스트 결과, 우측이 유사성 판단 능력을 나타내는 테스트 결과입니다.
구체적인 예시를 통해 패러프레이징 능력을 확인해보겠습니다.프롬프트에서 제시한 두 문장의 주요한 차이는 “값”의 차이입니다.
하지만 ChatGPT는 대략적인 의미와 (값의 차이에서 오는)세밀한 의미 정보 간의 불일치를 파악하지 못하고 같은 semantic(의미)을 갖고 있다고 판단했습니다.
달리 말하면 ChatGPT가 세밀한 의미 정보를 추출하는 능력을 강화한다면 패러프레이징 성능의 향상으로 이어질 수 있습니다.
그렇다면 프롬프팅 전략을 달리하면 ChatGPT의 퍼포먼스를 향상시킬 수 있지 않을까요?
적용할 프롬프팅 전략은 다음과 같습니다.
앞서 제시된 새로운 프롬프팅 전략에서 few-shot 프롬프팅
과 zero-shot 프롬프팅
의 개념이 등장합니다.
shot(샷)은 "예제"로 이해하면 쉽습니다.
few-shot 프롬프팅 : 2개 이상의 예제를 제공합니다.
zero-shot 프롬프팅 : 모델에게 예제를 제공하지 않습니다.
Self-consistency improves chain of thought reasoning in language models
(Xuezhi Wang, Jason Wei, Dale Schuurmans, Quoc Le, Ed Chi, and Denny Zhou)Self-Consistency Improves Chain of Thought Reasoning in Language Models
앞서 언급한 shot의 개념과 CoT의 개념이 어떻게 적용되는지 확인할 수 있습니다.
1. 앞서 제시한 세가지 전략 모두 성능 향상에 기여했습니다.
특히 Manual few-shot CoT prompting 전략은 ChatGPT가 약세를 보였던 패러프레이징과 유사성 판단 작업에서 유의미한 개선을 보여줬습니다.(값이 높을수록 우수합니다.)
2. 1-shot 전략의 성능은 사용하는 예시에 매우 민감합니다.
: 예시가 하나 뿐이기 때문에 테스트 데이터간의 correlation에 크게 영향을 받기 때문입니다.
현재 믿어방 서비스에서는 다음과 같이 유사성 판단을 위해 few-shot CoT 프롬프팅
을 적용한 프롬프트 엔지니어링 방법을 채택하였습니다.
completion = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": f"Q: For the sentence pair '계약 연장은 계약 만기 3달 전까지 갱신 의사를 밝혀야만 가능하다.' and '계약 만기 5개월 전 까지 재계약 의사를 밝히지 않은 경우, 계약은 만료되는 것으로 간주한다.', do these two sentences have the same semantics?"},
{"role": "assistant", "content": " First, identify the key differences between the two sentences. Second, consider the impact of the difference in wording. Third, consider the overall meaning of the two sentences. Therefore, given that the two sentences convey the same general idea, despite the difference in wording, we can conclude that they have the same semantics. The answer (yes or no) is: yes."},
{"role": "user", "content": f"Q: For the sentence pair {st1} and {st2}, do these two sentences have the same semantics? The answer (yes or no) is: ____"}
],
temperature=0,
)
단순히 두 문장 input이 유사한지를 묻는 프롬프트를 작성했을 때보다 더 나은 유사성 판단력을 보여주었습니다.