2. LangChain

벼리·2026년 6월 28일

AI

목록 보기
1/2

서론

해당 글은 https://youtu.be/rb3ZYR_Q1po?si=h5ngxX6DzDlg064t 랭체인 유튜브의 내용을 학습하고 정리하고자 작성했습니다

2.1 What is LangChain

LangChain이란?

  • LLM 기반 애플리케이션과 Agent를 쉽고 빠르게 개발할 수 있는 프레임워크
    • LLM 기반 애플리케이션 예시: 챗봇
구분LLM 기반 애플리케이션LLM 기반 Agent
정의LLM을 특정 목적에 맞게 설계된 고정된 파이프라인LLM이 스스로 추론(Reason)하고 행동(Act)하는 동적 시스템
행동 흐름• 입력 → LLM → 출력(고정된 흐름)
• “특정 키워드가 들어오면, 어떠한 형식으로 답변을 하라” 라고 사전에 정의• 입력 → 추론(”무엇을 해야 할까?”) → 도구 → 선택/사용 → 판단 → 반복 → 최종 출력
결정 주체개발자가 미리 정한 구조LLM이 매번 스스로 판단
예시• 텍스트 요약기

• 문서 질의응답(Retrieval QA)
• 챗봇 | • 검색하고 요약하는 Research Agent
• 외부 API(구글 캘린더, Gmail)를 호출해 일정을 정리하는 비서 서비스 |

LLM 기반 Agent: 행동 흐름 상세

  • 입력 → 추론
    • 특정 키워드들이 안 들어오더라도, 입력 자체를 언어 모델이 스스로 무엇을 해야할지 추론해서 도구를 선택하고 호출함
    • 입력 예시: “날씨 어때” 라고 입력하면, “오늘 날씨” 라고 유추
  • 도구 → 선택/사용
    • 예시: API 도구 호출
  • 판단
    • API 결과물로 지금 답변을 할 수 있는지를 판단
    • 결과물이 불충분하면 또다시 추론하여 도구를 호출함
      • 예시: 대기질 정보(개발자들이 미리 Agent에 대기질 정보 호출 시스템을 구축해놓은 상태여야함)

LLM 기반 애플리케이션 vs LLM 기반 Agent

  • 개발자가 사전을 미리 정해놓은 대로 고정된 형태로 돌아가는게 아니라, 동적으로 언어 모델의 힘을 빌려서 움직인다

Agent란?

  • 사용자의 입력(질문, 지시)에 대해 적절한 행동을 취하도록 추론(Reasoning)한 뒤 행동(Act)하는 주체(Excutor)
  • 구성요소
    • Model(LLM)
    • Tools(함수)

고도화된 형태의 Agent

  • 안전하고 성능이 좋은 Agent를 구축할 수 있게 된다
  • 요청에 대한 기초적인 방어가 안될 때가 있음
    • 기초적인 형태에서는 잘못된 답변을 받아도, 요청을 Agent가 혼자 처리하기 때문에 잘못된 방향으로 갈 수 있음
    • 예시: 교육회사 agent
      • 유저가 답변을 바로 알려달라고 하면, 그대로 답을 알려줌 → 학습 효과 저해

랭체인 철학

  • LLM(대형 언어 모델)은 강력한 새로운 기술이다
  • LLM은 외부 데이터(예: 검색, 문서, API)와 결합될 때 더욱 강력해진다
  • 미래 애플리케이션은 점점 더 에이전트형(agent)으로 발전할 것이다
  • 그러나 지금은 그 변환(LLM → 에이전트형 애플리케이션) 과정이 아직 초기 단계이며, 프로토타입은 쉬워도 생산환경에 들어올 수 있을 정도로 신뢰성 있는 에이전트를 만드는 것은 여전히 어렵다

2.2 Model

Model의 역할: 모든 시스템이 자동으로 돌아가게끔 하는 엔진 역할

  1. 텍스트 생성(Text Generation)
    1. 사람처럼 텍스트 생성
  2. 구조화된 답변 생성(Structured Output)
    1. Json, 리스트. XML
  3. 멀티 모달(Multimodality)
    1. 이미지, 영상, 음성 생성
  4. 추론
  5. Tool Calling

