정답 열쇠: NLP로 질문 응답의 잠재력 열기
머신러닝에서의 질문 응답을 깊이 있게 탐구하며, 과제, 기법, 모델을 살펴보고 단계별 Python 코드 예제를 제공합니다. 이 글은 AI 번역본입니다. 오역이 있을 경우 댓글로 알려주세요.
Created on September 15|Last edited on September 15
Comment

이 글에서는 머신러닝에서의 질문 응답(QA)의 기본을 살펴보고, 모델을 만드는 과정의 개요와 주요 과제, 그리고 적용 분야를 소개합니다.
이 분야가 처음이든, 이해를 더 깊게 하고 싶든, 이 글은 질문 응답(QA)에 대한 종합적인 입문을 제공합니다. 질문 응답의 흥미로운 세계와 그것이 다양한 NLP 작업을 어떻게 향상시키는지 배울 준비를 하세요.
이번 글에서 다룰 내용은 다음과 같습니다:
목차
AI에서의 질문 응답(QA)이란?NLP에서의 질의응답(QA)이란?질의응답(QA)의 과제는 무엇인가?생성형 질문응답이란?질문응답 시스템은 어떻게 만들까요?질문 응답을 위한 데이터셋Hugging Face로 질문 응답 처리하기튜토리얼1단계: 필요한 라이브러리 불러오기2단계: 사전 학습된 모델 불러오기3단계: 테스트 샘플 만들기4단계: Answer_text와 질문 토크나이즈하기5단계: 어텐션 마스크 생성하기6단계: 모델 출력 얻기7단계: 시작 인덱스와 종료 인덱스 정의하기8단계: 최종 답변 디코딩하기출력결론
AI에서의 질문 응답(QA)이란?
질의응답 (QA) 인공지능에서의 질문 응답(QA)은 기계가 자연어로 제기된 질문에 답할 수 있는 능력을 말합니다. 이 기술의 주요 목적은 방대한 데이터에서 관련 정보를 추출하여 간결한 답변 형태로 제시하는 것입니다.
이를 위해 AI 연구자와 엔지니어들은 질문 응답(QA) 모델로 알려진 특수한 유형의 모델을 개발했습니다.
이러한 모델은 질문을 입력받아 방대한 텍스트 데이터를 처리하고 가장 정확한 답을 도출합니다. 예를 들어 “세계에서 가장 높은 산봉우리는 무엇인가?”라는 질문에 대해, QA 모델은 자신의 말뭉치를 검색해 “에베레스트산”이라는 답을 반환합니다.
QA 모델의 궁극적 목표는 질문의 의미를 제대로 이해하고 맥락에 맞는 관련성 높은 답을 제공하는 것입니다. QA 모델의 성패는 다양한 질문에 대해 정확하고 의미 있는 답변을 얼마나 잘 제공하느냐로 평가됩니다.
NLP에서의 질의응답(QA)이란?
의 질의응답(QA) 자연어 처리는 자연어로 제기된 질문에 인간에 가까운 응답을 제공하는 것을 목표로 하는 연구·개발 분야입니다. 이 시스템의 목표는 질문의 맥락을 이해하고, 관련 정보를 검색하며, 정확한 답을 제시하는 것입니다.
최근 몇 년 사이 대화형 AI 시스템과 가상 비서에 대한 수요가 증가하면서 NLP 분야의 질의응답(QA) 기술 발전이 가속화되었습니다. 이러한 시스템은 정보 검색, 텍스트 분류, 머신러닝 등 정교한 NLP 기법에 의존하여 질문을 분석하고, 관련 정보를 찾아, 답변을 생성합니다. 이를 통해 지식이 풍부한 사람에게 질문했을 때와 유사한 사용자 경험을 제공하는 것을 목표로 합니다.
질의응답(QA)의 과제는 무엇인가?
질의응답(QA)은 효과적으로 작동하기 위해 여러 과제를 해결해야 하는 어려운 작업입니다. 다음은 해결해야 할 주요 과제들입니다:
- 질문의 의미 이해하기 첫 번째 과제는 문장이 복잡하거나 모호하더라도 질문 뒤에 있는 의도를 파악하는 것입니다. 이를 위해 AI 시스템은 자연어에 대한 깊은 이해와, 발음이나 표현이 비슷한 단어와 구를 구별하는 능력을 갖춰야 합니다. 이러한 지점에서 모델의 효과가 드러납니다. 일반적으로 모델이 복잡해질수록 실제 맥락을 더 깊이 이해하고 반영할 수 있습니다. 이는 매우 중요합니다. 대부분의 경우 주어진 질문은 바꿔 말해질 수 있고, 불명확할 수 있으며, 효과적으로 답하려면 ��로 떨어진 여러 문장을 종합해야 할 때도 있기 때문입니다.
- 정보 검색하기 또 다른 중요한 과제는 방대한 데이터에서 관련 정보를 추출하는 것입니다. AI 시스템은 필요한 답을 제공하기 위해 방대한 텍스트 데이터를 효율적으로 검색할 수 있어야 합니다. 이를 위해 의미 분석, 정보 추출과 같은 정교한 정보 검색 기법을 활용합니다. 예를 들어 획기적인 AI 도구인 ChatGPT는 대규모 데이터로 학습되었으며, 텍스트 데이터 45테라바이트. 여전히 몇 초 만에 필요한 답을 반환할 수 있음에도 불구하고.
- 지식 표현하기 정확한 답을 제공하려면, AI 시스템은 처리하는 데이터에 담긴 지식을 이해하고 표현할 수 있어야 합니다. 이를 위해 온톨로지와 의미 네트워크 같은 고급 지식 표현 기법을 사용해 정보를 분류하고 조직합니다. 이러한 기법의 주된 목적은 문장 안에서 서로 다른 단어들이 어떻게 연관되는지 모델이 이해하도록 하는 데 있습니다. 이를 위해 단어 토크나이즈가 필요하며, 텍스트를 토큰이라 불리는 더 작은 단위로 분해해 컴퓨터 프로그램이 분석하고 처리할 수 있게 합니다.
- 맥락적 추론 질문의 의미를 이해하는 것뿐 아니라, AI 시스템은 질문이 놓인 맥락을 파악하고 그 맥락에 적합하고 관련성 있는 답을 제공해야 합니다. 이를 위해 시스템은 서로 다른 정보 조각들 간의 관계를 깊이 이해하고, 그 관계에 근거해 판단을 내릴 수 있어야 합니다.
- 정답 검증하기 마지막으로, AI 시스템은 출처의 신뢰도와 잠재적 편향 같은 요소를 고려해 자신의 답변의 정확성을 검증할 수 있어야 합니다. 이를 위해서는 정보를 비판적으로 평가하고, 여러 증거원을 기반으로 판단을 내려야 합니다. 아울러 이러한 모델은 사람에 의해 생성된 데이터로 학습되며 그 안에는 종종 부정확성이 포함되므로, 모델의 정확성에 과도하게 의존해서는 안 됩니다.
생성형 질문응답이란?
생성형 질문응답은 고전적인 질문응답 문제를 다루는 최첨단 접근법입니다. 기존의 QA 시스템이 이미 존재하는 출처에서 정보를 단순히 찾아오는 것과 달리, GQA 시스템은 학습한 지식을 바탕으로 스스로 답변을 생성할 수 있습니다.
이는 더 창의적이고 미묘한 응답을 위한 새로운 가능성을 열어 줍니다.

