카테고리 보관물: Uncategorized

LangChain: Retrieval Augmented Generation 문서 기반 응답

Retrieval Augmented Generation (RAG) 방법은 LLM에게 질문과 관련 정보를 함께 줘서 해당 정보를 바탕으로 응답하게 하는 방법입니다. LLM의 환각 현상을 줄일 수 있는 방법이자, 최신 정보나 특정 분야의 지식을 전달해줄 수 있는 방법입니다. LangChain에서 RAG를 구현하는 과정은 아래 그림과 같습니다.

LangChain RAG 구현 과정

  • Source: 문서 파일을 준비합니다.
  • Load: document_loaders 모듈을 이용해 문서의 내용을 읽어들입니다.
  • Transform: 문서가 길면 text_splitter 모듈을 이용해 나눕니다.
  • Embed: embeddings 모듈의 임베딩 모델을 이용해 텍스트를 벡터로 변환합니다.
  • Store: vectorstores 모듈의 벡터 데이터베이스에 임베딩 벡터를 저장합니다. 벡터 데이터베이스에서는 유사도 기반 벡터 검색 기능도 제공합니다.
  • Retrieve: 질문과 가장 가까운 문서를 반환하는 인터페이스로, index나 vectorstore를 이용해 문서를 검색합니다.

LangChain에서 index는 문서를 저장하고 검색하기 위한 데이터 구조로, 벡터 데이터베이스는 index의 일종이라고 할 수 있습니다. Index는 벡터 데이터베이스보다 더 큰 개념으로, 저장과 유사도 기반 검색 뿐 아니라 문서 관리(중복 제거, 업데이트, 삭제) 기능도 포함합니다. 위 과정을 코드로 살펴보겠습니다.

Retrieval Augmented Generation 예제

이 예제는 DeepLearning.AI에서 가져온 예제입니다. 예제에서 사용하는 CSV 파일은 1000 종류의 옷에 관한 정보를 포함한 파일입니다.

Source, Load (Transform은 생략)

from langchain.document_loaders import CSVLoader

loader = CSVLoader(file_path="09_OutdoorClothingCatalog_1000.csv")
docs = loader.load()

docs는 1000개의 Document 객체를 포함한 리스트입니다. CSV 파일의 한 행이 하나의 문서가 되었습니다. Document 길이가 길지 않기 때문에 text_splitter는 사용하지 않았습니다.

Embed, Store

! pip install docarray
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import DocArrayInMemorySearch

embeddings = OpenAIEmbeddings()
db = DocArrayInMemorySearch.from_documents(
    docs,
    embeddings
)

다양한 vectorstores들 중 DocArrayInMemorySearch를 사용했습니다. 다른 벡터 데이터베이스를 사용하는 것도 가능합니다.

Store (Vector Search)

query = "한여름 산행에 좋은 여성 옷을 추천해줘. 추천 이유를 한국어로 간략하게 설명해줘.\nOutput format: 'name: reason'"

docs = db.similarity_search(query)

docs는 네 개의 Document를 포함한 리스트입니다. 포함된 문서는 질문과 의미가 가장 가까운 문서들입니다.

Retrieve

from langchain.chat_models import ChatOpenAI

llm = ChatOpenAI(temperature = 0.0)
qdocs = "".join([docs[i].page_content for i in range(len(docs))])
rag_prompt = f"{qdocs} Question: {query}"

response = llm.predict(rag_prompt)

## 출력
"name: Women's Camo Mountain Fleece Vest\nreason: 한여름 산행에 좋은 여성 옷으로 추천합니다. 이 베스트는 두꺼운 300무게의 셔파 플리스로 제작되어 견고하고 따뜻한 착용감을 제공합니다. 여름에도 산행 시에는 밤에 추워질 수 있으므로 이 베스트는 완벽한 보온층이 될 것입니다. 또한, 팔 구멍과 밑단에 탄력 있는 실이 있어 편안하게 착용할 수 있으며 바람을 막아줍니다."

앞에서 검색한 네 개의 Document 내용을 프롬프트에 넣어 LLM에 질문과 함께 전달했고, 옷을 하나 추천 받았습니다. 위의 Retrieve 과정은 RetrievalQA Chain을 이용해 구현할 수도 있습니다.

