Just Fighting

LLM과 RAG 이해하기 (with LangChain) 본문

카테고리 없음

LLM과 RAG 이해하기 (with LangChain)

yennle 2025. 2. 16. 20:24
728x90

 

 

1. LLM이란?

대규모 언어 모델(Large Language Model, LLM)은 자연어 처리(NLP) 분야에서 중요한 발전을 이룬 기술.

대규모의 데이터를 학습해 수십억 개의 파라미터를 가지며,

인간과 유사한 텍스트 이해 및 생성능력을 보유한 모델.

문맥을 이해하고 자연스러운 문장을 만드는 데 뛰어난 성능을 가진다.

 

 

 

2. LLM의 환각(Hallucination)이 발생하는 이유는?

LLM은 학습된 데이터에 의존한다.

따라서 최신 정보에 대한 정확한 답변이 어렵다.

 

명령과 확률에 의해 돌아가는 시스템이기 때문에 답변이 될 확률이 낮다고 해도,

답을 만들어내기 위해 엉뚱한 답을 내놓기도 한다.

 

 

 

2-1. LLM의 성능을 향상시킬 수 있는 기술

Prompt Engineering

많은 정보를 제공(상세하게 설명)해서 좋은 출력을 받는다는 개념

템플릿을 기반으로 LLM의 출력 가이드를 주고 원하는 답변을 유도하는 기술

학습하지 못한 질문들에 대해 잘못된 정보를 출력하는 Hallucination현상은 여전히 발생

 

Fine-tuning

정확하고 최신의 정보로 LLM 학습(Fine-tuning)

LLM을 파인튜닝하는 것에는 엄청난 자원이 필요하기 때문에 어려움.

 

RAG

바로 이어지는 3번에서 확인!

 

 

3. RAG란 무엇인가?

RAG(Retrieval-Augmented Generation)는 LLM으로 응답을 생성하기 전에 외부데이터*를 참조하도록 하는 프로세스다.

*외부데이터 : LLM의 학습데이터가 아닌 데이터

 

외부데이터를 LLM이 학습하게끔 할 수도 있지만,

학습시키는 데 엄청난 시간과 비용이 소요되기 때문에 RAG를 사용하는 것이 효율적임.

 

 

4. RAG와 LLM을 연결하는 방법은?

외부데이터 생성

API, 데이터베이스, 문서 등과 같은 여러 데이터를 임베딩 언어 모델 통해 수치로 변환하고,

벡터 데이터 베이스에 저장한다.

이 프로세스는 생성형 AI모델이 이해할 수 있는 지식 라이브러리를 생성한다.

 

관련 정보 검색

사용자의 쿼리는 벡터 표현으로 변환되고, 벡터 데이터 베이스와 매칭된다.

즉, 사용자의 쿼리에 관련된 문서를 검색한다.

예)‘연차 휴가가 얼마나 남았나요?’를 검색하면, 연차와 휴가에 관한 문서를 찾아준다.

 

LLM프롬프트 확장

검색된 데이터를 컨텍스트*에 추가해 사용자 입력을 보강한다.

*컨텍스트 : 어떤 정보를 이해하거나 처리하는 데 필요한 주변 정보

확장된 프롬프트를 사용하면 LLM이 더 정확한 답변을 생성할 수 있음.

사용자 질문: "양자 컴퓨터의 원리를 설명해줘."
검색된 문서: "양자 컴퓨터는 중첩(superposition)과 얽힘(entanglement)을 활용해 고전 컴퓨터보다 빠르게 복잡한 계산을 수행합니다."
보강된 입력: "양자 컴퓨터는 중첩과 얽힘을 활용합니다. 양자 컴퓨터의 원리를 설명해줘."

 

 

외부 데이터 업데이트

최신 정보를 업데이트 하기위해 비동기적으로 문서를 업데이트하고, 문서의 임배딩 표현을 업데이트함.

자동화된 실시간 프로젝트 혹은 주기적 배치 처리 이용

 

출처 : https://aws.amazon.com/ko/what-is/retrieval-augmented-generation/

 

 

 

5. 랭체인을 이용한 RAG와 LLM 사용방법

랭체인이란, LLM을 더 강력하게 활용하기 위한 프레임워크

주로 LLM과 외부 시스템(데이터베이스, API 등)을 연결해 복잡한 작업을 쉽게 구현하도록 돕습니다.

 

# 실행예시 1
# 출처 : https://developers.hyundaimotorgroup.com/blog/557

# Chain 정의 : 버티컬 라인(|)을 통해서 Chain의 파이프 라인 정의
chain_level_1 = {'question': RunnablePassthrough()} | input_prompt | llm | output_parser

# 출력 생성
print(chain_level_1.invoke({"question':'배고픈데 점심 추천해줘"}))
# 실행 예제2
# 출처 : https://developers.hyundaimotorgroup.com/blog/544

llm_rag = {'context': retriever, 'question': RunnablePassthrough()} | prompt2 | llm | StrOutputParser()

 

 

참고자료 1 : 데이터 직접 넣기

https://developers.hyundaimotorgroup.com/blog/544

 

참고자료 2 : 웹페이지 데이터 사용하기

데이터 청킹해서 벡터스토어에 정의

*청킹 : 정보를 더 작은 단위(청크, Chunk)로 나누어 기억하거나 처리하는 방식.

의미 있는 덩어리로 묶어서 쉽게 이해할 수 있게 도움.

https://developers.hyundaimotorgroup.com/blog/557

 

참고자료 3 : PDF 사용하기

prompt_template 사용

https://developers.hyundaimotorgroup.com/blog/571

 

참고자료 4 : travily 사용

Tavily Search API : LLM과 RAG 시스템에 최적화된 검색 엔진

https://velog.io/@woody_ahn/Tavily-LLM을-위한-최적화된-검색-API

 

 

 

 

 

[참고자료]

https://developers.hyundaimotorgroup.com/blog/485

https://aws.amazon.com/ko/what-is/retrieval-augmented-generation/

https://velog.io/@woody_ahn/LangChain과-GPT-4o-mini로-구현하는-간단한-페르소나-챗봇

https://velog.io/@woody_ahn/Tavily-LLM을-위한-최적화된-검색-API

 

 

728x90
Comments