使用 NVIDIA Riva 快速開發問題與回答應用程式

作者 NVIDIA Developer

您可能會向智慧音箱提問「聖母峰有多高?」之類的問題。它可能會回答:「聖母峰的海拔高度為 29,032 英尺。」但您是否曾經想過它是如何為您找出答案的?

提問與回答(question answering,QA)大致被定義為由資訊擷取(information retrieval,IR)和自然語言處理(natural language processing,NLP)所組成,且以自然語言回答人類提出之問題的系統。資訊擷取係從資料庫中之資源、網頁或文件集區查詢與取得相關資訊的技術。每天使用的搜尋引擎,即是理解此概念最簡單的方式。

在那之後,我們會需要利用 NLP 系統在 IR 系統中尋找與查詢相關的答案。雖然僅僅是列出建構 QA 系統需要的要素,但是從零開始建構 IR 和 NLP 卻不是一件容易的事。以下說明 NVIDIA Riva 如何協助您輕鬆開發 QA 系統。

Riva 概述

NVIDIA Riva 是經過全面加速的應用程式框架,適用於建構使用端對端深度學習工作流程的多模態對話式人工智慧服務。Riva 框架包含針對語音、視覺和自然語言理解(natural language understanding,NLU)任務的最佳化服務。除了為對話式 AI 服務的整個工作流程提供多種預先訓練模型外,Javis 也是為了大規模部署而設計。本文將會詳細解說 Riva 的 QA 功能,以及如何使用以建立自己的 QA 應用程式。

Riva QA 功能

想要理解 Riva QA 功能的運作方式,先從了解「以 transformer 為基礎的雙向編碼器表示技術(Bidirectional Encoder Representations from Transformers,BERT)」開始。它是以 transformer 為基礎的 NLP 預先訓練方法,由 Google 在 2018 年開發,並徹底改變了 NLP 領域。BERT 可以理解文字中特定單字的脈絡表示。它是以如 Wikipdia 等大型資料語料庫預先訓練的模型。

經過預先訓練的 BERT 是一個強大的 NLP 引擎,可以進一步微調,以執行像是利用史丹佛問答資料集(Stanford Question Answering Dataset,SQuAD)所打造的 QA 系統。現在,模型可以從給定的上下文如句子或段落中找出答案,回答以自然語言所提出的問題。圖 1 為 QA 系統範例中,將單字「gravity」標示為問題「What causes precipitation to fall?」的答案。在此範例中,段落是文本,經過成功微調的 QA 模型回傳單字「gravity」為答案。

A paragraph describing the meteorological explanation of precipitation. It has three pairs of questions and answers at the bottom.
圖 1:SQuAD 資料集中之範例段落的問答組。
資料來源:SQuAD: 100,000+ Questions for Machine Comprehension of Text.

使用 Riva 建立 QA 系統

NVIDIA 工程師和研究人員團隊提供的高品質 QA 功能,可以立即與 Riva 搭配使用。Riva NLP 服務提供了包含 QA 的高階 API 操作集合:NaturalQuery。Wikipedia API 操作可以使用自然語言查詢,擷取發布在線上百科全書 Wikipedia 上的文章。這就是之前提到的資訊擷取系統。將 Wikipedia API 操作與 Riva QA 功能結合,即可透過幾行 Python 程式碼建立簡單的 QA 系統。

首先安裝適用於 Python 的 Wikipedia API。接著匯入以 Riva 為基礎通訊框架的 Riva NLP 服務 API 和 gRPC。

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

現在,建立輸入查詢。使用 Wikipedia API 操作擷取相關文章,並定義想要擷取的文章數量,定義為 max_articles_combine。提出「What is speech recognition?」的問題之後印出搜尋回傳的文章標題。最後,將每一篇文章的摘要組合成變數: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)
The figure shows the printed output of the Python code run, three articles related to speech recognition.
圖 2:透過 Wikipedia API 操作擷取的文章標題。

接著開啟 gRPC 通道,指向執行 Riva 伺服器的位置。由於是在本機執行 Riva 伺服器,所以為「localhost:50051」。然後將 NaturalQueryRequest 個體化,並傳送要求、傳遞查詢和文本給 Riva 伺服器。最後列印從 Riva 伺服器回傳的回應。

channel = grpc.insecure_channel('localhost:50051')
riva_nlp = rnlp_srv.RivaNLPStub(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}")
The output of the Python code run, the query and answer, generated by the Riva QA function.
圖 3:查詢和回覆範例。

總結

利用 Riva QA 和 Wikipedia API 操作,您便可建立簡單的 QA 應用程式。如果在 Wikipedia 中具有與查詢有關的文章時,理論上可以找出答案。假設您擁有一個資料庫,其中包含與您的領域、公司、產業或任何主題有關的文章。您可以建立 QA 服務,以找出與您感興趣之領域有關的問題答案。當然,您需要 IR 系統,從資料庫中擷取相關文章,例如本文使用的 Wikipedia API 操作。將 IR 系統納入工作流程之後,Riva 即可協助您找出答案。我們期待您使用 Riva 創造酷炫的應用程式。