Retrieve: RetrievalQA Chain을 이용하는 방법

from langchain.chains import RetrievalQA

retriever = db.as_retriever()

qa_stuff = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=retriever,
    verbose=True
)
response = qa_stuff.run(query)

문서 내용이 길지 않기 때문에 옵션에서 chain_typestuff로 했습니다.네 개의 Document와 질문을 함께 전달하기 때문에 실행할 때마다 추천하는 옷이 달라질 수도 있습니다. 이러한 Retrieval Augmented Generation은 자주 사용하는 방법이기 때문에 index를 이용해 좀 더 간단하게 구현하는 방법도 있습니다.

Vectorstore Index를 이용하는 방법

RAG 과정 중 Source와 Load (loader 선언까지) 과정은 앞과 동일합니다. 이후 Embed, Store, Retrieve는 다음과 같이 구현할 수 있습니다.

from langchain.indexes import VectorstoreIndexCreator

index = VectorstoreIndexCreator(
    vectorstore_cls=DocArrayInMemorySearch,
    embedding=embeddings
).from_loaders([loader])

response = index.query(query)

앞의 코드에 비해 많이 짧아졌죠? 중간 과정에서 별도의 처리가 필요하다면 앞의 코드를 사용해야겠지만, 그렇지 않다면 index를 사용하는 것이 편리하겠습니다.

LangChain: Document Loaders로 문서 읽어들이기

파일로 된 문서를 가지고 LLM으로 작업하기 위해서는 먼저 문서의 내용을 읽어들여야겠죠. 파이썬에서 직접 문서의 내용을 텍스트로 읽어서 LLM에 전달하는 것도 가능합니다. 하지만 LangChain에서 제공하는 Document loader를 이용하면 편리하게 다양한 문서를 통일된 방식으로 읽어들일 수 있습니다.

LangChain에는 PDF, HTML, Text, Markdown, Json, CSV 파일 외에도 다양한 종류의 로컬 파일들과 클라우드 드라이브의 파일들을 읽을 수 있는 Document loader들이 있습니다. Document loader를 이용해 문서를 읽으면 Document 객체의 리스트를 반환합니다. 분할 여부에 따라 하나의 객체만 있는 리스트가 반환될 수도 있고, 페이지마다 하나씩 객체가 생성되어 여러 개의 원소를 가진 리스트가 반환될 수도 있습니다. 문서의 내용은 Document 객체의 page_content 속성에 들어가고, 원본 파일, 문서 제목, 페이지 번호 등의 정보는 metadata 속성에 저장됩니다. 예제를 살펴보겠습니다.

HTML 문서 읽기

import requests

url = "https://www.gutenberg.org/cache/epub/2680/pg2680-images.html"

response = requests.get(url)

with open("Meditations_pg.html",'wb') as fh:
    fh.write(response.content)

연습을 위해 프로젝트 구텐베르크 사이트에서 페이지를 하나 다운받아 Meditations_pg.html 파일로 저장했습니다. 마르쿠스 아우렐리우스의 명상록입니다. 이 html 파일을 읽어보겠습니다. BSHTMLLoader를 이용할텐데, 이를 위해서는 BeautifulSoup4 패키지를 먼저 설치해야 합니다.

# 설치: pip install beautifulsoup4

from langchain.document_loaders import BSHTMLLoader

loader = BSHTMLLoader("Meditations_pg.html")
data = loader.load()

위의 data는 Document 객체가 하나 들어있는 리스트입니다. 메타데이터를 확인해보겠습니다.

data[0].metadata
## 출력
{'source': 'Meditations_pg.html',
 'title': 'The Project Gutenberg eBook of Meditations, by Marcus Aurelius'}

이번엔 내용을 일부만 확인해보겠습니다.

