A A
[LLM] Retrieve Augmented Generation (RAG)
이번 글에선 Retrieve Augmented Generation (RAG)에 λ°ν•˜μ—¬ ν•œλ²ˆ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

Retrieve Augmented Generation (RAG)

 

RAG(Retrieve-Augmented Generation)은 λŒ€κ·œλͺ¨ μ–Έμ–΄ λͺ¨λΈ(LLM)의 ν•œκ³„μ μ„ κ·Ήλ³΅ν•˜κ³  더 μ •ν™•ν•˜κ³  ν’λΆ€ν•œ 응닡을 μ œκ³΅ν•˜κΈ° μœ„ν•΄ κ³ μ•ˆλœ μ•„ν‚€ν…μ²˜μž…λ‹ˆλ‹€.

RAGλŠ” νŠΉμ • μ§ˆμ˜μ— λŒ€ν•΄ μ™ΈλΆ€ 지식 λ² μ΄μŠ€μ—μ„œ κ΄€λ ¨ 정보λ₯Ό κ²€μƒ‰ν•œ ν›„, 이 정보λ₯Ό 기반으둜 ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜λŠ” λ°©μ‹μœΌλ‘œ μž‘λ™ν•©λ‹ˆλ‹€.

특히 정보가 ν’λΆ€ν•œ 응닡을 μƒμ„±ν•˜λŠ” 데 μœ λ¦¬ν•©λ‹ˆλ‹€.


RAG Architecture

RAG(Retrieve Augmented Generation)은 크게 μ„Έ 가지 λ‹¨κ³„λ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€.
Retrieve 단계, Augmented 단계, 그리고 Generate λ‹¨κ³„μž…λ‹ˆλ‹€.

RAG System의 Architecture


RAG의 μ£Όμš” ꡬ쑰

1. Retrieve 단계

  • λ¬Έμ„œ 검색: 이 λ‹¨κ³„μ—μ„œλŠ” μ‚¬μš©μžκ°€ μž…λ ₯ν•œ 질의(query)와 κ΄€λ ¨λœ 정보λ₯Ό μ™ΈλΆ€ 지식 베이슀(예: μ›Ή λ¬Έμ„œ, λ°μ΄ν„°λ² μ΄μŠ€, μ „λ¬Έ λ¬Έν—Œ)μ—μ„œ κ²€μƒ‰ν•©λ‹ˆλ‹€.
  • μž„λ² λ”© 생성: λ¨Όμ € μž…λ ₯된 질의λ₯Ό 벑터 ν˜•νƒœλ‘œ λ³€ν™˜ν•˜λŠ” μž„λ² λ”©μ„ μƒμ„±ν•©λ‹ˆλ‹€. 이 μž„λ² λ”©μ€ 질의의 의미λ₯Ό μˆ˜μΉ˜ν™”ν•˜μ—¬ ν‘œν˜„ν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€.
  • μœ μ‚¬μ„± 계산: 질의의 μž„λ² λ”©κ³Ό μ™ΈλΆ€ 지식 λ² μ΄μŠ€μ— μžˆλŠ” λ¬Έμ„œλ“€μ˜ μž„λ² λ”©μ„ λΉ„κ΅ν•˜μ—¬ μœ μ‚¬μ„±μ„ κ³„μ‚°ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 μ§ˆμ˜μ™€ κ°€μž₯ 관련성이 높은 λ¬Έμ„œλ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€.
  • μž„λ² λ”© μ•Œκ³ λ¦¬μ¦˜: 이 과정은 일반적으둜 λ”₯λŸ¬λ‹ 기반의 μž„λ² λ”© μ•Œκ³ λ¦¬μ¦˜μ„ 톡해 μˆ˜ν–‰λ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, Word2Vec, BERT, Sentence Transformers λ“±μ˜ λͺ¨λΈμ„ μ‚¬μš©ν•˜μ—¬ μ§ˆμ˜μ™€ λ¬Έμ„œμ˜ 의미λ₯Ό λ²‘ν„°λ‘œ ν‘œν˜„ν•©λ‹ˆλ‹€.

 

2. Augmented 단계

  • 질의 κ°•ν™”: Retrieve λ‹¨κ³„μ—μ„œ κ²€μƒ‰λœ λ¬Έμ„œλ₯Ό 기반으둜 μž…λ ₯된 질의λ₯Ό κ°•ν™”ν•©λ‹ˆλ‹€. 이 λ‹¨κ³„μ—μ„œλŠ” κ²€μƒ‰λœ λ¬Έμ„œμ˜ λ‚΄μš©μ„ λΆ„μ„ν•˜μ—¬ μ§ˆμ˜μ— 좔가적인 λ§₯락과 정보λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
  • λ§₯락 ν™•μž₯: κ²€μƒ‰λœ λ¬Έμ„œλ“€μ„ μ΄μš©ν•΄ μ›λž˜μ˜ μ§ˆμ˜μ— μΆ”κ°€ 정보λ₯Ό κ²°ν•©ν•˜μ—¬ 더 ν’λΆ€ν•œ 응닡을 생성할 수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ›λž˜ μ§ˆμ˜μ— λŒ€ν•œ μ„ΈλΆ€ μ •λ³΄λ‚˜ λ°°κ²½ 지식을 λ³΄κ°•ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.

 

3. Generate 단계

  • ν…μŠ€νŠΈ 생성: Augmented λ‹¨κ³„μ—μ„œ κ°•ν™”λœ 질의 λ˜λŠ” κ²€μƒ‰λœ λ¬Έμ„œλ₯Ό 기반으둜 μžμ—°μŠ€λŸ¬μš΄ ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. 이 과정은 일반적인 μ–Έμ–΄ λͺ¨λΈμ˜ ν…μŠ€νŠΈ 생성 방식과 μœ μ‚¬ν•˜μ§€λ§Œ, 이전 λ‹¨κ³„μ—μ„œ ν™•λ³΄ν•œ μ •λ³΄λ‘œ 인해 더 μ •ν™•ν•˜κ³  κ΄€λ ¨μ„± 높은 응닡을 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 응닡 생성: 이 λ‹¨κ³„μ—μ„œ μ΅œμ’…μ μΈ 응닡이 μƒμ„±λ©λ‹ˆλ‹€. κ²€μƒ‰λœ λ¬Έμ„œμ˜ λ‚΄μš©μ„ μ°Έκ³ ν•˜μ—¬ μ‚¬μš©μžμ˜ μ§ˆμ˜μ— λŒ€ν•΄ μžμ—°μŠ€λŸ½κ³  μ •ν™•ν•œ 응닡을 μ œκ³΅ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, κ²€μƒ‰λœ μ˜ν•™ 논문을 λ°”νƒ•μœΌλ‘œ 건강 κ΄€λ ¨ μ§ˆμ˜μ— λŒ€ν•œ μƒμ„Έν•œ 닡변을 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.

RAG의 μž‘λ™ 원리

RAG의 μž‘λ™ μ›λ¦¬λŠ” 5λ‹¨κ³„λ‘œ 이루어져 μžˆμŠ΅λ‹ˆλ‹€.

1. 쿼리 μž„λ² λ”© 생성

  • μ‚¬μš©μžκ°€ μž…λ ₯ν•œ 질의(query)λ₯Ό μž„λ² λ”© λ²‘ν„°λ‘œ λ³€ν™˜ν•˜λŠ” λ‹¨κ³„μž…λ‹ˆλ‹€. 이 과정은 질의λ₯Ό 고차원 벑터 κ³΅κ°„μ—μ„œ μˆ˜μΉ˜ν™”ν•˜μ—¬ ν‘œν˜„ν•¨μœΌλ‘œμ¨, λͺ¨λΈμ΄ 질의의 의미λ₯Ό 이해할 수 있게 ν•©λ‹ˆλ‹€.
  • μžμ—°μ–΄λ‘œ μž‘μ„±λœ μ§ˆμ˜λŠ” μž„λ² λ”© λͺ¨λΈ(예: BERT, Sentence Transformers λ“±)에 μž…λ ₯λ˜μ–΄ λ²‘ν„°λ‘œ λ³€ν™˜λ©λ‹ˆλ‹€.
  • 이 λ²‘ν„°λŠ” 질의의 의미λ₯Ό 수치적인 ν˜•μ‹μœΌλ‘œ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

 

2. λ¬Έμ„œ 검색

  • λ³€ν™˜λœ 쿼리 μž„λ² λ”©μ„ μ‚¬μš©ν•˜μ—¬ μ™ΈλΆ€ 지식 베이슀(예: μœ„ν‚€ν”Όλ””μ•„, λ‰΄μŠ€ μ•„μΉ΄μ΄λΈŒ, λ¬Έμ„œ λ°μ΄ν„°λ² μ΄μŠ€)μ—μ„œ κ΄€λ ¨ λ¬Έμ„œλ₯Ό κ²€μƒ‰ν•©λ‹ˆλ‹€.
  • 쿼리 μž„λ² λ”©κ³Ό μ™ΈλΆ€ 지식 베이슀 λ‚΄ λ¬Έμ„œλ“€μ˜ μž„λ² λ”© μ‚¬μ΄μ˜ μœ μ‚¬λ„λ₯Ό κ³„μ‚°ν•˜μ—¬, 쿼리와 κ°€μž₯ 관련성이 높은 λ¬Έμ„œλ“€μ„ μ°Ύμ•„λƒ…λ‹ˆλ‹€.
  • 일반적으둜 코사인 μœ μ‚¬λ„λ‚˜ μœ ν΄λ¦¬λ””μ•ˆ 거리λ₯Ό ν™œμš©ν•˜μ—¬ λ¬Έμ„œμ™€ 질의 κ°„μ˜ μœ μ‚¬μ„±μ„ μΈ‘μ •ν•©λ‹ˆλ‹€.

 

