인프런 커뮤니티 질문&답변

createhappy님의 프로필 이미지
createhappy

작성한 질문수

딥러닝을 활용한 자연어 처리 (NLP) 과정 (기초부터 ChatGPT/생성 모델까지)

Simple Chatbot 만들기 질문입니다.

작성

·

213

1

안녕하세요,

'Simple Chatbot 만들기' 관련하여 진행하다가 문의드립니다.

새롭게 최신 학습용 zip 파일을 다운받아서, 콜랩에서 해당 실습 파일 올리고,

바로 전체 셀 실행 테스트 해도,

질문에 대한 답변이, 계속 같은 답변으로만 나오고 있는 증상입니다.

sentencepiece 같은 모듈 설치시, 시간이 지나, 버전 차이로 인한 문제일까요?

이상입니다.

답변 1

0

YoungJea Oh님의 프로필 이미지
YoungJea Oh
지식공유자

좋은 질문 감사합니다.

저도 같은 현상이 나오네요. 아마도 뭔지 몰라도 version 차이로 제가 교재를 만들 때와 다르게 결과가 나오는 것 같습니다. 그러나 이 교재의 목적은 language model 이 어떤 원리로 작동하는지를 보여주는 것이고 key point는 chatbot 은 생각이 없고 단순히 가장 큰 확률의 단어를 나열하는 것 뿐이라는 것을 이해하는 것이고 이 원리가 Chat-GPT 같은 첨단 모델에도 그대로 적용되기 때문에 초거대 언어 모델의 "환각 현상"이 발생하는 것 입니다.

이 문제는 Greedy Decoding을 사용했기 때문에 이런 현상이 발생합니다. Greedy Decoding에서는 각 시점에서 가장 확률이 높은 단어를 선택하므로 매번 동일한 출력을 얻게 됩니다.

더 다양한 답변을 얻기 위해 Stochastic Sampling 또는 Beam Search와 같은 기법을 사용할 수 있습니다. 아래 코드는 Stochastic Sampling을 사용해 수정한 것 입니다.

Stochastic Sampling에서는 출력 확률 분포에서 단어를 샘플링하여 다양한 답변을 생성합니다. 이 방법은 각 단계에서 동일한 확률 분포를 가진 다른 단어를 선택할 수 있으므로 다양한 답변을 얻을 수 있습니다.

수정 내용을 github 에 반영하였습니다. 감사합니다.

def decode_sequence(input_seq, temperature=1.0):

# 입력된 질문을 encoder 에 입력하여 state vector 생성

states_value = encoder_model.predict(input_seq)

# size 1 짜리 빈 target sequence 생성

target_seq = np.zeros((1, 1))

# target sequence 의 첫번째 character 를 <s> 로 assign -> 1

target_seq[0, 0] = 1

eos = 2 #</s>

# 답변 생성 시작

output_ids = []

for in range(maxlen_A):

output_tokens, h, c = decoder_model.predict([target_seq] + states_value)

# 확률 분포에 따라 단어 샘플링

output_probs = output_tokens[0, 0, :]

idx = np.random.choice(len(output_probs), p=output_probs)

if eos == idx: # End sentence of EOS

break

if idx > 0: # idx 0 은 zero padding 이므로 skip

output_ids.append(int(idx))

# 생성된 word 를 decoder 의 다음 input 으로 사용

target_seq[0, 0] = idx

# Update states

states_value = [h, c]

return output_ids

createhappy님의 프로필 이미지
createhappy
질문자

감사합니다.

createhappy님의 프로필 이미지
createhappy

작성한 질문수

질문하기