자연어로 기술된 질문의 의미를 분석하여, 법령문서에서 조 내용을 검색하고 정답을 추론하여 제공하는 질의응답 API 입니다.
법률 QA는 한국 포함 35 개국의 헌법과 1,447 개의 국내 법률을 대상으로 질문에 대한 조항을 검색하고, 정의형/단답형/서술형에 대한 질문에 답을 할 수 있습니다. 법률 QA시스템은 KorBERT 에 기반한 검색 재순위화와 기계독해 기술을 적용하여 보다 정확한 정답을 제시할 수 있습니다.

법률 QA API는 HTTP 기반의 REST API 인터페이스로 JSON 포맷 기반의 입력 및 출력을 지원하며 ETRI 에서 제공하는 API Key 인증을 통해 사용할 수 있는 Open API 입니다.
기술명 | API명 | 1일 허용량 |
---|---|---|
질의응답 기술 |
|
5,000건/일 |
법률 QA API는 REST API 이며, 질문을 HTTP 통신으로 ETRI Open API 서버에 전달하면 됩니다. 서버가 제공하는 REST API 의 URI 는 다음과 같으며 POST 방식으로 호출해야 합니다.
HTTP 요청으로 법률 QA를 요청할 때 사전 준비 사항에서 발급받은 Access key정보를 요청 본문에 포함시켜야 합니다. 다음은 HTTP 요청 메시지 예입니다.
[HTTP Request Body] { "request_id": "reserved field", "access_key": “YOUR_ACCESS_KEY”, "argument": { "question": “YOUR_QUESTION” } }
위와 같은 HTTP 요청을 ETRI Open API 서버로 전달하면 ETRI Open API 서버는 JSON 형태의 Text 데이터를 HTTP 응답 메시지로 반환합니다. 다음은 HTTP 응답 예입니다.
[HTTP Respone Header] Access-Control-Allow-Origin:* Connection:close Content-Length:0 Content-Type:application/json; charset=UTF-8 [HTTP Respone Body] { "request_id": "reserved field", "result": 0, "return_type": "com.google.gson.internal.LinkedTreeMap", "return_object": {법률 QA 결과 JSON} }
JSON parsing을 위해 Gson 라이브러리를 사용하여 제공하고 있습니다. Gson 라이브러리에 대한 자세한 설명은 https://github.com/google/gson 에서 확인 하실 수 있습니다.
import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import java.util.Map; import com.google.gson.Gson; public class Example { static public void main ( String[] args ) { String openApiURL = "http://aiopen.etri.re.kr:8000/LegalQA"; String accessKey = "YOUR_ACCESS_KEY"; // 발급받은 API Key String question = "YOUR_QUESTION"; // 질문 데이터 Gson gson = new Gson(); Map<String, Object> request = new HashMap<>(); Map<String, String> argument = new HashMap<>(); argument.put("question", question); request.put("access_key", accessKey); request.put("argument", argument); URL url; Integer responseCode = null; String responBody = null; try { url = new URL(openApiURL); HttpURLConnection con = (HttpURLConnection)url.openConnection(); con.setRequestMethod("POST"); con.setDoOutput(true); DataOutputStream wr = new DataOutputStream(con.getOutputStream()); wr.write(gson.toJson(request).getBytes("UTF-8")); wr.flush(); wr.close(); responseCode = con.getResponseCode(); InputStream is = con.getInputStream(); byte[] buffer = new byte[is.available()]; int byteRead = is.read(buffer); responBody = new String(buffer); System.out.println("[responseCode] " + responseCode); System.out.println("[responBody]"); System.out.println(responBody); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
<?php $openApiURL = "http://aiopen.etri.re.kr:8000/LegalQA"; $accessKey = "YOUR_ACCESS_KEY"; $question = "YOUR_QUESTION"; $request = array( "access_key" => $accessKey, "argument" => array ( "question" => $question, ) ); try { $server_output = ""; $ch = curl_init(); $header = array( "Content-Type:application/json; charset=UTF-8", ); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_URL, $openApiURL); curl_setopt($ch, CURLOPT_VERBOSE, true); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode ( $request) ); $server_output = curl_exec ($ch); if($server_output === false) { echo "Error Number:".curl_errno($ch)."\n"; echo "Error String:".curl_error($ch)."\n"; } curl_close ($ch); } catch ( Exception $e ) { echo $e->getMessage (); } echo "result = " . var_dump($server_output); ?>
JSON parsing을 위해 jsoncpp 라이브러리를 사용하여 제공하고 있습니다. jsoncpp 라이브러리에 대한 자세한 설명은 https://github.com/open-source-parsers/jsoncpp 에서 확인 하실 수 있습니다.
HTTP 통신을 위해 curl 라이브러리를 사용하여 제공하고 있습니다. curl 라이브러리에 대한 자세한 설명은 https://curl.haxx.se/libcurl 에서 확인 하실 수 있습니다.
컴파일을 위해서는 아래와 같이 추가된 LIB에 대한 옵션을 추가해야 합니다.
g++ (c++파일명) (JSONCPP)/json/json.h (JSONCPP)/json/json-forwards.h (JSONCPP)/jsoncpp.cpp ?I(CURL)/include -lcurl
#include <curl/curl.h> #include <json/json.h> #include <iostream> #include <string> using namespace std; size_t writeDataFunc(void *ptr, size_t size, size_t nmemb, std::string stream); int main() { char* openApiURL = (char*)"http://aiopen.etri.re.kr:8000/LegalQA"; string accessKey = "YOUR_ACCESS_KEY"; string question = "YOUR_QUESTION"; Json::Value request; Json::Value argument; argument["question"] = question; request["access_key"] = accessKey; request["argument"] = argument; CURL *curl; curl_slist* responseHeaders = NULL; curl = curl_easy_init(); if( curl == NULL ) { cout << "Unable to initialize cURL interface" << endl ; } else { responseHeaders = curl_slist_append( responseHeaders , "Content-Type: application/json; charset=UTF-8" ) ; string requestJson = request.toStyledString(); long statusCode; string response; curl_easy_setopt(curl, CURLOPT_URL, openApiURL); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, responseHeaders ) ; curl_easy_setopt(curl, CURLOPT_TIMEOUT, 5); curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST"); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, requestJson.c_str()); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeDataFunc); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); curl_easy_perform(curl); curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &statusCode); curl_easy_cleanup(curl); cout << "[responseCode] " << statusCode << endl; cout << "[responBody]" << endl; cout << response << endl; } return 0; } size_t writeDataFunc(void *ptr, size_t size, size_t nmemb, std::string stream) { size_t realsize = size * nmemb; std::string temp(static_cast<const char*>(ptr), realsize); stream.append(temp); return realsize; }
python 3.0을 기준으로 작성되었습니다.
HTTP 통신을 위해 urllib3 라이브러리를 사용하여 제공하고 있습니다. Python 3.0 이하의 버전에서 예제를 실행하기 위해서는 별도로 urllib3의 설치가 필요합니다. 설치에 대한 설명은 https://pypi.python.org/pypi/urllib3 를 참고하시기 바랍니다. urllib3 라이브러리에 대한 자세한 설명은 https://urllib3.readthedocs.io/en/latest/ 에서 확인 하실 수 있습니다.
#-*- coding:utf-8 -*- import urllib3 import json openApiURL = "http://aiopen.etri.re.kr:8000/LegalQA" accessKey = "YOUR_ACCESS_KEY" question = "YOUR_QUESTION" requestJson = { "access_key": accessKey, "argument": { "question": question, } } http = urllib3.PoolManager() response = http.request( "POST", openApiURL, headers={"Content-Type": "application/json; charset=UTF-8"}, body=json.dumps(requestJson) ) print("[responseCode] " + str(response.status)) print("[responBody]") print(str(response.data,"utf-8"))
var openApiURL = 'http://aiopen.etri.re.kr:8000/LegalQA'; var access_key = 'YOUR_ACCESS_KEY'; var question = 'YOUR_QUESTION'; var requestJson = { 'access_key': access_key, 'argument': { 'question': question, } }; var request = require('request'); var options = { url: openApiURL, body: JSON.stringify(requestJson), headers: {'Content-Type':'application/json; charset=UTF-8'} }; request.post(options, function (error, response, body) { console.log('responseCode = ' + response.statusCode); console.log('responseBody = ' + body); });
법률 QA API에 필요한 요청 본문에 다음과 같은 파라미터를 작성해야 합니다.
[HTTP Request Body] { “access_key”: “YOUR_ACCESS_KEY”, “argument”: { “question”: “YOUR_QUESTION”, } }
다음은 파라미터에 대한 설명입니다.
Field 명 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
access_key | String | ○ | API 사용을 위해 ETRI에서 발급한 사용자 API Key |
argument | Object | ○ | API 사용 요청 시 분석을 위해 전달할 내용 |
question | String | ○ | 질문하고자 하는 Text 로서 UTF-8 인코딩된 텍스트만 지원 |
법률 QA API는 요청된 질문의 분석된 결과를 JSON 형태의 Text 데이터로 반환합니다.
다음은 정상적인 요청 처리에 대한 HTTP 응답 예입니다.
[HTTP Respone Header] Access-Control-Allow-Origin:* Connection:close Content-Length:50783 Content-Type:application/json; charset=UTF-8 [HTTP Respone Body] { "request_id": "reserved field", "result": 0, "return_type": "com.google.gson.internal.LinkedTreeMap", "return_object": {법률 QA 결과 JSON} }
다음은 오류가 발생한 요청 처리에 대한 HTTP 응답 예입니다.
[HTTP Respone Header] Access-Control-Allow-Origin:* Connection:close Content-Length:0 Content-Type:application/json; charset=UTF-8 [HTTP Respone Body] { "request_id": "reserved field", "result": -1, "reason": {오류 메시지} }
분석된 결과는 다음과 같은 내용이 포함되어 있습니다.
구분 | JSON Key 이름 | 설명 |
---|---|---|
법률 QA 기본정보 (LegalInfo) |
AnswerInfo | 응답결과 정보의 Json Object Array |
rank | 정답/검색 순위 | |
answer | 정답 (검색결과일 경우 빈 문자열) | |
source | 정답의 출처(법률명 및 조제목) | |
clause | 조 내용 | |
confidence | 정답의 스코어 | |
RelatedQs | 유사질문의 리스트 (비어있을 수 있음) |
법률 QA API의 오류 코드 목록은 다음과 같습니다.
http status code | result | reason | 설명 |
---|---|---|---|
400 | -1 | Required arguments is empty | 필수 파라미터의 값이 없는 경우 |
400 | -1 | One or more arguments are not valid | 파라미터의 값이 유효하지 않는 경우 |
413 | -1 | Request Entity Too Large | 요청 문장 또는 어휘의 크기가 서버가 처리 할 수 있는 것보다 큰 경우 |
429 | -1 | Too Many Requests | 사용자가 주어진 시간 내에 서버에 너무 많은 요청을 하는 경우 |
404 | -1 | Unknown Handler | 등록되지 않는 서비스를 요청한 경우 |
408 | -1 | Handler Timeout | 서버의 요청 대기가 시간을 초과한 경우 |
500 | -1 | ETRI service server connection refused | ETRI 분석 서버에서 요청을 받지 못하는 경우 |
500 | -1 | ETRI service server is not exists | 수행 가능한 ETRI 분석 서버가 없는 경우 |
500 | -1 | Recipient Failure | ETRI 분석 서버에서 요청을 처리하지 못하는 경우 |
500 | -1 | Unknown ReplyFailure | API 요청에 알 수 없는 내부 오류가 발생한 경우 |
500 | -1 | Unknown Exception | 알 수 없는 내부 오류가 발생한 경우 |