[AIVLE SCHOOL] 딥러닝(6) - 언어 모델

춤추는 머쉬룸·2024년 11월 5일

AIVLE SCHOOL 6기

목록 보기
63/80
post-thumbnail

11/5 2, 3, 4, 5, 6, 7세션

A. Chat-GPT

  • GPT 3.5 버전은 학습된 데이터로만 답변할 수 있었다
  • GPT 4버전부터는
  • 추가 학습 : 파인 튜닝
  • 추가 정보 제공 : RAG

파인 튜닝

추가적인 학습을 통해 성능 향상

RAG

학습하지 않아도 웹에서 검색해와서 답변해줌


B. NLP (Natural Language Processing)

  • 컴퓨터가 자연어를 이해시키기 위한 처리 절차
  • 문장 분류, 개체명 인식, 문장 생성, 질문 답변, 텍스트 번역 및 요약 등

C. Transformer

  • 기존의 언어모델은 RNN 기반이었다. 하지만 병렬 처리가 어렵고, 장기 의존성 문제가 있고, 확장성에 제한이 있었다
  • Transforemr 는 RNN 의 단점을 극복했다.
  • Google, 2017, Attention Is All You Need

C-1. Transforemr 의 특징

  • 이전 문장들을 잘 기억
  • 문맥상 집중해야 할 단어를 잘 캐치 티니핑
  • 문장의 단어별로 중요도 계산 (attention)

Pipeline 함수

  • 데이터 전처리 -> 모델 사용 -> 결과 후처리
  • hugging face에서 제공

Sentiment analysis

  • 주어진 문장에 대해 긍정, 부정 분류

Zero-shot classification

  • 학습 과정에서 본 적 없는 클래스에 대해 분류
  • 고양이, 개로 학습한 모델에 사자라는 새로운 클래스를 줘도 문맥적 지식을 이용하여 올바르게 분류

Summarization

  • 긴 문장이나 글에 대해 핵심 내용을 짧게 요약하는 기술

Translation

  • 번역

Text-generation

  • 몇 글자를 적어서 입력하면, 이어서 문장을 생성하는 기술

D. 언어 모델링 절차

  1. Tokenizer로 쪼갠다
  2. 쪼개면 단어/문자 별로 사전(Index)을 만든다.
  3. vocab을 사용해 숫자로 바꾼다. 한국어는 형태소 기반
  4. 임베딩 수행 - Machine 이 이해하는 형태로 변환

D-1. 토크나이징

  • 영어 / 한국어 문장을 문자, 단어, 형태소 등으로 나눠서 Vocab 에 따라 숫자 Index를 부여함
  • 번호 자체가 의미를 지니지는 않음

D-2. 임베딩

  • 자연어를 머신이 이해할 수 있는 숫자로 변환
  • 가중치
  • Word2Vec : 단어 벡터 간 유의미한 유사도를 반영할 수 있도록 단어의 의미를 수치화
  • FastText : 하나의 단어 안에도 여러 단어들이 존재하는 것으로 간주

E. LangChain

  • 답변을 학습한 데이터로만 답변하는 것이 아니라 선택한 Retriever 에서 불러와서 답변함

E-1. Message를 구분하는 이유

  • 관리 목적

E-2. PromptTemplate

  • 파이썬 입력과 프롬프트를 결합하도록 지원하는 모듈
nations = ['한국','중국','일본','인도','미국','영국']

prompt = PromptTemplate(template = "{nation}의 인구수는? 숫자로만 대답해줘", input_variables = ["nation"])

result = chat([HumanMessage(content=prompt.format(nation = nations))])