1. 텍스트 생성

  • init_chat_model 모듈을 가져와 모델을 선정
  • invoke() 메서드를 사용해 답변(텍스트) 생성
from langchain.chat_models import init_chat_model

model = init_chat_model("gpt-5-nano")
response = model.invoke("안녕하세요. 당신은 누구입니까?")

println(response.content)
""" 안녕하세요! 저는 OpenAI가 만든 AI 언어 모델 ChatGPT입니다. GPT-4 기반으로 작동하며, 텍스트를 이해하고 다양한 방식으로 생성해 드립니다.

제가 도와드릴 수 있는 것들
- 정보 설명, 요약, 번역
- 글쓰기 도움(에세이/편지/보고서 등), 아이디어 브레인스토밍
- 코딩 도움(간단한 코드 예시, 디버깅 아이디어)
- 학습 보조, 문제 풀이 및 개념 설명
- 일정 아이디어 정리, 의사소통 연습 등

주의할 점
- 제 지식은 2024년 6월까지의 정보에 기반합니다. 이후의 최신 소식은 반영이 필요할 수 있습니다.
- 인터넷에 실시간으로 접속하지는 못하고, 민감한 개인 정보는 안전하게 다루도록 주의해 주세요.

무엇을 도와드릴까요? 원하시는 주제나 요청을 말씀해 주시면 바로 시작하겠습니다."""

println(response.usage_metadata)
"""{'input_tokens': 15, 
 'output_tokens': 744,
 'total_tokens': 759,
 'input_token_details': {'audio': 0, 'cache_read': 0},
 'output_token_details': {'audio': 0, 'reasoning': 512}}"""
  • init_chat_model 모듈 파라미터

    • temperature(창의성)
      • 답변의 무작위성을 조절하여 창의성(High) 혹은 논리적(Low) 성향 결정 (0~1.0)
      • 단어의 후보군들 중 가장 적합하다라고 생각되는 부분을 선택해서 최종 답변을 우리에게 생성해줌
      • → 후보군을 얼마나 무작위하게 선택할 것인가
      • 1.0에 가까울수록 단어를 무작위로 선택
    • max_tokens(용량)
      • 응답의 최대 길이를 제한하여 비용 관리 및 출력 통제(토큰)
    • timeout(시간)
      • 응답 대기 시간을 제한하여 시스템의 무한 대기(Hang) 방지(초)
    • max_retries(안정성)
      • 네트워크 오류 발생 시 자동 재시도를 통해 연결 성공률 보장
  • invoke() 메서드를 사용해 답변(텍스트) 생성

    • stream(): chunk(말뭉치) 단위로 잘라서 하나씩 답변 생성 → UX 증가
      • 예시: 답변을 모두 생성해야 유저에게 보여주는게 아니라, 일단 만든 단어를 유저에게 보여줌

      • for chunk in model.stream("안녕하세요. 당신은 누구입니까?"):
          print(chunk.text, end="")
    • batch(): 여러 질문을 병렬적으로 요청 가능 → UX 증가 및 모델 호출을 줄여 비용 감소
      • input을 할 때마다 호출 비용이 든다

      • 한꺼번에 담아서 보내면 호출 비용을 감소시킬 수 있음

      • inputs = [
            "과적합이 뭔가요?",
            "앵무새의 털 색상이 화려한 이유는?",
            "AI Agent 기반 서비스는 뭐가 있나요?"
        ]
        
        responses = model.batch(inputs)
        for response in responses:
          print(response)