3. λ¬Έμ„œ μž„λ² λ”© 생성

  • κ²€μƒ‰λœ 각 λ¬Έμ„œλ₯Ό μž„λ² λ”© λ²‘ν„°λ‘œ λ³€ν™˜ν•˜λŠ” λ‹¨κ³„μž…λ‹ˆλ‹€. 이 λ‹¨κ³„μ—μ„œλŠ” κ²€μƒ‰λœ λ¬Έμ„œμ˜ λ‚΄μš©μ„ 벑터 ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•˜μ—¬ λ‹€μŒ λ‹¨κ³„μ—μ„œ ν™œμš©ν•  수 있게 μ€€λΉ„ν•©λ‹ˆλ‹€.
  • κ²€μƒ‰λœ λ¬Έμ„œλ“€ μ—­μ‹œ μž„λ² λ”© λͺ¨λΈμ„ 톡해 λ²‘ν„°ν™”λ©λ‹ˆλ‹€. λ¬Έμ„œμ˜ 의미λ₯Ό λ²‘ν„°λ‘œ ν‘œν˜„ν•˜μ—¬ μ§ˆμ˜μ™€ λ¬Έμ„œ κ°„μ˜ 의미적인 결합이 κ°€λŠ₯ν•΄μ§‘λ‹ˆλ‹€.

 

4. λ¬Έμ„œ-쿼리 κ²°ν•©

  • κ²€μƒ‰λœ λ¬Έμ„œμ˜ μž„λ² λ”©κ³Ό 쿼리 μž„λ² λ”©μ„ κ²°ν•©ν•˜μ—¬ ν…μŠ€νŠΈ 생성 λͺ¨λΈμ˜ μž…λ ₯으둜 μ‚¬μš©ν•©λ‹ˆλ‹€.
  • 이 결합은 RAG의 핡심 λ‹¨κ³„λ‘œ, μ§ˆμ˜μ™€ κ΄€λ ¨ λ¬Έμ„œμ˜ λ‚΄μš©μ„ ν†΅ν•©ν•˜μ—¬ ν’λΆ€ν•œ λ§₯락을 ν˜•μ„±ν•©λ‹ˆλ‹€.
  • 쿼리 μž„λ² λ”©κ³Ό λ¬Έμ„œ μž„λ² λ”©μ„ ν•¨κ»˜ μ‚¬μš©ν•˜μ—¬, λͺ¨λΈμ΄ μ§ˆμ˜μ™€ λ¬Έμ„œ λͺ¨λ‘μ˜ 정보λ₯Ό ν™œμš©ν•΄ ν…μŠ€νŠΈλ₯Ό 생성할 수 있게 ν•©λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄, μž„λ² λ”© 벑터듀을 μ—°κ²°(concatenate)ν•˜κ±°λ‚˜ νŠΉμ • 연산을 톡해 κ²°ν•©ν•©λ‹ˆλ‹€.

 

5. ν…μŠ€νŠΈ 생성

  • κ²°ν•©λœ μž„λ² λ”©μ„ μž…λ ₯으둜 λ°›μ•„ 디코더(ν…μŠ€νŠΈ 생성 λͺ¨λΈ)κ°€ μƒˆλ‘œμš΄ ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
  • 이 λ‹¨κ³„μ—μ„œ μ΅œμ’…μ μœΌλ‘œ μ‚¬μš©μžμ—κ²Œ μ œκ³΅ν•  λ‹΅λ³€μ΄λ‚˜ 정보λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
  • κ²°ν•©λœ μž„λ² λ”©μ€ 디코더 λͺ¨λΈ(예: GPT, T5 λ“±)에 μž…λ ₯λ˜μ–΄ μžμ—°μŠ€λŸ¬μš΄ μ–Έμ–΄λ‘œ ν…μŠ€νŠΈκ°€ μƒμ„±λ©λ‹ˆλ‹€.
  • λ””μ½”λ”λŠ” 이 μž„λ² λ”©μ„ λ°”νƒ•μœΌλ‘œ μƒˆλ‘œμš΄ 응닡을 μƒμ„±ν•˜λ©°, κ²€μƒ‰λœ λ¬Έμ„œμ™€ 질의λ₯Ό 기반으둜 ν•œ 응닡을 μƒμ„±ν•˜κ²Œ λ©λ‹ˆλ‹€.

RAG의 μž₯점, 단점

RAG의 μž₯점

  1. ν’λΆ€ν•˜κ³  μ •ν™•ν•œ 정보 제곡: RAGλŠ” μ™ΈλΆ€ 지식 베이슀λ₯Ό ν™œμš©ν•˜κΈ° λ•Œλ¬Έμ—, μ΅œμ‹  μ •λ³΄λ‚˜ νŠΉμ • μ£Όμ œμ— λŒ€ν•œ κ΄‘λ²”μœ„ν•˜κ³  μ •ν™•ν•œ 닡변을 μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” λ‹¨μˆœνžˆ λ‚΄λΆ€μ μœΌλ‘œλ§Œ ν•™μŠ΅λœ 지식을 ν™œμš©ν•˜λŠ” λͺ¨λΈλ³΄λ‹€ 더 μ‹ λ’°μ„± μžˆλŠ” 응닡을 κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€.
  2. λ‹€μ–‘ν•œ 데이터 μ†ŒμŠ€ 톡합: RAGλŠ” μ—¬λŸ¬ μ’…λ₯˜μ˜ 데이터 μ†ŒμŠ€λ₯Ό κ²°ν•©ν•˜μ—¬ 응닡을 생성할 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ‰΄μŠ€ 기사, 곡식 λ°œν‘œ 자료, κ³Όν•™ λ…Όλ¬Έ, μ›Ήμ‚¬μ΄νŠΈ 등을 ν™œμš©ν•˜μ—¬ κ΄‘λ²”μœ„ν•œ 지식을 포함할 수 μžˆμŠ΅λ‹ˆλ‹€.
  3. 정보가 ν’λΆ€ν•œ 응닡 생성: λ‹¨μˆœ 생성 λͺ¨λΈκ³Ό 달리, RAGλŠ” κ²€μƒ‰λœ μ™ΈλΆ€ 정보λ₯Ό ν™œμš©ν•˜μ—¬ 더 μ •ν™•ν•˜κ³  ꡬ체적인 응닡을 μƒμ„±ν•©λ‹ˆλ‹€. μ΄λŠ” 특히 μ‚¬μš©μžμ—κ²Œ 심측적인 정보λ₯Ό μ œκ³΅ν•΄μ•Ό ν•˜λŠ” μ„œλΉ„μŠ€μ—μ„œ μœ μš©ν•©λ‹ˆλ‹€.
  4. λ³΄μ•ˆ 및 ν”„λΌμ΄λ²„μ‹œ 이점: RAGλŠ” λ‚΄λΆ€ LLM λͺ¨λΈκ³Ό μ™ΈλΆ€ 지식 베이슀λ₯Ό κ²°ν•©ν•˜μ—¬ ꡬ성할 수 μžˆμ–΄, μ™„μ „νžˆ μ™ΈλΆ€ λ°μ΄ν„°μ—λ§Œ μ˜μ‘΄ν•˜μ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€. 이둜써 μ‚¬μš©μž λ°μ΄ν„°μ˜ λ³΄μ•ˆκ³Ό ν”„λΌμ΄λ²„μ‹œλ₯Ό 더 효과적으둜 λ³΄ν˜Έν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  5. 효율적인 νŠΉν™” 도메인 λŒ€μ‘: νŠΉμ • λΆ„μ•Όλ‚˜ 도메인에 νŠΉν™”λœ 정보λ₯Ό μ œκ³΅ν•  λ•Œ, RAGλŠ” νŒŒμΈνŠœλ‹λ³΄λ‹€ 더 효율적으둜 λŒ€μ‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 의료, 법λ₯ , 기술 λ“± μ „λ¬Έ 지식을 μš”κ΅¬ν•˜λŠ” μ˜μ—­μ—μ„œ λ”μš± μœ μš©ν•˜κ²Œ ν™œμš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.

 

