KITRI LangChain 교육 1일차 - LangChain 기초부터 실습까지
KITRI에서 진행된 LangChain 교육 1일차 내용을 정리해보겠습니다. 이번 포스팅에서는 LangChain의 기본 개념부터 실제 코드 구현까지 차근차근 다뤄보겠습니다.
1일차 학습 목표
- AI 역사
- 벡터와 AI 모델의 문제 해결 원리
- LangChain 프레임워크 이해
- 기본 구조와 구성 요소 파악
- Chain의 개념과 활용법 습득
- LLM API 연동 방법 학습
- Prompt Engineering 기초 실습
AI 역사 요약
1단계: AI의 탄생 (1943-1958)
- 1943년: McCulloch과 Pitts가 최초의 인공신경망 이론 제시
- 1958년: Frank Rosenblatt이 퍼셉트론 개발 - 현대 신경망의 시작점
2단계: 첫 번째 암흑기 (1970-1980년대)
- 원인: 1969년 Minsky와 Papert의 퍼셉트론 한계 지적, 1973년 Lighthill Report의 부정적 평가
- 결과: 1974년부터 1980년까지 AI 자금 지원이 급격히 감소
- 발전: 다양한 ML 알고리즘과 전문가 시스템 개발 시도
3단계: AI 부활과 이미지 혁명 (1990-2015)
- 1990년대: 두 번째 AI 겨울 후 점진적 회복
- 2009년: ImageNet 데이터셋 출시
- 2012년: AlexNet이 ImageNet Challenge에서 15.3% 오류율로 압승, 딥러닝 혁명의 시작
- 2012-2015년: CNN 기반 컴퓨터 비전 기술 급속 발전
4단계: 트랜스포머와 생성 AI 시대 (2017-현재)
트랜스포머 혁명 (2017) 2017년 Google 연구진이 "Attention Is All You Need" 논문에서 혁신적인 신경망 아키텍처인 트랜스포머를 소개했습니다. 이는 대규모 언어 모델의 기반이 되었습니다.
GPT 시리즈 발전
- 2018년: GPT-1 출시 (1억 1,700만 개 매개변수)
- 2019년: GPT-2 출시 (15억 개 매개변수)
- 2020년: GPT-3 출시 (1,750억 개 매개변수)
ChatGPT와 생성 AI 폭발 (2022-현재)
- 2022년 11월 30일: OpenAI가 ChatGPT를 대중에게 공개
- 2022년 12월 5일: 출시 5일 만에 100만 사용자 돌파
- 2023년 2월: ChatGPT가 TikTok(9개월)과 Instagram(2년 반)보다 빠르게 1억 사용자에 도달
- 2023년 3월: GPT-4 출시로 더 나은 신뢰성, 창의성, 문제 해결 능력 제공
현재 상황 (2024-2025) 2024년 5월 GPT-4o가 출시되었으며, 이는 OpenAI의 가장 최신 GPT 기반 모델입니다. 현재 AI는 2020년대에 출간물, 특허 출원, 총 투자액(2022년 500억 달러), 구인 공고(2022년 미국에서 80만 개) 등 모든 면에서 역사상 최고 수준의 관심과 자금을 받고 있습니다.
주요 특징
- 1958년: 신경망의 탄생
- 1970-80년대: AI 겨울과 기초 이론 발전
- 2012년: 딥러닝으로 이미지 인식 혁명
- 2017년: 트랜스포머로 언어 AI 혁명
- 2022년: ChatGPT로 생성 AI 대중화
- 현재: AI가 일상생활과 산업 전반에 깊숙이 통합
AI는 60여 년간 여러 번의 침체기를 겪었지만, 각 시기마다 중요한 기술적 발전을 이루며 현재의 생성 AI 시대에 이르렀습니다.
벡터와 AI 모델의 문제 해결 원리
벡터(Vector)란?
기본 개념
벡터는 여러 개의 숫자를 순서대로 나열한 것으로, AI에서 모든 정보를 수치로 표현하는 기본 단위입니다.
예시:
- 단어 "고양이": [0.8, -0.3, 0.6, 0.2, -0.1]
- 이미지 픽셀: [255, 128, 64, 200, ...]
- 음성 신호: [0.1, 0.3, -0.2, 0.5, ...]
AI에서 벡터의 역할
- 정보 표현: 모든 데이터(텍스트, 이미지, 음성)를 숫자로 변환
- 의미 포착: 비슷한 의미의 단어들은 비슷한 벡터값을 가짐
- 계산 가능: 수학적 연산으로 처리 가능
AI 모델의 문제 해결 과정
1단계: 입력 벡터화
모든 입력 데이터를 벡터로 변환합니다.
- 텍스트: 단어 → 임베딩 벡터
- 이미지: 픽셀값 → 숫자 배열
- 음성: 음파 → 주파수 벡터
2단계: 신경망 처리
입력 벡터 × 가중치 행렬 + 편향 = 새로운 벡터
각 층에서 벡터가 변환되며 점차 의미있는 특징을 추출합니다.
3단계: 활성화 함수
ReLU: f(x) = max(0, x) - 음수를 0으로 만듦 Sigmoid: f(x) = 1/(1+e^(-x)) - 0과 1 사이로 압축 Tanh: f(x) = (e^x - e^(-x))/(e^x + e^(-x)) - -1과 1 사이로 압축
4단계: Softmax 함수
Softmax의 핵심 원리
수학적 정의
Softmax(xi) = e^(xi) / Σ(e^(xj))
작동 과정
- 지수 함수 적용: 모든 값을 양수로 만듦
- 정규화: 전체 합이 1이 되도록 나눔
- 확률 출력: 각 선택지의 확률을 제공
예시 계산
입력: [2.0, 1.0, 0.5]
- 지수화: [e^2.0, e^1.0, e^0.5] = [7.39, 2.72, 1.65]
- 합계: 7.39 + 2.72 + 1.65 = 11.76
- 정규화: [7.39/11.76, 2.72/11.76, 1.65/11.76] = [0.63, 0.23, 0.14]
- 결과: 63%, 23%, 14%
실제 분류 예시
이미지 분류: "고양이 vs 개"
과정:
- 이미지 입력 → 픽셀 벡터
- CNN 처리 → 특징 추출
- 완전연결층 → 점수 계산
- 고양이 점수: 2.1
- 개 점수: 0.8
- Softmax 적용:
- e^2.1 = 8.17, e^0.8 = 2.23
- 합계: 10.40
- 고양이: 8.17/10.40 = 78.6%
- 개: 2.23/10.40 = 21.4%
- 결과: 고양이 (78.6% 신뢰도)
텍스트 분류: 감정 분석
입력: "이 영화 정말 좋아요!"
- 토큰화: ["이", "영화", "정말", "좋아요"]
- 임베딩: 각 단어를 벡터로 변환
- 트랜스포머 처리: 문맥 이해
- 분류층: [긍정: 3.2, 부정: -1.1, 중립: 0.3]
- Softmax: [긍정: 89%, 부정: 1%, 중립: 10%]
핵심 특징들
Softmax의 장점
- 확률 해석: 결과를 확률로 해석 가능
- 미분 가능: 역전파 학습 가능
- 상대적 비교: 가장 높은 값이 더 강조됨
Temperature 조정
Softmax(xi/T) = e^(xi/T) / Σ(e^(xj/T))
- T > 1: 확률이 더 균등해짐 (창의적)
- T < 1: 확률이 더 극단적이 됨 (확실함)
- T → 0: 가장 높은 값만 1, 나머지는 0
왜 이 방식을 사용할까?
1. 해석 가능성
숫자 점수보다 확률이 더 직관적으로 이해하기 쉽습니다.
2. 학습 효율성
확률 분포로 변환하면 교차 엔트로피 손실 함수를 사용할 수 있어 학습이 안정적입니다.
3. 다중 선택
여러 선택지 중에서 상대적 중요도를 파악할 수 있습니다.
이렇게 벡터와 Softmax를 통해 AI는 복잡한 입력을 이해하고, 인간이 해석할 수 있는 확률 형태로 답을 제공합니다. 위의 인터랙티브 데모를 통해 실제로 값을 조정해보며 Softmax가 어떻게 작동하는지 체험해보세요!
LangChain 개념 설명
LangChain이란?
LangChain은 언어 모델(LLM)을 활용한 애플리케이션 개발을 위한 강력한 오픈소스 프레임워크입니다.
핵심 특징
- 체인 구조: 여러 작업을 순차적으로 연결
- 모듈화: 재사용 가능한 컴포넌트 제공
- 다양한 연동: OpenAI, HuggingFace, Anthropic 등 지원
- 문서 처리: PDF, 웹페이지 등 다양한 형태 지원
실무에서 왜 중요한가?
기존 방식: LLM API 직접 호출 → 복잡한 코드 → 유지보수 어려움
LangChain: 표준화된 인터페이스 → 간단한 구현 → 확장성 확보
환경 설정 실습
# 1. 필수 라이브러리 설치
!pip install langchain
!pip install langchain-openai
!pip install python-dotenv
# 2. 환경 변수 설정from dotenv import load_dotenv
import os
load_dotenv()
# .env 파일 내용# OPENAI_API_KEY=your_api_key_here# LANGCHAIN_API_KEY=your_langsmith_key_here
LangChain 구성 요소 이해
LangChain의 핵심 구성 요소
1. Models (모델)
from langchain_openai import ChatOpenAI
# LLM 모델 초기화
llm = ChatOpenAI(
model="gpt-3.5-turbo",
temperature=0.7,
max_tokens=500
)
2. Prompts (프롬프트)
from langchain.prompts import ChatPromptTemplate
# 프롬프트 템플릿 생성
prompt = ChatPromptTemplate.from_messages([
("system", "당신은 친절한 AI 어시스턴트입니다."),
("human", "{question}")
])
3. Output Parsers (출력 파서)
from langchain.schema.output_parser import StrOutputParser
# 문자열 출력 파서
parser = StrOutputParser()
기본 체인 구성 실습
# 첫 번째 체인 만들기
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema.output_parser import StrOutputParser
# 1. 구성 요소 준비
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.7)
prompt = ChatPromptTemplate.from_messages([
("system", "당신은 도움이 되는 AI 어시스턴트입니다."),
("human", "{question}")
])
parser = StrOutputParser()
# 2. 체인 구성 (파이프라인 연산자 사용)
chain = prompt | llm | parser
# 3. 체인 실행
result = chain.invoke({"question": "LangChain에 대해 설명해주세요."})
print(result)
출력 예시
LangChain은 언어 모델을 활용한 애플리케이션 개발을 위한 프레임워크입니다.
주요 특징으로는 체인 구조를 통한 작업 연결, 다양한 LLM 모델 지원,
문서 처리 기능 등이 있습니다...
LangChain 활용법 이해
심화 체인 구성
1. 조건부 체인
from langchain.schema.runnable import RunnableBranch
# 언어 감지 후 다른 처리
language_chain = RunnableBranch(
(
lambda x: "안녕" in x["text"],
korean_chain
),
(
lambda x: "hello" in x["text"].lower(),
english_chain
),
default_chain
)
2. 병렬 체인
from langchain.schema.runnable import RunnableParallel
# 여러 작업을 동시에 실행
parallel_chain = RunnableParallel({
"summary": summary_chain,
"sentiment": sentiment_chain,
"keywords": keyword_chain
})
result = parallel_chain.invoke({"text": "분석할 텍스트"})
# 결과: {"summary": "...", "sentiment": "긍정적", "keywords": ["AI", "기술"]}
3. 순차 체인
from langchain.chains import SequentialChain
# 단계별 처리sequential_chain = SequentialChain(
chains=[preprocessing_chain, analysis_chain, output_chain],
input_variables=["raw_text"],
output_variables=["final_result"]
)
실제 활용 사례
고객 문의 자동 분류 시스템
# 고객 문의 분류 체인
customer_service_chain = (
ChatPromptTemplate.from_template("""
다음 고객 문의를 카테고리로 분류해주세요:
- 기술문의
- 결제문의
- 배송문의
- 기타
고객 문의: {inquiry}
카테고리:
""")
| llm
| StrOutputParser()
)
# 실행
result = customer_service_chain.invoke({
"inquiry": "제품이 언제 배송되나요?"
})
print(result)# 출력: "배송문의"
Chain 이해 및 실습
Chain의 핵심 개념
LCEL (LangChain Expression Language)
# 기존 방식 (복잡함)
def old_way(question):
formatted_prompt = prompt.format(question=question)
llm_output = llm.invoke(formatted_prompt)
parsed_output = parser.parse(llm_output)
return parsed_output
# LCEL 방식 (간단함)chain = prompt | llm | parser
result = chain.invoke({"question": "질문"})
다양한 Chain 패턴
1. Simple Chain (단순 체인)
# 질문 → 답변
simple_chain = (
ChatPromptTemplate.from_template("질문: {question}\\n답변:")
| llm
| StrOutputParser()
)
2. Transform Chain (변환 체인)
def preprocess_text(inputs):
# 텍스트 전처리
text = inputs["text"]
cleaned_text = text.strip().lower()
return {"processed_text": cleaned_text}
# 전처리 → LLM → 후처리
transform_chain = (
preprocess_text
| ChatPromptTemplate.from_template("분석할 텍스트: {processed_text}")
| llm
| StrOutputParser()
)
3. Router Chain (라우터 체인)
from langchain.chains.router import MultiPromptChain
# 주제별로 다른 전문가 체인으로 라우팅router_chain = MultiPromptChain(
router_chain=router,
destination_chains={
"technology": tech_expert_chain,
"business": business_expert_chain,
"general": general_chain
},
default_chain=general_chain
)
LLM API 활용
다양한 LLM 모델 연동
1. OpenAI 연동
from langchain_openai import ChatOpenAI
# GPT-3.5 Turbo
gpt35 = ChatOpenAI(
model="gpt-3.5-turbo",
temperature=0.7,
max_tokens=1000
)
# GPT-4
gpt4 = ChatOpenAI(
model="gpt-4",
temperature=0.5,
max_tokens=2000
)
2. HuggingFace 연동
from langchain_huggingface import HuggingFacePipeline
# 로컬 모델 사용
hf_llm = HuggingFacePipeline.from_model_id(
model_id="microsoft/DialoGPT-medium",
task="text-generation",
model_kwargs={"temperature": 0.7}
)
3. Anthropic Claude 연동
from langchain_anthropic import ChatAnthropic
claude = ChatAnthropic(
model="claude-3-sonnet-20240229",
max_tokens=1000
)
API 연동 실습
실시간 채팅 시스템 구현
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
# 메모리 기능이 있는 채팅 봇
memory = ConversationBufferMemory()
conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=True
)
# 대화 시작while True:
user_input = input("사용자: ")
if user_input.lower() == 'quit':
break
response = conversation.predict(input=user_input)
print(f"AI: {response}")
배치 처리 시스템
# 여러 질문을 한번에 처리
questions = [
"LangChain의 장점은?",
"Python과 JavaScript의 차이점은?",
"AI의 미래는 어떨까요?"
]
# 배치 실행
results = chain.batch([{"question": q} for q in questions])
for q, r in zip(questions, results):
print(f"Q: {q}")
print(f"A: {r}\\n")
Prompt Engineering
Prompt Engineering의 중요성
좋은 프롬프트는 AI의 성능을 크게 좌우합니다. 같은 모델이라도 프롬프트에 따라 결과가 천차만별입니다.
Before & After 비교
Before (나쁜 예시)
bad_prompt = "번역해줘"
After (좋은 예시)
good_prompt = """
당신은 전문 번역가입니다. 다음 텍스트를 한국어로 자연스럽게 번역해주세요.
번역 시 고려사항:
1. 문맥과 뉘앙스 유지
2. 한국어 표현에 맞게 의역
3. 전문 용어는 정확하게 번역
원문: {text}
번역:
"""
효과적인 Prompt 작성 기법
1. 역할 지정 (Role Playing)
role_prompt = ChatPromptTemplate.from_template("""
당신은 20년 경력의 소프트웨어 아키텍트입니다.
주니어 개발자에게 설명하듯이 쉽고 명확하게 답변해주세요.
질문: {question}
답변:
""")
2. 단계별 사고 (Chain of Thought)
cot_prompt = ChatPromptTemplate.from_template("""
다음 문제를 단계별로 해결해주세요:
문제: {problem}
해결 과정:
1단계: 문제 분석
2단계: 접근 방법 결정
3단계: 단계별 실행
4단계: 결과 검증
답변:
""")
3. 예시 제공 (Few-shot Learning)
few_shot_prompt = ChatPromptTemplate.from_template("""
다음은 고객 문의를 카테고리로 분류하는 예시입니다:
예시 1:
문의: "배송이 언제 되나요?"
카테고리: 배송문의
예시 2:
문의: "결제가 안 돼요"
카테고리: 결제문의
예시 3:
문의: "제품 사용법을 알려주세요"
카테고리: 기술문의
이제 다음 문의를 분류해주세요:
문의: {inquiry}
카테고리:
""")
프롬프트 최적화 실습
A/B 테스트를 통한 프롬프트 개선
# 버전 A: 기본 프롬프트
prompt_a = ChatPromptTemplate.from_template(
"다음 텍스트를 요약해주세요: {text}"
)
# 버전 B: 개선된 프롬프트
prompt_b = ChatPromptTemplate.from_template("""
당신은 전문 에디터입니다. 다음 텍스트의 핵심 내용을 3문장으로 요약해주세요.
요약 기준:
- 가장 중요한 정보 우선
- 구체적인 수치나 사실 포함
- 읽기 쉬운 문장 구조
텍스트: {text}
요약:
""")
# 두 버전 비교 테스트
test_text = "긴 텍스트 내용..."
result_a = (prompt_a | llm | StrOutputParser()).invoke({"text": test_text})
result_b = (prompt_b | llm | StrOutputParser()).invoke({"text": test_text})
print("버전 A 결과:", result_a)
print("버전 B 결과:", result_b)
종합 실습
미니 프로젝트: 스마트 FAQ 시스템
1일차 마지막 시간에는 배운 내용을 종합하여 실제 활용 가능한 FAQ 시스템을 만들어봅시다.
프로젝트 구조
# 1. FAQ 데이터 준비
faq_data = {
"배송": [
"배송은 주문 후 2-3일 소요됩니다.",
"무료배송은 3만원 이상 구매시 가능합니다."
],
"결제": [
"신용카드, 계좌이체, 간편결제를 지원합니다.",
"결제 취소는 주문 후 1시간 내 가능합니다."
],
"교환환불": [
"교환/환불은 구매 후 7일 내 가능합니다.",
"사용된 제품은 교환/환불이 어렵습니다."
]
}
# 2. 질문 분류 체인
classifier_chain = (
ChatPromptTemplate.from_template("""
다음 고객 질문을 카테고리로 분류해주세요.
카테고리: 배송, 결제, 교환환불, 기타
질문: {question}
카테고리:
""")
| llm
| StrOutputParser()
)
# 3. 답변 생성 체인
answer_chain = (
ChatPromptTemplate.from_template("""
다음 FAQ 정보를 참고하여 고객 질문에 친절하게 답변해주세요.
FAQ 정보: {faq_info}
고객 질문: {question}
답변:
""")
| llm
| StrOutputParser()
)
# 4. 전체 시스템 통합def smart_faq_system(question):
# 1단계: 질문 분류
category = classifier_chain.invoke({"question": question}).strip()
# 2단계: 관련 FAQ 정보 가져오기
faq_info = "\\n".join(faq_data.get(category, ["해당 카테고리 정보가 없습니다."]))
# 3단계: 답변 생성
answer = answer_chain.invoke({
"question": question,
"faq_info": faq_info
})
return {
"category": category,
"answer": answer
}
# 5. 테스트
test_questions = [
"배송비가 얼마인가요?",
"카드로 결제할 수 있나요?",
"제품을 교환하고 싶어요"
]
for question in test_questions:
result = smart_faq_system(question)
print(f"질문: {question}")
print(f"분류: {result['category']}")
print(f"답변: {result['answer']}")
print("-" * 50)
실행 결과 예시
질문: 배송비가 얼마인가요?
분류: 배송
답변: 배송비는 3만원 이상 구매시 무료배송이 가능하며,
그 이하는 배송비가 부과됩니다. 배송은 주문 후 2-3일 정도 소요됩니다.
질문: 카드로 결제할 수 있나요?
분류: 결제
답변: 네, 신용카드로 결제 가능합니다.
신용카드 외에도 계좌이체, 간편결제도 지원하고 있습니다.
핵심 개념 요약
- LangChain: LLM 애플리케이션 개발 프레임워크
- Chain: 작업들을 순차적으로 연결하는 파이프라인
- LCEL: 파이프라인 연산자(|)를 사용한 간단한 체인 구성
- Prompt Engineering: 효과적인 지시문 작성으로 AI 성능 향상
주요 코드 패턴
# 기본 패턴chain = prompt | llm | parser
# 조건부 처리chain = RunnableBranch((condition, chain_a), chain_b)
# 병렬 처리chain = RunnableParallel({"task1": chain1, "task2": chain2})
# 메모리 추가chain = ConversationChain(llm=llm, memory=memory)
실무 활용 포인트
- 모듈화: 재사용 가능한 체인 컴포넌트 설계
- 에러 처리: try-catch를 통한 안정성 확보
- 성능 최적화: 배치 처리, 비동기 처리 활용
- 프롬프트 관리: 버전 관리 및 A/B 테스트
'LLM(Open AI)' 카테고리의 다른 글
LangChain, RAG, ReAct, LangGraph의 핵심 이론 - KITRI 교육 (3) | 2025.07.14 |
---|---|
LangChain 과 Hugging Face를 활용한 한국어 AI 개발 다운로드 및 환경 구성 - Kitri (네이버 하이퍼클로바 모델, SKT의 KoGPT2, Anaconda, CURSOR, LangSmith 등) (2) | 2025.07.09 |
문서가 AI로 변한다? 노트북LM(NotebookLM) 이란, 장단점 등 사용방법 (5) | 2025.06.10 |
LLM의 중추, 트랜스포머 아키텍처 (2) | 2025.04.04 |
LLM의 기초 뼈대 세우기 (5) | 2025.04.01 |