μ΄λ² κΈμμ Retrieve Augmented Generation (RAG)μ λ°νμ¬ νλ² μμλ³΄κ² μ΅λλ€.
Retrieve Augmented Generation (RAG)
RAG(Retrieve-Augmented Generation)μ λκ·λͺ¨ μΈμ΄ λͺ¨λΈ(LLM)μ νκ³μ μ 극볡νκ³ λ μ ννκ³ νλΆν μλ΅μ μ 곡νκΈ° μν΄ κ³ μλ μν€ν μ²μ λλ€.
RAGλ νΉμ μ§μμ λν΄ μΈλΆ μ§μ λ² μ΄μ€μμ κ΄λ ¨ μ 보λ₯Ό κ²μν ν, μ΄ μ 보λ₯Ό κΈ°λ°μΌλ‘ ν μ€νΈλ₯Ό μμ±νλ λ°©μμΌλ‘ μλν©λλ€.
νΉν μ λ³΄κ° νλΆν μλ΅μ μμ±νλ λ° μ 리ν©λλ€.
RAG Architecture
RAG(Retrieve Augmented Generation)μ ν¬κ² μΈ κ°μ§ λ¨κ³λ‘ ꡬμ±λ©λλ€.
Retrieve λ¨κ³, Augmented λ¨κ³, κ·Έλ¦¬κ³ Generate λ¨κ³μ λλ€.
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μ μ₯μ
- νλΆνκ³ μ νν μ 보 μ 곡: RAGλ μΈλΆ μ§μ λ² μ΄μ€λ₯Ό νμ©νκΈ° λλ¬Έμ, μ΅μ μ 보λ νΉμ μ£Όμ μ λν κ΄λ²μνκ³ μ νν λ΅λ³μ μ 곡ν μ μμ΅λλ€. μ΄λ λ¨μν λ΄λΆμ μΌλ‘λ§ νμ΅λ μ§μμ νμ©νλ λͺ¨λΈλ³΄λ€ λ μ λ’°μ± μλ μλ΅μ κ°λ₯νκ² ν©λλ€.
- λ€μν λ°μ΄ν° μμ€ ν΅ν©: RAGλ μ¬λ¬ μ’ λ₯μ λ°μ΄ν° μμ€λ₯Ό κ²°ν©νμ¬ μλ΅μ μμ±ν μ μμ΅λλ€. μλ₯Ό λ€μ΄, λ΄μ€ κΈ°μ¬, 곡μ λ°ν μλ£, κ³Όν λ Όλ¬Έ, μΉμ¬μ΄νΈ λ±μ νμ©νμ¬ κ΄λ²μν μ§μμ ν¬ν¨ν μ μμ΅λλ€.
- μ λ³΄κ° νλΆν μλ΅ μμ±: λ¨μ μμ± λͺ¨λΈκ³Ό λ¬λ¦¬, RAGλ κ²μλ μΈλΆ μ 보λ₯Ό νμ©νμ¬ λ μ ννκ³ κ΅¬μ²΄μ μΈ μλ΅μ μμ±ν©λλ€. μ΄λ νΉν μ¬μ©μμκ² μ¬μΈ΅μ μΈ μ 보λ₯Ό μ 곡ν΄μΌ νλ μλΉμ€μμ μ μ©ν©λλ€.
- 보μ λ° νλΌμ΄λ²μ μ΄μ : RAGλ λ΄λΆ LLM λͺ¨λΈκ³Ό μΈλΆ μ§μ λ² μ΄μ€λ₯Ό κ²°ν©νμ¬ κ΅¬μ±ν μ μμ΄, μμ ν μΈλΆ λ°μ΄ν°μλ§ μμ‘΄νμ§ μμλ λ©λλ€. μ΄λ‘μ¨ μ¬μ©μ λ°μ΄ν°μ 보μκ³Ό νλΌμ΄λ²μλ₯Ό λ ν¨κ³Όμ μΌλ‘ 보νΈν μ μμ΅λλ€.
- ν¨μ¨μ μΈ νΉν λλ©μΈ λμ: νΉμ λΆμΌλ λλ©μΈμ νΉνλ μ 보λ₯Ό μ 곡ν λ, RAGλ νμΈνλλ³΄λ€ λ ν¨μ¨μ μΌλ‘ λμν μ μμ΅λλ€. μλ₯Ό λ€μ΄, μλ£, λ²λ₯ , κΈ°μ λ± μ λ¬Έ μ§μμ μꡬνλ μμμμ λμ± μ μ©νκ² νμ©λ μ μμ΅λλ€.
RAGμ λ¨μ
- 볡μ‘ν ꡬ쑰: κ²μκ³Ό μμ±μ κ²°ν©νλ κ³Όμ μ΄ λ³΅μ‘νκΈ° λλ¬Έμ, λͺ¨λΈμ νμ΅νκ³ νλνλ κ³Όμ μ΄ μ΄λ ΅κ³ μκ°μ΄ λ§μ΄ μμλ μ μμ΅λλ€. νΉν μλ² λ© μμ±, λ¬Έμ κ²μ, ν μ€νΈ μμ± λ± λ€μν λ¨κ³λ₯Ό ν¨μ¨μ μΌλ‘ ν΅ν©νλ κ²μ΄ κΉλ€λ‘μ΅λλ€.
- λμ μ°μ° μμ νμ: RAGλ μ¬λ¬ λ¨κ³μ μ°μ°μ μννλ―λ‘, μλ² λ© μμ±, λ¬Έμ κ²μ, ν μ€νΈ μμ± λ± λͺ¨λ κ³Όμ μμ λμ μ°μ° μμμ μꡬν©λλ€. μ΄λ λκ·λͺ¨ λ°μ΄ν°μ μ΄λ μ€μκ° μλ΅μ μ²λ¦¬ν λ μμ€ν λΆλ΄μ κ°μ€μν¬ μ μμ΅λλ€.
- μΈλΆ μ§μ λ² μ΄μ€μ λν μμ‘΄μ±: 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)μ νμ©νμ¬ κ²μ λ° μμ±μ λ 립μ μΈ λͺ¨λλ‘ κ΅¬νν μ μλ ꡬ쑰λ₯Ό μ 곡νλ νλ μμν¬μ λλ€.
μ΄λ₯Ό ν΅ν΄ λ€μν λ°μ΄ν° μμ€μ κ²μ λ°©λ²μ μ μ°νκ² ν΅ν©νκ³ , ν¨μ¨μ μΈ μΈμ΄ μ²λ¦¬ νμ΄νλΌμΈμ ꡬμΆν μ μμ΅λλ€.
μ£Όμ νΉμ§
- λͺ¨λνλ ꡬ쑰: LangChainμ κ²μκ³Ό μμ±μ λ 립μ μΈ λͺ¨λλ‘ λΆλ¦¬νμ¬, κ° κ΅¬μ± μμλ₯Ό λ 립μ μΌλ‘ κ°λ°, ν μ€νΈ, λ°°ν¬ν μ μλ ꡬ쑰λ₯Ό μ 곡ν©λλ€. μ΄λ μμ€ν μ μ μ°μ±κ³Ό νμ₯μ±μ ν¬κ² ν₯μμν΅λλ€.
- λ€μν λ°μ΄ν° μμ€ ν΅ν©: μΈλΆ λ°μ΄ν°λ² μ΄μ€, μΉμ¬μ΄νΈ, λ¬Έμ μ μ₯μ λ± λ€μν λ°μ΄ν° μμ€μ κ²μ λ°©λ²μ μ½κ² ν΅ν©ν μ μλ κΈ°λ₯μ μ 곡ν©λλ€.
- νμ΄νλΌμΈ μ μ°μ±: λ°μ΄ν°λ₯Ό μ²λ¦¬νκ³ λ³ννλ νμ΄νλΌμΈμ μ μ°νκ² κ΅¬μ±ν μ μμ΄, μ¬μ©μμ νΉμ μꡬ μ¬νμ λ§κ² λ°μ΄ν°λ₯Ό μ μ²λ¦¬νκ³ , κ²μ λ° μμ± λ¨κ³λ₯Ό μ‘°μ ν μ μμ΅λλ€.
- ν΅ν© νκ²½ μ 곡: μΈμ΄ λͺ¨λΈμ νμ΅, νκ°, λ°°ν¬λ₯Ό μν λꡬμ κΈ°λ₯μ ν¬ν¨νμ¬, μ 체μ μΈ μν¬νλ‘μ°λ₯Ό ν΅ν©νκ³ κ΄λ¦¬ν μ μλ νκ²½μ μ 곡ν©λλ€.
ꡬ쑰
- λ°μ΄ν° μμ€:
- μΈλΆ λ°μ΄ν°λ² μ΄μ€, μΉμ¬μ΄νΈ, λ¬Έμ μ μ₯μ λ± λ€μν λ°μ΄ν° μμ€μμ μ 보λ₯Ό κ²μνλ μν μ λ΄λΉν©λλ€.
- λ°μ΄ν° μμ€μ μ’ λ₯μ λ°λΌ λ€λ₯Έ κ²μ μ λ΅μ μ μ©ν μ μμ΅λλ€.
- κ²μ λͺ¨λ:
- TF-IDF, BM25 λ±μ κ²μ μκ³ λ¦¬μ¦μ μ¬μ©νμ¬ μ λ ₯ 쿼리μ κ΄λ ¨λ λ¬Έμλ₯Ό κ²μν©λλ€.
- 쿼리λ₯Ό μλ² λ© λ²‘ν°λ‘ λ³ννκ³ , ν΄λΉ 벑ν°λ₯Ό μ¬μ©ν΄ λ°μ΄ν° μμ€μμ κ°μ₯ κ΄λ ¨μ±μ΄ λμ λ¬Έμλ₯Ό μ°Ύμ΅λλ€.
- μ΄ λͺ¨λμ κ²μλ λ¬Έμλ€μ μ μ¬μ±μ κ³μ°νκ³ , μ ν©ν μ 보λ₯Ό μΆμΆνλ λ° μ΄μ μ λ‘λλ€.
- μμ± λͺ¨λ:
- μΈμ΄ λͺ¨λΈ(LLM)μ μ¬μ©νμ¬ κ²μλ λ¬Έμλ₯Ό λ°νμΌλ‘ μμ°μ€λ¬μ΄ ν μ€νΈλ₯Ό μμ±ν©λλ€.
- μ΄ λͺ¨λμ LLMμ λ₯λ ₯μ νμ©νμ¬ μ¬μ©μμ 쿼리μ λν΄ μ ννκ³ νλΆν μλ΅μ μμ±ν©λλ€.
- μλ΅ μμ±μ λ¨μν λ¬Έμ κ²μμ κ²°κ³Όλ₯Ό μ λ¬νλ κ²λΏ μλλΌ, μ¬μ©μμ λ§₯λ½μ λ§κ² λ¬Έμ₯μ μ¬κ΅¬μ±νμ¬ μμ°μ€λ¬μ΄ λν νλ¦μ λ§λλλ€.
- νμ΄νλΌμΈ κ΄λ¦¬:
- μ 체 λ°μ΄ν° μ²λ¦¬ νλ¦μ κ΄λ¦¬νλ κΈ°λ₯μ μ 곡ν©λλ€.
- λ°μ΄ν° μ μ²λ¦¬, κ²μ, μμ±μ κ° λ¨κ³λ₯Ό μ‘°μ νκ³ μ΅μ ννμ¬ μ΅μ’ μλ΅μ μμ±ν©λλ€.
- μ΄ κ΄λ¦¬ λͺ¨λμ μμ μ μμλ₯Ό μ νκ³ , κ° λ¨κ³μ κ²°κ³Όλ₯Ό λ€μ λ¨κ³λ‘ μ λ¬νλ μν μ μνν©λλ€.
LlamaIndex
LlamaIndexλ λκ·λͺ¨ μΈμ΄ λͺ¨λΈμ κΈ°λ°μΌλ‘ ν κ²μ λ° μμ± μμ μ μ§μνλ νλ μμν¬μ λλ€.
λκ·λͺ¨ λ°μ΄ν°μ μ ν¨μ¨μ μΌλ‘ μΈλ±μ±νκ³ , κ³ μ±λ₯ κ²μ κΈ°λ₯μ μ 곡νλ λ° μ€μ μ λκ³ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ λ€μν κ²μ μκ³ λ¦¬μ¦κ³Ό μΈμ΄ λͺ¨λΈμ μ½κ² ν΅ν©ν μ μμΌλ©°, λ¬Έμμ 쿼리μ μλ² λ©μ μμ±νκ³ μ μ¬μ±μ κ³μ°νμ¬ κ΄λ ¨ λ¬Έμλ₯Ό κ²μνλ κΈ°λ₯μ μ§μν©λλ€.
νΉμ§ λ° κΈ°λ₯
- λκ·λͺ¨ λ°μ΄ν° μΈλ±μ±: λκ·λͺ¨ λ°μ΄ν°μ μ ν¨μ¨μ μΌλ‘ μΈλ±μ±νμ¬ λΉ λ₯Έ κ²μμ μ§μν©λλ€. μ΄ κ³Όμ μμ λ°μ΄ν°μ ꡬ쑰μ λ΄μ©μ λΆμνμ¬ ν¨μ¨μ μΈ κ²μμ΄ κ°λ₯νλλ‘ ν©λλ€.
- κ³ μ±λ₯ κ²μ κΈ°λ₯: μ¬μ©μκ° μ λ ₯ν 쿼리λ₯Ό μλ² λ© λ²‘ν°λ‘ λ³ννκ³ , μΈλ±μ±λ λ¬Έμμ μλ² λ©κ³Ό λΉκ΅νμ¬ μ μ¬λλ₯Ό κ³μ°ν¨μΌλ‘μ¨ κ°μ₯ κ΄λ ¨μ± λμ λ¬Έμλ₯Ό κ²μν©λλ€.
- λ€μν κ²μ μκ³ λ¦¬μ¦ λ° μΈμ΄ λͺ¨λΈ ν΅ν©: λ€μν κ²μ μκ³ λ¦¬μ¦κ³Ό μΈμ΄ λͺ¨λΈμ μ½κ² ν΅ν©ν μ μμ΄, μμ© λΆμΌμ λ°λΌ μ΅μ νλ κ²μ λ° μλ΅ μμ±μ΄ κ°λ₯ν©λλ€.
- νμ΄νλΌμΈ κ΄λ¦¬: μΈλ±μ±, κ²μ, μμ± κ³Όμ μ ν΅ν©νμ¬ ν¨μ¨μ μΈ μμ νλ¦μ κ΄λ¦¬ν μ μμ΅λλ€.
ꡬ쑰
- λ°μ΄ν° μΈλ±μ±:
- λκ·λͺ¨ λ°μ΄ν°μ μ μΈλ±μ±νμ¬ λΉ λ₯΄κ³ ν¨μ¨μ μΈ κ²μμ μ§μν©λλ€.
- λ°μ΄ν°μ ꡬ쑰μ λ΄μ©μ λΆμνμ¬ μΈλ±μ€λ₯Ό ꡬμΆν¨μΌλ‘μ¨ κ²μμ μ νμ±κ³Ό μλλ₯Ό λμ λλ€.
- μλ₯Ό λ€μ΄, ν μ€νΈ λ¬Έμ, μΉ νμ΄μ§, λ°μ΄ν°λ² μ΄μ€ λ± λ€μν ννμ λ°μ΄ν°λ₯Ό μΈλ±μ±ν μ μμ΅λλ€.
- 쿼리 μ²λ¦¬ λ° κ²μ:
- μ¬μ©μκ° μ λ ₯ν 쿼리λ₯Ό μλ² λ© λ²‘ν°λ‘ λ³ννκ³ , μΈλ±μ±λ λ¬Έμλ€μ μλ² λ© λ²‘ν°μ λΉκ΅νμ¬ μ μ¬λλ₯Ό κ³μ°ν©λλ€.
- μ μ¬λ κ³μ°μ ν΅ν΄ 쿼리μ κ°μ₯ κ΄λ ¨μ± λμ λ¬Έμλ₯Ό κ²μνκ³ , μ΄λ₯Ό μ¬μ©μμ μ§μμ λν μλ΅ μμ±μ κΈ°λ°μΌλ‘ μ¬μ©ν©λλ€.
- TF-IDF, BM25 λ±μ μ ν΅μ μΈ κ²μ μκ³ λ¦¬μ¦λΏλ§ μλλΌ, μ κ²½λ§ κΈ°λ° μλ² λ©μ νμ©ν κ²μλ μ§μν©λλ€.
- ν
μ€νΈ μμ±:
- κ²μλ λ¬Έμλ₯Ό λ°νμΌλ‘, LLMμ νμ©νμ¬ μμ°μ€λ¬μ΄ μλ΅ ν μ€νΈλ₯Ό μμ±νλ λ° νμν μ λ ₯μ μ€λΉν©λλ€.
- μ΄ λ¨κ³μμλ κ²μλ λ¬Έμμ ν΅μ¬ λ΄μ©μ μΆμΆνκ³ , μ΄λ₯Ό μΈμ΄ λͺ¨λΈμ μ λ¬νμ¬ μ¬μ©μμ μ§μμ λν μλ΅μ μμ±ν©λλ€.
- νμ΄νλΌμΈ κ΄λ¦¬:
- μΈλ±μ±, κ²μ, μμ± λ± λͺ¨λ μμ μ ν΅ν©νμ¬ μ 체μ μΈ μμ νλ¦μ ν¨μ¨μ μΌλ‘ κ΄λ¦¬ν©λλ€.
- νμ΄νλΌμΈμ ν΅ν΄ λ°μ΄ν° μ²λ¦¬μ κ° λ¨κ³λ₯Ό μ‘°μ νκ³ , κ²°κ³Όλ₯Ό μ΅μ ννμ¬ μ¬μ©μμ μꡬμ λΉ λ₯΄κ² λμν μ μμ΅λλ€.
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)