print(result.content

E-3. 할루시네이션

  • 환각 현상
  • 거짓을 사실처럼 대답함

E-4. Output Parser

  • 출력 형태 지정
  • CommaSeparatedListOutputParser : 콤마로 구분하여 자름
# 출력파서 선언
output_parser = CommaSeparatedListOutputParser()

# 사용
result = chat([HumanMessage(content = "대전의 대표 관광지 5곳 알려줘."),
               HumanMessage(content = output_parser.get_format_instructions())])
               
output = output_parser.parse(result.content)
print(output)

F. RAG

  • 지식 DB에서 답변에 필요한 문서 검색
  • 필요한 문서를 포함한 프롬프트 생성
  • LLM이 답변 생성

F-1. Vector DB

  • 질문을 벡터로 변환하여 저장하는 것
  1. 텍스트 추출
  2. 텍스트 분할 : 문서로부터 텍스트를 분할 (chunk 등)
  3. DB 구성 : DB 경로 지정 및 임베딩 모델 지정
  4. Insert : 단순 텍스트를 입력하거나 텍스트와 메타데이터를 입력 (add_text(), add_documents())
  5. 완성된 데이터베이스를 데이터프레임으로 변환해서 조건 조회 가능
  6. 유사 문서 조회

F-2. Chroma DB

  • Vector DB 중 한 종류
  • SQLite3 기반
  • DB Browser for SQLite3 으로 접속
> input_list2 = ['오늘 날씨는 매우 맑음. 낮 기온은 30도 입니다.', '어제 주가는 큰 폭으로 상승했습니다.']
> metadata = [{'category':'test'}, {'category':'test'}]

> doc2 = [Document(page_content = input_list2[i], metadata = metadata[i]) for i in range(2)]

> ind2 = database.add_documents(doc2)

> database.get(ind2)

{'ids': ['05627d20-64d7-4c6c-aee8-ce469da9ca0c',
  '0661d61e-6704-4ef9-833b-2cfd2a8ee613'],
 'embeddings': None,
 'metadatas': [{'category': 'test'}, {'category': 'test'}],
 'documents': ['오늘 날씨는 매우 맑음. 낮 기온은 30도 입니다.', '어제 주가는 큰 폭으로 상승했습니다.'],
 'uris': None,
 'data': None}
# 문서 조회1
query = "오늘 낮 기온은?"   # 질문할 문장
k = 3                      # 유사도 상위 k 개 문서 가져오기.

result = database.similarity_search(query, k = k) #← 데이터베이스에서 유사도가 높은 문서를 가져옴
print(result)
print('-'*50)
for doc in result:
    print(f"문서 내용: {doc.page_content}") # 문서 내용 표시
    
---
[Document(page_content='오늘 날씨는 매우 맑음. 낮 기온은 30도 입니다.', metadata={'category': 'test'}), Document(page_content='어제 주가는 큰 폭으로 상승했습니다.', metadata={'category': 'test'}), Document(page_content='test 데이터 입력1')]
--------------------------------------------------
문서 내용: 오늘 날씨는 매우 맑음. 낮 기온은 30도 입니다.
문서 내용: 어제 주가는 큰 폭으로 상승했습니다.
문서 내용: test 데이터 입력1

F-3. 코싸인 유사도

  • 유사도 점수 계산법
  • Chroma DB는 Cosine Distance로 계산함. (1- 코싸인 유사도)
  • 0에 가까울수록 유사도가 높다

G. Memory

  • ConversationBufferMemory 함수
embeddings = OpenAIEmbeddings(model = "text-embedding-ada-002")
database = Chroma(persist_directory = "./db2", embedding_function = embeddings)
chat = ChatOpenAI(model="gpt-3.5-turbo")

k=3
retriever = database.as_retriever(search_kwargs={"k": k})

# 대화 메모리 생성
memory = ConversationBufferMemory(memory_key="chat_history", input_key="question", output_key="answer",
                                  return_messages=True)

# ConversationalRetrievalQA 체인 생성
qa = ConversationalRetrievalChain.from_llm(llm=chat, retriever=retriever, memory=memory,
                                           return_source_documents=True,  output_key="answer")

0개의 댓글