data[0].page_content[:1000]
## 출력
'\n\nThe Project Gutenberg eBook of Meditations, by Marcus Aurelius\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nThe Project Gutenberg eBook of Meditations\nThis ebook is for the use of anyone anywhere in the United States and\nmost other parts of the world at no cost and with almost no restrictions\nwhatsoever. You may copy it, give it away or re-use it under the terms\nof the Project Gutenberg License included with this ebook or online\nat www.gutenberg.org. If you are not located in the United States,\nyou will have to check the laws of the country where you are located\nbefore using this eBook.\nTitle: Meditations\n\nAuthor: Emperor of Rome Marcus Aurelius\n\nRelease date: June 1, 2001 [eBook #2680]\n                Most recently updated: March 9, 2021\nLanguage: English\n\n*** START OF THE PROJECT GUTENBERG EBOOK MEDITATIONS ***\n\n\n      MEDITATIONS\n    \n\n      By Marcus Aurelius\n    \n\n      MARCUS AURELIUS ANTONINUS THE ROMAN EMPEROR\n    \n\n \n\n\n\n      BOOKS\n    \n\n INTRODUCTION \n\n\n\n\n\nHIS FIRST BOOK\n\n\nTHE SECOND BOOK\n\n\nTHE THI'

전체 길이를 확인해보죠.

len(data[0].page_content)
## 출력
487994

공백 포함 48만자가 넘네요. 이 내용을 LLM에 전달하면 token 제한에 걸리겠죠? LLM에 전달할 때는 내용을 chunk로 분할해서 전달하게 됩니다.

PDF 문서 읽기

이번에는 위 웹 페이지를 pdf로 출력한 파일을 읽어보겠습니다. 이를 위해서는 pypdf 패키지를 미리 설치해야 합니다.

# 설치: pip install pypdf

from langchain.document_loaders import PyPDFLoader

loader = PyPDFLoader("Meditations.pdf")
pages = loader.load_and_split()
len(pages)
## 출력
151

load_and_split 명령으로 pdf 파일을 읽으면서 분할했습니다. 그랬더니 길이가 151인 리스트가 나왔습니다. 실제 pdf 파일의 페이지 수가 151입니다.

pages[0].metadata  ## {'source': 'Meditations.pdf', 'page': 0}
pages[150].metadata  ## {'source': 'Meditations.pdf', 'page': 150}

Metadata에 들어있는 항목이 html 파일의 경우와 달라졌죠? 문서에 따라 metadata의 내용이 달라진다는 것을 알 수 있습니다.

pages[0]
## 출력
Document(page_content='10/6/23, 10:40 PM The Project Gutenberg eBook of Meditations, by Marcus Aurelius\nhttps://www.gutenberg.org/cache/epub/2680/pg2680-images.html 1/151The Project Gutenberg eBook of Meditations\nThis ebook is for the use of anyone anywhere in the United\nStates and most other parts of the world at no cost and with\nalmost no restrictions whatsoever . You may copy it, give it\naway or re-use it under the terms of the Project Gutenber g\nLicense included with this ebook or online at\nwww .gutenber g.org. If you are not located in the United\nStates, you will have to check the laws of the country where\nyou are located before using this eBook.\nTitle: Meditations\nAuthor : Emperor of Rome Marcus Aurelius\nRelease date : June 1, 2001 [eBook #2680]\nMost recently updated: March 9, 2021\nLanguage : English\n*** ST ART OF THE PROJECT  GUTENBERG EBOOK\nMEDIT ATIONS ***\nMEDIT A TIONS\nBy Mar cus Aurelius\nMARCUS AURELIUS ANTONINUS\nTHE ROMAN EMPEROR\nBOOKS\nINTRODUCTION\nHIS FIRST  BOOK\nTHE SECOND BOOK\nTHE THIRD BOOK\nTHE FOUR TH BOOK\nTHE FIFTH BOOK\nTHE SIXTH BOOK\nTHE SEVENTH BOOK\nTHE EIGHTH BOOK\nTHE NINTH BOOK', metadata={'source': 'Meditations.pdf', 'page': 0})

리스트의 첫 번째 원소를 확인해보니 Document 객체가 들어있고, 페이지 내용은 page_content 속성에, 추가 정보는 metadata 속성에 들어가 있는 것을 확인할 수 있습니다.

이렇게 LangChain의 Document loader를 이용하면 다양한 유형의 파일들을 편리하게 읽어들일 수 있습니다.

