In-context Learning ?
최근 ChatGPT의 등장으로 거대언어모델의 활용에 대해 전 세계 사람들의 이목이 쏠리고 있습니다. 특히 기업에서는 사내 데이터를 활용하여 기존의 문서 검색 기술을 대체하거나, 자사 전용 모델을 구축하고자 하는 움직임이 느껴지는 시기입니다. 오늘 다루어볼 구현 내용 또한 이러한 니즈에 맞춰 적용해볼 수 있는 기술입니다. 바로 별도의 모델 학습(파인튜닝)없이 사용자가 가진 문서를 ChatGPT에 함께 입력하여 적절한 검색을 해볼 수 있는 방식입니다. 이렇게 학습없이 바로 문서와 함께 입력하여 원하는 답을 얻는 방식을 In-context Learning 이라고 합니다.
In-context Learning이란,
단순히 질의만 던지는 것이 아닌 그 질의에 필요한 사용자 데이터셋을 함께 제공하여, 필요한 정보를 그 데이터에서 찾도록 하는 방식입니다. 물론 In-context Learning에는 주어지는 데이터셋의 양에 따라 매우 다양하게 활용될 수 있습니다. 오늘은 대량의 문서를 가지고 검색에 가까운 질의응답 챗봇을 구현할 생각입니다.
사용할 데이터는 교육부에서 제공하는 교육과정 자료입니다. 교육부에서는 매년 초중고,특수 교육과정 자료를 제공하는데요. 해당 자료에서는 학교급, 과목 등에 따라 배우는 교육과정과 성취기준 등을 확인할 수 있습니다.
해당 자료 중 일부를 살펴보겠습니다.
위 처럼 중등 수학과목의 영역별 단원명을 확인할 수 있고, 여기서 영역은 (1) 수와연산, 단원은 아래 1. 소인수분해, 2. 정수와 유리수 등이 되겠습니다. 이까지는 우리에게 익숙하지만, 아래에 일련의 ID처럼 보이는 코드와 함께 문장들이 작성되어있습니다. 이는 성취기준이며, 쉽게 학습 목표 정도로 생각할 수 있겠습니다. 이러한 자료는 보통 교사들이 학생들이 가르칠 때 참고해야 할 지도서 역할의 자료로 보이는데요.
위 처럼 성취기준의 상세한 해설또한 확인할 수 있습니다.
그리고 학생들에게 해당 성취기준의 특히 어떤 내용을 가르쳐야 할지에 대한 고려사항도 작성되어 있습니다. 이런 대량의 문서에서 원하는 내용을 추출하는 질의를 할 수 있도록 구현해보겠습니다.
기본 설정
[Google Colab 으로 열기]
https://colab.research.google.com/drive/1rvQKJUuER-3aKmCL2xqBJL3p3T90XJAN?usp=sharing
!pip install openai
!pip install langchain
!pip install pypdf
!pip install chromadb
필요한 라이브러리는 위와 같습니다. openai는 ChatGPT API 사용을, LangChain은 질의와 모델간 연결을, pypdf는 PDF 불러오기를, chromadb는 VectorDB를 위함입니다.
import os
os.environ["OPENAI_API_KEY"] = "sk-SU....iZpox" # OPENAI_API_KEY 설정
먼저 OpenAI API KEY를 설정하겠습니다. API 연동을 위해 본인의 API KEYS를 발급받을 수 있습니다. (platform.openai.com/account/api-keys)
데이터 불러오기 (Data Load)
from langchain.document_loaders import PyPDFLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores.elastic_vector_search import ElasticVectorSearch
from langchain.vectorstores import Chroma
이제 사용할 데이터를 가져와볼까요? 위에서 말했듯 교육부 교육과정 자료를 가져왔습니다. 그 중에서도 수학과목에 대한 데이터를 사용해볼게요. 본인이 원하는 데이터를 사용할 수 있습니다.
loader = PyPDFLoader("./[별책8] 수학과 교육과정.pdf")
documents = loader.load()
PDF 파일을 불러옵니다. langchain에는 없는게 없습니다! PDF Loader 외에 굉장히 다양한 형태의 데이터를 읽어들일 수 있으니 링크를 참고 부탁드립니다. https://github.com/hwchase17/langchain/tree/master/langchain/document_loaders
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
불러왔던 PDF 텍스트를 적정사이즈로 잘라줍니다. 겹치는 텍스트가(chunk_overlap) 없도록 잘라주었습니다. 자른 각각의 텍스트는 texts에 저장! 이는 관련성이 높은 텍스트를 우선 찾은 다음, 질의에 활용하기 위함입니다.
각 텍스트는 내용와 source(파일명), 페이지가 있습니다.
문서 임베딩 (Embeddings)
그럼 이 텍스트들을 임베딩하여 VectorDB에 저장해두겠습니다.
embeddings = OpenAIEmbeddings()
vector_store = Chroma.from_documents(texts, embeddings)
retriever = vector_store.as_retriever(search_kwargs={"k": 2})
# retriever return 결과
VectorStoreRetriever(vectorstore=<langchain.vectorstores.chroma.Chroma object at 0x7f7e7af37a30>, search_type='similarity', search_kwargs={'k': 2})
line 1 - OpenAIEmbeddings() 이라는 임베딩 모델을 불러와 사용했습니다.
line 2 - 위에서 PDF 텍스트들을 잘라 저장했던 texts를 임베딩 했습니다. 이때 Chroma 라이브러리를 사용했는데, from_documents는 문서로 부터 임베딩하여 벡터 데이터 베이스(Vector DB)에 넣어주는 작업입니다.
line 3 - retriever는 저장했던 DB에서 유사한 k 개만큼의 텍스트 임베딩을 찾을 수 있도록 합니다.
ChatGPT(gpt-3.5-turbo) 질의
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQAWithSourcesChain
chain_type_kwargs = {"prompt": prompt}
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
chain = RetrievalQAWithSourcesChain.from_chain_type(
llm=llm,
chain_type="stuff",
retriever = retriever,
return_source_documents=True,
chain_type_kwargs=chain_type_kwargs
)
이제 gpt-3.5-turbo 모델로 질의를 해보겠습니다. 이때 LangChain을 활용하게 되는데요.
그 중 RetrievalQAWithSourcesChain 을 사용합니다. (참고 :https://python.langchain.com/docs/modules/chains/popular/vector_db_qa)
RetrievalQAWithSourcesChain은 QA를 위해 참고할 수 있는 데이터를 함께 넣을 수 있도록 합니다. 아래는 파라미터 설명입니다.
llm : 사용할 언어모델
chain_type : chain의 종류 (아래 링크 참조)
retriever : 질의와 유사한 문서 검색시 사용
return_source_documents : 문서의 source return
chain_type_kwargs : kwargs
위에서 구축했던 VectorDB에서 유사한 문서를 찾을 수 있는 retriever를 파라미터로 넘겨주었으며, chain_type_kwargs 로 시스템 prompt를 추가했습니다.
from langchain.prompts.chat import (
ChatPromptTemplate,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
)
system_template="""Use the following pieces of context to answer the users question shortly.
Given the following summaries of a long document and a question, create a final answer with references ("SOURCES"), use "SOURCES" in capital letters regardless of the number of sources.
If you don't know the answer, just say that "I don't know", don't try to make up an answer.
----------------
{summaries}
You MUST answer in Korean:"""
messages = [
SystemMessagePromptTemplate.from_template(system_template),
HumanMessagePromptTemplate.from_template("{question}")
]
prompt = ChatPromptTemplate.from_messages(messages)
시스템 템플릿을 요약하면, "참조한 문서를 포함하여 답변하고, 모르면 답을 지어내지 말라." 는 뜻입니다. 그리고 한국어로 대답하도록 추가하였습니다.
아래 링크는 RetrievalQAWithSourcesChain 의 파라미터 중 하나였던 chain_type에 대한 설명입니다. 이번에 사용한 chain은 'stuff'로 문서 목록을 가져와 프롬프트에 모두 삽입하고 해당 프롬프트를 LLM에 전달하는 chain입니다.
https://python.langchain.com/docs/modules/chains/document/
결과
질의를 만들어준 chain에 넣어 질문을 던졌고, result안에는 답변과, 참고한 원문 문서가 포함되어 있습니다. 아래 인퍼런스 결과에서 답변과 ChatGPT가 참고한 문서 2개를 순서대로 출력했습니다.
query = "중등 삼각형 작도와 관련한 단원의 성취기준은?"
result = chain(query)
print(result)
# result['answer']
[별책8] 수학과 교육과정.pdf의 39 페이지에서 확인할 수 있듯이, 중등 수학에서 삼각형 작도와 관련된 성취기준은 9수03-03입니다. 이 성취기준은 "주어진 삼각형과 합동인 삼각형을 작도하는 활동을 하고, 자신의 방법을 설명하게 한다"는 내용을 포함하고 있습니다.
# result['source_documents']
[Document(page_content='수학과 교육과정\n14(가) 성취기준 해설\n•[2수03-02] 쌓기나무로 만든 입체도형의 모양에 대해서 ‘∼의 앞’, ‘∼의 오른쪽 ’, ‘∼의 \n위’, ‘2층’ 등을 사용하여 말하게 한다.\n•[2수03-04] 삼각형 , 사각형 , 원은 예인 것과 예가 아닌 것을 분류하는 활동을 통하여 직관\n적으로 이해하게 한다. 본뜨기 , 도형판을 이용한 활동 등을 통해 삼각형 , 사각형 , 원의 모양\n을 그리게 할 수 있다.\n•[2수03-10] 길이의 표준 단위를 도입하기 전에 구체물을 직접 비교해 보거나 여러 가지 임의 \n단위를 사용하여 구체물의 길이를 재어보는 활동을 통해 표준 단위의 필요성을 알게 한다.\n•[2수03-12] 생활 주변의 여러 가지 물건들의 길이를 어림해 보고 자로 측정하여 확인하는 \n활동과 주어진 길이에 해당하는 선분을 그려 보는 활동을 통해 길이에 대한 양감을 기르게 \n한다.\n(나) 성취기준 적용 시 고려 사항\n•‘도형과 측정’ 영역에서는 용어와 기호로 ‘삼각형 , 사각형 , 원, 꼭짓점 , 변, 시, 분, 약, cm, \nm’를 다룬다 .[2수03-05] 삼각형 , 사각형에서 각각의 공통점을 찾아 말할 수 있다.\n\uf000 양의 비교\n[2수03-06] 구체물의 길이, 들이, 무게, 넓이를 비교하여 각각 ‘길다, 짧다’, ‘많다, 적다’, ‘무겁다 , \n가볍다 ’, ‘넓다, 좁다’ 등을 구별하여 말할 수 있다.\n\uf000 시각과 시간\n[2수03-07] 시계를 보고 시각을 ‘몇 시 몇 분’까지 읽을 수 있다. \n[2수03-08] 1시간과 1분의 관계를 이해하고 , 시간을 ‘시간’, ‘분’으로 표현할 수 있다.\n[2수03-09] 실생활 문제 상황과 연결하여 1분, 1시간, 1일, 1주일, 1개월, 1년 사이의 관계를 \n이해한다 .\n\uf000 길이\n[2수03-10] 길이 단위 1cm와 1m를 알고, 이를 이용하여 주변 사물의 길이를 측정할 수 있다.\n[2수03-11] 1m와 1cm의 관계를 이해하고 , 길이를 ‘몇 m 몇 cm’와 ‘몇 cm’로 표현할 수 있다. \n[2수03-12] 여러 가지 물건의 길이를 어림하고 , 길이에 대한 양감을 기른다 .\n[2수03-13] 실생활 문제 상황과 연결하여 길이의 덧셈과 뺄셈을 할 수 있다.', metadata={'source': '[별책8] 수학과 교육과정.pdf', 'page': 19}),
Document(page_content='공통 교육과정 \n39•[9수03-03] 주어진 삼각형과 합동인 삼각형을 작도하는 활동을 하고, 자신의 방법을 설명\n하게 한다. \n•[9수03-05] 삼각형의 내각과 외각의 크기, 다각형의 내각과 외각의 크기의 합, 다각형의 \n대각선의 개수를 구하는 과정을 탐구하여 다각형의 성질을 추측하고 일반화할 수 있게 한다.\n•[9수03-07] 구체적인 사물, 전개도 , 교구, 컴퓨터 프로그램 등을 이용하여 다면체와 회전\n체를 관찰하고 그 성질을 탐구하게 한다. 회전체 단면의 모양은 회전체의 성질을 이해하는 \n데 필요한 정도로 다룬다 .\n•[9수03-09] 종이접기 , 작도, 공학 도구 등을 이용하여 이등변삼각형의 성질을 추측하게 하\n고, 그 성질을 삼각형의 합동 조건을 이용하여 정당화할 수 있게 한다. 이때, 증명이라는 \n용어를 도입하고 , 그 필요성을 인식하게 한다. \n•[9수03-11] 사각형의 성질은 대각선에 관한 성질을 위주로 다룬다 . 여러 가지 사각형의 \n성질을 통해 사각형 사이의 관계를 설명하게 한다. \n•[9수03-15] 피타고라스 정리는 다양한 활동을 통하여 추측하고 정당화할 수 있게 한다. \n피타고라스 정리의 역은 직관적으로 이해하게 하고, 이를 이용하여 세 변의 길이가 주어\n진 삼각형이 직각삼각형인지 판별하게 한다. \n•[9수03-17] 삼각비를 활용하여 직접 측정하기 어려운 거리나 높이 등을 구해 보는 활동\n을 통해 유용성을 인식하고 흥미를 느낄 수 있게 한다.\n(나) 성취기준 적용 시 고려 사항\n•‘도형과 측정’ 영역에서는 용어와 기호로 ‘교점, 교선, 두 점 사이의 거리, 중점, 수직이등\n분선, 꼬인 위치, 교각, 맞꼭지각 , 엇각, 동위각 , 평각, 직교, 수선의 발, 작도, 대변, 대각, \n삼각형의 합동 조건, 내각, 외각, 부채꼴 , 중심각 , 호, 현, 활꼴, 할선, 다면체 , 각뿔대 , 정다\n면체, 회전체 , 회전축 , 원뿔대 , 증명, 접선, 접점, 접한다 , 외심, 외접, 외접원 , 내심, 내접, \n내접원 , 중선, 무게중심 , 닮음, 닮음비 , 삼각형의 닮음 조건, 피타고라스 정리, 삼각비 , 사\n인, 코사인 , 탄젠트 , 원주각 , \ue06d\ue06c\ue06eAB, \ue06d\ue06eAB, \ue06dAB, \ue054\ue054, ∠ABC, ⊥, △ABC, ≡, \ue065AB, \ue0ac, \n□ABCD, \uf000, sin\ue000, cos\ue000, tan\ue000’를 다룬다 .\n•다양한 교구나 공학 도구를 이용하여 합동과 닮음의 의미를 이해하게 한다.\n•다각형과 다면체는 그 모양이 볼록인 경우만 다룬다 . \n•간단한 입체도형의 단면을 관찰하는 활동과 전개도를 접어 간단한 입체도형을 만드는 활\n동을 통해 평면도형과 입체도형의 관계를 직관적으로 이해하게 한다. \n•다양한 교구나 공학 도구를 이용하여 도형을 그리거나 만들어 보는 활동을 통해 도형의 성\n질을 추론하고 토론할 수 있게 한다.', metadata={'source': '[별책8] 수학과 교육과정.pdf', 'page': 44})]
순서대로, 답변(Answer)과 참고한 소스(source_documents)입니다. 정확히 자료의 페이지까지 언급하며 성취기준을 파악하고 있네요. 질의에 '중등'을 언급해 준 이유는 워낙 자료의 학교급과 단원이 다양하고, 중복되는 것이 많다보니 확실히 학교급 정도는 미리 정해주고 질문하는 것이 원하는 답변을 정확히 얻을 수 있더라구요. 아래는 자료의 실제 39 p 내용입니다.
query = "초등 비례식과 비례배분 단원의 성취기준은?"
result = chain(query)
print(result)
# result['answer']
초등 수학 교육과정의 '변화와 관계' 영역에서는 '비례식'과 '비례배분'을 다룹니다. 이에 따라 성취기준은 다음과 같습니다. - [6수02-04] 비례식을 알고, 그 성질을 이해하며, 이를 활용하여 간단한 비례식을 풀 수 있다. - [6수02-05] 비례배분을 알고, 주어진 양을 비례배분할 수 있다. 이와 함께 '변화와 관계' 영역에서는 '비, 기준량, 비교하는 양, 비율, 백분율, 비례식, 비례배분, :, %'를 다루며, 대응 관계를 탐구할 때는 두 양의 변화를 함께 고려하게 하고, 한 양의 변화에만 초점을 두지 않습니다. 또한, 두 양 사이의 대응 관계를 식으로 나타내는 방법을 지도하는 활동에서는 덧셈식, 뺄셈식, 곱셈식, 나눗셈식 중 하나로 표현되는 간단한 경우만 다룹니다. 이러한 내용들을 통해 학생들은 비례식과 비례배분을 이해하고 활용할 수 있는 능력을 기를 수 있습니다. (
# result['source_documents']
[Document(page_content='공통 교육과정 \n27보나 부족한 정보 찾기, 조건을 바꾸어 새로운 문제 만들기 , 문제해결 과정의 타당성 검토\n하기 등을 통하여 문제해결 역량을 기르게 한다. \n•‘수와 연산’ 영역에서 자신의 문제해결 과정을 논리적으로 설명하고 다른 친구의 문제해결 \n과정과 비교함으로써 비판적으로 사고하는 태도를 기르게 한다.\n(2) 변화와 관계\n\uf000 대응 관계 \n[6수02-01] 한 양이 변할 때 다른 양이 그에 종속하여 변하는 대응 관계를 나타낸 표에서 규칙을 \n찾아 설명하고 , □, △ 등을 사용하여 식으로 나타낼 수 있다.\n\uf000 비와 비율\n[6수02-02] 두 양의 크기를 비교하는 상황을 통해 비의 개념을 이해하고 , 두 양의 관계를 비로 \n나타낼 수 있다. \n[6수02-03] 비율을 이해하고 , 비율을 분수, 소수, 백분율로 나타낼 수 있다.\n\uf000 비례식과 비례배분\n[6수02-04] 비례식을 알고, 그 성질을 이해하며 , 이를 활용하여 간단한 비례식을 풀 수 있다.\n[6수02-05] 비례배분을 알고, 주어진 양을 비례배분 할 수 있다.\n(가) 성취기준 해설\n•[6수02-02] 두 양을 비교할 때는 한 양을 기준으로 다른 양이 몇 배가 되는지를 나타낼 필\n요성을 인식하면서 비의 개념을 이해하게 한다.\n(나) 성취기준 적용 시 고려 사항\n•‘변화와 관계’ 영역에서는 용어와 기호로 ‘비, 기준량 , 비교하는 양, 비율, 백분율 , 비례식 , \n비례배분 , :, %’를 다룬다 .\n•대응 관계를 탐구할 때는 두 양의 변화를 함께 고려하게 하고, 한 양의 변화에만 초점을 두\n지 않는다 .\n•두 양 사이의 대응 관계를 식으로 나타내는 방법을 지도하는 활동에서는 덧셈식 , 뺄셈식 , \n곱셈식 , 나눗셈식 중 하나로 표현되는 간단한 경우만 다룬다 .\n•비와 비율을 다룰 때는 기준량과 비교하는 양을 명확하게 인식하게 한다.\n•비와 비율을 탐구할 때는 실생활 및 타 교과에서 비와 비율이 적용되는 간단한 사례를 활', metadata={'source': '[별책8] 수학과 교육과정.pdf', 'page': 32}),
Document(page_content='수학과 교육과정\n200\n2. 내용 체계 및 성취기준\n가. 내용 체계\n핵심 아이디어⋅수의 계산과 단위의 변환 등은 직무 상황에서 효율적인 업무 수행의 기반이 된다.\n⋅비 와 비율, 표 와 그 래프, 방 정 식과 부 등 식 은 직 무 상 황에 서 발 생 하는 여러 가지 문 제 를 해 결 하는 \n데 활용된다 .\n⋅도형의 이해와 측정은 직무 상황에서 다루는 공간 관련 문제를 해결하는 데 도움을 준다. \n⋅직 무 상 황 에 서 다 루 는 자 료 를 수 집, 정 리, 해 석 하 는 활 동 은 합 리 적 인 의 사 결 정 을 가 능 하 게 한 다.\n구분\n범주내용 요소\n지식⋅이해수와 연산⋅수와 사칙연산\n⋅단위 환산\n변화와 관계⋅비율과 백분율\n⋅규칙성과 변화\n⋅식과 문제해결\n도형과 측정⋅도형의 관찰과 표현\n⋅도형의 측정\n자료와 \n가능성⋅경우의 수와 가능성 \n⋅자료의 정리와 해석\n과정⋅기능⋅수학적 개념을 활용하여 직무 상황의 문제해결하기\n⋅수학적 개념에 근거하여 수 크기를 비교하기\n⋅변환된 단위 계산하기 \n⋅수학의 개념, 원리, 법칙을 직무 상황에 연결하여 적용하기\n⋅수학적 표현을 사용하여 설명하기\n⋅식, 표, 그래프를 이해하고 설명하기\n⋅입체도형의 모양 표현하기 \n⋅입체도형의 모양 판별하기\n⋅수학의 성질, 공식, 규칙에 근거하여 값 구하기\n⋅직무 상황의 다양한 자료와 정보를 수집, 변환하여 목적에 맞게 정리하기\n⋅여러 가지 방법으로 변환한 자료 해석하기 \n⋅자료에 기반하여 합리적으로 의사 결정하기\n⋅직무 상황에서 요구되는 문제에 대한 다양한 해결 방법 탐색하기\n⋅적절한 공학 도구를 선택하여 직무 상황의 문제해결에 이용하기\n가치⋅태도⋅직무를 효과적으로 수행하는 방법으로서 수학의 유용성 인식\n⋅직무 상황의 문제를 해결하기 위해 끈기 있게 도전하는 태도\n⋅직무 상황의 자료를 표나 그래프로 표현하는 것에 대한 흥미\n⋅표나 그래프를 근거로 미래 상황을 예측하여 합리적으로 의사 결정하는 태도', metadata={'source': '[별책8] 수학과 교육과정.pdf', 'page': 205})]
이번에는 단원명을 바로 주고, 해당 단원의 성취기준을 찾아달라고 질의했습니다. 해당 단원에 포함되는 총 두개의 성취기준을 코드와 함께 정확히 찾아주었네요. 아래는 실제 <비례식과 비례배분>의 성취기준입니다.
간단히 PDF 파일을 Langchain을 활용하여 질의하는 시스템을 구현해보았습니다. 리소스가 많이 드는 파인튜닝 대신 이렇게 질의할 때마다 데이터를 넣어 주는 방식의 In-context Learning은 매우 유연성이 좋은 것 같습니다. 아래는 제가 참고한 원문글입니다. 감사합니다.
'AI' 카테고리의 다른 글
맞춤형 수학 문항추천을 위한 Neo4j Knowledge Graph 구축 및 추천시스템 구현 (Cypher) (4) | 2023.12.26 |
---|---|
GPT-3.5 기반 한국어 Knowledge Graph 구축 (GraphGPT, Networkx) (2) | 2023.08.15 |
Prompt Engineering 은 어떻게 하는걸까? : ChatGPT 활용 예제와 함께 완벽히 정리하기 (기본편) (0) | 2023.06.18 |
Matrix Factorization : 개요와 원리부터, 최적화(SGD, ALS)까지 이해하기 (0) | 2023.06.01 |
FM(Factorization Machines)을 활용한 학생별 문항 맞힐확률 예측하기 (0) | 2023.02.26 |