본문 바로가기

Biusiness Insight/AI · Data Science

LangChain 이해하기

반응형

1. 랭체인(LangChain) 개요

  • 정의: LLM(Large Language Model)을 기반으로 한 애플리케이션을 개발하기 위한 오픈소스 프레임워크임.
  • 지원 언어: 파이썬(Python) 및 자바스크립트(JavaScript)를 지원함.
  • 핵심 가치: 거대 언어 모델(Large Language Model)과 외부 데이터를 결합하거나, 모델이 자율적으로 도구를 사용하여 복잡한 작업을 수행할 수 있도록 돕는 체인(Chain)과 에이전트(Agent) 환경을 제공함.

 

2. 랭체인(LangChain)의 핵심 구성 요소

  • 체인(Chains): 여러 구성 요소를 결합하여 하나의 워크플로우를 생성함.
  • 에이전트(Agents): 모델이 스스로 어떤 도구(Tool)를 사용할지 결정하고 실행하는 자율성을 부여함.
  • 메모리(Memory): 대화의 맥락을 기억하고 이전 상호작용 데이터를 저장함.
  • 검색기(Retrievals): 외부 데이터 소스(문서, 데이터베이스 등)에서 정보를 가져와 모델에 제공함.
  • 통합(Integrations) 지원: 써드 파티(3rd Party) 도구 및 서비스와 연결/ 생태계 지원.
    • LLM (GPT, Claude, Gemini, etc)
    • 데이터 로더 (PDF, Excel, CSV, JSON, etc)
    • VertorStore (DB)

 

3. 랭체인 표현 언어 (LangChain Expression Language, LCEL)

  • 개념: 구성 요소를 선언적으로 연결하여 체인(Chain)을 쉽게 구축할 수 있도록 설계된 언어임.
  • 특징:
    • 파이프 연산자(|) 사용: 유닉스(Unix) 파이프와 유사하게 component1 | component2 | component3 방식으로 데이터를 전달함.
    • 선언적 방식: 복잡한 논리를 코드 구현 없이 연결 순서만으로 정의할 수 있음.
    • 비동기 지원: 스트리밍(Streaming) 및 배치(Batch) 처리를 기본적으로 지원함.
  • 기본 구조 예시: 프롬프트(Prompt) | 모델(Model) | 출력 파서(Output Parser)
  • LCEL 문법
    • 체인 정의 : Chain 클래스를 통해 답변 생성 파이프라인 정의
    • 구성 요소 : 질문, 관련 정보 검색, LLM, 최종 답변
    • 연산자 : Pipe Operator( | )로 구성 요소 연결

from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI

# 오픈에이아이(OpenAI)의 챗오픈에이아이(ChatOpenAI) 클래스 인스턴스 생성
# 모델 이름, 최대 토큰(Token) 수, 온도 설정을 통해 인공지능(AI) 모델의 동작 방식 정의 [cite: 845, 846]
model = ChatOpenAI(
    model="gpt-4o-mini", # 사용할 인공지능(AI) 모델의 이름 [cite: 847]
    max_tokens=2048,     # 생성할 응답의 최대 토큰(Token) 수 [cite: 848, 849]
    temperature=0.1,     # 응답의 다양성을 조절하는 온도 값 [cite: 850, 851]
)

# 프롬프트 템플릿(Prompt Template) 객체 생성
# 주어진 주제에 대해 쉽게 설명하는 프롬프트 템플릿(Prompt Template) 정의 [cite: 853-855]
prompt = PromptTemplate.from_template("{topic}에 대해 쉽게 설명해주세요.")

# 인공지능(AI) 모델의 응답을 문자열 형식으로 변환하는 출력 파서(Output Parser) 객체 생성 [cite: 856]
output_parser = StrOutputParser()

# 프롬프트(Prompt), 모델(Model), 출력 파서(Output Parser)를 파이프 연산자(|)로 연결하여 처리 체인(Chain) 구성 [cite: 857]
chain = prompt | model | output_parser

 

4. LangChain Interface 및 실행 방식

  • 인보크(invoke): 입력을 받아 체인을 한 번 실행하고 결과를 반환함.
  • 스트림(stream): 결과가 생성되는 대로 실시간으로 한 조각(Chunk)씩 데이터를 반환함.
  • 배치(batch): 여러 개의 입력 목록을 한 번에 효율적으로 처리함.
  • 에이싱크(async): ainvoke, astream, abatch 등 비동기 실행 환경을 지원하여 성능을 최적화함.
  • astream_log : 최종 응답뿐만 아니라 발생하는 중간 단계를 스트리밍(실시간으로 데이터를 반환)함

 

invoke() 예제 - 짧은 응답이나 단순 질의응답에 적합.

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage [cite: 724, 725]

