[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 등 검색 + 생성 기반 앱 만들 때 구조가 깔끔하게 정리됨
- 체인을 통한 분기, 반복, 조건처리도 가능
- 체인(Chain)으로 LLM 사용을 조합하기 위해
- Models
- 다양한 LLM을 통합하고 상호 작용하는데 사용
- 이 컴포넌트를 통해 개발자는 여러 모델을 쉽게 전환하고 비교할 수 있음
- Prompt
- 프롬프트란 인간이 인공지능(LLM)에게 전달하는 지시문으로 모델의 응답을 결정짓는 핵심 입력
- 역할
- LLM에게 무엇을 할지 설명
- 질문, 명령, 조건 등을 포함
- LLM의 출력 품질을 좌우하는 가장 중요한 요소
- LangChain에서의 프롬프트
- PromptTemplate : 변수 기반 동적 프롬프트 생성
- ChatPromptTemplate : 여러 메시지를 구조화하여 대화 설계
- 프롬프트 -> LLM -> 응답의 중심 구성요소
- PromptTemplate
- LangChain에서 프롬프트(Prompt)를 템플릿 형태로 추상화한 클래스
- 사용자 입력을 동적으로 삽입할 수 있는 문자열 포맷 객체
- 유동적 템플릿 생성과 변수만 바꿔서 다양한 결과 실험 가능
- 객체화, 재사용, 체인과 결합 가능
- 특히 LLMChain이나 AgentChain 같은 구조와 연결할 때 핵심 역할
- 답변의 다양성과 무작위성 제어
- LLM의 다음 단어 생성
- 내부적으로 각 단어 후보마다 로짓(logits)을 계산한 뒤 이를 softmax 함수로 확률로 변환
- Temperature
- 확률 분포 자체를 날카롭게(0) 혹은 넓게(1+) 조절
- 낮은 값 (0) : 항상 가장 확률 높은 단어를 고름 -> 일관되고 예측 가능한 결과
- 높은 값 (1 이상) : 낮은 확률 단어도 고를 가능성 있음 -> 창의적이지만 불안정한 결과
- 확률 분포 자체를 날카롭게(0) 혹은 넓게(1+) 조절
- 일반적인 값의 범위
- 0 : 가장 보수적, 항상 같은 답 / 코드 생성, 논리적 답변
- 0.3 ~ 0.7 : 적당한 창의성 / 일상 대화, 설명문
- 1 ~ : 매우 창의성 / 시, 이야기, 브레인스토밍
- LLM의 다음 단어 생성
- 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
- 대표 상황 : 채팅, 실시간 출력, 프롬프트 디버깅 등
- .invoke()
- 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에서 데이터를 받아 처리하고 다음 단계로 넘겨주는 연결 가능한 처리 단위
- input | Runnable 1 | Runnable 2 | Runnable 3
'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 |