개발자로 후회없는 삶 살기

네 번째 미션(한국어 ChatPDF 개발) 본문

[인턴]/[Annotation-AI]

네 번째 미션(한국어 ChatPDF 개발)

몽이장쥰 2023. 5. 21. 15:28

서론

5월 말에 국가 기관에 시연을 하기 위해 한국어 ChatPDF를 개발하는 과제를 받았습니다. 현재까지 진행 상황을 정리합니다.

 

본론

1. ChatGPT API 키로 직접 Chat PDF 어플리케이션 만들기
2. 텍스트 넣으면 요약, 분석해서 답해주는 LLM 조사

 

- ChatGPT API 키로 직접 Chat PDF 어플리케이션 만들기

1) PyPDF2로 pdf에서 텍스트 추출

reader = PdfReader("/content/sample2.pdf")

raw_text = ""

for i, page in enumerate(reader.pages):
    text = page.extract_text()
    if text:
        raw_text += text

raw_text[:1000]

원하는 PDF 경로를 지정하고 위 코드를 실행하면

 

파이썬 라이브러리를 사용해서 PDF에서 텍스트를 추출할 수 있습니다.

 

2) 특이사항

추출한 텍스트를 ChatGPT를 호출하여 원하는 답변을 할 수 있는지 테스트합니다. 현재 방식은 인사이트를 얻기 위한 과정으로 ChatGPT를 사용했을 경우 내부 데이터 보안 문제가 발생할 수 있습니다. 사용 후 특이사항을 정리해 봅니다.

 

① 요금

OpenAI는 ChatGPT API를 호출해 사용할 경우 과금을 적용하고 10만 토큰 정도 분량의 영어로 된 pdf(180 페이지)를 요약하는데 600원 정도 나옵니다. 또한 추론을 할 때마다 PDF 요약한 내용을 입력하기 때문에 180 페이지 분량의 PDF라면 한 개의 질문에 3분 이상의 시간이 걸릴 때도 있습니다.

 

② 활용 모델

gpt3뿐 아니라 gpt4와 gpt 3.5 터보도 가능합니다.

 

③ pdf 이슈

입력하는 pdf의 경우 파일을 열고 드래그 했을 때 텍스트가 드래그 되는 PDF만 가능합니다. 드레그가 안 되는 텍스트는 추출이 안 됩니다.

 

-> 결론

pdf로부터 텍스트 추출하는 것과 추출한 텍스트를 요약, 분석할 수 있는 오픈소스 모델 2가지만 해결되면 ChatPDF를 만들 수 있습니다. 1번은 해결 했으니 오픈소스 모델만 조사하면 되겠다는, 인사이트를 얻었습니다.

 

- 텍스트 넣으면 요약, 분석해서 답해주는 LLM 조사

https://github.com/airobotlab/KoChatGPT

 

GitHub - airobotlab/KoChatGPT: ChatGPT의 RLHF를 학습을 위한 3가지 step별 한국어 데이터셋

ChatGPT의 RLHF를 학습을 위한 3가지 step별 한국어 데이터셋. Contribute to airobotlab/KoChatGPT development by creating an account on GitHub.

github.com

해당 레포지토리를 참고하였습니다.

 

1) 1단계

PDF 내용으로 질의응답을 하는 QnA 모델을 학습합니다.

 

-> 학습 데이터

사내에서 30000개의 PDF 질문 데이터 셋을 보유하고 있습니다.

 

질문 데이터를 ChatGPT API를 활용하여 질문 답변 쌍 데이터로 만듭니다. 저희는 ChatGPT같은 한국어 기반 chatPDF를 만드는 것이 목표이기 때문에 유창한 언어 실력을 위해 다른 LLM이 아닌 ChatGPT를 목표로 잡았습니다.

 

-> base 모델

KoGPT2를 base 모델로 합니다. GPT2는 GPT3보다 훨씬 적은 양의 파라미터를 가지고 있기에 기존에 알고 있는 정보를 바탕으로 해석하는 경향을 해소하는데 적합하다고 판단했습니다. 앞서 말한 것처럼 저희는 KoChatGPT를 만드는 것이 목표라서 OpenAI에서 공개된 ChatGPT 학습 방법을 사용할 것입니다.

 

 

-> 스텝 1 학습 결과

① 1 에폭 학습

질문 : 한국의 skt는 어떤 회사야?
답변 : 인터넷 검색을 하세요.

 

질문 : 한국의 수도는?
답변 : 정확한 답변을 드릴 수 없습니다. 하지만 한국의 수도는 서울입니다.

 

단순 QA 모델이고 기학습 모델인데도 1 에폭 튜닝 결과 아직 정확한 질의 응답을 하지 못 합니다.

 

① 10 에폭 학습

질문 : 한국의 skt는 어떤 회사야?
답변 : 저는 AI라서 정보가 없습니다. 하지만 한국 SKT는 스마트폰과 탬플릿 등 다양한 제품을 생산하는 제조업 회사입니다.

 

질문 : 한국의 수도는?
답변 : 한국의 수도는 서울입니다.

 

10 에폭 학습 결과 아직 만족스럽지 않지만 비교적 나아진 결과를 보입니다. 현재 학습시킨 모델은 일반 QnA 모델로 질문에 대한 답변만 할 뿐 챗봇처럼 유연한 대답은 못 합니다.

 

2) 2단계

스텝 2의 목표는 보상 모드를 만드는 것 입니다. 모델이 만든 답변이 사람이 읽기에 좋은 글인지 아닌지 판단을 하는 채점기를 투입하여 모델이 보다 더 인간적인 답변을 내는 결과를 만들도록 하는 것입니다.

 