# 챗오픈에이아이(ChatOpenAI) 객체 생성
# 온도 설정: 0.1 (출력의 무작위성 조절)
# 모델명 설정: gpt-4o-mini (사용할 모델 지정)
llm = ChatOpenAI(
    temperature=0.1,  # 창의성 (0.0~2.0) [cite: 730, 734]
    model_name="gpt-4o-mini",  # 모델명 [cite: 735]
) [cite: 733]

# 질의 내용 설정
# 사용자가 알고자 하는 질문 내용 정의
question = "대한민국의 수도는 어디인가요?" [cite: 737, 738, 739]

# 질의 수행 및 결과 출력
# 설정된 거대 언어 모델(Large Language Model)을 사용하여 질문에 대한 답변 생성 및 출력
llm.invoke(question) [cite: 741, 742, 743]

 

stream() 예제 - 긴 응답이나 실시간 피드백이 필요한 경우에 적합.

# 스트림(stream) 방식으로 질의
# answer에 스트리밍 답변의 결과를 받습니다.
answer = llm.stream("대한민국의 아름다운 관광지 10곳과 주소를 알려주세요!") [cite: 747, 748, 749]

# 스트리밍 방식으로 각 토큰(Token)을 출력합니다. (실시간 출력)
for token in answer:
    print(token.content, end="", flush=True) [cite: 750, 751]

 

5. 주요 메시지 객체 유형

  • 시스템 메시지(SystemMessage): 인공지능(AI) 모델에게 부여할 페르소나나 지침(Instruction)을 정의함.
  • 휴먼 메시지(HumanMessage): 사용자가 인공지능(AI)에게 전달하는 실제 입력값임.
  • 에이아이 메시지(AIMessage): 모델이 생성한 응답 데이터임.
  • 툴 메시지(ToolMessage): 도구 호출 결과 값을 모델에 다시 전달할 때 사용함.

 

6. 랭스미스(LangSmith)

  • 정의: 랭체인(LangChain) 애플리케이션의 개발(Development), 디버깅(Debugging), 테스트(Testing), 평가(Evaluating), 모니터링(Monitoring)을 지원하는 통합 플랫폼임.
  • LangChain 생태계의 일부로, LLM 체인을 검사하고 최적화하는데 사용
  • 프롬프트 최적화, 체인 및 에이전트의 실행 추적, 데이터셋 관리 등 다양한 기능 제공
  • LLMOps 도구로 분류될 수 있으며, DevOpse의 LLM 버전
  • 기능:
    • 체인의 실행 단계별 입력 및 출력을 시각적으로 추적함.
    • 성능 저하 지점이나 할루시네이션(Hallucination) 발생 여부를 확인하여 품질을 개선함.

 

7. 랭그래프(LangGraph)

  • 개념: 에이전트(Agent)와 멀티 에이전트(Multi-Agent) 워크플로우를 구축하기 위한 도구로, 순환(Cyclic) 그래프 구조를 지원함.
  • 특징: 단순히 순차적인 체인을 넘어, 조건에 따라 이전 단계로 되돌아가거나 복잡한 상태 관리가 필요한 에이전틱(Agentic) 워크플로우 구현에 최적화됨.

 

8. LLM & Multimodal LLM 활용 예제

8.1. 챗오픈에이아이(ChatOpenAI)

ChatOpenAI는 OpenAI의 지피티(GPT) 기반 모델을 LangChain에서 사용할 수 있도록 지원하는 클래스임.

주요 매개변수(Parameter):

  • 온도(temperature): 모델의 창의성을 조절하며, 값이 낮을수록 보수적이고 높을수록 창의적인 응답을 생성함.
  • 모델명(model_name): 사용할 오픈에이아이(OpenAI) 모델을 지정함 (예: gpt-4o-mini, gpt-4o, gpt-3.5-turbo, o1, o3-mini 등).
  • 최대 토큰(max_tokens): 한 번의 응답에서 생성할 최대 토큰(Token) 수를 지정하며, 설정값이 클수록 더 많은 내용을 출력할 수 있음.

객체 생성 예시 코드:

# 객체 생성
llm = ChatOpenAI(
    temperature=0.1,      # 창의성 (0.0 ~ 2.0) [cite: 6879]
    model_name="gpt-4o-mini", # 사용할 모델명 [cite: 6880]
    max_tokens=2048       # 최대 출력 토큰(Token) 수 [cite: 6880, 6881]
)

 

8.2. 멀티모달 거대 언어 모델(Multi-modal LLM)