RAG의 단점

  1. λ³΅μž‘ν•œ ꡬ쑰: 검색과 생성을 κ²°ν•©ν•˜λŠ” 과정이 λ³΅μž‘ν•˜κΈ° λ•Œλ¬Έμ—, λͺ¨λΈμ„ ν•™μŠ΅ν•˜κ³  νŠœλ‹ν•˜λŠ” 과정이 μ–΄λ ΅κ³  μ‹œκ°„μ΄ 많이 μ†Œμš”λ  수 μžˆμŠ΅λ‹ˆλ‹€. 특히 μž„λ² λ”© 생성, λ¬Έμ„œ 검색, ν…μŠ€νŠΈ 생성 λ“± λ‹€μ–‘ν•œ 단계λ₯Ό 효율적으둜 ν†΅ν•©ν•˜λŠ” 것이 κΉŒλ‹€λ‘­μŠ΅λ‹ˆλ‹€.
  2. 높은 μ—°μ‚° μžμ› ν•„μš”: RAGλŠ” μ—¬λŸ¬ λ‹¨κ³„μ˜ 연산을 μˆ˜ν–‰ν•˜λ―€λ‘œ, μž„λ² λ”© 생성, λ¬Έμ„œ 검색, ν…μŠ€νŠΈ 생성 λ“± λͺ¨λ“  κ³Όμ •μ—μ„œ 높은 μ—°μ‚° μžμ›μ„ μš”κ΅¬ν•©λ‹ˆλ‹€. μ΄λŠ” λŒ€κ·œλͺ¨ λ°μ΄ν„°μ…‹μ΄λ‚˜ μ‹€μ‹œκ°„ 응닡을 μ²˜λ¦¬ν•  λ•Œ μ‹œμŠ€ν…œ 뢀담을 κ°€μ€‘μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
  3. μ™ΈλΆ€ 지식 λ² μ΄μŠ€μ— λŒ€ν•œ μ˜μ‘΄μ„±: RAGλŠ” μ™ΈλΆ€ 지식 베이슀의 ν’ˆμ§ˆκ³Ό μ΅œμ‹ μ„±μ— 크게 μ˜μ‘΄ν•©λ‹ˆλ‹€. λ§Œμ•½ μ‚¬μš©λ˜λŠ” μ™ΈλΆ€ 지식 λ² μ΄μŠ€κ°€ μ˜€λž˜λ˜μ—ˆκ±°λ‚˜ μ‹ λ’°ν•  수 μ—†λŠ” μ •λ³΄λ‘œ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€λ©΄, 결과의 정확성에 뢀정적인 영ν–₯을 λ―ΈμΉ  수 μžˆμŠ΅λ‹ˆλ‹€.

RAG Example

1. 질의 응닡 μ‹œμŠ€ν…œ (Question Answering)

  • μ‚¬μš©μžκ°€ "λ§ˆμ§€λ§‰ μ˜¬λ¦Όν”½ 100m 달리기 κΈˆλ©”λ‹¬λ¦¬μŠ€νŠΈλŠ” λˆ„κ΅¬μΈκ°€?"라고 μ§ˆλ¬Έν•˜λ©΄, RAG λͺ¨λΈμ€ μ΅œμ‹  λ‰΄μŠ€ κΈ°μ‚¬λ‚˜ 곡식 슀포츠 기둝을 κ²€μƒ‰ν•˜μ—¬ μ •ν™•ν•œ 닡변을 μ œκ³΅ν•©λ‹ˆλ‹€.
  • μ΅œμ‹  μ˜¬λ¦Όν”½ 기둝을 κ²€μƒ‰ν•˜κ³ , ν•΄λ‹Ή 경기에 λŒ€ν•œ 곡식 κ²°κ³Όλ₯Ό μ°Ύμ•„ "λ§ˆμ§€λ§‰ μ˜¬λ¦Όν”½ 100m 달리기 κΈˆλ©”λ‹¬λ¦¬μŠ€νŠΈλŠ” [μ„ μˆ˜ 이름]μž…λ‹ˆλ‹€"λΌλŠ” μ‹μœΌλ‘œ μ •ν™•ν•œ 정보λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

 

2. ꡐ윑 λ„μš°λ―Έ 챗봇

  • 학생이 "κ΄‘ν•©μ„±μ˜ 과정은 μ–΄λ–»κ²Œ μ΄λ£¨μ–΄μ§€λ‚˜μš”?"라고 μ§ˆλ¬Έν•˜λ©΄, 챗봇은 μ΅œμ‹  생물학 κ΅κ³Όμ„œμ™€ ꡐ윑 자료λ₯Ό κ²€μƒ‰ν•˜μ—¬ κ΄‘ν•©μ„±μ˜ 과정을 λ‹¨κ³„λ³„λ‘œ μ„€λͺ…ν•©λ‹ˆλ‹€.
  • 챗봇은 μ™ΈλΆ€ 지식 λ² μ΄μŠ€μ—μ„œ κ΄‘ν•©μ„±κ³Ό κ΄€λ ¨λœ ꡐ윑 자료λ₯Ό κ²€μƒ‰ν•˜μ—¬, 학생이 μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ "광합성은 식물이 λΉ› μ—λ„ˆμ§€λ₯Ό μ΄μš©ν•΄ λ¬Όκ³Ό μ΄μ‚°ν™”νƒ„μ†Œλ‘œλΆ€ν„° μ‚°μ†Œμ™€ 포도당을 μƒμ„±ν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€..."와 같은 μƒμ„Έν•œ μ„€λͺ…을 μ œκ³΅ν•©λ‹ˆλ‹€.

 

3. μ—¬ν–‰ μΆ”μ²œ μ‹œμŠ€ν…œ

  • μ‚¬μš©μžκ°€ "이번 여름 νœ΄κ°€μ— 갈 λ§Œν•œ 해변을 μΆ”μ²œν•΄μ€˜"라고 μš”μ²­ν•˜λ©΄, RAG λͺ¨λΈμ€ μ΅œμ‹  μ—¬ν–‰ λΈ”λ‘œκ·Έ, κ°€μ΄λ“œ, 날씨 정보 등을 κ²€μƒ‰ν•˜μ—¬ μ‚¬μš©μžκ°€ μ„ ν˜Έν•  λ§Œν•œ ν•΄λ³€ λͺ©λ‘μ„ μ œκ³΅ν•©λ‹ˆλ‹€.
  • μ΅œμ‹  μ—¬ν–‰ 정보λ₯Ό κ²€μƒ‰ν•˜μ—¬ ν•΄λ³€μ˜ 인기, 날씨, νŽΈμ˜μ‹œμ„€ 등을 κ³ λ €ν•΄ "이번 여름에 κ°€λ³Ό λ§Œν•œ ν•΄λ³€μœΌλ‘œλŠ” 발리의 쿠타 λΉ„μΉ˜, ν•˜μ™€μ΄μ˜ 와이킀킀 λΉ„μΉ˜, 그리고 슀페인의 μ½”μŠ€νƒ€ λΈŒλΌλ°”λ₯Ό μΆ”μ²œν•©λ‹ˆλ‹€..."와 같은 λ§žμΆ€ν˜• μΆ”μ²œμ„ μ œκ³΅ν•©λ‹ˆλ‹€.

 

4. 기술 지원 챗봇

  • μ‚¬μš©μžκ°€ "컴퓨터가 자꾸 μž¬λΆ€νŒ…λ˜λŠ”λ° μ–΄λ–»κ²Œ ν•΄κ²°ν•  수 μžˆλ‚˜μš”?"라고 μ§ˆλ¬Έν•˜λ©΄, 챗봇은 μ΅œμ‹  기술 λ¬Έμ„œ, 포럼 κ²Œμ‹œκΈ€, FAQλ₯Ό κ²€μƒ‰ν•˜μ—¬ κ°€μž₯ 일반적인 ν•΄κ²° 방법을 μ œκ³΅ν•©λ‹ˆλ‹€.
  • 챗봇은 κ²€μƒ‰λœ 기술 지원 λ¬Έμ„œλ₯Ό λ°”νƒ•μœΌλ‘œ "컴퓨터가 자꾸 μž¬λΆ€νŒ…λ˜λŠ” λ¬Έμ œλŠ” 주둜 κ³Όμ—΄, λ“œλΌμ΄λ²„ 좩돌, λ˜λŠ” ν•˜λ“œμ›¨μ–΄ 문제 λ•Œλ¬ΈμΌ 수 μžˆμŠ΅λ‹ˆλ‹€. λ¨Όμ €, CPU νŒ¬μ„ μ²­μ†Œν•΄ λ³΄μ‹œκ³ , λ“œλΌμ΄λ²„λ₯Ό μ—…λ°μ΄νŠΈν•˜κ±°λ‚˜ κ³ μž₯ λ‚œ ν•˜λ“œμ›¨μ–΄λ₯Ό μ κ²€ν•΄λ³΄μ„Έμš”..."와 같이 문제 ν•΄κ²° 방법을 μ œμ‹œν•©λ‹ˆλ‹€.

 

