KT 에이블스쿨 9기 DX컨설턴트

[KT 에이블스쿨 9기 기자단] DX컨설턴트 6주차 후기

juhyo 2026. 5. 20. 22:47

안녕하세요 KT에이블스쿨 9기 기자단입니다.
오늘은 DX컨설턴트 트랙 6주차 후기를 작성하려고 합니다.
매주 써야하는데 이런저런 일이 많다보니 시간이 지나서 작성하게 되네요.
이번주부턴 그 주에 바로 바로 작성하도록 노력해보겠습니다.
 
6주차는 월,화는 휴강일로
수,목,금 3일만 수업이 진행되었습니다.
 
수요일엔 저번주에 이어 음성인식 AI 개인비서 구축이라는 주제로 3차 미니프로젝트가 진행되었습니다.
마케팅팀 김대리 맞춤으로 streamlit과 hugging face를 사용한
AI개인비서 에이블 구현을 목표로 진행하였습니다.
3차 미프 1일차엔 오전에 각자 개별과제를 수행한 후,
조별미팅 시간에 개인비서 에이블에 있으면 추가기능에 대해 의견을 나누는 시간을 가졌습니다.
2일차엔 1일차때 나온 추가기능 의견을 바탕으로 직접 구현해보고 더 고도화를 진행하였습니다.
또한 일종의 어플리케이션처럼 보여지는거다보니
ui도 상의하여 생성형ai를 통해 이미지를 만들어 삽입하였습니다. 
제가 이번에 맡은 역할은 로직구현이었는데요.
이 역할을 수행하면서 실습을 많이 진행하다보니 수업시간에 배웠던 것 보다 훨씬 이해가 잘 되었고,
hugging face 홈페이지와 streamlit함수들 몇가지는 익숙해진 것 같아 좋았습니다.
또한 1차 2차 미니프로젝트에 비해 팀원들간의 의사소통이 원활하다고 느겼습니다.
 
목요일과 금요일엔 LangChain 기반 RAG구현에 대해 배웠습니다.
LangChain은 단순히 LLM을 호출하는 수준이 아니라,
문서 처리, 메모리 관리, 출력 구조화, 체인 연결 같은 기능을 제공해서 실제 AI 서비스를 구현하기 쉽게 만들어줍니다.
특히 RAG 시스템을 만들 때 문서 로딩과 문서 분할의 중요성이 매우 크다는 점을 확인할 수 있었습니다.
또 Prompt Template과 JSON 출력 구조화를 활용하면 더 안정적인 AI 시스템을 만들 수 있다는 점도 인상적이었습니다.
아래는 수업시간에 배운내용 중 중요한 내용을 정리해보았습니다.

LangChain 핵심 개념 정리

1. LangChain 시작

LangChain은 LLM을 쉽게 연결하고 체인 형태로 구성할 수 있게 도와주는 프레임워크이다.
기본적으로 모델 연결, 프롬프트 구성, 문서 처리, 대화 기록 관리 등을 쉽게 구현할 수 있다.

라이브러리 설치

!pip install langchain-core langchain-community langchain-openai -q

OpenAI 모델 연결

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="gpt-4o-mini",
    temperature=0
)
  • ChatOpenAI를 사용해 OpenAI 모델과 연결한다.
  • temperature 값이 낮을수록 더 일관된 답변을 생성한다.

메시지 기반 입력

from langchain_core.messages import HumanMessage, SystemMessage

messages = [
    SystemMessage(content="당신은 친절한 AI입니다."),
    HumanMessage(content="LangChain이 뭐야?")
]

response = llm.invoke(messages)
print(response.content)
  • SystemMessage는 AI 역할을 정의한다.
  • HumanMessage는 사용자 질문이다.
  • invoke()를 사용해 모델 응답을 생성한다.

2. Prompt Template 활용

Prompt Template은 프롬프트를 동적으로 생성하기 위한 기능이다.
변수를 넣어서 재사용 가능한 프롬프트를 만들 수 있다.

PromptTemplate 생성

from langchain_core.prompts import ChatPromptTemplate

prompt_text = "{language} 언어로 번역하세요: {text}"
prompt = ChatPromptTemplate.from_template(prompt_text)
  • {language}, {text} 부분에 원하는 값을 동적으로 넣을 수 있다.

프롬프트 실행

chain = prompt | llm

response = chain.invoke({
    "language": "영어",
    "text": "안녕하세요"
})

print(response.content)
  • | 연산자를 사용해 Prompt와 LLM을 연결한다.
  • invoke()에 딕셔너리 형태로 값을 전달한다.

Prompt Template 장점

  • 프롬프트 재사용 가능
  • 유지보수 편리
  • 변수 기반 자동 생성 가능
  • 체인 구조 구성 가능

