qg์ ๊ฐ(ๅผท)์์กดํ๋ ์ ์ถ๋ ฅ ์ด๋ํฐ
์์ฐ์ด ์ฒ๋ฆฌ ๋ชจ๋ธ์ด ์๋ค. ๋ชจ๋ธ์ python ์ธํฐํ๋ฆฌํฐ์์ ์คํ๋๋ฉฐ, ์์ฐ์ด๊ฐ ๋ฐฐ์น๋ก ์ ๋ ฅ๋์ด์ ๊ทธ์ ๋ํ ๋ฐฐ์น ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
[python ์ธํฐํ๋ฆฌํฐ์ UniLMv1์ ์ ์ฌํ๋ ์ธํฐํ์ด์ค]
python biunilm/decode_seq2seq.py --bert_model bert-large-cased --new_segment_ids --mode s2s \\
--input_file ${DATA_DIR}/dev.pq.txt --split ${EVAL_SPLIT} \\
--model_recover_path ${MODEL_RECOVER_PATH} \\
--max_seq_length 512 --max_tgt_length 48 \\
--batch_size 16 --beam_size 1 --length_penalty 0
์์๋ ๋ง์ดํฌ๋ก์ํํธ๊ฐ ์ ๊ณตํ๋ ํ์ธํ ๋ ๋ชจ๋ธ: UniLMv1
์ด๋ค.
๋ณด์๋ฏ์ด biunilm/decode_seq2seq.py
์ ์ธํฐํ์ด์ค๋ args๋ก ์ ๋ฌ๋ ํ
์คํธ ํ์ผ์์ ์์ฐ์ด๋ฅผ ์ฝ์ด๋ค์ด๊ณ , ์ฐ์ฐํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ณ ์ข
๋ฃ๋๋๋ก ์ค๊ณ๋์๋ค.
์ด ์ธํฐํ์ด์ค๋ ์๋น์ค์ ์ฌ์ฉํ ์ ์๋ค. ๋ชจ๋ธ์ ์ ์ฌ ์๋๋ ๋๋ฌด ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ฟผ๋ฆฌ ์์ฒญ๋ง๋ค ์ ์ฌ ์์ ์ ์ํํ๋ ์ผ์ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๋ฐฐ์น ์ ๋ ฅ์ ๋ํด ๋ฐฐ์น ์ถ๋ ฅ์ ๋ง๋ค์ด๋ด๋ ์์ฐ์ด ์ฒ๋ฆฌ ๋ชจ๋ธ์ด ์ฃผ์ด์ก์ ๋,
- ์ด ๋ชจ๋ธ์ ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ์ ์ ์ฌํ๊ณ
- ์ ๋ ฅ๊ณผ ์ถ๋ ฅ์ ์ง์ํ๋๋ก ํ๋ ค๊ณ ํ๋ค.
์ด ์๊ตฌ์ฌํญ์ ๋ง์กฑ์ํค๋ ์ด๋ํฐ ์ปดํฌ๋ํธ๋ฅผ ๊ตฌํํ๊ณ ์์ฐ์ด ์ฒ๋ฆฌ ๋ชจ๋ธ ์ฝ๋(.py)๋ฅผ ์ต์ํ์ผ๋ก ์์ ํ์ฌ ๊ฒฐํฉํ์์ค.
์์ฐ์ด์ฒ๋ฆฌ ์๋น์ค๋, ์ด์ฉ์๋ก๋ถํฐ ์์ฐ์ด๋ฅผ ์ ๋ ฅ๋ฐ๊ณ , ์ ๋ ฅ์ ์ธ๊ณต์ง๋ฅ ๋ชจ๋ธ์ ์ ํํ์ฌ ๋์ถํ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์ด์ฉ์์๊ฒ ๋๋๋ ค ์ฃผ๋ ์๋น์ค์ด๋ค.
- ์ด์ฉ์: ๋ชจ๋ธ์ ์ ๋ ฅํ๊ณ ํ ์์ฐ์ด๋ฅผ ์ ๊ณตํ๊ณ , ์์ฐ์ด์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋๋ ค ๋ฐ๋๋ค.
- ํด๋ผ์ด์ธํธ ์ฑ: ์ด์ฉ์์ ๋ง์ฃผํ๋ ์ผ๊ตด ๋ง๋ด์ด๋ค. ์ด์ฉ์๋ ์์ฐ์ด๋ฅผ ์ ๋ ฅํ๋ค. ์ด ์ ๋ ฅ์ ์ด๋ํฐ๊ฐ ์ดํดํ ์ ์๋ ํ์์ผ๋ก ๋ฐ๊พธ์ด ํด๋ผ์ด์ธํธ ์ฑ์ด ์ด๋ํฐ์๊ฒ ์ ๋ฌํ๋ค. ์ดํ ์ด๋ํฐ๊ฐ ์ ๋ ฅ์ ๋ํ ๊ฒฐ๊ณผ๋ฌผ์ ๋ฐํํ๋ฉด, ์ด๊ฒ์ ์ด์ฉ์๊ฐ ์ดํดํ ์ ์๋ ํ์์ผ๋ก ๋ฐ๊พธ์ด ๋ค์ ์ด์ฉ์์๊ฒ ๋ฐํํ๋ค.
- ์ด๋ํฐ: ํด๋ผ์ด์ธํธ ์ฑ๊ณผ ์ด๋ํฐ ๋ชจ๋ธ ์ฌ์ด์ ์๋ ์ปดํฌ๋ํธ์ด๋ค. ์์ฐ์ด ์ฒ๋ฆฌ ๋ชจ๋ธ์ ๋ํํ์ฌ ์ด ๋ชจ๋ธ์ด ์ ์ฌ ์ดํ ์ง์์ ์ธ '์์ฐ์ด ์ ๋ ฅ- ๋ชจ๋ธ ์ ํ - ๊ฒฐ๊ณผ ๋ฐํ' ํ๋ก์ธ์ค๋ก ์คํ๋๋๋ก ํ๋ค.
- ์์ฐ์ด์ฒ๋ฆฌ ๋ชจ๋ธ: ์ฒ๋ฆฌํด์ผ ํ ์์ฐ์ด๋ฅผ ์ ๋ ฅ ๋ฐ๊ณ , ๋คํธ์ํฌ์ ์ด๋ฅผ ์ ํํ์ฌ ์์ฐ์ด ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฌผ์ ๋ง๋๋ ๋ชจ๋์ด๋ค.
- ์ด๋ํฐ ๋ชจ๋ธ: ์ด๋ํฐ์ ์ํธ์์ฉ ๊ฐ๋ฅํ๋๋ก ์ธํฐํ์ด์ค ์๊ตฌ์ฌํญ์ ๊ตฌํํ, "์์ ๋ ์์ฐ์ด์ฒ๋ฆฌ ๋ชจ๋ธ"์ด๋ค.
์ด ํ๋ก์ ํธ๋ Question Generation
ํ์คํฌ์ ํ์ ํ์ฌ ํ์ฅ์ฑ์ ๊ณ ๋ คํ์ง ์๋ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๋ค.
GET http://localhost/qg/{baseKnowledge}
์์ฐ์ด ๋จ๋ฝ baseKnowledge
์ ๋ํ ์ง๋ฌธ ์์ฑ์ ์์ฒญํ๋ค.
์์ฑ๋ ์ง๋ฌธ์ JSON bkd
์ q
๋ก ์ด๋ค์ง ๊ฐ์ฒด์ด๋ค.
{
"bkd": "์ง๋ฌธ ์์ฑ์ ์ฌ์ฉํ ๋จ๋ฝ",
"q": "๋ชจ๋ธ์ด ์์ฑํ ์ง๋ฌธ"
}
{
"bkd": "Well, but I still wanna ask: 'How was your day?'",
"q": "Why do you think I still want to say hello to?"
}
ํด๋ผ์ด์ธํธ ์ฑ๊ณผ ์ด๋ํฐ๊ฐ Java๋ก ๊ตฌํ๋ ๊ฒฝ์ฐ ๋ช ์ธ๋ ๋ค์๊ณผ ๊ฐ๋ค.
@Controller
class QuestionGenerationController {
private final NLPModel model;
@GetMapping("/qg/{baseKnowledge}")
public QuestionGenerationResponseDto questionGeneration(@RequestParam String baseKnowledge) {
return new QuestionGenerationResponseDto(baseKnowledge, model.offer(baseKnowledge));
}
}
interface NLPModel {
public void boot();
public String offer(String message);
public List<String> offer(List<String> message);
public void close();
}
์ด๋ํฐ์ ์ด๋ํฐ ๋ชจ๋ธ์ HTTP REST ํ์์ ํต์ ์ ํ๋ค.
abstract class DefaultModelAdapter implements ModelAdapter<ByteArray> {
private final PythonInterpreter process;
private final RestIO restio;
private final Queue<String> resultQueue;
@Override
public void boot(){...}
@Override
public void write(String message) {
JSONObject response = restio.send(message);
resultQueue.offer(resopnse.get("question"));
}
@Override
public ByteArray read() {
...
return resultQueue.pop();
}
}
[์ด๋ํฐ ๋ชจ๋ธ ๊ฐ๋ต ๊ตฌ์กฐ]
Flask์ฑ:
1. ์์กด ๋ชจ๋ธ ๋ถํ
(huggingface Auto API)
2. REST ์ธํฐํ์ด์ค ์ค์
3. WebService๋ก์ ์คํ
~21.07.17 ><;;;
2๊ฐ์ง GPT2 ๋ชจ๋ธ์ ๋ํํด ๋ณผ ๊ฒ์ ๊ถ๊ณ ํ๋ค.