5. μ˜ν™” μΆ”μ²œ μ„œλΉ„μŠ€

  • μ‚¬μš©μžκ°€ "μš”μ¦˜ 인기 μžˆλŠ” 슀릴러 μ˜ν™” μΆ”μ²œν•΄μ€˜"라고 μš”μ²­ν•˜λ©΄, RAG λͺ¨λΈμ€ μ˜ν™” 리뷰 μ‚¬μ΄νŠΈ, λ°•μŠ€μ˜€ν”ΌμŠ€ μˆœμœ„, μ˜ν™” 평둠을 κ²€μƒ‰ν•˜μ—¬ μ΅œμ‹  인기 슀릴러 μ˜ν™”λ₯Ό μΆ”μ²œν•©λ‹ˆλ‹€.
  • κ²€μƒ‰λœ 데이터λ₯Ό λ°”νƒ•μœΌλ‘œ "μ΅œκ·Όμ— κ°œλ΄‰ν•œ 슀릴러 μ˜ν™”λ‘œλŠ” 'ν…Œλ„·', 'λ…Έ νƒ€μž„ 투 닀이', 'μ–Έμ°¨ν‹°λ“œ' 등이 μžˆμŠ΅λ‹ˆλ‹€. 특히 'ν…Œλ„·'은 ν™”λ €ν•œ μ•‘μ…˜κ³Ό λ³΅μž‘ν•œ μŠ€ν† λ¦¬λ‘œ λ§Žμ€ ν˜Έν‰μ„ λ°›κ³  μžˆμŠ΅λ‹ˆλ‹€..."와 같은 정보λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

 

6. λΉ„μ¦ˆλ‹ˆμŠ€ μΈν…”λ¦¬μ „μŠ€

  • κΈ°μ—… λ‹΄λ‹Ήμžκ°€ "졜근 우리 μ‚°μ—… λΆ„μ•Όμ˜ νŠΈλ Œλ“œκ°€ 무엇인가?"라고 μ§ˆλ¬Έν•˜λ©΄, RAG λͺ¨λΈμ€ μ΅œμ‹  λΉ„μ¦ˆλ‹ˆμŠ€ λ‰΄μŠ€, 연ꡬ λ³΄κ³ μ„œ, μ‚°μ—… 뢄석 자료λ₯Ό κ²€μƒ‰ν•˜μ—¬ ν˜„μž¬μ˜ μ‚°μ—… νŠΈλ Œλ“œλ₯Ό μš”μ•½ν•©λ‹ˆλ‹€.
  • RAGλŠ” μ‚°μ—… 뢄석 λ³΄κ³ μ„œμ™€ λ‰΄μŠ€λ₯Ό 톡해 "졜근 λ‹Ήμ‹ μ˜ μ‚°μ—… λΆ„μ•Όμ—μ„œλŠ” 디지털 μ „ν™˜κ³Ό AI λ„μž…μ΄ μ£Όμš” νŠΈλ Œλ“œλ‘œ λΆ€μƒν•˜κ³  있으며, 고객 κ²½ν—˜ ν–₯상을 μœ„ν•œ λ§žμΆ€ν˜• μ„œλΉ„μŠ€κ°€ 각광받고 μžˆμŠ΅λ‹ˆλ‹€..."와 같은 μΈμ‚¬μ΄νŠΈλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

RAG 직접 κ΅¬ν˜„μ„ μœ„ν•œ μš”μ†Œ

RAGλ₯Ό 직접 κ΅¬ν˜„ν•˜κΈ° μœ„ν•œ μ£Όμš” ꡬ성 μš”μ†Œμ— λ°ν•˜μ—¬ μ„€λͺ…ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

1. μž„λ² λ”© (Embedding)

μž„λ² λ”©μ€ ν…μŠ€νŠΈλ₯Ό λ²‘ν„°ν™”ν•˜λŠ” κ³Όμ •μœΌλ‘œ, RAG μ‹œμŠ€ν…œμ˜ ν•΅μ‹¬μž…λ‹ˆλ‹€. 주둜 두 가지 방법을 μ‚¬μš©ν•©λ‹ˆλ‹€.

  • TF-IDF: 고전적인 λ°©λ²•μœΌλ‘œ, λ‹¨μ–΄μ˜ λΉˆλ„μ™€ μ—­λ¬Έμ„œ λΉˆλ„λ₯Ό μ‚¬μš©ν•˜μ—¬ ν…μŠ€νŠΈλ₯Ό λ²‘ν„°ν™”ν•©λ‹ˆλ‹€. λ‹¨μˆœν•˜μ§€λ§Œ νŠΉμ • μƒν™©μ—μ„œ νš¨κ³Όμ μž…λ‹ˆλ‹€.
  • μž„λ² λ”© λͺ¨λΈ: Word2Vec, GloVe, BERT, Sentence Transformers와 같은 λͺ¨λΈμ„ μ‚¬μš©ν•˜μ—¬ 더 μ •κ΅ν•œ 벑터 ν‘œν˜„μ„ μƒμ„±ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ λͺ¨λΈμ€ λ‹¨μ–΄μ˜ μ˜λ―Έμ™€ λ¬Έλ§₯을 벑터에 λ°˜μ˜ν•˜μ—¬ 높은 μˆ˜μ€€μ˜ ν‘œν˜„λ ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.

 

2. 정보 μ €μž₯ 및 검색

ν…μŠ€νŠΈ μž„λ² λ”©μ„ μ €μž₯ν•˜κ³  κ²€μƒ‰ν•˜λŠ” 데 μ‚¬μš©ν•  수 μžˆλŠ” λ°μ΄ν„°λ² μ΄μŠ€ μ‹œμŠ€ν…œμž…λ‹ˆλ‹€.

  • RDBMS: κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λ‘œ, μž‘μ€ 규λͺ¨μ˜ 데이터셋에 λŒ€ν•œ κ°„λ‹¨ν•œ 검색에 μœ μš©ν•©λ‹ˆλ‹€.
  • NoSQL: MongoDB, Cassandra λ“±μ˜ λΉ„κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λ‘œ, μœ μ—°ν•œ μŠ€ν‚€λ§ˆλ₯Ό μ œκ³΅ν•˜λ©° λŒ€λŸ‰μ˜ λΉ„μ •ν˜• 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” 데 μ ν•©ν•©λ‹ˆλ‹€.
  • VectorDB: Milvus, Pinecone, FAISS와 같은 벑터 λ°μ΄ν„°λ² μ΄μŠ€λŠ” μž„λ² λ”© 벑터λ₯Ό 효율적으둜 μ €μž₯ν•˜κ³  κ³ μ†μ˜ μœ μ‚¬λ„ 검색을 μ§€μ›ν•©λ‹ˆλ‹€. RAGμ—μ„œ λŒ€κ·œλͺ¨ 벑터 검색 μž‘μ—…μ„ μˆ˜ν–‰ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

 

3. LLM (Large Language Models)

μ–Έμ–΄ λͺ¨λΈμ€ κ²€μƒ‰λœ 정보와 μ‚¬μš©μž μ§ˆμ˜μ— κΈ°λ°˜ν•˜μ—¬ ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.

  • Llama: Meta AIμ—μ„œ κ°œλ°œν•œ λŒ€κ·œλͺ¨ μ–Έμ–΄ λͺ¨λΈλ‘œ, νŠΉμ • μž‘μ—…μ„ μœ„ν•΄ λ―Έμ„Έ μ‘°μ •(fine-tuning)ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • ChatGPT: OpenAIμ—μ„œ κ°œλ°œν•œ μ–Έμ–΄ λͺ¨λΈλ‘œ, λŒ€ν™”ν˜• 응닡 생성에 νŠΉν™”λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
  • Phi: νŠΉμ •ν•œ μž‘μ—… λ˜λŠ” 도메인에 μ΅œμ ν™”λœ μ–Έμ–΄ λͺ¨λΈλ‘œ μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.

RAG Framework

RAG을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•œ Framework에 λ°ν•˜μ—¬ μ„€λͺ…ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

Langchain

LangChain은 λŒ€κ·œλͺ¨ μ–Έμ–΄ λͺ¨λΈ(LLM)을 ν™œμš©ν•˜μ—¬ 검색 및 생성을 독립적인 λͺ¨λ“ˆλ‘œ κ΅¬ν˜„ν•  수 μžˆλŠ” ꡬ쑰λ₯Ό μ œκ³΅ν•˜λŠ” ν”„λ ˆμž„μ›Œν¬μž…λ‹ˆλ‹€.

이λ₯Ό 톡해 λ‹€μ–‘ν•œ 데이터 μ†ŒμŠ€μ™€ 검색 방법을 μœ μ—°ν•˜κ²Œ ν†΅ν•©ν•˜κ³ , 효율적인 μ–Έμ–΄ 처리 νŒŒμ΄ν”„λΌμΈμ„ ꡬ좕할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