Multi-modal은 복수의 모달리티(Modality)를 처리할 수 있음을 의미함.

  • 특징: 텍스트 입력뿐만 아니라 이미지, 오디오, 비디오 등 다양한 데이터를 입력으로 받아 처리할 수 있는 모델임.
  • 대표적인 멀티모달 모델:
    • 제미나이(Gemini): 텍스트, 이미지, 비디오를 입력으로 받을 수 있음.
    • 지피티-4오(GPT-4o) / 지피티-4.1(GPT-4.1): 텍스트와 이미지를 입력으로 받을 수 있음.

멀티모달(Multi-modal) 활용 예시 코드:

from langchain_teddynote.models import MultiModal
from langchain_teddynote.messages import stream_response

# 챗오픈에이아이(ChatOpenAI) 객체 생성
llm = ChatOpenAI(
    temperature=0.1,
    model_name="gpt-4o",
)

# 멀티모달(Multi-modal) 객체 생성
multimodal_llm = MultiModal(llm) [cite: 6899]

# 샘플 이미지 주소(웹사이트로부터 바로 인식)
IMAGE_URL = "https://example.com/sample_image.jpg" [cite: 6900, 6901]

# 이미지 파일로부터 질의 및 실시간 응답 출력
answer = multimodal_llm.stream(IMAGE_URL) [cite: 6903]
stream_response(answer) [cite: 6904]

 

8.3 프롬프트 템플릿(Prompt Template)

Prompt Template은 거대 언어 모델(Large Language Model)에 전달할 프롬프트를 효율적으로 생성하기 위한 도구임.

  • 주요 특징:
    • 재사용성: 한 번 정의한 템플릿을 반복적으로 사용하여 일관된 품질의 프롬프트 생성이 가능함.
    • 변수 치환: {variable} 형식을 사용하여 템플릿 내에 변수를 정의하고, 실행 시점에 동적으로 값을 삽입함.
from langchain_core.prompts import PromptTemplate

# {topic} 부분을 변수로 정의하여 재사용 가능한 템플릿 생성
prompt_template = PromptTemplate.from_template("{topic}에 대해 짧고 강렬하게 설명해줘.")

# 변수에 값을 채워 실제 프롬프트 생성
final_prompt = prompt_template.format(topic="인공지능")

 

8.4. 출력 파서(Output Parser)

출력 파서(Output Parser)는 LLM이 생성한 비정형 텍스트를 사용자가 원하는 구조화된 데이터로 변환하는 역할을 수행함.

  • 주요 역할:
    • 데이터 구조화: 모델의 답변을 제이슨(JSON, JavaScript Object Notation), 엑스엠엘(XML, eXtensible Markup Language) 등 기계가 읽기 쉬운 형식으로 변환함.
    • 워크플로우 자동화: 구조화된 데이터를 통해 후속 시스템이나 프로그램에서 즉시 활용할 수 있는 자동화된 흐름을 구성함.
    • 일관성 유지: 답변의 형식을 강제하여 데이터의 일관성을 보장함.
    • 시스템 통합: 다양한 소프트웨어 및 외부 시스템과의 데이터 통합 용이성을 높임.
  • 작성 예시 (정형화된 출력 파서를 사용하지 않은 경우):
# 체인(Chain)을 실행하고 결과를 스트리밍(Streaming)으로 출력함
response = chain.stream(
    {
        "email_conversation": email_conversation,
        "question": "이메일 내용중 주요 내용을 추출해 주세요."
    }
)
이메일의 중요한 내용은 다음과 같습니다: 

1. 김철수 상무가 바이크코퍼레이션을 대표하여 이은채 대리에게 연락.
2. "ZENESIS" 자전거에 대한 상세한 브로슈어 요청 (기술 사양, 배터리 성능, 디자인 정보 포함.)
3. 유통 전략과 마케팅 계획을 구체화하기 위한 정보 필요.
4. 협력 가능성 논의를 위한 미팅 제안: 다음 주 화요일(1월 15일) 오전 10시, 귀사 사무실에서

 

  • 작성 예시 (출력 파서 사용한 경우, Pydantic Output Parser) 
class EmailSummary(BaseModel):
    person: str = Field(description="메일을 보낸 사람")
    email: str = Field(description="메일을 보낸 사람의 이메일 주소")
    subject: str = Field(description="메일 제목")
    summary: str = Field(description="메일 본문을 요약한 텍스트")
    date: str = Field(description="메일 본문에 언급된 미팅 날짜와 시간")
JSON
{
    "person": "김철수",
    "email": "chulsoo.kim@bikecorporation.me",
    "subject": "\"ZENESIS\" 자전거 유통 협력 및 미팅 일정 제안",
    "summary": "김철수 상무는 바이크코퍼레이션의 자전거 유통 협력을 위해 ZENESIS 모델의 브로슈어를 요청하고...",
    "date": "1월 15일 화요일 오전 10시"
}

 

반응형