OpenAI의 GPT-3, 그 구성 요소인 ChatGPT를 포함하여, 생성형 질문응답(GQA) 모델로 볼 수 있습니다. GPT-3는 대규모 언어 생성 모델을 사용해 질문과 프롬프트에 대한 텍스트를 생성함으로써 사실상 질문에 답합니다. 방대한 텍스트 데이터로부터 학습한 정보를 바탕으로 새로운 답변을 생성할 수 있으므로, 생성형 질문응답의 한 형태입니다.
예를 들어 ChatGPT를 사용할 때 질문을 입력하면, 모델은 학습된 데이터를 바탕으로 텍스트 답변을 생성합니다. 이는 기존의 출처에서 정보를 단순히 검색하는 데 그치지 않고 새로운 답변을 생성할 수 있으므로, 더 역동적이고 창의적인 질문응답 경험을 제공합니다.

GQA 시스템은 가상 비서, 고객 지원 봇, 교육 플랫폼 등 다양한 애플리케이션에 빠르게 도입되고 있습니다. 새로운 답변을 생성하는 능력은 이러한 분야에 상호작용성과 사용자 참여를 한 차원 끌어올리는 효과를 더합니다.
질문응답 시스템은 어떻게 만들까요?
질문응답 시스템을 만드는 과정은 다음과 같은 단계로 나눌 수 있습니다:
- 데이터 수집 및 전처리: 가장 먼저 필요한 것은 시스템이 학습할 대규모 텍스트 말뭉치입니다. 이 데이터는 뉴스 기사, 서적, 데이터베이스 등에서 수집할 수 있습니다. 그다음 데이터 정제와 포맷팅을 통해 후속 처리에 적합한 형태로 준비해야 합니다. 여기에는 불필요한 정보를 제거하고, 어간 추출이나 표제어 처리(레mmatization)를 적용하며, 텍스트를 개별 단어 또는 구 단위로 토크나이즈하는 과정이 포함될 수 있습니다.
- 정보 검색: 다음으로, 질문에 답하기 위해 텍스트 말뭉치에서 관련 정보를 추출하는 알고리즘을 개발해야 합니다. 여기에는 키워드 검색, 텍스트 분류, 개체명 인식과 같은 기법이 포함될 수 있습니다. 예를 들어 키워드 검색 알고리즘은 질문에 포함된 단어를 바탕으로 말뭉치에서 가장 관련성 높은 문서를 식별하는 데 도움이 됩니다.
- 질문 분석: 질문의 의도를 파악하고 정보 검색을 이끌 핵심 키워드와 구를 식별하기 위해 질문을 분석하는 것이 중요합니다. 이를 위해 품사 태깅, 의존 구문 분석, 개체명 인식과 같은 기법을 사용해 질문 속의 중요한 단어와 구를 찾아낼 수 있습니다.
- 답변 생성: 관련 정보를 검색한 뒤에는 QA 시스템이 자연어로 응답을 생성해야 합니다. 이를 위해 보통 텍스트 생성과 요약 같은 기법을 사용합니다. 예를 들어, 텍스트 생성 알고리즘은 앞선 단계에서 검색된 가장 관련성 높은 정보를 바탕으로 응답을 만들어낼 수 있습니다.
- 모델 평가: 마지막으로 정밀도, 재현율, F1 점수 같은 지표를 사용해 QA 시스템의 성능을 평가해야 합니다. 이를 통해 시스템이 질문에 얼마나 정확히 답하는지 파악하고 개선이 필요한 부분을 식별할 수 있습니다.
이 단계들은 필요에 따라 반복하여 Question answering(QA) 시스템을 계속 개선할 수 있습니다. NLP와 머신러닝의 새로운 기법이 등장하면 이를 통합해 시스템의 효과를 더욱 높일 수 있습니다. 목표는 질문의 맥락을 이해하고 자연어로 정확하고 관련성 높은 답변을 생성하는 QA 시스템을 구축하는 것입니다.
질문 응답을 위한 데이터셋
질문 응답 연구와 개발을 위해 사용할 수 있는 데이터셋으로는 SQuAD(Stanford Question Answering Dataset), MS MARCO(Microsoft Machine Reading Comprehension), TREC QA(Text REtrieval Conference Question Answering Track), HotpotQA, BioASQ, CoQA, MultiRC, RACE 등이 있습니다.
- SQuAD(Stanford Question Answering Dataset)는 위키피디아 문서를 기반으로 10만 개가 넘는 질문과 답변을 포함한, 이 분야에서 가장 널리 사용되고 인기 있는 데이터셋 중 하나입니다.
- MS MARCO는 질문 응답(QA) 시스템의 복잡한 질문 이해 능력에 초점을 맞추며, 웹 페이지에서 답을 제공합니다.
- 20년 넘게 이 분야에서 활용되어 온 TREC QA는 다양한 출처에서 수집한 질문과 답변을 포함합니다.
- HotpotQA는 여러 문단을 종합적으로 추론해 정답을 찾아야 하는 멀티홉 질문 응답 데이터셋입니다.
- BioASQ는 생물의학 분야의 시맨틱 색인과 질문 응답을 위한 벤치마크입니다.
- CoQA는 대화형 질문 응답(QA) 데이터셋으로, 모델이 문맥을 유지하고 질문과 답변 간의 관계를 이해할 것을 요구합니다.
- MultiRC는 기계 독해에서 여러 문장을 종합적으로 추론하는 능력을 평가하기 위한 데이터셋이며,
- RACE는 영어 기계 독해와 질문 응답을 위한 대규모 데이터셋입니다.
Hugging Face로 질문 응답 처리하기