대학생의 자유로부터의 도피

책 – 자유로부터의 도피

에리히 프롬은 ‘자유로부터의 도피’에서 중세에서 근대로 오면서 사람들이 자유를 얻었을 때 어떻게 반응해왔는지 알려줍니다. 중세 사회는 사람들이 사회 체제 안에서 자신의 역할에 묶여 있는 사회였습니다. 자유가 없는 대신 소속감, 안전, 속박이 있는 사회였죠. 근대 자본주의 사회에서 사람들은 속박에서 해방되어 자유를 얻게 되었지만, 대신 소속감을 잃고 고립되어 불안해하는 경우가 많았습니다. 이러한 불안감으로부터 도피하기 위해 사람들은 크게 세 가지 방법을 선택했습니다.

  1. 권위주의: 자기 이외의 어떤 사람이나 사물에 의지하는 방법입니다.
  2. 파괴성: 어떤 대상을 파괴하는 행동입니다.
  3. 자동 인형적 순응: 자아를 상실하고 타인의 기대에 따라 살아가는 방법입니다.

세 가지 방법 모두 바람직한 방법은 아닙니다. 에리히 프롬이 제안한 대안은 소극적 자유로부터 적극적 자유로 나아가는 것입니다. 소극적 자유가 속박으로부터의 자유라면, 적극적 자유는 사랑과 일 속에서 자신의 능력을 발휘하며 바깥 세계와 자연스럽게 관계를 맺는 자유입니다.

대학생의 자유로부터의 도피

고등학생 때까지 별다른 자유 없이 공부만 하다가 대학에 들어온 학생들은 갑자기 대인관계, 수강신청, 동아리 등 다양한 선택의 자유를 얻게 됩니다. 하지만 자유에 따르는 책임, 취업, 진로, 인간관계의 어려움 등으로 인해 불안감이 생기죠. 에리히 프롬의 분류에 따른 대학생의 도피 방식은 다음과 같이 생각해볼 수 있습니다.

  1. 권위주의: 학교의 규칙, 교수나 멘토의 기대에 맞는 틀 안에서만 움직이는 방법입니다.
  2. 파괴성: 갈등이나 대인관계의 문제 등을 파괴적인 행동으로 해결하려고 시도합니다.
  3. 자동 인형적 순응: 사회의 기대에 맞추어 행동하고 자신의 개성 없이 트렌드나 패션을 맹목적으로 따릅니다.

바람직한 반응은 적극적 자유로 나아가는 것이죠.

  • 다른 사람의 기대에 따라 사는 것이 아니라 자신의 삶을 주도하겠다고 결심합시다.
  • 자신만의 고유한 가치를 긍정적으로 받아들여 자신만의 정체성을 찾아가시기 바랍니다.
  • 다양한 책을 읽으며 스스로 생각하는 힘을 키웁시다.
  • 삶의 의미를 찾아가며 존재하는 삶을 살아가시길 바랍니다.

이러한 과정에서 여러 어려움과 실패가 있겠지만 우리는 실패를 통해 배우고 성장할 수 있습니다.

대학생의 옵션 구매

옵션이란?

경제에서 옵션은 선택할 수 있는 권리를 말합니다.

예를 들어, 현재 브렌트유 가격이 리터당 1700원이라고 해봅시다. 한 달 후에 1리터를 1750원에 살 수 있는 권리를 50원에 팔고 있다고 해봅시다. 사겠습니까?

한 달 후 유가가 리터당 1800원이 넘어갈 것이라 예상한다면 이 권리를 사는 것이 좋습니다. 만약 2000원이 된다면 1750원을 내고 2000원짜리 브렌트유 1리터를 살 수 있으므로 250원 이득이네요. 옵션 구매에 50원을 투자했으니 총 이득은 250원에서 50원을 뺀 200원이 됩니다. 50원 투자해서 한 달만에 200원 순이익을 남겼다면 대단히 성공적인 투자죠?

반대로 유가가 1400원으로 떨어졌다고 해봅시다. 얼마나 손해를 볼까요? 옵션은 권리라고 했습니다. 손해볼 것 같으면 안 사면 됩니다. 따라서 유가가 아무리 떨어져도 최대 손실은 옵션 구매에 쓴 50원으로 제한됩니다.