2. 구조화된 답변 생성

  • Structured Outputs
    • 다음 작업을 위해 답변을 특정 형태로 파싱할 때 사용
      • 스키마(class) 생성
      • model에 with_structured_output을 사용해 새로운 모델 객체 생성
    • 특정 작업을 위해 agent를 만들 수 있음
      • 예시: 로그에 대한 결과물을 code/json/XML 등으로 받을 수 있음
      • 후작업을 위해 에이전트가 만든 답변을 텍스트가 아니라 특정한 데이터 형식으로 파싱할 때 사용
    • 스키마 생성
      • pydantic: 데이터 검증(Validation), 직렬화(Serialziation)
        • pydantic은 파싱 + 데이터 검증까지 지원

        • 후작업을 할 때 type이 중요한 상황이면 pydantic을 사용하는게 좋음

        • from pydantic import BaseModel, Field
          
          class Movie(BaseModel):
            "상세한 영화 정보."
            title: str = Field(description="영화의 제목")
            year: int = Field(description="개봉 연도")
            director:str = Field(description="영화 감독 이름")
            rating: float = Field(description="영화 평점(10점 만점)")
            
          model_with_structure = model.with_structured_output(Movie)
          model_with_structure.invoke("영화 인셉션에 대해 설명해 주세요.")
          # Movie(title='Inception', year=2010, director='Christopher Nolan', rating=8.8)
            
      • Json Schema
        • 영어/숫자/언더스코어/대시만 사용 가능
        • Json schema는 파싱만 지원
        • invoke 될 때, AI 모델한테 schema가 호출과 같이 전달됨
        • 한글 같은게 있으면 오픈 AI에서 에러를 반환하기 때문에 제한이 있음

2.3 Message

메모리 구현

메시지 구성 요소

  • System Message: 개발자가 사전에 작성한 입력(프롬프트)
    • 예시: 당신은 유능한 로켓 전문가입니다.
  • Human Message: 사용자의 요청(request), 입력
  • AI Message: Model의 답변(result)
    • 시스템 메시지를 기반으로 답변을 내놓음

예시코드 1 - Message 객체 사용

from langchain.messages import HumanMessage, AIMessage, SystemMessage

system_msg = SystemMessage("당신은 유능한 로켓 전문가 입니다.")
human_msg = HumanMessage("안녕하세요. 궁금한 것이 있어요!")

messages = [system_msg, human_msg]
response = model.invoke(messages)

# AIMessage(content='안녕하세요! 로켓 전문가로서 도와드리겠습니다. 어떤 주제든 편하게 물어보세요.\n\n원하신다면 아래처럼 시작해볼 수 있어요.

과거 대화 맥락을 함께 넣으면?

→ 대화 맥락에 맞는 답변이 나옴

→ 개발자가 미리 설정한 역할에 맞춰서 나옴

human_msg1 = HumanMessage("안녕하세요. 저는 벼리입니다")
ai_msg = AIMessage("안녕하세요 벼리! 어떤 도움이 필요한가요?")
human_msg2 = HumanMessage("제 이름은 무엇인가요?")

messages = [human_msg1,ai_msg,human_msg2]
response = model.invoke(messages)

# AIMessage(content='당신의 이름은 벼리입니다.\n\n다르게 부르고 싶다거나 애칭이 있다면 말씀해 주세요. 앞으로 벼리로 불러드릴까요, 아니면 더 편한 호칭이 있을까요?',

예시 코드 2 - 딕셔너리 포맷(Open AI)

messages = [
    {"role": "system", "content": "당신은 유능한 로켓 전문가입니다."},
    {"role": "human", "content": "안녕하세요. 궁금한 게 있어요!"},
    {"role": "ai", "content": "로켓 관련 무엇이든 물어보세요."},
    {"role": "human", "content": "추진 방식 차이를 설명해 주세요"},
]

response = model.invoke(messages)

2.4 참고 자료

랭그래프 & 랭스미스

랭그래프

  • 오케스트레이션(Orchestration) 기반 에이전트 → 복잡한 의사결정에 특화
  • 오크스트레이터(지휘자)가 작업을 분해, 위입, 종합
    • 하위 업무로 분해
    • 특정 작업을 위임
    • 받은 결과들을 종합

https://docs.langchain.com/oss/python/langgraph/workflows-agents

랭스미스

  • 랭체인, 랭그래프로 만든 애플리케이션 추적, 평가, 모니터링
    • 추적
      • LLM 내부의 실행 과정을 시각화
    • 평가
      • 테스트 데이터를 실행시켜 평가 가능
    • 모니터링
      • 실제 서비스 배포 후 상태 확인(Latency, API 비용, 에러)
profile
코딩일기

0개의 댓글