sayyoon.site
postsguestbook
🦜
SKALA생성형AI

LangChain 실습 코드 리뷰

2025.03.09

수업 때 배운 실습 파일들을 통해 랭체인에 대해 파묘!해보자
실습 코드는 총 7개이다!

 

1. LangChain 기초

랭체인은 LLM 어플리케이션을 효율적으로 개발할 수 있게 해주는 라이브러리

  • invoke() : 랭체인의 구성요소를 실행함

  • 랭체인은 프롬프트 템플릿을 구성할 수 있음

  • 채팅 메시지인 경우, ChatPromptTemplate을 사용하고, format()이 아닌 format_messages()를 사용함

  • 랭체인으로 댓글 자동 분류하기

    • 리뷰가 긍정인지 부정인지 llm으로 분류하기
    • 성능 높이기
      1. CoT 방식의 출력 유도하기 → 추론과정을 통해 분류 능력 향상
      2. CoT 없이 자세한 지시사항 프롬프트 작성하기 → 비용 효율적이지만 프롬프트 구성이 어려움

랭체인 기초 사용법과 프롬프트 템플릿 사용법에 대해 담겨있고, 랭체인을 활용한 아주 간단한 댓글 자동 분류 코드를 짜봄

 

2. LCEL

랭체인에서 체인을 간결하게 구성하는 문법인 LCEL(LangChain Expression Language)에 대해 공부할 것

  • LCEL은 1번 실습과 달리 Chain 구성요소를 | (파이프)로 연결하여 한 번에 실행함

  • pydantic : 데이터 형식에 제약조건을 두고 이를 준수하는지 검증하는 라이브러리

    • pydantic으로 데이터 형식을 지정하고, 이를 parser로 사용
  • Structured Output : llm의 응답을 구조화된 형식으로 파싱할 때 사용하는 메서드

  • Runnables : LCEL의 기본 단위로, 입력을 받아 출력을 생성하는 기본 단위

    • RunnablePassthrough : 체인의 직전 출력을 그대로 가져옴
    • RunnableParallel : 서로 다른 ㅔ인을 병렬적으로 실행

 

3. 랭체인과 멀티모달 모델을 활용한 스마트 냉장고 앱 만들기

이미지를 첨부해 이미지 속 음식 재료를 llm이 리스트로 출력하고,
출력한 음식 재료를 활용해 만들 수 있는 음식 2가지를 선정.
그 뒤, 음식 이미지를 dall-e-3로 그림

 

4. LangChain Tool과 Agent

Agent : 사용자의 요청에 대해, Tool로 표현되는 외부 모듈을 활용하여 문제를 해결하는 기능

Tool : LLM이 답변을 출력하기 위해 활용할 수 있는 다양한 수단
LLM : Tool을 사용하기 위해 Tool 이름과 Argument를 생성

Tool 실행을 자동화하여 LLM을 반복적으로 실행하여 최종 단계에 도달하는 방법이 Agent!

  • LangChain Agent 만들기
  • LangGraph로 Agentic Application 만들기
    • LangGraph : GraphState의 형태로 Agent의 활동 상태를 정의. Agent는 여러 개의 노드를 오가며 State에 상태값을 저장하고, 이를 체인에 전달하여 결과를 얻음

 

5. HuggingFace에서 공개 모델 사용하기

허깅페이스 라이브러리를 사용해 AI 모델을 만들 수 있다.

 

6. 벡터 데이터베이스 기반 RAG 어플리케이션

RAG 과정은 저번 포스트에서 봤던 대로 Indexing, Processing, Search(Retrieval), Augmenting, Generation 과정으로 진행됨