μ£Όμš” νŠΉμ§•

  1. λͺ¨λ“ˆν™”λœ ꡬ쑰: LangChain은 검색과 생성을 독립적인 λͺ¨λ“ˆλ‘œ λΆ„λ¦¬ν•˜μ—¬, 각 ꡬ성 μš”μ†Œλ₯Ό λ…λ¦½μ μœΌλ‘œ 개발, ν…ŒμŠ€νŠΈ, 배포할 수 μžˆλŠ” ꡬ쑰λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. μ΄λŠ” μ‹œμŠ€ν…œμ˜ μœ μ—°μ„±κ³Ό ν™•μž₯성을 크게 ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€.
  2. λ‹€μ–‘ν•œ 데이터 μ†ŒμŠ€ 톡합: μ™ΈλΆ€ λ°μ΄ν„°λ² μ΄μŠ€, μ›Ήμ‚¬μ΄νŠΈ, λ¬Έμ„œ μ €μž₯μ†Œ λ“± λ‹€μ–‘ν•œ 데이터 μ†ŒμŠ€μ™€ 검색 방법을 μ‰½κ²Œ 톡합할 수 μžˆλŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.
  3. νŒŒμ΄ν”„λΌμΈ μœ μ—°μ„±: 데이터λ₯Ό μ²˜λ¦¬ν•˜κ³  λ³€ν™˜ν•˜λŠ” νŒŒμ΄ν”„λΌμΈμ„ μœ μ—°ν•˜κ²Œ ꡬ성할 수 μžˆμ–΄, μ‚¬μš©μžμ˜ νŠΉμ • μš”κ΅¬ 사항에 맞게 데이터λ₯Ό μ „μ²˜λ¦¬ν•˜κ³ , 검색 및 생성 단계λ₯Ό μ‘°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  4. 톡합 ν™˜κ²½ 제곡: μ–Έμ–΄ λͺ¨λΈμ˜ ν•™μŠ΅, 평가, 배포λ₯Ό μœ„ν•œ 도ꡬ와 κΈ°λŠ₯을 ν¬ν•¨ν•˜μ—¬, 전체적인 μ›Œν¬ν”Œλ‘œμš°λ₯Ό ν†΅ν•©ν•˜κ³  관리할 수 μžˆλŠ” ν™˜κ²½μ„ μ œκ³΅ν•©λ‹ˆλ‹€.

 

ꡬ쑰

  1. 데이터 μ†ŒμŠ€:
    • μ™ΈλΆ€ λ°μ΄ν„°λ² μ΄μŠ€, μ›Ήμ‚¬μ΄νŠΈ, λ¬Έμ„œ μ €μž₯μ†Œ λ“± λ‹€μ–‘ν•œ 데이터 μ†ŒμŠ€μ—μ„œ 정보λ₯Ό κ²€μƒ‰ν•˜λŠ” 역할을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€.
    • 데이터 μ†ŒμŠ€μ˜ μ’…λ₯˜μ— 따라 λ‹€λ₯Έ 검색 μ „λž΅μ„ μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  2. 검색 λͺ¨λ“ˆ:
    • TF-IDF, BM25 λ“±μ˜ 검색 μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜μ—¬ μž…λ ₯ 쿼리와 κ΄€λ ¨λœ λ¬Έμ„œλ₯Ό κ²€μƒ‰ν•©λ‹ˆλ‹€.
    • 쿼리λ₯Ό μž„λ² λ”© λ²‘ν„°λ‘œ λ³€ν™˜ν•˜κ³ , ν•΄λ‹Ή 벑터λ₯Ό μ‚¬μš©ν•΄ 데이터 μ†ŒμŠ€μ—μ„œ κ°€μž₯ 관련성이 높은 λ¬Έμ„œλ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€.
    • 이 λͺ¨λ“ˆμ€ κ²€μƒ‰λœ λ¬Έμ„œλ“€μ˜ μœ μ‚¬μ„±μ„ κ³„μ‚°ν•˜κ³ , μ ν•©ν•œ 정보λ₯Ό μΆ”μΆœν•˜λŠ” 데 μ΄ˆμ μ„ λ‘‘λ‹ˆλ‹€.
  3. 생성 λͺ¨λ“ˆ:
    • μ–Έμ–΄ λͺ¨λΈ(LLM)을 μ‚¬μš©ν•˜μ—¬ κ²€μƒ‰λœ λ¬Έμ„œλ₯Ό λ°”νƒ•μœΌλ‘œ μžμ—°μŠ€λŸ¬μš΄ ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
    • 이 λͺ¨λ“ˆμ€ LLM의 λŠ₯λ ₯을 ν™œμš©ν•˜μ—¬ μ‚¬μš©μžμ˜ 쿼리에 λŒ€ν•΄ μ •ν™•ν•˜κ³  ν’λΆ€ν•œ 응닡을 μƒμ„±ν•©λ‹ˆλ‹€.
    • 응닡 생성은 λ‹¨μˆœν•œ λ¬Έμ„œ κ²€μƒ‰μ˜ κ²°κ³Όλ₯Ό μ „λ‹¬ν•˜λŠ” 것뿐 μ•„λ‹ˆλΌ, μ‚¬μš©μžμ˜ λ§₯락에 맞게 λ¬Έμž₯을 μž¬κ΅¬μ„±ν•˜μ—¬ μžμ—°μŠ€λŸ¬μš΄ λŒ€ν™” 흐름을 λ§Œλ“­λ‹ˆλ‹€.
  4. νŒŒμ΄ν”„λΌμΈ 관리:
    • 전체 데이터 처리 흐름을 κ΄€λ¦¬ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.
    • 데이터 μ „μ²˜λ¦¬, 검색, μƒμ„±μ˜ 각 단계λ₯Ό μ‘°μ •ν•˜κ³  μ΅œμ ν™”ν•˜μ—¬ μ΅œμ’… 응닡을 μƒμ„±ν•©λ‹ˆλ‹€.
    • 이 관리 λͺ¨λ“ˆμ€ μž‘μ—…μ˜ μˆœμ„œλ₯Ό μ •ν•˜κ³ , 각 λ‹¨κ³„μ˜ κ²°κ³Όλ₯Ό λ‹€μŒ λ‹¨κ³„λ‘œ μ „λ‹¬ν•˜λŠ” 역할을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

LlamaIndex

 

LlamaIndexλŠ” λŒ€κ·œλͺ¨ μ–Έμ–΄ λͺ¨λΈμ„ 기반으둜 ν•œ 검색 및 생성 μž‘μ—…μ„ μ§€μ›ν•˜λŠ” ν”„λ ˆμž„μ›Œν¬μž…λ‹ˆλ‹€.

λŒ€κ·œλͺ¨ 데이터셋을 효율적으둜 μΈλ±μ‹±ν•˜κ³ , κ³ μ„±λŠ₯ 검색 κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” 데 쀑점을 두고 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 λ‹€μ–‘ν•œ 검색 μ•Œκ³ λ¦¬μ¦˜κ³Ό μ–Έμ–΄ λͺ¨λΈμ„ μ‰½κ²Œ 톡합할 수 있으며, λ¬Έμ„œμ™€ 쿼리의 μž„λ² λ”©μ„ μƒμ„±ν•˜κ³  μœ μ‚¬μ„±μ„ κ³„μ‚°ν•˜μ—¬ κ΄€λ ¨ λ¬Έμ„œλ₯Ό κ²€μƒ‰ν•˜λŠ” κΈ°λŠ₯을 μ§€μ›ν•©λ‹ˆλ‹€.

 

νŠΉμ§• 및 κΈ°λŠ₯

  1. λŒ€κ·œλͺ¨ 데이터 인덱싱: λŒ€κ·œλͺ¨ 데이터셋을 효율적으둜 μΈλ±μ‹±ν•˜μ—¬ λΉ λ₯Έ 검색을 μ§€μ›ν•©λ‹ˆλ‹€. 이 κ³Όμ •μ—μ„œ λ°μ΄ν„°μ˜ ꡬ쑰와 λ‚΄μš©μ„ λΆ„μ„ν•˜μ—¬ 효율적인 검색이 κ°€λŠ₯ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.
  2. κ³ μ„±λŠ₯ 검색 κΈ°λŠ₯: μ‚¬μš©μžκ°€ μž…λ ₯ν•œ 쿼리λ₯Ό μž„λ² λ”© λ²‘ν„°λ‘œ λ³€ν™˜ν•˜κ³ , μΈλ±μ‹±λœ λ¬Έμ„œμ˜ μž„λ² λ”©κ³Ό λΉ„κ΅ν•˜μ—¬ μœ μ‚¬λ„λ₯Ό κ³„μ‚°ν•¨μœΌλ‘œμ¨ κ°€μž₯ κ΄€λ ¨μ„± 높은 λ¬Έμ„œλ₯Ό κ²€μƒ‰ν•©λ‹ˆλ‹€.
  3. λ‹€μ–‘ν•œ 검색 μ•Œκ³ λ¦¬μ¦˜ 및 μ–Έμ–΄ λͺ¨λΈ 톡합: λ‹€μ–‘ν•œ 검색 μ•Œκ³ λ¦¬μ¦˜κ³Ό μ–Έμ–΄ λͺ¨λΈμ„ μ‰½κ²Œ 톡합할 수 μžˆμ–΄, μ‘μš© 뢄야에 따라 μ΅œμ ν™”λœ 검색 및 응닡 생성이 κ°€λŠ₯ν•©λ‹ˆλ‹€.
  4. νŒŒμ΄ν”„λΌμΈ 관리: 인덱싱, 검색, 생성 과정을 ν†΅ν•©ν•˜μ—¬ 효율적인 μž‘μ—… 흐름을 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