이렇게 이득은 커질 수 있고, 손실은 제한되는 비대칭적 선택권이 바로 옵션입니다. 미래에 변동이 없다면 옵션은 필요 없습니다. 유가가 한 달 후에도 1700원이라면 옵션을 구매할 이유가 없죠. 변동성이 크고 불확실할수록 옵션은 빛을 발합니다.

대학생의 옵션

옵션을 대학 생활에 적용해봅시다. 4년 동안 열심히 공부해서 우수한 성적으로 졸업하고 원하는 기업에 취직할 것이 확실하다면 옵션이 필요 없습니다. 부모님께 물려받을 재산이 많다면 역시 옵션이 필요 없습니다. 졸업 후가 불확실하다면 나만의 옵션을 준비하는 것이 어떻까요?

대학생은 돈이 별로 없으니 옵션은 시간과 노력으로 구매해야 합니다. 예를 들면 인스타그램 보는 시간을 줄이고, A0 받을 만큼 공부하는 대신 B+ 받을 만큼만 공부해서 남는 시간과 노력으로 미래에 도움이 될 수도 있을만한 다른 것을 공부하거나 만드는 것입니다. 이 때 많이들 하는 스펙 쌓기가 아니라 남들과 차별화할 수 있는 일을 해야 좋은 옵션이 됩니다.

어학 연수? 단순히 어학 연수 다녀왔다는 것은 좋은 옵션이 아닙니다. 원어민처럼 말하고 듣는다면 물론 좋은 옵션이 될 수 있지만 시간, 노력 뿐 아니라 돈도 많이 들 수 있습니다. 생성AI 공부? 빠르게 실력을 쌓는다면 향후 몇 년간 좋은 옵션이 될 수 있을 것으로 보입니다. 컨텐츠 크리에이터? 2년 이상 한 가지 분야에서 전문성을 쌓아가는 과정을 보여준다면 훌륭한 옵션이 될 수 있습니다. 창업? 대학생 때 창업을 한다면 우선 위험 부담 없는 창업으로 경험을 쌓기를 권장합니다. 역시 좋은 옵션이 될 수 있습니다.

옵션은 권리라고 했습니다. 자신이 준비한 옵션이 졸업 후 취업이나 창업에 도움이 된다면 사용하면 되고, 도움이 되지 않는다면 안 쓰면 됩니다. 손해보는 것은 물론 옵션을 준비하는데 들어간 시간과 노력(나중에 보면 손해가 아닐 수도 있습니다)이지만 잘 될 경우 옵션으로 인해 여러분의 진로와 인생이 달라질 수 있습니다.

거꾸로 수업 4학기

거꾸로 수업과의 만남

2015년 2월 말, 개강을 한 주 앞두고 마음이 무거웠다. 강의에서 보게 될 일부 학생들의 멍한 눈빛과 조는 모습이 눈 앞에 아른거렸다. 그동안 조는 학생들보다는 열심히 듣는 학생들이 더 많았고 강의 평가도 나쁘지 않았지만 내 무미건조한 말투 때문에 잠과 사투를 벌일 학생들을 생각하니 마음이 아팠다. 그 때 하나님의 은혜로 ‘플립러닝’이란 단어가 생각났다. 그게 무엇인지는 몰랐다. 이전 학기에 대학교육개발원에서 플립러닝 교수법 강의가 있어서 가보고 싶었지만 강의 시간과 겹쳐서 못 갔었는데 그 때 생각이 난 것이다. 그래서 인터넷을 찾아보고 2014년 봄에 방송했던 KBS의 21세기 교육혁명 미래교실을 찾아서 프로그램도 봤다. 거꾸로 교실 관련 책도 두 권 주문해서 읽으며 당장 모든 학부 강의에 거꾸로 수업을 도입하기로 했다.

거꾸로 수업