이번에 학습시킨 데이터 셋은 답변에 랭킹이 있습니다. 3개의 챗봇 모델(ChatGPT, Bard, KoAlpaca)에 하나의 동일 질문을 하여 답변을 받습니다. 저희는 ChatGPT를 만드는 것이 목표이기에 ChatGPT가 만든 답변을 1등으로 하고 다른 두 모델이 한 답변은 2, 3등이라고 명시했습니다. 이렇게 사람에 손이 들어가지 않고 랭킹 데이터 셋을 만들었고 보상기를 학습 시켰습니다.

 

3) 3단계

스텝 3에서 할 것은 스텝 1에서 만든 QnA 모델이 한 답변을 채점기를 통해 피드백을 내리는 RLHF(Reinforcement Learning from Human) 강화 학습입니다.

 

PPOTrainer는 OpenAI에서 제공하는 Cartpole을 RL environment로 지정해 주고 강화 학습을 할 수 있는 환경을 제공합니다.

 

-> 스텝 3 학습 결과

입력한 PDF 내용은 '제주 제 2공항 건설 사업의 재개와 진행 일정'을 담고 있습니다.

 

① 1 에폭 학습

질문 : 아래 내용 요약해줘 ~ (PDF 내용)
답변 : 아예 관련없는 내용

1 에폭 학습 결과 전혀 관련 없는 내용을 답변합니다.

 

① 10 에폭 학습

질문 : PDF 내용 요약해줘
답변 : 제공되는 정보로는 "제주 제 2공항 건설 사업의 기본계획의 수립은 언제든 가능"하다는 내용입니다.

 

질문 : 이 내용에서 공항정책관이 한 말이 뭐야?
답변 : 이 문장에서는 공항이 생긴 배경과 이유, 주민 의견, 국제공항의 계획 등과 같은 것들을 구체적으로 언급하면서, 그 과정에서 지역 주민들의 의견과 감정을 반영하고자 한다. 이에 따라, 지역사회의 의견과 수용도가 높은 우선순위를 반영하여 계획안을 도출하는 것이 중요하다.

 

10 에폭 학습 PDF의 내용을 이해하고 요약, 분석하는 법을 알고 있습니다. 일반 질의응답 모델을 PDF 데이터로 튜닝하여 도메인을 지정하고 강화 학습으로 챗봇으로 만들었기에 이런 결과를 얻을 수 있습니다.

 

-> ✅ 프롬프트에 힌트 제공하기

강화학습을 통해 보다 인간적이고 안정적인 결과를 보이긴 했지만, 환각 현상이 유지되는 문제가 있었습니다. 따라서 새로운 챗봇 프로세스 아이디어를 제안했습니다.

 

 

META AI의 Retrieval 방식에서 영감을 얻은 방법으로, 추출한 raw text를 챗봇에게 전달하기 전, QA 모델에게 전달하고 그 결과를 챗봇이 사용자 질문에 대한 답변을 찾는 소스로 사용합니다. QA 모델은 답변을 생성할 때 context 상에서 답변이 되는 단어뭉치를 그대로 반환하기 때문에, 단답형으로 대답하며, QA 모델이 생성한 답변과 질문을 챗봇에게 전달할 때 "해당 {질문}에 대한 정답은 {힌트}입니다. 이를 바탕으로 답변하시오"라는 프롬프트로 묶어 전달합니다.

 

[한국어 BERT QA 테스크 튜닝]

 

AI hub의 일반상식 데이터를 활용한 Question & Answering

서론 이 프로젝트는 BERT의 specific task 중 하나인 Q&A를 한국어 위키백과 데이터로 fine tuning 하고 한국어로 BERT 모델과 질의응답을 하는 것을 목표로 합니다. -> 전체 코드 https://github.com/SangBeom-Hahn/Qu

hsb422.tistory.com

QA 모델은 BERT를 사용하였으며, 해당 내용은 저의 이전 블로그를 참고했습니다.

 

동일 raw text에 대해 BERT의 답변을 추출합니다. 지문의 주제에 대해 질문하니 지문에서 예측결과를 찾고  단답형으로 반환합니다.

 

-> 🚨 새로운 프로세스 적용 실험

10 에폭 학습시킨 챗봇을 대상으로 새로운 프롬프트를 적용한 실험을 진행했습니다. 결과적으로 챗봇은 프롬프트에 따라 질문에 대한 정답을 매끄럽게 설명하고, 환각 증상이 감소했습니다.

 

-> QA 모델과 ChatPDF의 상관 관계와 환각 증상

QA 모델의 답변 성능이 높을수록, KoGPT2가 모르는 내용이 많을수록 성능이 향상되었습니다. 환각 증상은 언어 모델이 알고 있는 정보가 많으면 새로운 instruct을 부여해도 기존에 자신이 알고 있던 정보를 우선적으로 답변하는 결과로 인해 나타납니다.

 

EX) 대한민국 헌법에 대해 잘 알고 있다 보니, 헌법에 대한 내용을 살짝 바꾸어서 전달해도 기존의 자신이 알던 헌법을 바탕으로 답변.

위와 같은 문제를 해결하기 위해선 범용성을 키운 대규모 언어 모델보다는 비교적 작은 규모의 언어 모델에 특정 테스크에 맞게 튜닝하는 것이 적절하다고 판단됩니다.

 

결론

에폭을 늘리니 좀 더 성능이 좋습니다. 하지만 이 방법 또한 에폭을 늘리니 디스크 초과가 발생합니다. 현재 환경에서는 10 에폭이 최선으로 A100 환경에서 학습한다면 훨씬 좋은 성능을 기대할 수 있습니다.

Comments