ꡬ쑰

  1. 데이터 인덱싱:
    • λŒ€κ·œλͺ¨ 데이터셋을 μΈλ±μ‹±ν•˜μ—¬ λΉ λ₯΄κ³  효율적인 검색을 μ§€μ›ν•©λ‹ˆλ‹€.
    • λ°μ΄ν„°μ˜ ꡬ쑰와 λ‚΄μš©μ„ λΆ„μ„ν•˜μ—¬ 인덱슀λ₯Ό κ΅¬μΆ•ν•¨μœΌλ‘œμ¨ κ²€μƒ‰μ˜ μ •ν™•μ„±κ³Ό 속도λ₯Ό λ†’μž…λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, ν…μŠ€νŠΈ λ¬Έμ„œ, μ›Ή νŽ˜μ΄μ§€, λ°μ΄ν„°λ² μ΄μŠ€ λ“± λ‹€μ–‘ν•œ ν˜•νƒœμ˜ 데이터λ₯Ό 인덱싱할 수 μžˆμŠ΅λ‹ˆλ‹€.
  2. 쿼리 처리 및 검색:
    • μ‚¬μš©μžκ°€ μž…λ ₯ν•œ 쿼리λ₯Ό μž„λ² λ”© λ²‘ν„°λ‘œ λ³€ν™˜ν•˜κ³ , μΈλ±μ‹±λœ λ¬Έμ„œλ“€μ˜ μž„λ² λ”© 벑터와 λΉ„κ΅ν•˜μ—¬ μœ μ‚¬λ„λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.
    • μœ μ‚¬λ„ 계산을 톡해 쿼리와 κ°€μž₯ κ΄€λ ¨μ„± 높은 λ¬Έμ„œλ₯Ό κ²€μƒ‰ν•˜κ³ , 이λ₯Ό μ‚¬μš©μžμ˜ μ§ˆμ˜μ— λŒ€ν•œ 응닡 μƒμ„±μ˜ 기반으둜 μ‚¬μš©ν•©λ‹ˆλ‹€.
    • TF-IDF, BM25 λ“±μ˜ 전톡적인 검색 μ•Œκ³ λ¦¬μ¦˜λΏλ§Œ μ•„λ‹ˆλΌ, 신경망 기반 μž„λ² λ”©μ„ ν™œμš©ν•œ 검색도 μ§€μ›ν•©λ‹ˆλ‹€.
  3. ν…μŠ€νŠΈ 생성:
    • κ²€μƒ‰λœ λ¬Έμ„œλ₯Ό λ°”νƒ•μœΌλ‘œ, LLM을 ν™œμš©ν•˜μ—¬ μžμ—°μŠ€λŸ¬μš΄ 응닡 ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜λŠ” 데 ν•„μš”ν•œ μž…λ ₯을 μ€€λΉ„ν•©λ‹ˆλ‹€.
    • 이 λ‹¨κ³„μ—μ„œλŠ” κ²€μƒ‰λœ λ¬Έμ„œμ˜ 핡심 λ‚΄μš©μ„ μΆ”μΆœν•˜κ³ , 이λ₯Ό μ–Έμ–΄ λͺ¨λΈμ— μ „λ‹¬ν•˜μ—¬ μ‚¬μš©μžμ˜ μ§ˆμ˜μ— λŒ€ν•œ 응닡을 μƒμ„±ν•©λ‹ˆλ‹€.
  4. νŒŒμ΄ν”„λΌμΈ 관리:
    • 인덱싱, 검색, 생성 λ“± λͺ¨λ“  μž‘μ—…μ„ ν†΅ν•©ν•˜μ—¬ 전체적인 μž‘μ—… 흐름을 효율적으둜 κ΄€λ¦¬ν•©λ‹ˆλ‹€.
    • νŒŒμ΄ν”„λΌμΈμ„ 톡해 데이터 처리의 각 단계λ₯Ό μ‘°μ •ν•˜κ³ , κ²°κ³Όλ₯Ό μ΅œμ ν™”ν•˜μ—¬ μ‚¬μš©μžμ˜ μš”κ΅¬μ— λΉ λ₯΄κ²Œ λŒ€μ‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Langchain vs LlamaIndex

Langchain

  • λͺ¨λ“ˆν™”λœ ꡬ성 μš”μ†Œ: 검색과 생성 단계λ₯Ό λ…λ¦½μ μœΌλ‘œ κ΅¬ν˜„ν•˜κ³  μ‘°ν•©ν•  수 μžˆλŠ” ꡬ쑰λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 각 ꡬ성 μš”μ†Œλ₯Ό λ…λ¦½μ μœΌλ‘œ 개발, ν…ŒμŠ€νŠΈ, 배포할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • ν™•μž₯μ„±: λ‹€μ–‘ν•œ 데이터 μ†ŒμŠ€μ™€ 검색 방법을 μ‰½κ²Œ 톡합할 수 μžˆμŠ΅λ‹ˆλ‹€. μ™ΈλΆ€ λ°μ΄ν„°λ² μ΄μŠ€, μ›Ήμ‚¬μ΄νŠΈ, λ¬Έμ„œ μ €μž₯μ†Œ λ“± λ‹€μ–‘ν•œ ν˜•νƒœμ˜ 데이터λ₯Ό μ†μ‰½κ²Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μœ μ—°ν•œ νŒŒμ΄ν”„λΌμΈ: 데이터λ₯Ό μ²˜λ¦¬ν•˜κ³  λ³€ν™˜ν•˜λŠ” νŒŒμ΄ν”„λΌμΈμ„ μœ μ—°ν•˜κ²Œ ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€. μ‚¬μš©μžκ°€ νŠΉμ • μš”κ΅¬ 사항에 맞게 데이터 μ „μ²˜λ¦¬, 검색 및 생성 단계λ₯Ό μ‘°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ‹€μ–‘ν•œ μ–Έμ–΄ λͺ¨λΈκ³Ό 검색 기법: TF-IDF, BM25 λ“±μ˜ 검색 μ•Œκ³ λ¦¬μ¦˜λΏλ§Œ μ•„λ‹ˆλΌ, λ‹€μ–‘ν•œ μ–Έμ–΄ λͺ¨λΈμ„ ν™œμš©ν•˜μ—¬ 효율적이고 ν™•μž₯ κ°€λŠ₯ν•œ μžμ—°μ–΄ 처리 μ‹œμŠ€ν…œμ„ ꡬ좕할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

LlamaIndex

  • 효율적인 인덱싱: λŒ€κ·œλͺ¨ 데이터셋을 κ΅¬μ‘°ν™”λœ ν˜•νƒœλ‘œ μΈλ±μ‹±ν•˜μ—¬ λΉ λ₯Έ 검색을 μ§€μ›ν•©λ‹ˆλ‹€. 이둜써 μ‚¬μš©μžλŠ” λŒ€λŸ‰μ˜ 데이터λ₯Ό λΉ λ₯΄κ²Œ κ²€μƒ‰ν•˜κ³  ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • κ°•λ ₯ν•œ 검색 κΈ°λŠ₯: Dense Retrieval 기법을 μ‚¬μš©ν•˜μ—¬ 높은 μ •ν™•λ„μ˜ 검색 κ²°κ³Όλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. λ¬Έμ„œμ™€ 쿼리의 μž„λ² λ”©μ„ μƒμ„±ν•˜κ³  μœ μ‚¬μ„±μ„ κ³„μ‚°ν•˜μ—¬ κ΄€λ ¨ λ¬Έμ„œλ₯Ό μ°Ύμ•„λƒ…λ‹ˆλ‹€.
  • ν†΅ν•©λœ 생성 κΈ°λŠ₯: κ²€μƒ‰λœ 정보λ₯Ό λ°”νƒ•μœΌλ‘œ μžμ—°μŠ€λŸ¬μš΄ ν…μŠ€νŠΈλ₯Ό 생성할 수 μžˆμŠ΅λ‹ˆλ‹€. 이둜써 μ‚¬μš©μžλŠ” λ”μš± ν’λΆ€ν•˜κ³  μ •ν™•ν•œ 응닡을 받을 수 μžˆμŠ΅λ‹ˆλ‹€.
  • λŒ€κ·œλͺ¨ 데이터 관리: λŒ€κ·œλͺ¨ λ°μ΄ν„°μ…‹μ˜ 인덱싱과 κ³ μ„±λŠ₯ 검색 κΈ°λŠ₯에 쀑점을 두어 λŒ€μš©λŸ‰ 데이터 기반 μ‘μš© ν”„λ‘œκ·Έλž¨μ— μ ν•©ν•©λ‹ˆλ‹€.
Langchain은 λͺ¨λ“ˆν™”와 ν™•μž₯성에 쀑점을 λ‘” ν”„λ ˆμž„μ›Œν¬λ‘œ, λ‹€μ–‘ν•œ 데이터 μ†ŒμŠ€μ™€ 검색 방법을 μœ μ—°ν•˜κ²Œ 톡합할 수 μžˆμŠ΅λ‹ˆλ‹€.
검색 및 생성 νŒŒμ΄ν”„λΌμΈμ„ μœ μ—°ν•˜κ²Œ κ΅¬μ„±ν•˜κ³  μ‘°μ •ν•  수 있기 λ•Œλ¬Έμ— λ‹€μ–‘ν•œ μ‘μš© 뢄야에 μ ν•©ν•©λ‹ˆλ‹€.
LlamaIndexλŠ” λŒ€κ·œλͺ¨ 데이터셋을 효율적으둜 μΈλ±μ‹±ν•˜κ³ , Dense Retrieval 기법을 톡해 높은 μ •ν™•λ„μ˜ 검색을 μ œκ³΅ν•˜λŠ” 데 쀑점을 λ‘‘λ‹ˆλ‹€. 특히 λŒ€μš©λŸ‰ 데이터 기반의 κ³ μ„±λŠ₯ 검색 및 μžμ—°μ–΄ 생성을 ν•„μš”λ‘œ ν•˜λŠ” μ‘μš© ν”„λ‘œκ·Έλž¨μ— μ ν•©ν•©λ‹ˆλ‹€.

