실시간 대화형 AI 애플리케이션 개발을 돕는 NVIDIA Riva ‘해부’

by NVIDIA Korea

사람들은 스마트 스피커에 “에베레스트 산의 높이”와 같은 질문을 하곤 합니다. 그에 대한 답변은 아마도 “에베레스트 산은 해발 29,032피트입니다”일 텐데요. 그렇다면 스마트 스피커가 어떻게 답을 찾았는지 궁금했던 적이 있나요?

질문 응답(QA)은 크게 정보 검색(IR)과 자연어 처리(NLP)로 구성된 시스템으로 정의되며, 이는 인간이 던지는 질문에 자연어로 답하는 것과 관련이 있습니다. 정보 검색에 익숙하지 않은 경우, 예를 들어 데이터베이스의 리소스, 웹 페이지 또는 문서 등에서 쿼리에 대한 관련 정보를 얻을 수 있는 기술인데요. 이 개념을 이해하는 가장 쉬운 방법은 우리가 매일 사용하는 검색 엔진을 생각하면 됩니다.

그런 다음 쿼리와 관련된 IR 시스템 내에서 답변을 찾기 위해 NLP 시스템이 필요합니다. 지금은 QA 시스템 구축에 필요한 사항만 나열했지만 처음부터 IR과 NLP를 구축하는 것은 쉬운 일이 아닙니다. 다음은 NVIDIA Riva 를 사용해 QA 시스템을 쉽게 개발하는 방법입니다.

NVIDIA Riva

NVIDIA Riva는 엔드 투 엔드 딥 러닝 파이프라인을 사용하는 음성 서비스 구축을 위한 GPU 가속 SDK입니다. Riva SDK에는 음성, 자연어 처리(NLP) 작업에 최적화된 서비스가 포함돼 있는데요. Riva는 대화형 AI 서비스의 전체 파이프라인에 대해 사전 훈련된 여러 모델을 제공할 뿐만 아니라 대규모 배포를 위해 설계됐습니다. 이번 블로그에서는 Riva의 QA 기능과 이를 활용해 여러분 만의 QA 애플리케이션을 만드는 방법에 대해 자세히 알아보겠습니다.

Riva QA 기능

Riva QA 기능의 작동 방식을 이해하려면 BERT(Bidirectional Encoder Representations from Transformers)부터 시작해야 하는데요. BERT는 2018년 구글에서 개발한 트랜스포머 기반의 NLP 사전 훈련 방식으로, NLP 분야를 완전히 바꾸어 놓았죠. BERT는 텍스트에서 주어진 단어의 문맥적 표현을 이해합니다. 위키피디아(Wikipedia)를 포함해 방대한 양의 데이터에 대해 사전 훈련됐습니다.

강력한 NLP 엔진인 사전 훈련된 BERT를 사용하면 SQuAD(Stanford Question Answering Dataset)와 같은 많은 질문-답변 쌍으로 QA를 수행하도록 더욱 미세 조정할 수 있습니다. 이제 모델은 주어진 컨텍스트(문장 또는 단락)에서 자연어로 된 질문에 대한 답변을 찾을 수 있습니다. 그림 1은 QA의 예를 보여줍니다. 여기서 “강수가 떨어지는 원인은 무엇인가?”라는 질문에 대한 답변으로 “중력”이라는 단어가 강조 표시됐습니다. 이 예에서 단락은 컨텍스트이고 성공적으로 미세 조정된 QA 모델은 “중력”이라는 단어를 답변으로 제공합니다.

그림 1. SQuAD 데이터세트의 샘플 구절에 대한 질문-답변 쌍.
출처: SQuAD: 텍스트의 기계 이해를 위한 100,000개 이상의 질문.

Riva로 QA 시스템 만들기

NVIDIA의 엔지니어와 연구원 팀은 Riva로 즉시 사용 가능한 고품질 QA 기능을 구현했습니다. Riva NLP 서비스는 QA, NaturalQuery를 포함하는 고급 API 작업 세트를 제공합니다. Wikipedia API 작업을 사용하면 온라인 백과사전인 위키피디아에 게시된 기사를 자연어 쿼리로 가져올 수 있는데요. 이것이 앞서 말했던 정보 검색 시스템입니다. Wikipedia API 작업과 Riva QA 기능을 결합하면 몇 줄의 파이썬(Python) 코드로 간단한 QA 시스템을 만들 수 있습니다.

먼저 파이썬 용 Wikipedia API를 설치합니다. 다음으로, Riva의 기본 통신 프레임워크인 Riva NLP 서비스 API 와 gRPC를 가져옵니다.

!pip install wikipedia
import wikipedia as wiki
import grpc
import riva_api.riva_nlp_pb2 as rnlp
import riva_api.riva_nlp_pb2_grpc as rnlp_srv

이제 입력 쿼리를 만듭니다. Wikipedia API 작업으로 관련 기사를 가져오고 가져올 기사 수를 max_articles_combine으로 정의합니다. “음성 인식이란 무엇입니까?”라는 질문을 한 후, 검색에서 제공된 기사 제목을 인쇄합니다. 마지막으로 각 기사의 요약을 combined_summary 변수에 추가합니다.

input_query = "What is speech recognition?"
wiki_articles = wiki.search(input_query)
max_articles_combine = 3
combined_summary = ""
if len(wiki_articles) == 0:
    print("ERROR: Could not find any matching results in Wikipedia.")
else:
    for article in wiki_articles[:min(len(wiki_articles), max_articles_combine)]:
        print(f"Getting summary for: {article}")
        combined_summary += "\n" + wiki.summary(article)
그림 2. Wikipedia API 작업으로 가져온 기사 제목.

다음으로, Riva 서버가 실행 중인 위치를 가리키는 gRPC 채널을 엽니다. Riva 서버를 로컬에서 실행 중이므로 ‘localhost:50051’입니다. 그런 다음 NaturalQueryRequest를 인스턴스화하고, 요청을 Riva 서버로 전송하여 쿼리와 컨텍스트를 모두 전달합니다. 마지막으로 Riva 서버에서 돌아온 응답을 인쇄합니다.

channel = grpc.insecure_channel('localhost:50051')
riva_nlp = rnlp_srv.RivaLanguageUnderstandingStub(channel)
req = rnlp.NaturalQueryRequest()
req.query = input_query
req.context = combined_summary
resp = riva_nlp.NaturalQuery(req)

print(f"Query: {input_query}")
print(f"Answer: {resp.results[0].answer}")
그림 3. 쿼리와 답변 예.

요약

이렇게 Riva QA 와 Wikipedia API 작업으로 간단한 QA 애플리케이션을 만들었는데요. 이론적으로, 위키피디아에 쿼리와 관련된 기사가 있다면 답변을 찾을 수 있습니다.

여러분의 분야, 회사, 산업 또는 관심 있는 모든 것과 관련된 기사로 가득 찬 데이터베이스가 있다고 상상해 보세요. 관심 분야와 관련된 질문에 대한 답변을 찾을 수 있는 QA 서비스를 만들 수 있습니다. 이 글에서 사용된 Wikipedia API 작업과 같이 데이터베이스에서 관련 기사를 가져오는 IR 시스템이 필요하겠죠? 파이프라인에 IR 시스템이 있다면 Riva가 답을 찾는 데 도움을 줄 수 있습니다.

Riva로 멋진 애플리케이션을 만들어 보세요!