기존의 수업은 학교에서 강의를 듣고 집에 가서 숙제를 하는 방식이었다. 강의는 보통 선생님이 앞에서 설명하고 학생들은 조용히 듣는 방식이다. 학생들이 질문을 할 수도 있지만 질문하는 학생은 많지 않다. 집에서 숙제를 할 때에는 강의 자료나 책 등을 참고하는데 이 때 선생님의 도움을 받기는 어렵다.

거꾸로 수업에서는 집에서 강의를 듣거나 읽는다. 수업 시간에는 숙제, 토의와 같은 활동을 하면서 수시로 친구들과 대화하고 선생님께 질문하여 도움을 받을 수 있다.

‘서울대에서는 누가 A+를 받는가’라는 책에서 인용한 연구를 보면 학생은 강의를 들으며 머리를 별로 쓰지 않는다. 따라서 질문할 것도 별로 없다. 반면에 스스로 공부를 하거나 숙제를 할 때에는 머리를 많이 사용하게 되고 질문할 것도 많아진다. 거꾸로 수업에서는 학생들에게 질문이 생겼을 때 선생님이 옆에서 도와줄 수 있다.

수업 준비

거꾸로 수업을 위해서는 학생들이 집에서 예습을 해올 수 있도록 미리 동영상을 만들어 인터넷에 올려야 했다. 적당한 교재가 있다면 동영상이 필수는 아니지만 학생들이 빠르게 예습해올 수 있도록 매 시간 강의의 핵심 내용만 담아 짧게는 10분에서 길게는 30분 정도 길이의 동영상을 만들어 올렸다. 짧은 동영상이지만 제작에는 몇 시간씩 걸린다. 동영상도 중요하지만 더 중요한 것은 수업 시간을 어떻게 채울 것인가이다. 강의 없이 두 시간을 채워야 한다. 수업을 위해 학생들이 토의할 수 있는 질문들과 풀 문제들, 동영상에서 생략된 내용을 채워줄 토의를 준비해야 했는데, 수업 준비하느라 흰머리가 많이 늘어난 듯 하다. 그렇게 2015년 두 학기는 수업 준비와 과제 채점만 하다가 다 보냈다. 올해 1학기에는 작년에 만들었던 동영상을 그대로 사용할 수 있어서 비교적 수월했지만 2학기에는 강의 과목 변경으로 인해 또 두 과목의 동영상을 새로 제작중이다.

고맙게도 대부분의 학생들이 수업 전에 동영상을 보고 왔다. 학생들 중에는 동영상을 보며 몇 장씩 필기를 해오는 학생들도 있었다. 나중에 설문조사를 해보니 동영상이 길지 않아 아무 때나 스마트폰으로 간편히 볼 수 있고, 동영상을 미리 보지 않으면 수업 시간에 조원들에게 피해를 끼치게 되기 때문에 열심히 보고 왔다고 했다.

수업 진행

수업 진행 방식은 강의에 따라 약간씩 달라지지만 크게 내가 제시하는 질문에 대한 학생들의 조별 토의와 문제 풀이로 나뉜다. 조별 토의는 강의실 구조상 한 책상에 앉은 두세 명이 한 조가 되어 진행한다. 조는 보통 내가 지정해주지는 않고 학생들이 알아서 앉도록 한다. 제시하는 질문들은 동영상 내용을 이해했는지 기본 개념을 묻는 질문과 응용이 필요한 질문들이다. 이 때 학생들은 짝을 지어 대화, 토론, 논쟁하는 하브루타 방식으로 공부하게 된다. 학생들은 주요 개념들을 직접 설명하면서 더 잘 이해하고 기억하게 된다. 나는 학생들이 서로 설명하고 토의할 때 학생들 사이를 지나다니며 질문을 받고 대답해준다. 예전 강의식 수업에 비하면 학생들의 질문이 크게 늘었다. 조에 따라 활발히 토론하는 조도 있고 말이 별로 없는 조도 있지만, 현재 학생들의 토의를 평가에 넣지는 않고 있다. 대부분의 학생들이 토의에 열정적으로 참여한다. 토의 후에는 몇몇 학생들에게 토의 내용을 발표하도록 시켜서 바로 이해했는지 확인 후 다음 질문으로 넘어간다. 중요한 개념과 관련된 질문의 경우 발표하는 학생에게 소크라테스식 문답법으로 꼬리에 꼬리를 물고 질문을 던지고 설명해주기도 한다. 학생들 한 명 한 명 이름을 불러 질문하다 보니 내 수업을 처음 듣는 학생들 이름도 금방 기억할 수 있어서 좋다. 평소에 학생들이 토론하는 모습을 관찰하게 되니 학생들이 추천서를 써달라고 왔을 때 쓸 말이 있어서 좋았다.