SELF-RAG

SELF-RAGλŠ” RAG μ‹œμŠ€ν…œμ˜ 생성 ν’ˆμ§ˆκ³Ό 사싀성을 κ°œμ„ ν•˜κΈ° μœ„ν•œ ν”„λ ˆμž„μ›Œν¬μž…λ‹ˆλ‹€.

κΈ°μ‘΄ RAG μ‹œμŠ€ν…œμ΄ 정보 검색과 ν…μŠ€νŠΈ μƒμ„±μ˜ 쑰합을 톡해 응닡을 μƒμ„±ν•˜λŠ” 데 쀑점을 λ‘” 반면, SELF-RAGλŠ” 생성 κ³Όμ •μ—μ„œμ˜ 자체 평가와 λ°˜μ„±μ„ λ„μž…ν•˜μ—¬ 더 높은 정확도와 사싀성을 μΆ”κ΅¬ν•©λ‹ˆλ‹€.

 

μ£Όμš” νŠΉμ§•

  • Reflection 토큰 μ‚¬μš©: SELF-RAGλŠ” reflection 토큰을 ν™œμš©ν•˜μ—¬ μƒμ„±λœ λ‚΄μš©μ„ 자체적으둜 λ°˜μ„±ν•˜κ³  ν‰κ°€ν•©λ‹ˆλ‹€. 이 토큰은 λͺ¨λΈμ΄ 응닡을 μƒμ„±ν•˜λŠ” λ™μ•ˆ 슀슀둜 생성 κ²°κ³Όλ₯Ό ν‰κ°€ν•˜κ³ , ν•„μš”ν•˜λ‹€λ©΄ λ‹€μ‹œ κ²€μƒ‰ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.
  • 검색 λΉˆλ„ μ‘°μ •: Reflection 토큰을 톡해 λͺ¨λΈμ€ μ–Έμ œ 좔가적인 검색이 ν•„μš”ν•œμ§€ νŒλ‹¨ν•˜κ³ , 검색 λΉˆλ„λ₯Ό μ‘°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 더 μ •ν™•ν•˜κ³  사싀에 κΈ°λ°˜ν•œ 응닡을 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ‚¬μš©μž μ„ ν˜Έλ„ ν•™μŠ΅: SELF-RAGλŠ” Reflection 과정을 톡해 μ‚¬μš©μž μ„ ν˜Έλ„μ— 맞게 λͺ¨λΈμ˜ 행동을 ν•™μŠ΅ν•©λ‹ˆλ‹€. μ΄λŠ” 생성 결과의 일관성과 ν’ˆμ§ˆμ„ ν–₯μƒμ‹œν‚€λ©°, μ‚¬μš©μžμ—κ²Œ λ”μš± 만쑱슀러운 응닡을 μ œκ³΅ν•  수 있게 ν•©λ‹ˆλ‹€.

Adaptive RAG

Adaptive-RAGλŠ” 쿼리의 λ³΅μž‘λ„μ— 따라 졜적의 검색 및 생성 μ „λž΅μ„ λ™μ μœΌλ‘œ μ„ νƒν•˜λŠ” ν”„λ ˆμž„μ›Œν¬μž…λ‹ˆλ‹€.

λ‹€μ–‘ν•œ λ‚œμ΄λ„μ˜ 쿼리에 λŒ€μ‘ν•˜κΈ° μœ„ν•΄ RAG μ‹œμŠ€ν…œμ˜ νš¨μœ¨μ„±κ³Ό 정확성을 κ· ν˜• 있게 ν–₯μƒμ‹œν‚€λŠ” 것을 λͺ©ν‘œλ‘œ ν•©λ‹ˆλ‹€.

 

μ£Όμš” νŠΉμ§•

  • 쿼리 λ³΅μž‘λ„ 인식: Adaptive-RAGλŠ” μž…λ ₯된 쿼리의 λ³΅μž‘λ„λ₯Ό ν‰κ°€ν•˜κ³ , 그에 따라 검색 및 생성 μ „λž΅μ„ μ μ‘μ μœΌλ‘œ μ„ νƒν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ‹¨μˆœν•œ μΏΌλ¦¬μ—λŠ” λΉ λ₯Έ 검색 μ „λž΅μ„ μ‚¬μš©ν•˜κ³ , λ³΅μž‘ν•œ μΏΌλ¦¬μ—λŠ” 심측적인 검색 및 생성 μ „λž΅μ„ μ μš©ν•©λ‹ˆλ‹€.
  • 동적 μ „λž΅ 선택: 쿼리의 λ³΅μž‘λ„μ— 따라 λ‹€μ–‘ν•œ 검색 및 생성 방법을 λ™μ μœΌλ‘œ μ μš©ν•˜μ—¬ νš¨μœ¨μ„±κ³Ό 정확성을 μ‘°μ ˆν•©λ‹ˆλ‹€. μ΄λŠ” μ‹œμŠ€ν…œμ΄ λ‹¨μˆœν•œ 질문과 λ³΅μž‘ν•œ μ§ˆλ¬Έμ— λͺ¨λ‘ 적절히 λŒ€μ‘ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.
  • νš¨μœ¨μ„± 및 μ •ν™•μ„± κ· ν˜•: Adaptive-RAGλŠ” 쿼리의 λ‚œμ΄λ„μ— 따라 λ¦¬μ†ŒμŠ€ μ‚¬μš©μ„ μ΅œμ ν™”ν•˜κ³ , 검색과 생성을 μ‘°μ •ν•˜μ—¬ 전체적인 응닡 ν’ˆμ§ˆμ„ ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€. 이둜써 더 적은 λ¦¬μ†ŒμŠ€λ‘œλ„ 높은 μ •ν™•λ„μ˜ 응닡을 μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

RAG Example Code

!pip install langchain
!pip install transformers
!pip install sentence-transformers
!pip install faiss-cpu
import torch
from transformers import DPRQuestionEncoderTokenizer, DPRQuestionEncoder, DPRContextEncoderTokenizer, DPRContextEncoder
from sentence_transformers import SentenceTransformer, util
import faiss
import numpy as np
from transformers import GPT2Tokenizer, GPT2LMHeadModel
# κ°„λ‹¨ν•œ λ¬Έμ„œ 데이터 μ€€λΉ„
documents = [
    "Paris is the capital of France.",
    "Berlin is the capital of Germany.",
    "Madrid is the capital of Spain.",
    "Rome is the capital of Italy.",
    "London is the capital of the United Kingdom."
    "Munich is the capital of the Germany football"
]
# λ¬Έμ„œ 인코더와 ν† ν¬λ‚˜μ΄μ € μ€€λΉ„
context_tokenizer = DPRContextEncoderTokenizer.from_pretrained("facebook/dpr-ctx_encoder-single-nq-base")
context_encoder = DPRContextEncoder.from_pretrained("facebook/dpr-ctx_encoder-single-nq-base")
# λ¬Έμ„œλ₯Ό μž„λ² λ”©μœΌλ‘œ λ³€ν™˜
document_embeddings = []
for doc in documents:
    inputs = context_tokenizer(doc, return_tensors="pt")
    outputs = context_encoder(**inputs)
    document_embeddings.append(outputs.pooler_output.detach().numpy())
# 리슀트 ν˜•νƒœμ˜ μž„λ² λ”©μ„ ν•˜λ‚˜μ˜ numpy λ°°μ—΄λ‘œ λ³€ν™˜
document_embeddings = np.vstack(document_embeddings)
# FAISS 인덱슀 생성 및 μž„λ² λ”© μΆ”κ°€
index = faiss.IndexFlatL2(document_embeddings.shape[1])
index.add(document_embeddings)
FAISS (Facebook AI Similarity Search) is a library that allows developers to quickly search for embeddings of multimedia documents that are similar to each other. It solves limitations of traditional query search engines that are optimized for hash-based searches, and provides more scalable similarity search functions.
# 질문 인코더와 ν† ν¬λ‚˜μ΄μ € μ„€μ •
question_tokenizer = DPRQuestionEncoderTokenizer.from_pretrained("facebook/dpr-question_encoder-single-nq-base")
question_encoder = DPRQuestionEncoder.from_pretrained("facebook/dpr-question_encoder-single-nq-base")