3. 세션 기반 대화 기록 관리

LangChain은 이전 대화를 기억하는 기능을 제공한다.
이를 통해 챗봇 형태의 대화 시스템을 만들 수 있다.

메시지 히스토리 관리

from langchain.memory import ConversationBufferMemory

memory = ConversationBufferMemory(return_messages=True)
  • 이전 대화 내용을 메모리에 저장한다.
  • return_messages=True 옵션을 사용하면 메시지 객체 형태로 반환한다.

대화 체인 생성

from langchain.chains import ConversationChain

conversation = ConversationChain(
    llm=llm,
    memory=memory
)

대화 실행

response = conversation.invoke({
    "input": "안녕하세요"
})

print(response)
  • 이전 대화 기록을 기반으로 자연스러운 답변이 가능하다.
  • 챗봇 구현 시 핵심 기능이다.

4. 멀티모달 데이터 입력

멀티모달은 텍스트뿐 아니라 이미지 같은 다양한 데이터를 함께 처리하는 방식이다.
최근 LLM은 이미지 입력도 지원한다.

이미지 파일 읽기

import base64

with open("image.png", "rb") as f:
    image_data = base64.b64encode(f.read()).decode("utf-8")

이미지와 텍스트 함께 전달

from langchain_core.messages import HumanMessage

message = HumanMessage(
    content=[
        {"type": "text", "text": "이미지를 설명해줘"},
        {
            "type": "image_url",
            "image_url": {
                "url": f"data:image/png;base64,{image_data}"
            }
        }
    ]
)

response = llm.invoke([message])
print(response.content)
  • 텍스트와 이미지를 동시에 입력 가능하다.
  • 이미지 분석, OCR, 시각 질의응답 등에 활용된다.

5. 응답을 JSON 형태로 구조화

LLM 응답을 JSON 형태로 강제하면 데이터를 안정적으로 처리할 수 있다.
API 응답이나 자동화 시스템에서 많이 사용된다.

구조화된 출력 생성

from langchain_core.output_parsers import JsonOutputParser

JSON 형식 응답 유도

prompt = ChatPromptTemplate.from_template(
    """
    아래 내용을 JSON 형태로 정리하세요.

    질문: {question}
    """
)

체인 구성

parser = JsonOutputParser()

chain = prompt | llm | parser

response = chain.invoke({
    "question": "AI의 장점을 설명해줘"
})

print(response)
  • 출력 데이터를 딕셔너리 형태로 받을 수 있다.
  • 프론트엔드, 데이터 처리 시스템과 연결하기 좋다.

6. 다양한 문서 불러오기

LangChain은 PDF, TXT, CSV 등 다양한 문서를 불러오는 기능을 제공한다.
RAG 시스템 구축 시 매우 중요하다.

텍스트 문서 로딩

from langchain_community.document_loaders import TextLoader

loader = TextLoader("sample.txt")
docs = loader.load()

PDF 문서 로딩

from langchain_community.document_loaders import PyPDFLoader

loader = PyPDFLoader("sample.pdf")
docs = loader.load()

CSV 문서 로딩

from langchain_community.document_loaders import CSVLoader

loader = CSVLoader(file_path="sample.csv")
docs = loader.load()

핵심 개념

  • 문서를 LangChain Document 객체로 변환한다.
  • 이후 임베딩, 벡터DB, 검색 시스템과 연결 가능하다.
  • RAG 파이프라인의 시작 단계이다.

7. 문서 분할하기

긴 문서를 그대로 LLM에 넣으면 토큰 제한 문제가 발생한다.
그래서 문서를 작은 단위로 분할해야 한다.

RecursiveCharacterTextSplitter 사용

from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50
)
  • chunk_size는 문서 조각 크기이다.
  • chunk_overlap은 이전 문맥을 일부 유지하기 위한 중복 영역이다.

문서 분할

split_docs = text_splitter.split_documents(docs)

print(len(split_docs))

왜 문서를 분할할까?

  • 토큰 제한 해결
  • 검색 정확도 향상
  • 임베딩 성능 개선
  • RAG 검색 품질 향상

전체 흐름 정리

LangChain 기반 RAG 시스템은 보통 아래 흐름으로 구성된다.

  1. 문서 불러오기
  2. 문서 분할
  3. 임베딩 생성
  4. 벡터DB 저장
  5. 사용자 질문 입력
  6. 관련 문서 검색
  7. LLM 응답 생성

이 과정에서 Prompt Template, Memory, JSON Output Parser 같은 기능이 함께 사용된다.


 
여기까지 읽어주셔서 감사합니다.!