Hugging Face 은 NLP 연구와 개발을 위한 플랫폼을 제공하는 회사입니다. 이들은 다음과 같은 다양한 NLP 작업을 위한 대규모 사전 학습 모델 컬렉션을 제공합니다. 감성 분석, 텍스트 분류, 언어 번역, 그리고 질의응답.
이러한 모델은 딥러닝 기법으로 설계되었으며 대규모 데이터셋으로 학습되었습니다. 또한 특정 사용 사례에 맞춰 미세 조정할 수 있습니다.
Hugging Face는 사용자 친화적인 인터페이스를 제공하는 API를 통해 개발자와 연구자가 이러한 모델에 쉽게 접근하고 사용할 수 있도록 돕습니다. 이 플랫폼은 미세 조정 스크립트, 학습 데이터, 평가 지표 등 NLP 연구에 유용한 리소스와 도구도 제공합니다. 또한 사용자와 기여자 커뮤니티가 크고 활발하여 지식과 전문성을 교류하기에 훌륭한 공간입니다.
특히 질의응답을 위해 Hugging Face는 다음과 같은 사전 학습된 모델들을 제공합니다 BERT, GPT-2, 그리고 RoBERTa. 이러한 모델은 추출형 QA와 생성형 QA 모두에 사용할 수 있습니다. 이들 모델을 사용하려면 모델을 불러오고, 입력 데이터를 준비한 뒤, 실행하여 답을 얻으면 됩니다.
그렇다 해도 Hugging Face를 사용해 QA 모델을 구축하는 절차는 일반적인 접근과 크게 다르지 않습니다. 먼저 Hugging Face Transformers 라이브러리를 설치하고 원하는 사전 학습 모델을 불러옵니다. 다음으로 입력 데이터를 준비한 뒤 모델을 실행합니다.
튜토리얼
이 부분에서는 Python을 사용해 질문응답(QA) 모델을 만들어 보겠습니다. 이 모델에서는 사전 학습된 BERT Hugging Face에서 만든 모델을 사용해 QA 기능을 수행합니다. 파인튜닝에 자주 사용되는 데이터셋으로는 BertForQuestionAnswering 모델을 파인튜닝할 때 자주 사용하는 데이터셋은 Stanford Question Answering Dataset(SQuAD)입니다.
1단계: 필요한 라이브러리 불러오기
이 모델의 이 부분에서는 PyTorch 라이브러리(torch) 그리고 사전 학습된 트랜스포머 2개로, 이는 BertForQuestionAnswering 그리고 BertTokenizer입니다. The BertForQuestionAnswering 는 사전 학습된 BERT(Bidirectional Encoder Representations from Transformers) 모델로, Question answering(QA) 작업에 맞춰 추가로 파인튜닝되었습니다. The BertTokenizer 입력 텍스트를 토크나이즈하여 숫자 표현(토큰)으로 변환합니다.
import torchfrom transformers import BertForQuestionAnswering, BertTokenizer
2단계: 사전 학습된 모델 불러오기
아래 두 줄의 코드는 다음을 인스턴스화합니다 BertForQuestionAnswering 및 BertTokenizer 각 클래스에 해당하며, 지정한 이름 "bert-large-uncased-whole-word-masking-finetuned-squad"의 사전 학습된 BERT 모델을 불러옵니다.
model = BertForQuestionAnswering.from_pretrained("bert-large-uncased-whole-word-masking-finetuned-squad")tokenizer = BertTokenizer.from_pretrained("bert-large-uncased-whole-word-masking-finetuned-squad")
3단계: 테스트 샘플 만들기
아래에는 answer_text 모델이 지정된 질문에 대한 필요한 답을 반환할 근거가 되는 문맥이나 지식을 담고 있는 문자열입니다.
answer_text = "The Great Barrier Reef is located in the Coral Sea, off the coast of Australia. It is the largest coral reef system in the world, stretching over 2,300 km and covering an area of approximately 344,400 km². The Great Barrier Reef is home to a diverse range of marine life and is considered one of the seven natural wonders of the world. It is also a UNESCO World Heritage Site threatened by climate change and other environmental factors."
question = "Where is the Great Barrier Reef located?"
4단계: Answer_text와 질문 토크나이즈하기
모델의 토크나이즈 과정과 마찬가지로, 새 입력에도 토크나이즈를 수행해야 합니다. 그래야 모델이 입력을 이해할 수 있습니다.
input_ids = tokenizer.encode(question, answer_text)
5단계: 어텐션 마스크 생성하기
아래 코드 한 줄은 어텐션 마스크를 생성합니다. 이는 입력에서 어떤 토큰을 사용할지 1과 0의 시퀀스로 표시합니다. input_ids 모델이 주의를 기울여야 하는 시퀀스입니다.
attention_mask = [1] * len(input_ids)
6단계: 모델 출력 얻기
모델의 출력은 두 부분으로 구성됩니다. 첫 번째는 시작 토큰 인덱스에 대한 로짓이며, 두 번째는 종료 토큰 인덱스에 대한 로짓입니다.
output = model(torch.tensor([input_ids]), attention_mask=torch.tensor([attention_mask]))
7단계: 시작 인덱스와 종료 인덱스 정의하기
The start_index 및 end_index 답변의 시작 인덱스와 종료 인덱스를 다음에서 결정합니다 input_ids 시퀀스입니다. 이 인덱스들은 각각 시작 토큰 로짓(start)과 종료 토큰 로짓(end)에서 가장 높은 로짓 점수를 가진 토큰을 선택하여 결정됩니다. 이러한 로짓 점수는 답변의 시작 위치와 종료 위치가 어디인지에 대한 예측을 나타냅니다. input_ids 시퀀스입니다. BERT 모델은 특정 분류에 대한 모델의 신뢰도를 나타내기 위해 로짓 점수를 활용합니다.
start_index = torch.argmax(output[0][0, :len(input_ids) - input_ids.index(tokenizer.sep_token_id)])end_index = torch.argmax(output[1][0, :len(input_ids) - input_ids.index(tokenizer.sep_token_id)])
8단계: 최종 답변 디코딩하기
이 단계에서는 최종 답변의 의미를 이해할 수 있도록 토크나이즈 과정을 되돌려 복원하겠습니다.
answer = tokenizer.decode(input_ids[start_index:end_index + 1], skip_special_tokens=True)print("Answer:", answer)
출력
특정 문맥과 질문에 대한 모델의 최종 출력.
Answer: coral sea
결론
결론적으로, 질문 응답(QA)은 자연어로 제기된 질문에 답할 수 있는 알고리즘을 개발하는 것을 목표로 하는 머신러닝의 흥미로운 분야입니다. 자연어 처리(NLP)는 인간의 언어를 처리하고 이해하는 데 필요한 도구와 기법을 제공하기 때문에 QA에서 핵심적인 요소입니다.
그렇다고 해서, 여러분이 선택한 사전 학습 모델을 활용해 직접 QA 모델을 만들어도 되고, SQuAD(Stanford Question Answering Dataset)처럼 QA 모델 학습과 평가에 널리 쓰이는 데이터셋으로 자신만의 모델을 학습시킬 수도 있습니다. 이 데이터셋은 QA 시스템의 성능을 평가하는 벤치마크를 제공합니다.
인터넷과 디지털 도서관처럼 방대한 텍스트 데이터가 폭발적으로 늘어나면서, 효율적이고 효과적인 질문 응답(QA) 시스템의 필요성이 점점 더 중요해지고 있습니다. 이러한 시스템은 거대한 데이터 속에서 수동으로 검색하는 데 시간을 들이지 않고도 필요한 정보를 빠르고 쉽게 찾을 수 있게 해 줌으로써, 우리가 정보와 상호작용하는 방식을 크게 개선할 잠재력을 지니고 있습니다.
Add a comment