# 생성 λͺ¨λΈκ³Ό ν† ν¬λ‚˜μ΄μ € μ„€μ •
generation_tokenizer = GPT2Tokenizer.from_pretrained("gpt2-medium")
generation_model = GPT2LMHeadModel.from_pretrained("gpt2-medium")
print(generation_model)
GPT2LMHeadModel(
  (transformer): GPT2Model(
    (wte): Embedding(50257, 1024)
    (wpe): Embedding(1024, 1024)
    (drop): Dropout(p=0.1, inplace=False)
    (h): ModuleList(
      (0-23): 24 x GPT2Block(
        (ln_1): LayerNorm((1024,), eps=1e-05, elementwise_affine=True)
        (attn): GPT2SdpaAttention(
          (c_attn): Conv1D()
          (c_proj): Conv1D()
          (attn_dropout): Dropout(p=0.1, inplace=False)
          (resid_dropout): Dropout(p=0.1, inplace=False)
        )
        (ln_2): LayerNorm((1024,), eps=1e-05, elementwise_affine=True)
        (mlp): GPT2MLP(
          (c_fc): Conv1D()
          (c_proj): Conv1D()
          (act): NewGELUActivation()
          (dropout): Dropout(p=0.1, inplace=False)
        )
      )
    )
    (ln_f): LayerNorm((1024,), eps=1e-05, elementwise_affine=True)
  )
  (lm_head): Linear(in_features=1024, out_features=50257, bias=False)
)
class RAGModel:
    def __init__(self, question_encoder, context_encoder, generation_model, index, tokenizer):
        # RAG λͺ¨λΈ 클래슀의 μ΄ˆκΈ°ν™” ν•¨μˆ˜
        # question_encoder: μ§ˆλ¬Έμ„ μΈμ½”λ”©ν•˜μ—¬ μž„λ² λ”©μ„ μƒμ„±ν•˜λŠ” λͺ¨λΈ
        # context_encoder: λ¬Έμ„œλ₯Ό μΈμ½”λ”©ν•˜μ—¬ μž„λ² λ”©μ„ μƒμ„±ν•˜λŠ” λͺ¨λΈ
        # generation_model: 질문과 κ²€μƒ‰λœ λ¬Έμ„œλ₯Ό 기반으둜 닡변을 μƒμ„±ν•˜λŠ” λͺ¨λΈ
        # index: λ¬Έμ„œμ˜ μž„λ² λ”©μ„ μ €μž₯ν•˜κ³  κ²€μƒ‰ν•˜λŠ” 데 μ‚¬μš©ν•˜λŠ” 인덱슀 (FAISS와 같은 라이브러리 μ‚¬μš©)
        # tokenizer: ν…μŠ€νŠΈλ₯Ό ν† ν°ν™”ν•˜κ³  μΈμ½”λ”©ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” ν† ν¬λ‚˜μ΄μ €
        self.question_encoder = question_encoder
        self.context_encoder = context_encoder
        self.generation_model = generation_model
        self.index = index
        self.tokenizer = tokenizer

    def retrieve(self, question):
        # 주어진 μ§ˆλ¬Έμ„ 기반으둜 κ°€μž₯ κ΄€λ ¨ μžˆλŠ” λ¬Έμ„œλ₯Ό κ²€μƒ‰ν•˜λŠ” ν•¨μˆ˜
        
        # 1. μ§ˆλ¬Έμ„ ν† ν°ν™”ν•˜κ³  μΈμ½”λ”©ν•˜μ—¬ λͺ¨λΈμ— μž…λ ₯
        question_inputs = question_tokenizer(question, return_tensors="pt")
        
        # 2. 질문 인코더λ₯Ό μ‚¬μš©ν•˜μ—¬ μ§ˆλ¬Έμ„ μž„λ² λ”© λ²‘ν„°λ‘œ λ³€ν™˜
        question_outputs = self.question_encoder(**question_inputs)
        
        # 3. μž„λ² λ”© 결과의 pooler_output을 μ‚¬μš©ν•˜μ—¬ 질문의 벑터 ν‘œν˜„μ„ μ–»μŒ
        question_embedding = question_outputs.pooler_output.detach().numpy()

        # 4. FAISS 인덱슀λ₯Ό μ‚¬μš©ν•˜μ—¬ 질문 벑터와 κ°€μž₯ κ°€κΉŒμš΄ λ¬Έμ„œ 검색
        # D: 거리 λ°°μ—΄, I: 인덱슀 λ°°μ—΄
        # k=1: κ°€μž₯ κ°€κΉŒμš΄ 1개의 λ¬Έμ„œλ₯Ό 검색
        D, I = self.index.search(question_embedding, k=1)
        
        # 5. κ²€μƒ‰λœ λ¬Έμ„œ λ°˜ν™˜ (κ°€μž₯ κ°€κΉŒμš΄ λ¬Έμ„œμ˜ 인덱슀λ₯Ό μ‚¬μš©ν•˜μ—¬ λ¬Έμ„œ λ¦¬μŠ€νŠΈμ—μ„œ λ¬Έμ„œ κ°€μ Έμ˜€κΈ°)
        return documents[I[0][0]]

    def generate(self, question, retrieved_doc):
        # 질문과 κ²€μƒ‰λœ λ¬Έμ„œλ₯Ό 기반으둜 닡변을 μƒμ„±ν•˜λŠ” ν•¨μˆ˜
        
        # 1. 질문과 κ²€μƒ‰λœ λ¬Έμ„œλ₯Ό κ²°ν•©ν•˜μ—¬ λͺ¨λΈμ˜ μž…λ ₯으둜 μ‚¬μš©
        input_text = question + " " + retrieved_doc
        
        # 2. κ²°ν•©λœ ν…μŠ€νŠΈλ₯Ό ν† ν°ν™”ν•˜μ—¬ λͺ¨λΈμ˜ μž…λ ₯으둜 λ³€ν™˜
        inputs = self.tokenizer.encode(input_text, return_tensors="pt")

        # 3. 생성 λͺ¨λΈμ„ μ‚¬μš©ν•˜μ—¬ λ‹΅λ³€ 생성
        # max_length=50: μƒμ„±λœ ν…μŠ€νŠΈμ˜ μ΅œλŒ€ 길이 μ„€μ •
        outputs = self.generation_model.generate(inputs, max_length=50)
        
        # 4. μƒμ„±λœ 닡변을 λ””μ½”λ”©ν•˜μ—¬ ν…μŠ€νŠΈλ‘œ λ³€ν™˜
        return self.tokenizer.decode(outputs[0], skip_special_tokens=True)

    def run(self, question):
        # 주어진 μ§ˆλ¬Έμ— λŒ€ν•΄ RAG λͺ¨λΈμ„ μ‹€ν–‰ν•˜μ—¬ 닡변을 μƒμ„±ν•˜λŠ” ν•¨μˆ˜
        
        # 1. μ§ˆλ¬Έμ„ 기반으둜 κ°€μž₯ κ΄€λ ¨ μžˆλŠ” λ¬Έμ„œ 검색
        retrieved_doc = self.retrieve(question)
        print(f"Retrieved Document: {retrieved_doc}")
        
        # 2. κ²€μƒ‰λœ λ¬Έμ„œμ™€ μ§ˆλ¬Έμ„ 기반으둜 λ‹΅λ³€ 생성
        return self.generate(question, retrieved_doc)

# RAG λͺ¨λΈ μΈμŠ€ν„΄μŠ€ 생성
# question_encoder, context_encoder, generation_model, index, generation_tokenizerλ₯Ό μ‚¬μš©ν•˜μ—¬ RAGModel 클래슀의 μΈμŠ€ν„΄μŠ€ 생성
rag_model = RAGModel(question_encoder, context_encoder, generation_model, index, generation_tokenizer)
# RAG λͺ¨λΈμ„ ν…ŒμŠ€νŠΈν•˜κΈ° μœ„ν•œ ν•¨μˆ˜
def test_rag_model(question):
    # RAG λͺ¨λΈμ„ μ‹€ν–‰ν•˜μ—¬ 주어진 μ§ˆλ¬Έμ— λŒ€ν•œ 닡변을 생성
    answer = rag_model.run(question)
    
    # 질문과 닡변을 좜λ ₯ν•˜μ—¬ κ²°κ³Ό 확인
    print(f"Question: {question}")
    print(f"Answer: {answer}")

# 검색 단계λ₯Ό κ±°μΉ˜μ§€ μ•Šκ³  직접 닡변을 μƒμ„±ν•˜λŠ” ν•¨μˆ˜
def generate_pure_answer(question):
    # 1. 주어진 μ§ˆλ¬Έμ„ ν† ν°ν™”ν•˜μ—¬ λͺ¨λΈ μž…λ ₯으둜 λ³€ν™˜
    inputs = generation_tokenizer.encode(question, return_tensors="pt")
    
    # 2. 생성 λͺ¨λΈμ„ μ‚¬μš©ν•˜μ—¬ μ§ˆλ¬Έμ— λŒ€ν•œ 닡변을 생성
    # max_length=50: μƒμ„±λœ ν…μŠ€νŠΈμ˜ μ΅œλŒ€ 길이 μ„€μ •
    outputs = generation_model.generate(inputs, max_length=50)
    
    # 3. μƒμ„±λœ 닡변을 λ””μ½”λ”©ν•˜μ—¬ ν…μŠ€νŠΈλ‘œ λ³€ν™˜
    return generation_tokenizer.decode(outputs[0], skip_special_tokens=True)
# 예제 질문
question = "What is the capital of the Germant Football?"
test_rag_model(question)
# 순수 생성 λͺ¨λΈ ν…ŒμŠ€νŠΈ
pure_answer = generate_pure_answer(question)
print("Pure Generation Answer:", pure_answer)