여기서는 Processing을 제외한 단계로 진행됨

  1. WebBaseLoader로 뉴스 기사 받아오기

  2. Chunking: 청크 단위로 나눠 ChromaDB를 활용해 저장함

  3. Prompting

  4. Chain: RAG를 수행하기 위한 체인을 만듦

    요 RAG Chain은 프롬프트에 context와 question을 전달해야 했음
    체인의 입력은 question만 들어가므로, context를 동시에 프롬프트에 넣기 위해 아래와 같이 코드 짬

    {
        "context": retriever | format_docs,
        "question": RunnablePassthrough()
    }

    입력값을 2개로 나눠서 병렬 처리하는 LCEL 스타일의 체인 구성

    1. context에는 RAG 검색 결과가 들어가야 하므로, 사용자 입력 question → retriever에 넣음 → List[Document] 반환 → format_docs()로 텍스트로 변환 → 결과가 context로 들어감
    2. question에는 원본 사용자 질문이 그대로 들어감 → 최종 prompt에서 question을 그대로 사용할 수 있어야 함

 

7. Advanced RAG

  1. Indexing: pdf 데이터 불러오기

  2. Chunking: 토큰 단위로 청킹하고 ChromaDB에 저장

  3. Prompting

  4. RAG 수행하기 위한 Chain 만들기

    6번 실습코드와 다르게 이번에는 questions를 여러 개 만들어서 개별적으로 대답을 얻을 수 있게 함

 

Multi-Query Retriever

  • 랭체인에서 제공하는 고급 Retriever 중 하나로, 질문 하나를 여러 형태로 바꾼 뒤 검색해주는 Retriever
  • 즉, 하나의 사용자 질문 → 다양한 관점의 쿼리들로 재작성 → 더 풍부한 문서 검색을 가능하게 해줌
  • 검색 결과가 부족하거나 얕을 때, 사용자의 질문이 너무 광범위할 때, Dense vector similarity가 제한적인 상황일 때에 사용

Ensemble Retriever

  • 랭체인에서 제공하는 다양한 Retriever의 결과를 조합해서 더 나은 검색 품질을 얻기 위한 Retriever
  • 즉, 여러 Retriever의 검색 결과를 합쳐서(rank or concat) 사용하는 고급 구조
  • 하나의 Retriever만으로는 불충분할 때, Sparse와 Dense 검색이 상호보완적일 때, 각기 다른 데이터 소스나 chunking 전략이 있을 때에 사용

Contextual Retrieval

  • 질문 뿐만 아니라 이전 대화나 현재 상황(Context)까지 고려해서 검색하는 방식
  • 기존 RAG가 단일 질문 → 검색이라면, Contextual Retrieval는 대화 흐름 전체나 사용자 세션 정보를 포함해서 검색 품질을 높이는 고급 RAG 기법
  • 즉, 대화나 상황의 흐름을 고려해 질문을 해석하고 검색을 수행하는 RAG 방식. 특히 연속 질의, 챗봇 멀티턴 QA에 적합

 

세 가지 Retrieval 차이 정리해봄!

항목 MultiQuery Retriever Ensemble Retriever Contextual Retriever
목적 질문 표현 다양화 검색 전략 다양화 대화 흐름 반영
방식 질문 1개 → 다양한 쿼리로 LLM이 재작성 → 단일 Retriever로 다중 검색 여러 Retriever 사용 → 결과 합치기 (가중치 가능) 이전 대화/세션 정보 기반으로 질문 재해석 + 검색
검색 대상 하나의 Retriever만 사용 여러 Retriever 병렬 실행 하나의 Retriever (context-aware)
LLM 필요 필요 (질문 재작성용) (optional: query 개선 시 사용) 필요 (대화 문맥 재작성)
장점 표현 차이로 인한 검색 누락 방지 Dense + Sparse 조합 등 보완적 검색 다중 턴 질문에서도 정확한 정보 검색
단점 LLM 비용 증가, 느림 속도 느림 (retriever 여러 번 호출) 메모리 설계 필요, 초기 구축 복잡
사용 예 "AI 사례""AI 활용 사례", "AI 실전 적용" Dense, Sparse, BM25 결과 통합 "그는 언제 태어났어?""스티브 잡스는 언제 태어났어?"
LangChain 예시 MultiQueryRetriever EnsembleRetriever ConversationalRetrievalChain, RunnableWithMessageHistory

 

© Powered by danmin