Data Science/생성형 AI

LangChain

Boxya 2025. 4. 21. 23:18

[KT] AIVLE SCHOOL 19일차

 

LangChain

  • LangChain은 대규모 언어 모델(LLMs)을 활용하여 체인을 구성
  • 이 체인을 통해 복잡한 작업을 자동화하고 쉽게 수행할 수 있도록 돕는 라이브러리
  • 구성요소
    • 모델
    • 프롬프트
    • 인덱스 : 벡터 DB
    • 메모리
    • 체인 Agent와 Tools
  • LangChain을 쓰는 이유
    • 체인(Chain)으로 LLM 사용을 조합하기 위해
      • LLM 호출, 프롬프트 구성, 추력 파싱, 메모리 등 여러 단계를 연결해서 처리
      • 하나하나 직접 짜는 대신 재사용 가능한 구성요소로 조립 가능
      • e.g. 사용자 질문 -> 프롬프트 템플릿 -> LLM 호출 -> 파싱 -> DB 저장 -> 다음 질문과 연결
      • 위 과정을 LangChain은 한 줄로 연결해서 관리 가능
    • 구성 요소가 모듈화 되어 있음
      • 프롬프트, 모델, 출력 파서, 메모리 등 모두 독립적인 객체로 관리
      • 실험적으로 교체하거나 튜닝할 때 유리 -> "프롬프트만 바꿔서 결과 비교해 보자" 같은 작업이 쉬움
    • 메모리, Tool, Agent 같은 고급 기능 제공
      • 챗봇에 상태(이전 대화)를 기억하게 하려면 --> 메모리
      • LLM이 도구를 써서 계산이나 검색을 하게 하고 싶으면 --> Agent
    • 복잡한 RAG, 멀티모달, 워크플로우에 유리
      • Retrieval, RAG, LangGraph 등 검색 + 생성 기반 앱 만들 때 구조가 깔끔하게 정리됨
      • 체인을 통한 분기, 반복, 조건처리도 가능
  • Models
    • 다양한 LLM을 통합하고 상호 작용하는데 사용
    • 이 컴포넌트를 통해 개발자는 여러 모델을 쉽게 전환하고 비교할 수 있음
  • Prompt
    • 프롬프트란 인간이 인공지능(LLM)에게 전달하는 지시문으로 모델의 응답을 결정짓는 핵심 입력
    • 역할
      • LLM에게 무엇을 할지 설명
      • 질문, 명령, 조건 등을 포함
      • LLM의 출력 품질을 좌우하는 가장 중요한 요소
    • LangChain에서의 프롬프트
      • PromptTemplate : 변수 기반 동적 프롬프트 생성
      • ChatPromptTemplate : 여러 메시지를 구조화하여 대화 설계
      • 프롬프트 -> LLM -> 응답의 중심 구성요소
    • PromptTemplate
      • LangChain에서 프롬프트(Prompt)를 템플릿 형태로 추상화한 클래스
      • 사용자 입력을 동적으로 삽입할 수 있는 문자열 포맷 객체
      • 유동적 템플릿 생성과 변수만 바꿔서 다양한 결과 실험 가능
      • 객체화, 재사용, 체인과 결합 가능
      • 특히 LLMChain이나 AgentChain 같은 구조와 연결할 때 핵심 역할
      • 답변의 다양성과 무작위성 제어
        • LLM의 다음 단어 생성
          • 내부적으로 각 단어 후보마다 로짓(logits)을 계산한 뒤 이를 softmax 함수로 확률로 변환
        • Temperature
          • 확률 분포 자체를 날카롭게(0) 혹은 넓게(1+) 조절
            • 낮은 값 (0) : 항상 가장 확률 높은 단어를 고름 -> 일관되고 예측 가능한 결과
            • 높은 값 (1 이상) : 낮은 확률 단어도 고를 가능성 있음 -> 창의적이지만 불안정한 결과
        • 일반적인 값의 범위
          • 0 : 가장 보수적, 항상 같은 답 / 코드 생성, 논리적 답변
          • 0.3 ~ 0.7 : 적당한 창의성 / 일상 대화, 설명문
          • 1 ~ : 매우 창의성 / 시, 이야기, 브레인스토밍
    • ChatPromptTemplate
      • 시스템 메시지, 사용자 메시지, AI 메시지 등 역할(role) 구분
      • 다중 메시지 기반의 프롬프트 흐름을 구성할 수 있도록 도와주는 템플릿
      • 메시지 종류
        • SystemMessage : AI에게 역할/성격을 지정
        • HumanMessage : 사용자 질문 또는 요청
        • AIMessage : AI 응답
    • Output Parser
      • PromptTemplate, ChatPromptTemplate --> LLM에게 어떻게 질문할 것인가
      • Output Parser --> LLM이 반환한 답을 어떻게 정리하고 쓸 수 있는가
      • Output Parser가 필요한 이유
        • LLM은 기본적으로 자유형 텍스트(string)를 반환
        • 하지만 우리가 원하는건 구조화된 된 데이터
          • 리스트 형태 ([["A", "B", "C"])
          • 딕셔너리 ({"title": ..., "summary": ...})
          • 숫자 값, JSON 포맷 등
        • OutputParser는 이런 "텍스트"를 우리가 원하는 형태로 가공해주는 도구
      • Output Parser 종류
        • CommaSepartedListOutputParser : 쉼표 구분 문자열 -> 리스트로 변환
        • PydanticOutputParser
          • 텍스트 -> Pydantic 모델로 파싱 
          • Pydantic : 데이터를 정의하고 검증할 수 있는 파이썬 라이브러리
          • 데이터 구조(스키마)를 정의하고 타입이 맞는지 자동으로 검증(validation)까지 해줌
          • Python 객체처럼 쓰면서도 JSON->Python 변환에 아주 유리
        • StructuredOutputParser
          • JSON 기반 구조화 파싱
          • 지정된 JSON 구조로 유도, 그 결과를 Python dict로 파싱 
      • 출력 방식
        • .invoke()
          • 호출 방식 : 전체 응답을 한 번에 받아옴
          • 반환 값 : 완성된 결과 (str 또는 메시지)
          • 사용 시점 : 일반적인 응답 처리
          • 대표 상황 : 분석, 요약, JSON 응답 등
        • .stream()
          • 여러 개의 응답 조각(chunk)을 하나씩 생성하는 generator 
          • 호출 방식 : 한 토큰씩 실시간으로 받아옴
          • 반환 값 : generator (순차적으로 토큰 스트리밍)
          • 사용 시점 : 실시간 출력, 빠른 피드백, 대화형 UI
          • 대표 상황 : 채팅, 실시간 출력, 프롬프트 디버깅 등
  • Memory
    • 챗봇 : 이전 대화를 기억하고 이전 질문 답변을 Memory에 저장하고 이를 Prompt에 포함
    • 메모리를 사용하기 위해서는 Chain으로 역어야 함 (LLM과 메모리 엮기)
    • 자주 사용되는 메모리 종류
      • LangChain에서는 다양한 상황에 맞게 사용할 수 있도록 여러 가지 Memory 클래스를 제공
      • ConversationBufferMemory
        • 모든 대화를 순차적으로 저장
        • 텍스트 누적 방식으로 LLM에 전달됨
        • 대화 길이가 짧고 단순한 맥락 유지에 적합
      • ConversationSummaryMemory
        • 대화를 요약해서 저장,
        • 긴 대화를 다룰 때 적합 : 프롬프트에 전체 내용을 붙이지 않아 토큰 절약 가능
        • 리소스 절약 필요할 때
        • 내부적으로 요약용 LLM이 호출됨
          • 요약은 두번째 대화부터 진행
          • 요약 범위 : 이전 요약 + 새 메시지들만 요약해서 업데이트
      • ConversationBufferWindowMemory
        • 최근 N턴만 기억
        • 메모리 용량 조절 가능
        • 과거 내용은 자동 삭제됨(메모리에는 k턴의 대화 내용만 저장됨)
        • 최신 문맥만 중요할 때 (e.g. 챗봇)
  • LCEL(LangChain Expression Language)
    • 체인, 모델, 파서, 프롬프트 등 여러 구성요소를 파이프라인처럼 | 연산자로 연결할 수 있는 표현식 기반 체인 구성 방식
    • LCEL으로 엮을 수 있는 대상
      • input | Runnable 1 | Runnable 2 | Runnable 3
        • input : prompt
        • Runnble 1 객체 : LangChain에서 데이터를 받아 처리하고 다음 단계로 넘겨주는 연결 가능한 처리 단위

 

'Data Science > 생성형 AI' 카테고리의 다른 글

Vector DB와 RAG 파이프라인 구축  (0) 2025.04.22
Vector DB와 RAG  (2) 2025.04.22
Fine-tuning  (1) 2025.04.18
LLM 활용  (2) 2025.04.18
생성형 AI  (0) 2025.04.18