문제 풀이는 조별 또는 개인 과제로 제출하도록 해서 평가에 반영한다. 개인 과제 제출시에도 베끼지는 말되, 옆 친구들과 적극적으로 토의하며 풀도록 한다. 과제는 되도록이면 수업 시간이 끝나기 전에 마쳐서 제출하도록 하지만 수업 시간중에 다 못해서 나중에 제출하더라도 감점은 없다. 학과에 컴퓨터실이 있어서 과목에 따라 컴퓨터실에서 수업을 진행하며 컴퓨터로 풀어야 하는 과제들을 내주기도 한다.

거꾸로 수업을 하게 되면서 학생들은 서로 말을 많이 하게 되었다. 그에 따라 조는 학생이 없어졌다. 드물게 몇 주에 한 번 조는 학생을 발견하는 경우도 있지만 예전에 거의 매시간 몇 명씩 봤던 것에 비하면 없는 것이나 마찬가지다. 그래서 수업 시간도 이전에 학생들이 많이 졸던 9시, 1시로 잡고 있다. 조별 토의를 통해 편입학한 학생들이 기존 학생들과 쉽게 친해지는 장점도 있었다.

‘어떻게 공부할 것인가’라는 책의 ‘인출 연습’ 개념을 도입하여 토의 내용에 이전 수업 내용과 관련된 질문을 넣기도 한다. 퀴즈와 시험 범위는 처음부터 누적이다. 과목에 따라 학기중 두 세번 정도 학생들이 마인드맵을 이용해 배운 내용을 정리하고 직접 시험 문제를 출제해보도록 해준다. 학생들이 작성해서 제출한 내용은 스캔해서 모든 학생들에게 공개하며 좋은 문제가 있으면 중간 또는 기말 시험에 그대로 출제하기도 한다.

수업 결과

앞에 거꾸로 수업으로 얻게된 장점들을 몇 가지 적었는데, 가장 큰 단점은 수업 준비에 많은 시간과 노력이 필요하다는 점이다. ‘조벽 교수의 명강의 노하우&노와이’에서 준비에 시간이 많이 걸리는 교수법은 좋지 않다고 했다. 새로 동영상을 제작하는데는 시간이 오래 걸리지만 앞으로 동일한 수업을 반복하게 되면 수업 준비 시간이 짧아지게 될 것이다.

현재 네 학기째 학부 수업을 거꾸로 수업으로 진행중이다(대학원 수업은 강의식 수업과 거꾸로 수업의 활동이 혼합된 형태). 강의 경력이 짧아서 학생들의 학업 성취도가 향상되었는지는 알 수 없다. 하지만 학생들의 강의 만족도는 높아졌다. 수업을 열심히 들었던 한 학생은 대학교육개발원의 명강의 에세이 공모전에 내 강의에 관한 글을 써서 상을 받았다. 고맙게도 학생들이 작년 두 학기 강의 평가를 잘 해줘서 단과대학 우수강의교수상을 받았다. 앞으로도 개선해야 할 점들이 많지만 이전의 강의식 수업으로 돌아갈 수는 없을 듯 하다.

환영합니다

탄성파 탐사 연구실을 찾아주신 분들을 환영합니다.

단순히 연구실 소개만 하는 홈페이지가 아니라 방문자에게 조금이라도 유익한 홈페이지로 만들고자 블로깅을 시작합니다. 물리탐사 전공자 뿐 아니라 수치해석을 다루는 다른 전공자들에게도 참고가 될 수 있도록 주로 프로그래밍과 관련된 글들을 올릴 생각입니다.

감사합니다.

 

The LORD bless you and keep you;

the LORD make his face shine on you and be gracious to you;

the LORD turn his face toward you and give you peace.