[์ž๋ฃŒ] KT ์‚ฌ๋‚ด ์ง์› ๋Œ€์ƒ RAG ๊ต์•ˆ ๋Œ€๋ฐฉ์ถœ?!

Posted by Euisuk's Dev Log on November 26, 2024

[์ž๋ฃŒ] KT ์‚ฌ๋‚ด ์ง์› ๋Œ€์ƒ RAG ๊ต์•ˆ ๋Œ€๋ฐฉ์ถœ?!

์›๋ณธ ๊ฒŒ์‹œ๊ธ€: https://velog.io/@euisuk-chung/์„œ๊ฐ•๋Œ€-๊ธฐ์ˆ ๊ฒฝ์˜์ „๋ฌธ๋Œ€ํ•™์›-by-KT-DS-๊น€์„ฑ์šฐ-๋‹จ์žฅ๋‹˜

์˜ค๋Š˜๋„ RAG์— ๋Œ€ํ•œ ์ž๋ฃŒ๋ฅผ ์ฐพ์•„๋ณด๋˜ ์ค‘, KT DS์˜ ๊น€์„ฑ์šฐ ๊ธฐ์ˆ ํ˜์‹ ๋‹จ์žฅ๋‹˜๊ป˜์„œ ๊ณต์œ ํ•˜์‹  RAG ๊ด€๋ จ ์ž๋ฃŒ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : LinkedIn - KTDS ๊น€์„ฑ์šฐ ๊ธฐ์ˆ ํ˜์‹ ๋‹จ์žฅ

KT ์‚ฌ๋‚ด ์ง์› RAG ๊ต์•ˆ์ด๋ผ๋Š” ๋ง์— ์–ด๋–ค ๋‚ด์šฉ์ผ์ง€ ๊ถ๊ธˆํ•˜์—ฌ, ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ํ•ด๋‹น ์ž๋ฃŒ๋ฅผ ์ž์„ธํ•˜๊ฒŒ ๊ณต๋ถ€ํ•˜๋ฉฐ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด๋ณด์•˜์œผ๋‹ˆ ํ•จ๊ป˜ ์‚ดํŽด๋ณด์‹œ์ฃ .

์ด๋ฏธ์ง€ ์ถœ์ฒ˜ : https://www.lgcns.com/blog/it-trend/15258/


๋ณธ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…์€ โ€œKT DS์˜ ๊น€์„ฑ์šฐ ๊ธฐ์ˆ ํ˜์‹ ๋‹จ์žฅ๋‹˜๊ป˜์„œ ๊ณต์œ ํ•ด์ฃผ์‹  RAG ๊ด€๋ จ ์ž๋ฃŒ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ž‘์„ฑ๋œ ์ž๋ฃŒ์ž…๋‹ˆ๋‹ค.

  • ๋ณ„๋„์˜ Reference๋ฅผ ๋‹ฌ์ง€ ์•Š์€ ์‚ฌ์ง„ ์ž๋ฃŒ๋Š” ํ•ด๋‹น ๊ฐ•์˜ ์ž๋ฃŒ ๋‚ด์šฉ์„ ๋ฐœ์ทŒํ•œ ์ž๋ฃŒ์ž„์„ ๋ฏธ๋ฆฌ ๋ฐํž™๋‹ˆ๋‹ค.

Chapter 1: Overview of RAG

  1. Discriminative vs. Generative AI

  • Discriminative AI => ํŒ๋ณ„ํ˜• AI
    • ๋ถ„๋ฅ˜(Classification) ๋ฐ ํšŒ๊ท€(Regression) ๋“ฑ ์ „ํ†ต์ ์ธ ๋จธ์‹ ๋Ÿฌ๋‹ ์ž‘์—…์— ์ดˆ์ ์„ ๋งž์ถค.
    • ์ผ๋ฐ˜์ ์œผ๋กœ ๊ณ ์ •๋œ ์Šคํ‚ค๋งˆ ์ž…๋ ฅ. (์ž…์ถœ๋ ฅ์ด ํ•œ์ •์ ์ž„)
    • ํŠน์ง•: ์ง€๋„ ํ•™์Šต(Supervised Learning)
  • Generative AI => ์ƒ์„ฑํ˜• AI
    • ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋กœ ์‚ฌ์ „ ํ•™์Šต๋œ ๋ชจ๋ธ์„ ํ†ตํ•ด ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘” ๊ธฐ์ˆ .
    • ์–ธ์–ด ์ƒ์„ฑ, ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๋“ฑ ๋‹ค์–‘ํ•œ ์ฐฝ์˜์  ์ž‘์—… ๊ฐ€๋Šฅ. (์ž…์ถœ๋ ฅ์ด ์œ ์—ฐํ•จ)
    • ํŠน์ง•: ๋น„์ง€๋„ํ•™์Šต(unsupervised) , ์ž๊ฐ€ํ•™์Šต(self-supervised)

  1. AI Hype Cycle

  • ํ•˜์ดํ”„ ์‚ฌ์ดํด(Hype Cycle)

    • ์‹ ๊ธฐ์ˆ ์˜ ๋Œ€์ค‘์  ์—ด๊ด‘ ๋ฐ ์ฑ„ํƒ ๋‹จ๊ณ„๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๊ฐ€ํŠธ๋„ˆ์˜ ๋ชจ๋ธ.
    • ์ฃผ์š” ๋‹จ๊ณ„:

      1. ๊ธฐ์ˆ  ์ด‰๋ฐœ ๋‹จ๊ณ„: ๊ธฐ์ˆ  ์†Œ๊ฐœ.
      2. ๊ณผ๋„ํ•œ ๊ธฐ๋Œ€์˜ ์ •์ : ๊ณผ์žฅ๋œ ๊ธฐ๋Œ€๊ฐ ํ˜•์„ฑ.
      3. ํ™˜๋ฉธ ๋‹จ๊ณ„: ์‹ค์งˆ์  ํ•œ๊ณ„์— ๋Œ€ํ•œ ์ธ์‹ ์ฆ๊ฐ€.
      4. ๊ณ„๋ชฝ ๋‹จ๊ณ„: ์‹ค์šฉ์  ์‚ฌ์šฉ ์‚ฌ๋ก€ ๋“ฑ์žฅ.
      5. ์ƒ์‚ฐ์„ฑ ๋‹จ๊ณ„: ์„ฑ์ˆ™๋œ ๊ธฐ์ˆ ๋กœ ์ž๋ฆฌ์žก์Œ.
    • ํ˜„์žฌ ์ƒ์„ฑํ˜• AI๋Š” ๊ณผ๋„ํ•œ ๊ธฐ๋Œ€์˜ ์ •์ ์—์„œ ํ™˜๋ฉธ ๋‹จ๊ณ„๋กœ ์ง„์ž… ์ค‘์ž„.

  1. LLM & ํ•œ๊ณ„

  • LLM(Large Language Models)์ด๋ž€?

    • ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์…‹์„ ํ™œ์šฉํ•˜์—ฌ ํ›ˆ๋ จ๋œ ์–ธ์–ด ๋ชจ๋ธ๋กœ, ์ธ๊ฐ„์˜ ์–ธ์–ด๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์ตœ์ ํ™”๋œ ๋ชจ๋ธ.
    • Generative AI ๊ธฐ์ˆ ์˜ ํ•ต์‹ฌ์œผ๋กœ, OpenAI์˜ GPT ์‹œ๋ฆฌ์ฆˆ, Google์˜ BERT, Hugging Face์˜ Transformers ๋“ฑ์ด ๋Œ€ํ‘œ์ .
    • ์–ธ์–ด ์ฒ˜๋ฆฌ(์ž์—ฐ์–ด ์ฒ˜๋ฆฌ, ์Œ์„ฑ ์ธ์‹, ๋ฒˆ์—ญ ๋“ฑ)์™€ ๊ด€๋ จ๋œ ๋‹ค์–‘ํ•œ ์ž‘์—…์— ์ ์šฉ ๊ฐ€๋Šฅ
  • LLM(Large Language Models)์˜ ํŠน์ง•

    • ๋Œ€๊ทœ๋ชจ ํ•™์Šต ๋ฐ์ดํ„ฐ:
      • ์ˆ˜๋ฐฑ์–ต~์ˆ˜์กฐ ๊ฐœ์˜ ํ† ํฐ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐ์ดํ„ฐ๋กœ ํ•™์Šต.
      • ์›น ๋ฐ์ดํ„ฐ, ๋…ผ๋ฌธ, ์†Œ์…œ ๋ฏธ๋””์–ด ๋“ฑ ๊ด‘๋ฒ”์œ„ํ•œ ๋ฐ์ดํ„ฐ ์ถœ์ฒ˜ ํ™œ์šฉ.
    • Generative AI์˜ ํ•ต์‹ฌ:
      • ์ƒˆ๋กœ์šด ํ…์ŠคํŠธ ์ƒ์„ฑ, ์งˆ๋ฌธ ์‘๋‹ต(QA), ์š”์•ฝ, ๋ฒˆ์—ญ ๋“ฑ ์–ธ์–ด ์ƒ์„ฑ ์ž‘์—… ์ˆ˜ํ–‰.
      • ์ฐฝ์˜์ ์ด๊ณ  ์œ ์—ฐํ•œ ์‘๋‹ต ๊ฐ€๋Šฅ.
    • ์ œ๋กœ์ƒท(Zero-shot) ์ถ”๋ก  ๊ฐ€๋Šฅ:
      • ์ถ”๊ฐ€ ํ•™์Šต ์—†์ด๋„, ์‚ฌ์ „ ํ•™์Šต๋œ ์ง€์‹์„ ํ™œ์šฉํ•ด ์ƒˆ๋กœ์šด ์ž‘์—…์„ ์ˆ˜ํ–‰.
      • ํ”„๋กฌํ”„ํŠธ๋งŒ์œผ๋กœ๋„ ํŠน์ • ๋„๋ฉ”์ธ์—์„œ ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ.
    • ๋‹ค์–‘ํ•œ ์ž‘์—…์—์„œ์˜ ์ ์šฉ์„ฑ:
      • ํ…์ŠคํŠธ ๋ถ„๋ฅ˜, ๊ฐ์ • ๋ถ„์„, ๋Œ€ํ™”ํ˜• AI, ์ฝ”๋“œ ์ƒ์„ฑ, ์˜๋ฃŒ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋“ฑ ๋‹ค์–‘ํ•œ ๋„๋ฉ”์ธ์—์„œ ํ™œ์šฉ.
    • ๊ธฐ์ˆ  ๋ฐœ์ „์˜ ์ค‘์‹ฌ:
      • ํŠธ๋žœ์Šคํฌ๋จธ(Transformer) ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•œ ํ•™์Šต.
      • GPU/TPU ๋“ฑ์˜ ํ•˜๋“œ์›จ์–ด์™€ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ ๊ธฐ์ˆ ์˜ ๋ฐœ์ „์œผ๋กœ ํ›ˆ๋ จ ํšจ์œจ ํ–ฅ์ƒ.

  • LLM(Large Language Models)์˜ ํ•œ๊ณ„
    • ๋„๋ฉ”์ธ ํŠนํ™” ๋Šฅ๋ ฅ ๋ถ€์กฑ:
      • ํ•™์Šต ๋ฐ์ดํ„ฐ๊ฐ€ ์ผ๋ฐ˜์ ์ธ ์ •๋ณด์— ์ดˆ์ ์ด ๋งž์ถฐ์ ธ ์žˆ์Œ.
      • ํŠน์ • ์‚ฐ์—…(์˜๋ฃŒ, ๋ฒ•๋ฅ  ๋“ฑ)์ด๋‚˜ ์ตœ์‹  ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ดํ•ด ๋ถ€์กฑ.
    • ์ •๋ณด์˜ ์ตœ์‹ ์„ฑ ๋ถ€์กฑ:
      • ํ•™์Šต ์‹œ์  ์ดํ›„์˜ ์ƒˆ๋กœ์šด ์ง€์‹ ๋ฐ˜์˜ ์–ด๋ ค์›€.
      • ์ •์  ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜์œผ๋กœ ํ›ˆ๋ จ๋˜๋ฏ€๋กœ ์‹ค์‹œ๊ฐ„ ์ •๋ณด์™€๋Š” ๊ฒฉ์ฐจ ๋ฐœ์ƒ.
    • ํ™˜๊ฐ(Hallucination):
      • ๋ชจ๋ธ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์‚ฌ์‹ค์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ์ •๋ณด๋ฅผ ์‹ ๋ขฐ๋„ ์žˆ๊ฒŒ ์ œ๊ณต.
      • ์ƒ์„ฑ ๊ฒฐ๊ณผ๊ฐ€ ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Œ.
    • ์ถ”๋ก  ๋Šฅ๋ ฅ ๋ถ€์กฑ:
      • LLM์€ ์ถ”๋ก ์˜ ๊นŠ์ด๊ฐ€ ๋ถ€์กฑํ•˜์—ฌ ๋…ผ๋ฆฌ์ ์ด๊ฑฐ๋‚˜ ๋ณต์žกํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ํ•œ๊ณ„๊ฐ€ ์žˆ์Œ.
      • ์ˆ˜ํ•™์  ๋ฌธ์ œ ํ’€์ด๋‚˜ ๋ณต์žกํ•œ ๋…ผ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฅด๋Š” ์งˆ๋ฌธ์— ๋Œ€ํ•ด ์ •ํ™•ํžˆ ๋‹ตํ•˜์ง€ ๋ชปํ•  ๋•Œ๊ฐ€ ๋งŽ์Œ.
      • LLM์€ ๋…ผ๋ฆฌ์  ์ฒด๊ณ„๋ณด๋‹ค๋Š” ํŒจํ„ด ์ธ์‹์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ.
    • ์ง€์‹ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”(parameterizing knowledge) ํšจ์œจ์„ฑ์ด ๋‚ฎ์Œ:
      • LLM์€ ๋ชจ๋“  ์ง€์‹์„ ๋ชจ๋ธ์˜ ๊ฐ€์ค‘์น˜(parameter)์— ์••์ถ• ์ €์žฅํ•จ.
      • ์ด๋Š” ์ง€์‹์„ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜ ํ™•์žฅํ•˜๋Š” ๋ฐ ๋น„ํšจ์œจ์ ์ž„(์–ด๋ ค์›€)

  1. LLM ํ•œ๊ณ„ ๊ทน๋ณต

LLM ํ•œ๊ณ„ ๊ทน๋ณต ์ „๋žต์—์„œ ๋‹ค๋ฃจ๋Š” ์ฃผ์š” ์š”์†Œ๋“ค์€ ๊ฐ๊ฐ ์žฅ๋‹จ์ ์ด ์žˆ์œผ๋ฉฐ, ํŠน์ • ์ƒํ™ฉ์— ์ ํ•ฉํ•˜๊ฒŒ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.1 Prompt Engineering

  • ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง

    • ์ •์˜: ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง์€ LLM์˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ž…๋ ฅ ํ…์ŠคํŠธ๋ฅผ ๊ตฌ์กฐํ™”ํ•˜๊ฑฐ๋‚˜ ์žฌ๊ตฌ์„ฑํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์†Œํ”„ํŠธ์›จ์–ด์  ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ, ๋ชจ๋ธ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด์„œ๋„ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
    • ์˜ˆ์‹œ: Standard Prompting(๊ธฐ๋ณธ ์งˆ์˜)์™€ Chain-of-Thought Prompting(์‚ฌ๊ณ ์˜ ํ๋ฆ„)์„ ๋น„๊ตํ•ด๋ณด๋ฉด, ํ›„์ž๋Š” ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ๋‹จ๊ณ„๋ณ„๋กœ ํ•ด๊ฒฐํ•˜๋„๋ก ์œ ๋„ํ•˜์—ฌ ์ •ํ™•ํ•œ ๋‹ต๋ณ€์„ ๋„์ถœํ•ฉ๋‹ˆ๋‹ค.
    • ํ•œ๊ณ„: ๋„๋ฉ”์ธ ์ง€์‹์ด๋‚˜ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ํ•œ๊ณ„๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ž˜ ์„ค๊ณ„๋œ ํ”„๋กฌํ”„ํŠธ ์—†์ด ๊ฒฐ๊ณผ๊ฐ€ ์ผ๊ด€์ ์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.2 RAG (Retrieval-Augmented Generation)

  • RAG ๊ฐœ๋…

    • ์ •์˜: RAG๋Š” ์™ธ๋ถ€ ์ง€์‹๋ฒ ์ด์Šค(Vector Database)์™€ LLM์„ ๊ฒฐํ•ฉํ•˜์—ฌ ๋” ๊ฐ•๋ ฅํ•œ ๋‹ต๋ณ€์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰๋œ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‘๋‹ต์„ ์ƒ์„ฑํ•จ์œผ๋กœ์จ ์ตœ์‹  ๋ฐ์ดํ„ฐ ๋ฐ˜์˜์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, LLM์ด ์ž์ฒด์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ์ง€์‹์˜ ๊ณต๋ฐฑ์„ ๋ฉ”์›๋‹ˆ๋‹ค.
    • ์žฅ์ :

      • ์ •๋ณด ์—…๋ฐ์ดํŠธ๊ฐ€ ์‰ฝ์Šต๋‹ˆ๋‹ค.
      • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•จ์œผ๋กœ์จ ์ฆ‰๊ฐ์ ์ธ ์ง€์‹ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
      • ๋‹ค์–‘ํ•œ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ(์˜ˆ: ๋ฌธ์„œ, PDF, ๋ฐ์ดํ„ฐ์…‹) ํ™œ์šฉ์— ๊ฐ•์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋‹จ์ :

      • ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ์— ๋”ฐ๋ผ ์ตœ์ข… ๊ฒฐ๊ณผ๊ฐ€ ์ขŒ์šฐ๋ฉ๋‹ˆ๋‹ค.
      • ๊ฒ€์ƒ‰ ํ’ˆ์งˆ์ด ๋‚ฎ์„ ๊ฒฝ์šฐ, ์ƒ์„ฑ๋œ ์‘๋‹ต์˜ ํ’ˆ์งˆ๋„ ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • ๊ฒ€์ƒ‰๊ณผ ์ƒ์„ฑ ๋‹จ๊ณ„๋ฅผ ๊ฒฐํ•ฉํ•˜๋‹ค ๋ณด๋‹ˆ ์‹œ๊ฐ„ ์ง€์—ฐ(latency)์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

4.3 Fine-Tuning

  • Fine-Tuning

    • ์ •์˜: Fine-Tuning(๋ฏธ์„ธ ์กฐ์ •)์€ ์‚ฌ์ „ ํ•™์Šต๋œ ๋Œ€๊ทœ๋ชจ ์–ธ์–ด ๋ชจ๋ธ(LLM)์„ ํŠน์ • ๋„๋ฉ”์ธ์ด๋‚˜ ์ž‘์—…์— ๋งž๊ฒŒ ๋‹ค์‹œ ํ•™์Šต์‹œํ‚ค๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

      • ์ด๋ฅผ ํ†ตํ•ด ๋ชจ๋ธ์˜ ๊ฐ€์ค‘์น˜(Weights)๋ฅผ ์กฐ์ •ํ•˜์—ฌ, ์‚ฌ์ „ ํ•™์Šต๋œ ์ผ๋ฐ˜์ ์ธ ์–ธ์–ด ์ดํ•ด ๋Šฅ๋ ฅ์„ ํŠน์ •ํ•œ ์šฉ๋„์— ๋งž๊ฒŒ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ์‹œ: ์˜๋ฃŒ ๋ถ„์•ผ์—์„œ ํŠนํ™”๋œ ์ง„๋‹จ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Fine-Tuning์„ ์ง„ํ–‰ํ•˜๋ฉด, ๋ชจ๋ธ์ด ๋” ์ „๋ฌธ์ ์ด๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์˜๋ฃŒ ๊ด€๋ จ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์žฅ์ :

      • ๋„๋ฉ”์ธ ์ „๋ฌธ์„ฑ ๊ทน๋Œ€ํ™”: Fine-Tuning์„ ํ†ตํ•ด ํŠน์ • ๋„๋ฉ”์ธ(์˜ˆ: ๋ฒ•๋ฅ , ์˜๋ฃŒ, ๊ธˆ์œต ๋“ฑ)์— ๋งž๋Š” ์‘๋‹ต์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.๋„๋ฉ”์ธ ์ „๋ฌธ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ตœ์ ํ™”: Fine-Tuning์€ ํŠน์ • ์ž‘์—…(์˜ˆ: ๊ฐ์ • ๋ถ„์„, ์š”์•ฝ ์ƒ์„ฑ, ๊ณ ๊ฐ ์ง€์›)์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋กœ ๋ชจ๋ธ์„ ํ•™์Šต์‹œ์ผœ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.
    • ๋‹จ์ :

      • ๋†’์€ ํ•™์Šต ๋น„์šฉ: Fine-Tuning์€ ๋ชจ๋ธ ์ „์ฒด์˜ ๊ฐ€์ค‘์น˜๋ฅผ ํ•™์Šต์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์—, GPU/TPU์™€ ๊ฐ™์€ ๋Œ€๊ทœ๋ชจ ๊ณ„์‚ฐ ์ž์›์ด ํ•„์š”ํ•˜๋ฉฐ, ํ•™์Šต ์‹œ๊ฐ„๋„ ๋งŽ์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค.
      • ์œ ์—ฐ์„ฑ ๋ถ€์กฑ: Fine-Tuning๋œ ๋ชจ๋ธ์€ ํŠน์ • ๋ฐ์ดํ„ฐ๋‚˜ ๋„๋ฉ”์ธ์— ์ง€๋‚˜์น˜๊ฒŒ ์ตœ์ ํ™”๋˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์–ด, ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋‚˜ ๋น ๋ฅด๊ฒŒ ๋ณ€ํ•˜๋Š” ํ™˜๊ฒฝ(์˜ˆ: ์‹ค์‹œ๊ฐ„ ๋‰ด์Šค)์— ์ ์‘ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
      • ๊ณผ์ ํ•ฉ ์œ„ํ—˜: ํ•™์Šต ๋ฐ์ดํ„ฐ์— ์ง€๋‚˜์น˜๊ฒŒ ์˜์กดํ•  ๊ฒฝ์šฐ, Fine-Tuning๋œ ๋ชจ๋ธ์ด ์ผ๋ฐ˜ํ™” ๋Šฅ๋ ฅ์„ ์žƒ์–ด ๊ณผ์ ํ•ฉ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’Œ RAG vs Fine-Tuning

๋น„๊ต ํ•ญ๋ชฉ RAG Fine-Tuning
ํŠน์ง• ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ(์˜ˆ: ๋ฌธ์„œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ LLM์ด ํ™œ์šฉํ•˜๋„๋ก ์„ค๊ณ„. ๋ชจ๋ธ ์ž์ฒด๋ฅผ ํŠน์ • ์ž‘์—…์— ๋งž๊ฒŒ ์กฐ์ •ํ•˜์—ฌ ๋„๋ฉ”์ธ์— ํŠนํ™”๋œ ์„ฑ๋Šฅ ์ œ๊ณต.
๋น„์šฉ ๋น„๊ต์  ๋‚ฎ์Œ. ๊ฒ€์ƒ‰ ์ธํ”„๋ผ ๊ตฌ์ถ•์— ๋”ฐ๋ผ ์ดˆ๊ธฐ ๋น„์šฉ์€ ๋ฐœ์ƒํ•˜๋‚˜, ๋ชจ๋ธ ์žฌํ•™์Šต ๋น„์šฉ ์—†์Œ. ๋ฐ์ดํ„ฐ ์ค€๋น„ ๋ฐ ๋ชจ๋ธ ์žฌํ•™์Šต์— ์ƒ๋‹นํ•œ ๋น„์šฉ๊ณผ ์‹œ๊ฐ„์ด ์†Œ์š”๋จ.
์ ์šฉ ๊ฐ€๋Šฅ์„ฑ ์ž์ฃผ ์—…๋ฐ์ดํŠธ๋˜๋Š” ๋™์  ๋ฐ์ดํ„ฐ๋‚˜ ์‹ค์‹œ๊ฐ„ ์ •๋ณด์— ์ ํ•ฉ. ์ƒ๋Œ€์ ์œผ๋กœ ์ •์ ์ด๊ณ  ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ ํ™˜๊ฒฝ์—์„œ ์ ํ•ฉ.
๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—…๋ฐ์ดํŠธ๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์ง€์‹ ํ™•์žฅ ๊ฐ€๋Šฅ. ๋ฐ์ดํ„ฐ์…‹ ์ƒ์„ฑ ๋ฐ ๋ ˆ์ด๋ธ”๋ง์ด ํ•„์š”ํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ ์‹œ ์žฌํ•™์Šต ํ•„์š”.
๋ชจ๋ธ ์ˆ˜์ • ํ•„์š”์„ฑ ๋ชจ๋ธ ๊ฐ€์ค‘์น˜๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์Œ. ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ†ตํ•œ ์ง€์‹ ํ™•์žฅ์— ์˜์กด. ๋ชจ๋ธ ๊ฐ€์ค‘์น˜๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜์—ฌ ํŠน์ • ์ž‘์—…์ด๋‚˜ ๋„๋ฉ”์ธ์— ์ตœ์ ํ™”๋œ ๋ชจ๋ธ ์ƒ์„ฑ.
์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ฒ€์ƒ‰ ๋‹จ๊ณ„์˜ ํ’ˆ์งˆ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง. ๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ ๊ฐœ์„ ์œผ๋กœ ์„ฑ๋Šฅ ํ–ฅ์ƒ ๊ฐ€๋Šฅ. ๋ชจ๋ธ ์„ฑ๋Šฅ์€ ๋ฐ์ดํ„ฐ ํ’ˆ์งˆ๊ณผ ํ•™์Šต ์„ค์ •์— ๋”ฐ๋ผ ๊ฒฐ์ •๋˜๋ฉฐ, ๋„๋ฉ”์ธ ํŠนํ™”๋œ ์šฐ์ˆ˜ํ•œ ์„ฑ๋Šฅ ์ œ๊ณต.
์ง€์—ฐ ์‹œ๊ฐ„ ๊ฒ€์ƒ‰ ๋ฐ ์ƒ์„ฑ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ์•ผ ํ•˜๋ฏ€๋กœ ์‘๋‹ต ์‹œ๊ฐ„์ด ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ์Œ. ์‚ฌ์ „ ํ•™์Šต๋œ ๋ชจ๋ธ๋กœ ๋ฐ”๋กœ ์‘๋‹ต ๊ฐ€๋Šฅํ•˜์—ฌ ์‘๋‹ต ์†๋„๊ฐ€ ๋น ๋ฆ„.
์œ ์ง€ ๊ด€๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—…๋ฐ์ดํŠธ๋งŒ์œผ๋กœ ์œ ์ง€ ๋ณด์ˆ˜ ๊ฐ€๋Šฅ. ๋ฐ์ดํ„ฐ์…‹์˜ ์—…๋ฐ์ดํŠธ ๋ฐ ๋ชจ๋ธ ์žฌํ•™์Šต์ด ํ•„์š”ํ•˜์—ฌ ์œ ์ง€ ๊ด€๋ฆฌ ๋น„์šฉ์ด ๋†’์Œ.
์œค๋ฆฌ์  ๊ณ ๋ ค์‚ฌํ•ญ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ํ™œ์šฉ์œผ๋กœ ์ธํ•ด ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ ๋ฐ ๋ฐ์ดํ„ฐ ์†Œ์Šค ์‹ ๋ขฐ์„ฑ์ด ์ค‘์š”. ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ ํฌํ•จ ์‹œ, ๋ชจ๋ธ์ด ์ด๋ฅผ ํ•™์Šตํ•˜๋ฉด์„œ ๊ฐœ์ธ์ •๋ณด ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•  ๊ฐ€๋Šฅ์„ฑ ์กด์žฌ.
ํ™˜๊ฐ(hallucination) ๊ฒ€์ƒ‰๋œ ์ •๋ณด์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ™˜๊ฐ ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ์Œ. ํŠน์ • ๋„๋ฉ”์ธ์—์„œ ํ•™์Šต๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, ๋ถ€์ •ํ™•ํ•˜๊ฑฐ๋‚˜ ํ™˜๊ฐ๋œ ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•  ๊ฐ€๋Šฅ์„ฑ ์กด์žฌ.
๋„๋ฉ”์ธ ์ ํ•ฉ์„ฑ ๋‹ค์ค‘ ๋„๋ฉ”์ธ ๋˜๋Š” ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ํ™˜๊ฒฝ์— ์ ํ•ฉ. ํŠน์ • ๋„๋ฉ”์ธ์— ์ตœ์ ํ™”๋œ ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ๋†’์€ ์ „๋ฌธ์„ฑ ์ œ๊ณต.
๊ตฌํ˜„ ๋‚œ์ด๋„ ๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ๊ณผ์˜ ํ†ตํ•ฉ์ด ์š”๊ตฌ๋˜๋ฏ€๋กœ ์ดˆ๊ธฐ ๊ตฌ์ถ•์ด ๋‹ค์†Œ ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Œ. ๋ชจ๋ธ ํ•™์Šต ๋ฐ ๋ฐ์ดํ„ฐ์…‹ ์ค€๋น„ ๊ณผ์ •์ด ๋ณต์žกํ•˜๋ฉฐ, ๊ณ„์‚ฐ ๋ฆฌ์†Œ์Šค ์š”๊ตฌ๋Ÿ‰์ด ๋†’์Œ.
ํˆฌ๋ช…์„ฑ(Explainability) ๊ฒ€์ƒ‰๋œ ๋ฐ์ดํ„ฐ์™€ ๋‹ต๋ณ€์„ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ๊ฒฐ๊ณผ์˜ ์ถ”์  ๋ฐ ํ•ด์„์ด ์šฉ์ด. ๋ชจ๋ธ์ด ๋‚ด๋ฆฐ ๊ฒฐ๋ก ์„ ์„ค๋ช…ํ•˜๊ธฐ ์–ด๋ ต๊ณ , ๋ธ”๋ž™๋ฐ•์Šค ํŠน์„ฑ์„ ๊ฐ€์ง.
ํ™œ์šฉ ์‚ฌ๋ก€ FAQ ์‹œ์Šคํ…œ, ์ตœ์‹  ๋‰ด์Šค ์‘๋‹ต, ๊ณ ๊ฐ ์ง€์› ๋“ฑ ์‹ค์‹œ๊ฐ„ ์ •๋ณด ์ œ๊ณต ์„œ๋น„์Šค์— ์ ํ•ฉ. ์˜๋ฃŒ, ๋ฒ•๋ฅ , ๊ณผํ•™ ์—ฐ๊ตฌ ๋“ฑ ๊ณ ๋„๋กœ ํŠนํ™”๋œ ์ „๋ฌธ ๋ถ„์•ผ์— ์ ํ•ฉ.

4.4 Fine-Tuning - PEFT (Parameter-Efficient Fine-Tuning)

ํšจ์œจ์ ์ธ Fine-Tuning์˜ ๋Œ€์•ˆ

  • PEFT ๊ฐœ๋…

    • ์ •์˜: PEFT(Parameter-Efficient Fine-Tuning)๋Š” ๊ธฐ์กด Fine-Tuning์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ์ œ์•ˆ๋œ ๋ฐฉ๋ฒ•์œผ๋กœ, ๋ชจ๋ธ ์ „์ฒด๋ฅผ ์กฐ์ •ํ•˜์ง€ ์•Š๊ณ  ์ผ๋ถ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋งŒ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ํ•™์Šตํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.
      • ๊ธฐ์กด Fine-Tuning๊ณผ๋Š” ๋‹ฌ๋ฆฌ, ๋ชจ๋ธ์˜ ๊ธฐ์กด ๊ฐ€์ค‘์น˜๋ฅผ ๋Œ€๋ถ€๋ถ„ ๊ณ ์ •ํ•œ ์ƒํƒœ์—์„œ ์ถ”๊ฐ€์ ์ธ ํ•™์Šต ๊ฐ€๋Šฅํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ(๋ชจ๋“ˆ)๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ํ•™์Šตํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ์—ฐ์‚ฐ๋Ÿ‰์„ ์ค„์ด๊ณ , ํšจ์œจ์ ์ธ ํ•™์Šต์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„๋œ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.
      • ์ค‘์š”ํ•œ ์ ์€, ๋‹จ์ˆœํžˆ ํŠน์ • ๋ ˆ์ด์–ด๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜ ๋™๊ฒฐ(Freeze)ํ•˜๋Š” ๊ฒƒ์— ๊ทธ์น˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ƒˆ๋กœ์šด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ๋„์ž…ํ•˜์—ฌ ํ•™์Šต์„ ์ง„ํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด Fine-Tuning์˜ ๊ณ ๋น„์šฉ๊ณผ ๋†’์€ ์ž์› ์š”๊ตฌ๋ฅผ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • PEFT ํŠน์ง• : PEFT์˜ ์ฃผ์š” ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

    • ๊ธฐ์กด ๋ชจ๋ธ ์œ ์ง€: ์‚ฌ์ „ ํ•™์Šต๋œ ๋ชจ๋ธ์˜ ๋Œ€๋ถ€๋ถ„์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๊ณ ์ •๋œ ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
    • ์ƒˆ๋กœ์šด ํŒŒ๋ผ๋ฏธํ„ฐ ์ถ”๊ฐ€: ๋ชจ๋ธ์— ์ ์€ ์ˆ˜์˜ ์ƒˆ๋กœ์šด ํ•™์Šต ๊ฐ€๋Šฅํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    • ํšจ์œจ์ ์ธ ํ•™์Šต: ์ถ”๊ฐ€๋œ ํŒŒ๋ผ๋ฏธํ„ฐ๋งŒ ํ•™์Šตํ•˜์—ฌ ๊ณ„์‚ฐ ๋น„์šฉ๊ณผ ์ €์žฅ ๊ณต๊ฐ„์„ ํฌ๊ฒŒ ์ค„์ž…๋‹ˆ๋‹ค.
    • ์„ฑ๋Šฅ ์œ ์ง€: ์ „์ฒด ๋ฏธ์„ธ ์กฐ์ •๊ณผ ๋น„์Šทํ•œ ์„ฑ๋Šฅ์„ ๋‹ฌ์„ฑํ•˜๋ฉด์„œ๋„ ์ž์› ์‚ฌ์šฉ์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.
    • ๋‹ค์–‘ํ•œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•: PEFT๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค:

      • LoRA (Low-Rank Adaptation):

        • ๊ธฐ์กด ๋ชจ๋ธ ๊ฐ€์ค‘์น˜(์˜ˆ: ํŠธ๋žœ์Šคํฌ๋จธ ๋ ˆ์ด์–ด์˜ Query ๋ฐ Value ํ–‰๋ ฌ)๋ฅผ ์ €๋žญํฌ ํ–‰๋ ฌ๋กœ ๋ถ„ํ•ดํ•˜์—ฌ ํ•™์Šต ๊ฐ€๋Šฅํ•œ ์ž‘์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€.
        • ์ฃผ์š” ๊ฐ€์ค‘์น˜๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ , ์ €๋žญํฌ ํ–‰๋ ฌ๋งŒ ํ•™์Šต๋จ.
        • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด๋ฉด์„œ Fine-Tuning ์„ฑ๋Šฅ์— ๊ทผ์ ‘ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœ.
        • ๊ธฐ์กด์˜ ๊ฐ€์ค‘์น˜ WWW๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘” ์ฑ„, Wโ€ฒ=W+Aโ‹…BWโ€™ = W + A \cdot BWโ€ฒ=W+Aโ‹…B ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.
          • ์—ฌ๊ธฐ์„œ:
            • WWW: ๊ณ ์ •๋œ ๊ธฐ์กด ๋ชจ๋ธ์˜ ๊ฐ€์ค‘์น˜
            • A,BA, BA,B: ํ•™์Šต ๊ฐ€๋Šฅํ•œ ์ž‘์€ ์ €๋žญํฌ ํ–‰๋ ฌ
      • Adapter:

        • ํŠธ๋žœ์Šคํฌ๋จธ ์•„ํ‚คํ…์ฒ˜์˜ ๋ ˆ์ด์–ด ์‚ฌ์ด์— ์ž‘์€ ์–ด๋Œ‘ํ„ฐ ๋ชจ๋“ˆ์„ ์ถ”๊ฐ€.
        • ์–ด๋Œ‘ํ„ฐ๋Š” ์ฃผ๋กœ ์ถ”๊ฐ€์ ์ธ Feedforward Layer ๋˜๋Š” Bottleneck Layer๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.
          • ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ธฐ์กด ๋ ˆ์ด์–ด์˜ ์ถœ๋ ฅ hhh์— ๋Œ€ํ•ด:
            • hโ€ฒ=h+g(Wdownโ‹…Wupโ‹…h)hโ€™ = h + g(W_{down} \cdot W_{up} \cdot h)hโ€ฒ=h+g(Wdownโ€‹โ‹…Wupโ€‹โ‹…h)
            • WdownW_{down}Wdownโ€‹๊ณผ WupW_{up}Wupโ€‹์€ ํ•™์Šต ๊ฐ€๋Šฅํ•œ ์ž‘์€ ๊ฐ€์ค‘์น˜ ํ–‰๋ ฌ.
        • ๊ธฐ์กด ๋ชจ๋ธ์˜ ๊ตฌ์กฐ๋ฅผ ํฌ๊ฒŒ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ํŠน์ • ์ž‘์—…์— ํ•„์š”ํ•œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ ํ•™์Šต.
        • ์ผ๋ฐ˜์ ์œผ๋กœ ํ•™์Šต ๊ฐ€๋Šฅํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜๊ฐ€ ๋งค์šฐ ์ ์Œ.
      • Prefix Tuning:

        • ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ์•ž์— ํ•™์Šต ๊ฐ€๋Šฅํ•œ ํ”„๋ฆฌํ”ฝ์Šค ํ…์„œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ชจ๋ธ์ด ์ƒˆ๋กœ์šด ์ •๋ณด๋ฅผ ํ•™์Šตํ•˜๋„๋ก ์œ ๋„.
        • ํ”„๋ฆฌํ”ฝ์Šค ํ…์„œ๋Š” ์ž…๋ ฅ๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ํ•™์Šต๋˜๋ฉฐ, ํŠธ๋žœ์Šคํฌ๋จธ์˜ ๊ฐ ๋ ˆ์ด์–ด์˜ ์–ดํ…์…˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค.
          • ์˜ˆ๋ฅผ ๋“ค์–ด, ์ž…๋ ฅ XXX์— ๋Œ€ํ•ด, ์ƒˆ๋กœ์šด ์ž…๋ ฅ Xโ€ฒXโ€™Xโ€ฒ๋Š”:
            • Xโ€ฒ=[P;X]Xโ€™ = [P; X]Xโ€ฒ=[P;X]
            • PPP: ํ•™์Šต ๊ฐ€๋Šฅํ•œ ํ”„๋ฆฌํ”ฝ์Šค ํ…์„œ.
        • ๊ธฐ์กด ๊ฐ€์ค‘์น˜๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉฐ, ํ”„๋ฆฌํ”ฝ์Šค ํ…์„œ๋งŒ ํ•™์Šต.
    • ์žฅ์ :

      • Fine-Tuning ๋Œ€๋น„ ์ ์€ ๊ณ„์‚ฐ ์ž์›์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋” ์ ์€ ๋ฐ์ดํ„ฐ๋กœ๋„ ํ•™์Šต์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
      • ๋Œ€๊ทœ๋ชจ ๋ชจ๋ธ์— ์ ์šฉํ•  ๋•Œ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.
    • ๋‹จ์ :

      • ํŠน์ • ํŒŒ๋ผ๋ฏธํ„ฐ๋งŒ ํ•™์Šตํ•˜๋‹ค ๋ณด๋‹ˆ, ๋ณต์žกํ•œ ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ํ•™์Šต ์„ฑ๋Šฅ์ด ์ œํ•œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ’Œ Traditional Fine-Tuning vs. Parameter-Efficient Fine-Tuning

  • PEFT(Parameter-Efficient Fine-Tuning)๋Š” ์ „ํ†ต์ ์ธ Fine-Tuning๊ณผ ๋น„๊ตํ•ด ํšจ์œจ์„ฑ์„ ๊ฐ•์กฐํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ, ๋Œ€๊ทœ๋ชจ ๋ชจ๋ธ์„ ํ•™์Šต์‹œํ‚ค๋Š” ๋ฐ ์žˆ์–ด โ€œ๋ณต์žก์„ฑ๊ณผ ๋น„์šฉโ€ ๊ทธ๋ฆฌ๊ณ  โ€œ์„ฑ๋Šฅโ€ ์ธก๋ฉด์—์„œ LLM ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋น„๊ตํ•˜๋Š” ์ง€ํ‘œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
ํ•ญ๋ชฉ Fine-Tuning PEFT
ํ•™์Šต ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜ ๋ชจ๋ธ์˜ ๋ชจ๋“  ํŒŒ๋ผ๋ฏธํ„ฐ ์—…๋ฐ์ดํŠธ ์ผ๋ถ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋งŒ ์—…๋ฐ์ดํŠธ
๊ณ„์‚ฐ ๋น„์šฉ ๋†’์Œ ๋‚ฎ์Œ
์œ ์—ฐ์„ฑ ํŠน์ • ๋„๋ฉ”์ธ์— ํ•œ์ • ๋‹ค์–‘ํ•œ ์ž‘์—…์— ๋น ๋ฅด๊ฒŒ ์ ์šฉ ๊ฐ€๋Šฅ
ํ•™์Šต ์‹œ๊ฐ„ ์˜ค๋ž˜ ๊ฑธ๋ฆผ ๋น„๊ต์  ๋น ๋ฆ„
์ ์šฉ ๊ฐ€๋Šฅํ•œ ์ž‘์—… ๋ณต์žกํ•œ ๋„๋ฉ”์ธ ์ž‘์—… ์ ์€ ๋ฐ์ดํ„ฐ๋กœ ๋น ๋ฅด๊ฒŒ ์ ์šฉํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…

์œ„ ์žฅํ‘œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ•ด์„ํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Complexity of Implementation (๊ตฌํ˜„ ๋ณต์žก์„ฑ)

  • Prompt Engineering: ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ์‹์œผ๋กœ, LLM์˜ ์ž…๋ ฅ๊ฐ’์ธ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์กฐ์ •ํ•˜์—ฌ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
    • ๋ชจ๋ธ์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š์•„ ๋ณต์žก์„ฑ์ด ๋งค์šฐ ๋‚ฎ์Šต๋‹ˆ๋‹ค.
  • RAG: RAG๋Š” ๊ฒ€์ƒ‰(Augmentation)๊ณผ ์ƒ์„ฑ(Generation)์„ ๊ฒฐํ•ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง๋ณด๋‹ค๋Š” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.
    • ํ•˜์ง€๋งŒ, ๋ชจ๋ธ ์ž์ฒด๋ฅผ ๋ฏธ์„ธ ์กฐ์ •ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ƒ๋Œ€์ ์œผ๋กœ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.
  • PEFT: ์ผ๋ถ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋งŒ ํ•™์Šต์‹œํ‚ค๋Š” PEFT๋Š” RAG๋ณด๋‹ค ๋ณต์žกํ•˜์ง€๋งŒ, ์™„์ „ํ•œ Fine-Tuning์— ๋น„ํ•ด์„œ๋Š” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.
    • ๊ทธ๋Ÿฌ๋‚˜ ์ถ”๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ฝ์ž…์ด๋‚˜ LoRA์™€ ๊ฐ™์€ ๊ธฐ์ˆ  ์„ค์ •์ด ํ•„์š”ํ•ด ๊ตฌํ˜„ ๋‚œ์ด๋„๊ฐ€ ๋†’์•„์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Full Fine-Tuning: ๋ชจ๋“  ๋ชจ๋ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์กฐ์ •ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ฐ€์žฅ ๋†’์€ ๋ณต์žก์„ฑ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
    • ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ๋ชจ๋ธ์—์„œ๋Š” ๊ณ„์‚ฐ ๋ฆฌ์†Œ์Šค์™€ ์„ค์ • ๋ณต์žก๋„๊ฐ€ ๋งค์šฐ ๋†’์Šต๋‹ˆ๋‹ค.

Cost of Implementation & Maintenance (๊ตฌํ˜„ ๋ฐ ์œ ์ง€ ๋น„์šฉ)

  • Prompt Engineering: ๋ชจ๋ธ์„ ์žฌํ•™์Šตํ•  ํ•„์š”๊ฐ€ ์—†์–ด ๋น„์šฉ์ด ๊ฐ€์žฅ ๋‚ฎ์Šต๋‹ˆ๋‹ค.
    • ์ž…๋ ฅ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๋ฐ๋งŒ ๋ฆฌ์†Œ์Šค๊ฐ€ ์†Œ์š”๋ฉ๋‹ˆ๋‹ค.
  • RAG: ๊ฒ€์ƒ‰ ์ธํ”„๋ผ ๋ฐ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ๋น„์šฉ์ด ์žˆ์ง€๋งŒ, Fine-Tuning์— ๋น„ํ•ด ์œ ์ง€ ๋น„์šฉ์ด ๋‚ฎ์Šต๋‹ˆ๋‹ค.
  • PEFT: ๊ณ„์‚ฐ ๋ฆฌ์†Œ์Šค๋ฅผ ์ ๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์ผ๋ถ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋งŒ ํ•™์Šตํ•˜๋ฏ€๋กœ ๋น„์šฉ์ด ์ค‘๊ฐ„ ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค.
    • ๊ทธ๋Ÿฌ๋‚˜ LoRA๋‚˜ Adapter ์ถ”๊ฐ€๋กœ ์ธํ•ด ์ดˆ๊ธฐ ์„ค์ • ๋น„์šฉ์ด ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Full Fine-Tuning: ๋ชจ๋“  ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ•™์Šต์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ๊ณ„์‚ฐ ๋ฆฌ์†Œ์Šค, ์œ ์ง€ ๋ณด์ˆ˜ ๋น„์šฉ์ด ๊ฐ€์žฅ ๋†’์Šต๋‹ˆ๋‹ค.
    • ํŠนํžˆ, ๋„๋ฉ”์ธ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋ฉด ์ง€์†์ ์ธ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•˜์—ฌ ๋น„์šฉ์ด ๊ธ‰์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„ ์žฅํ‘œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ•ด์„ํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Avoiding Hallucinations (ํ• ๋ฃจ์‹œ๋„ค์ด์…˜(ํ™˜๊ฐ) ์ตœ์†Œํ™”)

  • Prompt Engineering: ๊ธฐ๋ณธ์ ์ธ ํ”„๋กฌํ”„ํŠธ ์กฐ์ •์œผ๋กœ๋Š” ํ™˜๊ฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
  • RAG: ์™ธ๋ถ€ ์ง€์‹๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์‹  ์ •๋ณด ๊ธฐ๋ฐ˜์œผ๋กœ ์‘๋‹ตํ•˜๋ฏ€๋กœ ํ™˜๊ฐ ๋ฌธ์ œ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • PEFT: ํ•™์Šต๋œ ๋ฐ์ดํ„ฐ์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ RAG๋ณด๋‹ค ํ™˜๊ฐ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ์•ฝ๊ฐ„ ๋ถ€์กฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Full Fine-Tuning: ํŠน์ • ๋„๋ฉ”์ธ ๋ฐ์ดํ„ฐ๋กœ ํ•™์Šตํ•˜์—ฌ ํ™˜๊ฐ ๋ฌธ์ œ๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Domain-Specific Terminology (๋„๋ฉ”์ธ ํŠนํ™” ์šฉ์–ด)

  • Prompt Engineering: ํŠนํ™”๋œ ์šฉ์–ด๋ฅผ ์ดํ•ดํ•˜๊ฑฐ๋‚˜ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • RAG: ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฒ€์ƒ‰๋œ ์ •๋ณด๋ฅผ ํ™œ์šฉํ•ด ๋„๋ฉ”์ธ ์šฉ์–ด๋ฅผ ์ดํ•ดํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • PEFT: ํŠน์ • ๋„๋ฉ”์ธ์— ๋งž์ถฐ ์ผ๋ถ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์กฐ์ •ํ•˜๋ฏ€๋กœ ๋„๋ฉ”์ธ ํŠนํ™” ์„ฑ๋Šฅ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • Full Fine-Tuning: ์ „์ฒด ๋ชจ๋ธ์„ ๋„๋ฉ”์ธ ๋ฐ์ดํ„ฐ๋กœ ํ•™์Šตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋„๋ฉ”์ธ ์šฉ์–ด๋ฅผ ๊ฐ€์žฅ ์ž˜ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Up-to-date Response (์ตœ์‹  ์‘๋‹ต ์ œ๊ณต)

  • Prompt Engineering: ๋ชจ๋ธ์ด ํ›ˆ๋ จ๋œ ๋ฐ์ดํ„ฐ์— ์˜์กดํ•˜๋ฏ€๋กœ ์ตœ์‹  ์ •๋ณด๋ฅผ ๋ฐ˜์˜ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
  • RAG: ์™ธ๋ถ€ ์ง€์‹๋ฒ ์ด์Šค๋ฅผ ํ†ตํ•ด ์ตœ์‹  ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ฆ‰๊ฐ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • PEFT: ์ตœ์‹  ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€๋กœ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, Fine-Tuning๊ณผ ๋น„์Šทํ•œ ํ•œ๊ณ„๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Full Fine-Tuning: ์‚ฌ์ „ ํ•™์Šต๋œ ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜์œผ๋กœ ์‘๋‹ตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์‹  ์ •๋ณด๋ฅผ ๋ฐ˜์˜ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

Transparency & Interpretability (ํˆฌ๋ช…์„ฑ ๋ฐ ํ•ด์„ ๊ฐ€๋Šฅ์„ฑ)

  • Prompt Engineering: ๋‹จ์ˆœํ•œ ์„ค์ •์ด๋ฏ€๋กœ ํ•ด์„์ด ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.
  • RAG: ๊ฒ€์ƒ‰๋œ ์ •๋ณด ์ถœ์ฒ˜๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์–ด ํˆฌ๋ช…์„ฑ๊ณผ ํ•ด์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’์Šต๋‹ˆ๋‹ค.
  • PEFT: ์ผ๋ถ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋งŒ ํ•™์Šตํ•˜๋ฏ€๋กœ ํ•ด์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Full Fine-Tuning: ๋ธ”๋ž™๋ฐ•์Šค ์„ฑ๊ฒฉ์ด ๊ฐ•ํ•˜๋ฉฐ, ํ•™์Šต ๊ฒฐ๊ณผ๋ฅผ ํ•ด์„ํ•˜๊ฑฐ๋‚˜ ํˆฌ๋ช…์„ฑ์„ ํ™•๋ณดํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

  1. Emerging Tech: Agentic Workflow

์ถœ์ฒ˜ : AI์˜ ์ƒ์‚ฐ์„ฑ์„ ๋†’์ด๋Š” ๋ฐฉ๋ฒ• (Agentic Workflow)

  • Agentic Workflow

    • AI Agentic Workflow๋Š” ๋ณต์žกํ•œ ์ž‘์—…์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŠนํ™”๋œ ์—์ด์ „ํŠธ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” AI ์‹œ์Šคํ…œ ๊ตฌ์กฐ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋Š” ๋‹จ์ผ AI ๋ชจ๋ธ์ด ๋ชจ๋“  ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ์กด ๋ฐฉ์‹๊ณผ ๋‹ฌ๋ฆฌ, ๊ฐ ๋‹จ๊ณ„๋ฅผ ์ „๋ฌธํ™”๋œ ์—์ด์ „ํŠธ๊ฐ€ ๋‹ด๋‹นํ•จ์œผ๋กœ์จ ๋”์šฑ ํšจ์œจ์ ์ด๊ณ  ์ •ํ™•ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
    • Stanford ์•ค๋“œ๋ฅ˜ ์‘ ๊ต์ˆ˜๋Š” AI Agentic Workflow๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:

      • ๋ฐ˜๋ณต์ ์ธ ํ”„๋กœ์„ธ์Šค: LLM์ด ๋ฌธ์„œ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณตํ•˜์—ฌ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
      • ์ž์ฒด ํ‰๊ฐ€ ๋ฐ ๊ฐœ์„ : AI๊ฐ€ ์ž์‹ ์˜ ์ถœ๋ ฅ์„ ์ž์ฒด ํ‰๊ฐ€ํ•˜๊ณ  ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.
      • ํ˜‘์—… ์‹œ์Šคํ…œ: ์—ฌ๋Ÿฌ AI ์‹œ์Šคํ…œ์ด ์„œ๋กœ ์†Œํ†ตํ•˜๊ณ  ๊ท ํ˜•์„ ๋งž์ถ”๋ฉฐ ํ˜‘๋ ฅํ•˜์—ฌ ๋ณต์žกํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค

  1. LLM ์—์ด์ „ํŠธ ๋””์ž์ธ ํŒจํ„ด

  • LLM ์—์ด์ „ํŠธ ํŒจํ„ด

    • LLM ๊ธฐ๋ฐ˜ ์—์ด์ „ํŠธ์˜ ๋‹ค์–‘ํ•œ ์„ค๊ณ„ ๋ฐฉ์‹์€ ํŠน์ • ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์ ์˜ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    • ์ฃผ์š” ๋””์ž์ธ ํŒจํ„ด:

      1. ๋ฆฌํ”Œ๋ ‰์…˜(Reflection): AI๊ฐ€ ์ž์ฒด์ ์œผ๋กœ ์ž‘์—…์„ ๊ฒ€ํ† ํ•˜๊ณ  ๊ฐœ์„  ๋ฐฉ์•ˆ์„ ๋งˆ๋ จํ•ฉ๋‹ˆ๋‹ค.
      2. ๋„๊ตฌ ์‚ฌ์šฉ(Tool Use): AI๊ฐ€ ์›น ๊ฒ€์ƒ‰, ์ฝ”๋“œ ์‹คํ–‰ ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
      3. ๊ณ„ํš(Planning): AI๊ฐ€ ๋ชฉํ‘œ ๋‹ฌ์„ฑ์„ ์œ„ํ•œ ๋‹ค๋‹จ๊ณ„ ๊ณ„ํš์„ ์ˆ˜๋ฆฝํ•˜๊ณ  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
      4. ๋‹ค์ค‘ ์—์ด์ „ํŠธ ํ˜‘์—…(Multi-Agent Collaboration): ์—ฌ๋Ÿฌ AI ์—์ด์ „ํŠธ๊ฐ€ ํ˜‘๋ ฅํ•˜์—ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๋””์ž์ธ ํŒจํ„ด ์ƒ์„ธ:

(1) Reflection Pattern

  • ๊ฐœ๋…:
    • LLM์˜ ์ดˆ๊ธฐ ์‘๋‹ต์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ํ‰๊ฐ€ํ•˜๊ณ , ์ด๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ฐœ์„ .
    • LLM์ด ์ž์ฒด ๊ฒ€ํ† ์™€ ํ”ผ๋“œ๋ฐฑ์„ ํ†ตํ•ด ํ’ˆ์งˆ์„ ๋†’์ž„.

  • ์˜ˆ์‹œ:
    • ๋‹ต๋ณ€์˜ ๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์Šค์Šค๋กœ ์ˆ˜์ •.
    • ํ…์ŠคํŠธ ์ƒ์„ฑ ํ›„ ๋ฌธ๋ฒ•, ๋…ผ๋ฆฌ ๋ฐ ์˜๋ฏธ๋ฅผ ์žฌ๊ฒ€ํ† .
  • ์ ์šฉ ์‚ฌ๋ก€:
    • Self-Refine: Madaan et al.(2023)์˜ ์—ฐ๊ตฌ์—์„œ ๋ฐ˜๋ณต์ ์ธ ์ž์ฒด ํ”ผ๋“œ๋ฐฑ์„ ํ†ตํ•ด ์‘๋‹ต ํ’ˆ์งˆ ํ–ฅ์ƒ.
    • Reflexion: ๊ฐ•ํ™”ํ•™์Šต์„ ์‚ฌ์šฉํ•˜์—ฌ ์–ธ์–ด ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ ๊ฐœ์„ .

(2) Tool Use Pattern

  • ๊ฐœ๋…:
    • LLM ์ž์ฒด ์ •๋ณด๊ฐ€ ๋ถˆ์ถฉ๋ถ„ํ•  ๊ฒฝ์šฐ ์™ธ๋ถ€ ๋„๊ตฌ(API, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ •๊ตํ•œ ์‘๋‹ต ์ƒ์„ฑ.
    • ๊ฒ€์ƒ‰, ๊ณ„์‚ฐ, ๋ถ„์„ ๋„๊ตฌ ๋“ฑ ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค์— ์˜์กด.

  • ์˜ˆ์‹œ:
    • Google ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ์ตœ์‹  ์ •๋ณด ํ™•์ธ.
    • Wolfram Alpha๋ฅผ ์‚ฌ์šฉํ•ด ์ˆ˜ํ•™ ๋ฌธ์ œ ํ•ด๊ฒฐ.
    • YouTube ๋ถ„์„ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋™์˜์ƒ ์ •๋ณด ์ถ”์ถœ.
  • ์ ์šฉ ์‚ฌ๋ก€:
    • Gorilla: API์™€ ์—ฐ๊ณ„ํ•˜์—ฌ ์ •๋ฐ€ํ•œ ์ •๋ณด ๊ฒ€์ƒ‰ ์ˆ˜ํ–‰.
    • MM-REACT: ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐ ์‹คํ–‰์„ ์ง€์›ํ•˜๋Š” ์‹œ์Šคํ…œ.

(3) Planning Pattern

  • ๊ฐœ๋…:
    • ์ž‘์—…์„ ์„ธ๋ถ„ํ™”ํ•˜์—ฌ ๋‹จ๊ณ„์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ฐ ๋‹จ๊ณ„์—์„œ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ˜์˜.
    • ๋ณต์žกํ•œ ์ž‘์—…๋„ ์ฒด๊ณ„์ ์œผ๋กœ ๋ถ„ํ• ํ•ด ํ•ด๊ฒฐ.

  • ์˜ˆ์‹œ:
    • ReAct(Reasoning + Acting) ๊ธฐ๋ฒ•์„ ํ†ตํ•ด ์ถ”๋ก ๊ณผ ํ–‰๋™์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ ๋ชฉํ‘œ ๋‹ฌ์„ฑ.
    • ๋Œ€๊ทœ๋ชจ ๊ณ„ํš(์˜ˆ: ๋ณด๊ณ ์„œ ์ž‘์„ฑ)์„ ์„ธ๋ถ„ํ™”ํ•œ ํ›„ ๊ฐ ๋ถ€๋ถ„์„ ์ฒ˜๋ฆฌ.
  • ์ ์šฉ ์‚ฌ๋ก€:
    • HuggingGPT: ๋‹ค์–‘ํ•œ AI ๋ชจ๋ธ์„ ์กฐ์œจํ•˜์—ฌ ๋ณต์žกํ•œ ์ž‘์—… ์ฒ˜๋ฆฌ.

(4) Multi-Agent Collaboration

  • ๊ฐœ๋…:
    • ์—ฌ๋Ÿฌ ์—์ด์ „ํŠธ๊ฐ€ ์„œ๋กœ ํ˜‘๋ ฅํ•˜๋ฉฐ ์—ญํ• ์„ ๋ถ„๋‹ดํ•˜์—ฌ ์ž‘์—…์„ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰.
    • ๊ฐ ์—์ด์ „ํŠธ๋Š” ๊ณ ์œ ์˜ ๊ธฐ๋Šฅ(์˜ˆ: ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘, ๋ถ„์„, ์‹คํ–‰)์„ ๋‹ด๋‹น.

  • ์˜ˆ์‹œ:
    • ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด ์—ญํ• ์˜ ์—์ด์ „ํŠธ์™€ ํ”„๋กœ์ ํŠธ ๋งค๋‹ˆ์ € ์—ญํ• ์˜ ์—์ด์ „ํŠธ๊ฐ€ ํ˜‘๋ ฅ.
    • ํ•œ ์—์ด์ „ํŠธ๋Š” ๋ฐ์ดํ„ฐ ํฌ๋กค๋ง, ๋‹ค๋ฅธ ์—์ด์ „ํŠธ๋Š” ๊ฒฐ๊ณผ ๋ถ„์„.
  • ์ ์šฉ ์‚ฌ๋ก€:
    • AutoGen: ๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ ํ˜‘์—…์„ ์ง€์›ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ.
    • CrewAI: ์ž‘์—… ๋‹จ์œ„ ๋ถ„๋‹ด์„ ํ†ตํ•œ ํ˜‘๋ ฅ ์ˆ˜ํ–‰.

Chapter 2: Naive RAG

Naive RAG๋ž€?

  • Naive RAG๋Š” RAG์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ๋กœ, ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ด๋ฅผ LLM์— ์ „๋‹ฌํ•˜์—ฌ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

  • ์ฃผ๋กœ ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(Vector DB)๋ฅผ ํ™œ์šฉํ•˜๋ฉฐ, ๊ฒ€์ƒ‰๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ปจํ…์ŠคํŠธ๋กœ ์‚ฌ์šฉํ•ด LLM์ด ๋ณด๋‹ค ์ •ํ™•ํ•œ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•˜๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์„ค์น˜ ๋ช…๋ น์–ด

1
2
3
4
5
pip install langchain\
            langchain-community\
            langchain-openai\
            langchain-huggingface\
            langchain-cohere  -qU
1
pip install pypdf faiss-cpu rank-bm25 ragas deepeval -qU

LangChain ๊ด€๋ จ ํŒจํ‚ค์ง€

  • langchain: LLM ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ
  • langchain-community: ์„œ๋“œํŒŒํ‹ฐ ํ†ตํ•ฉ์„ ์œ„ํ•œ LangChain ํŒจํ‚ค์ง€
  • langchain-openai: OpenAI์™€ LangChain ํ†ตํ•ฉ์„ ์œ„ํ•œ ํŒจํ‚ค์ง€
  • langchain-huggingface: Hugging Face์™€ LangChain ํ†ตํ•ฉ์„ ์œ„ํ•œ ํŒจํ‚ค์ง€
  • langchain-cohere: Cohere์™€ LangChain ํ†ตํ•ฉ์„ ์œ„ํ•œ ํŒจํ‚ค์ง€

๊ธฐํƒ€ ํŒจํ‚ค์ง€

  • pypdf: PDF ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ˆœ์ˆ˜ Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • faiss-cpu: ๊ณ ๋ฐ€๋„ ๋ฒกํ„ฐ์˜ ํšจ์œจ์ ์ธ ์œ ์‚ฌ์„ฑ ๊ฒ€์ƒ‰ ๋ฐ ํด๋Ÿฌ์Šคํ„ฐ๋ง์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • rank-bm25: BM25 ๋žญํ‚น ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•œ ํŒจํ‚ค์ง€
  • ragas: RAG(Retrieval-Augmented Generation) ์‹œ์Šคํ…œ์„ ํ‰๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ
  • deepeval: RAG(Retrieval-Augmented Generation) ํŒŒ์ดํ”„๋ผ์ธ ํ‰๊ฐ€๋ฅผ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ

-qU ์˜ต์…˜ ์„ค๋ช…

pip ๋ช…๋ น์–ด์˜ -qU ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค:

  • -q: quiet ๋ชจ๋“œ๋กœ, ์„ค์น˜ ๊ณผ์ •์˜ ์ถœ๋ ฅ์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • -U: โ€“upgrade์˜ ์ถ•์•ฝํ˜•์œผ๋กœ, ์ด๋ฏธ ์„ค์น˜๋œ ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๋‹ค๋ฉด ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ -qU ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ํŒจํ‚ค์ง€๋ฅผ ์กฐ์šฉํžˆ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


2.1. Vector DB ๊ตฌ์ถ•ํ•˜๊ธฐ

2.1.1. Documents Loading

  • ์ž‘์—… ๋ชฉ์ : ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ๋ฌธ์„œ๋ฅผ ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ์˜ˆ์‹œ

    • ์ž…๋ ฅ ์˜ˆ์‹œ : ์•„๋ž˜ ์ฝ”๋“œ๋Š” PDF๋ฅผ ๋กœ๋”ฉํ•˜๋Š” ์ฝ”๋“œ snippet์ž…๋‹ˆ๋‹ค.

      1
      2
      3
      4
      5
      6
      
          
      from langchain.document_loaders import PyPDFLoader
          
      # PDF ํŒŒ์ผ ๋กœ๋”ฉ
      loader = PyPDFLoader("sample.pdf")
      docs = loader.load()
      
    • ์ถœ๋ ฅ ์˜ˆ์‹œ: ๋กœ๋“œ๋œ ๋ฌธ์„œ์˜ ํŽ˜์ด์ง€ ์ˆ˜์™€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธ.

      1
      2
      3
      
          
      print(len(docs))  # ๋ฌธ์„œ์˜ ๊ฐœ์ˆ˜
      print(docs[0].metadata)  # ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ •๋ณด
      


2.1.2. Chunking

  • ๋ชฉ์ : ๋ฌธ์„œ๋ฅผ ์ ์ ˆํ•œ ํฌ๊ธฐ๋กœ ๋ถ„๋ฆฌํ•ด ๊ฒ€์ƒ‰ ํšจ์œจ์„ฑ์„ ๋†’์ž„.

  • ์ฒญํ‚น(Chunking) ๋ฐฉ์‹

    • ํ…์ŠคํŠธ๋ฅผ ์ผ์ • ํฌ๊ธฐ๋กœ ๋‚˜๋ˆ ์ฃผ๋Š” ๊ณผ์ •.
      • ํฐ Chunk => ๋งŽ์€ ์ •๋ณด, ๋งŽ์€ ๋…ธ์ด์ฆˆ
      • ์ž‘์€ Chunk => ์ž‘์€ ์ •๋ณด, ์ž‘์€ ๋…ธ์ด์ฆˆ
      • ์ ๋‹นํ•œ ์‚ฌ์ด์ฆˆ์˜ ํฌ๊ธฐ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ์‹œ์Šคํ…œ ๊ฒฐ๊ณผ์˜ ์ถฉ์‹ค๋„ ๋ฐ ๊ด€๋ จ์„ฑ์— ์˜ํ–ฅ์„ ์คŒ
  • ์žฌ๊ท€์  ์ฒญํ‚น(Recursive Chunking) ๋ฐฉ์‹

    • ํ…์ŠคํŠธ๋ฅผ ๊ณ„์ธต์ ์œผ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ์ •๋ณด์˜ ๋งฅ๋ฝ๊ณผ ์˜๋ฏธ๋ฅผ ๋ณด์กดํ•˜๋Š” ๊ณผ์ •.

      • ๋‹จ์ˆœ ์ฒญํ‚น ๋ฐฉ์‹์—์„œ๋Š” ํ…์ŠคํŠธ๋ฅผ ์ผ์ • ํฌ๊ธฐ๋กœ ๋‚˜๋ˆ„์ง€๋งŒ, ์žฌ๊ท€์  ์ฒญํ‚น์€ ํ…์ŠคํŠธ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜์—ฌ ์ƒ์œ„-ํ•˜์œ„ ๊ด€๊ณ„๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ ๋ถ„ํ• ํ•จ.
      • RecursiveCharacterTextSplitter๋Š” ํ…์ŠคํŠธ๋ฅผ ์ง€์ •๋œ ํฌ๊ธฐ์˜ ์ฒญํฌ๋กœ ๋ถ„ํ• ํ•˜๋Š” LangChain์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
      • ์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ…์ŠคํŠธ๋ฅผ ๋ถ„ํ• ํ•œ ํ›„ ์ตœ์ข… chunk๋ฅผ ์ •์˜ํ•˜๋Š” ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

        1. ๋ถ„ํ•  ๊ณผ์ •:

          • ์ง€์ •๋œ ๊ตฌ๋ถ„์ž(separators)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…์ŠคํŠธ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค.
          • ํฐ ๋‹จ์œ„์˜ ๊ตฌ๋ถ„์ž๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ์ ์ฐจ ์ž‘์€ ๋‹จ์œ„์˜ ๊ตฌ๋ถ„์ž๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
        2. ๋ณ‘ํ•ฉ ๊ณผ์ •:

          • ๋ถ„ํ• ๋œ ํ…์ŠคํŠธ ์กฐ๊ฐ๋“ค์„ ์ง€์ •๋œ chunk_size์— ๋งž๊ฒŒ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
          • chunk_overlap์„ ๊ณ ๋ คํ•˜์—ฌ ์ผ๋ถ€ ๋‚ด์šฉ์ด ๊ฒน์น˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
        3. ์ตœ์ข… chunk ์ •์˜:

          • ๋ณ‘ํ•ฉ๋œ ํ…์ŠคํŠธ ์กฐ๊ฐ๋“ค์ด ์ตœ์ข… chunk๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
          • ๊ฐ chunk๋Š” ์ง€์ •๋œ chunk_size๋ฅผ ์ดˆ๊ณผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
      • ์ฃผ์š” ๋งค๊ฐœ๋ณ€์ˆ˜

        1. chunk_size: ๊ฐ ์ฒญํฌ์˜ ์ตœ๋Œ€ ๋ฌธ์ž ์ˆ˜ (์—ฌ๊ธฐ์„œ๋Š” 100)
        2. chunk_overlap: ์—ฐ์†๋œ ์ฒญํฌ ๊ฐ„ ๊ฒน์น˜๋Š” ๋ฌธ์ž ์ˆ˜ (์—ฌ๊ธฐ์„œ๋Š” 20)
        3. separators: ํ…์ŠคํŠธ๋ฅผ ๋ถ„ํ• ํ•  ๋•Œ ์‚ฌ์šฉํ•  ๊ตฌ๋ถ„์ž ๋ชฉ๋ก
      • Separators์˜ ์ž‘๋™ ๋ฐฉ์‹

        separators ๋ฆฌ์ŠคํŠธ [โ€œ\n\nโ€, โ€œ\nโ€, โ€œ.โ€, โ€œ โ€œ]๋Š” ์šฐ์„ ์ˆœ์œ„ ์ˆœ์„œ๋Œ€๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค:

        1. โ€\n\nโ€: ๋จผ์ € ๋นˆ ์ค„๋กœ ๊ตฌ๋ถ„๋œ ๋‹จ๋ฝ์„ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
        2. โ€\nโ€: ๊ทธ ๋‹ค์Œ ์ค„๋ฐ”๊ฟˆ์œผ๋กœ ๊ตฌ๋ถ„๋œ ์ค„์„ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
        3. โ€.โ€: ๊ทธ ๋‹ค์Œ ๋งˆ์นจํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ๋ฌธ์žฅ์„ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
        4. โ€โ€: ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋œ ๋‹จ์–ด๋ฅผ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • ์ฝ”๋“œ ์˜ˆ์‹œ

    • ์ž…๋ ฅ

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      
      from langchain.text_splitter import RecursiveCharacterTextSplitter
          
      # ์ž…๋ ฅ ํ…์ŠคํŠธ
      text = """
      This is a sample document. It contains multiple paragraphs.
          
      Each paragraph contains multiple sentences.
      This is the second sentence in the second paragraph.
          
      Finally, this is the last paragraph.
      """
          
      # RecursiveCharacterTextSplitter ์„ค์ •
      text_splitter = RecursiveCharacterTextSplitter(
          chunk_size=100,          # ์ฒญํฌ ํฌ๊ธฐ (์ตœ๋Œ€ 100์ž)
          chunk_overlap=20,        # ์ฒญํฌ ๊ฐ„ ๊ฒน์น˜๋Š” ๋ถ€๋ถ„ (20์ž)
          separators=["\n\n", "\n", ".", " "]  # ๋ถ„ํ•  ๊ธฐ์ค€
      )
          
      # ํ…์ŠคํŠธ ๋ถ„ํ• 
      chunks = text_splitter.split_text(text)
          
      # ๋ถ„ํ• ๋œ ์ฒญํฌ ์ถœ๋ ฅ
      for i, chunk in enumerate(chunks):
          print(f"Chunk {i + 1}:\n{chunk}\n")
          
      
    • ์ถœ๋ ฅ

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      
          
        Chunk 1:
        This is a sample document. It contains multiple paragraphs.
          
        Chunk 2:
        Each paragraph contains multiple sentences.
        This is the second sentence in the second paragraph.
          
        Chunk 3:
        Finally, this is the last paragraph.
          
      
    • ์„ค๋ช…

      1. ์ฒซ ๋ฒˆ์งธ ์ฒญํฌ:

        • โ€œ\n\nโ€๋กœ ๋ถ„๋ฆฌ๋œ ์ฒซ ๋ฒˆ์งธ ๋‹จ๋ฝ์ด ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.
        • ์ด ๋‹จ๋ฝ์€ 100์ž ๋ฏธ๋งŒ์ด๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ ์ฒซ ๋ฒˆ์งธ ์ฒญํฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
      2. ๋‘ ๋ฒˆ์งธ ์ฒญํฌ:

        • ๋‚จ์€ ํ…์ŠคํŠธ์—์„œ ๋‹ค์Œ โ€œ\n\nโ€๋กœ ๊ตฌ๋ถ„๋œ ๋‹จ๋ฝ์ด ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.
        • ์ด ๋‹จ๋ฝ๋„ 100์ž ๋ฏธ๋งŒ์ด๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ ๋‘ ๋ฒˆ์งธ ์ฒญํฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
      3. ์„ธ ๋ฒˆ์งธ ์ฒญํฌ:

        • ๋งˆ์ง€๋ง‰ ๋‚จ์€ ํ…์ŠคํŠธ๊ฐ€ ์„ธ ๋ฒˆ์งธ ์ฒญํฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

      chunk_overlap์ด 20์œผ๋กœ ์„ค์ •๋˜์—ˆ์ง€๋งŒ, ์ด ์˜ˆ์‹œ์—์„œ๋Š” ๊ฐ ์ฒญํฌ๊ฐ€ 100์ž ๋ฏธ๋งŒ์ด์–ด์„œ ๊ฒน์น˜๋Š” ๋ถ€๋ถ„์ด ์ƒ๊ธฐ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๐Ÿ“‹ ์ฐธ๊ณ  (Chunking ๊ธฐ๋ฒ•)


2.1.3. Embedding

  • Embedding์˜ ์ •์˜: ํ…์ŠคํŠธ, ์ด๋ฏธ์ง€, ์Œ์„ฑ ๋“ฑ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ์ฐจ์›์˜ ๋ฒกํ„ฐ ๊ณต๊ฐ„์— ํ‘œํ˜„ํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.
    • ์ด ๋‹จ๊ณ„๋Š” ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(Vector DB)์—์„œ ์œ ์‚ฌ๋„ ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํ•ต์‹ฌ ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

  • Embedding์˜ ์—ญํ• :

    1. ์˜๋ฏธ์  ์œ ์‚ฌ์„ฑ ํฌ์ฐฉ: ์œ ์‚ฌํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๋Š” ๋ฒกํ„ฐ ๊ณต๊ฐ„์—์„œ ์„œ๋กœ ๊ฐ€๊น๊ฒŒ ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.
    2. ์ฐจ์› ์ถ•์†Œ: ๊ณ ์ฐจ์›์˜ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์ฐจ์›์œผ๋กœ ํ‘œํ˜„ํ•˜์—ฌ ํšจ์œจ์ ์ธ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    3. ์œ ์‚ฌ๋„ ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰: ๋ฒกํ„ฐ ๊ฐ„ ๊ฑฐ๋ฆฌ๋‚˜ ๊ฐ๋„๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ์œ ์‚ฌํ•œ ํ•ญ๋ชฉ์„ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Embedding ์˜ˆ์‹œ

    • ์ด ์˜ˆ์‹œ์—์„œ๋Š” HuggingFace์™€ OpenAI์˜ ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
    • OpenAI์˜ ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ์€ ๊ฐ•๋ ฅํ•œ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ API ํ‚ค๊ฐ€ ํ•„์š”ํ•˜๊ณ  ์‚ฌ์šฉ๋Ÿ‰์— ๋”ฐ๋ฅธ ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      
          
        # OpenAI API ์‚ฌ์šฉ
        from langchain.embeddings import OpenAIEmbeddings
        import os
          
        # OpenAI API ํ‚ค ์„ค์ •
        os.environ["OPENAI_API_KEY"] = "your-api-key-here"
          
        # ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ ์„ค์ •
        embedding_model = OpenAIEmbeddings()
        embeddings = [embedding_model.embed_query(chunk) for chunk in chunks]
          
      
    • ๋ฐ˜๋ฉด HuggingFace ๋ชจ๋ธ์€ ๋ฌด๋ฃŒ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ๋กœ์ปฌ์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ OpenAI ๋ชจ๋ธ์— ๋น„ํ•ด ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      
          
        # HuggingFace ๋ชจ๋ธ ์‚ฌ์šฉ:
        from langchain_huggingface import HuggingFaceEmbeddings
          
        model_name = "BAAI/bge-m3"
        model_kwargs = {"device": "cuda"}
        encode_kwargs = {"normalize_embeddings": True}
        hf_embeddings = HuggingFaceEmbeddings(
            model_name=model_name, model_kwargs=model_kwargs, encode_kwargs=encode_kwargs
        )
      
  • Embedding ํ™œ์šฉ ์˜ˆ์‹œ

    • ์ž„๋ฒ ๋”ฉ์„ ์ƒ์„ฑํ•œ ํ›„์—๋Š” ๋ฒกํ„ฐ ๊ฐ„ ์œ ์‚ฌ๋„๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ํ…์ŠคํŠธ ๊ฐ„์˜ ์˜๋ฏธ์  ๊ด€๊ณ„๋ฅผ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด๋Š” ์ •๋ณด ๊ฒ€์ƒ‰, ๋ฌธ์„œ ๋ถ„๋ฅ˜, ์ถ”์ฒœ ์‹œ์Šคํ…œ ๋“ฑ ๋‹ค์–‘ํ•œ ์ž์—ฐ์–ด ์ฒ˜๋ฆฌ ์ž‘์—…์— ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      
        
      import numpy as np
        
      # ์ž„๋ฒ ๋”ฉ ์ฐจ์› ํ™•์ธ
      print(f"์ž„๋ฒ ๋”ฉ ์ฐจ์›: {len(embeddings[0])}")
        
      # ์ž„๋ฒ ๋”ฉ ๋ฒกํ„ฐ ๊ฐ„ ์œ ์‚ฌ๋„ ๊ณ„์‚ฐ (์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„)
      def cosine_similarity(v1, v2):
          return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))
        
      similarity = cosine_similarity(embeddings[0], embeddings[1])
      print(f"์ฒซ ๋ฒˆ์งธ์™€ ๋‘ ๋ฒˆ์งธ ์ฒญํฌ์˜ ์œ ์‚ฌ๋„: {similarity}")
      

2.1.4. Vector DB ์ €์žฅ

์ž„๋ฒ ๋”ฉ ๊ณผ์ •์„ ํ†ตํ•ด ์ƒ์„ฑ๋œ ๋ฒกํ„ฐ๋Š” ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(Vector DB)์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

  • Vector DB๋Š” ๊ฒ€์ƒ‰ ์†๋„๋ฅผ ๋†’์ด๊ณ , ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์…‹์—์„œ๋„ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฒกํ„ฐ DB ํŠน์ง•

    • ์ธ๋ฑ์‹ฑ(Indexing) : ํšจ์œจ์ ์ธ ๊ฒ€์ƒ‰์„ ์œ„ํ•ด ๋ฒกํ„ฐ๋ฅผ ์ธ๋ฑ์‹ฑํ•˜์—ฌ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ : Milvus, Pinecone, Weaviate ๋“ฑ ๋ฒกํ„ฐ DB ํ”Œ๋žซํผ์ด ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ๋นŒ๋ฆฌ์–ธ ์Šค์ผ€์ผ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ์˜ˆ์‹œ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from langchain.vectorstores import FAISS

# 1. ๋ฒกํ„ฐ DB ์ƒ์„ฑ
vector_db = FAISS.from_documents(documents = split_documents,
                                 embedding = embedding_model)


# 2. ๋กœ์ปฌ์— ์ €์žฅ
vectorstore.save_local('./db/faiss')

# 3. ๋กœ์ปฌ์—์„œ ๋กœ๋“œ
vectorstore = FAISS.load_local(
    './db/faiss', 
    embedding_model, 
    allow_dangerous_deserialization=True
)

๐Ÿ“ (์ฐธ๊ณ ) ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ Vector DB

  • ์•„๋ž˜ ๊ฐ ์นดํ…Œ๊ณ ๋ฆฌ ๋ณ„๋กœ ๋ช‡๊ฐ€์ง€ ์‚ฌ๋ก€๋“ค์„ ์กฐ์‚ฌํ•ด์„œ ์„ค๋ช…์„ ์ถ”๊ฐ€ํ•ด ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ—ƒ๏ธ ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

  • ์ฃผ๋กœ ๊ณ ์ฐจ์› ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ์˜ ์ €์žฅ๊ณผ ๊ฒ€์ƒ‰์— ํŠนํ™”๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ, ๊ฒ€์ƒ‰ ํšจ์œจ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • Milvus
      • https://milvus.io/

      • ๋‹ค์–‘ํ•œ ์ธ๋ฑ์Šค ํƒ€์ž… ์ง€์›๊ณผ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ํŠน์ง•
      • ํ•˜๋“œ์›จ์–ด ๊ฐ€์†ํ™”๋œ ์—ฐ์‚ฐ ์ง€์›๊ณผ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ ์ œ๊ณต
      • 10๊ฐœ ์ด์ƒ์˜ ์ธ๋ฑ์Šค ํƒ€์ž…์„ ์ง€์›ํ•˜๋ฉฐ GPU ๊ธฐ๋ฐ˜ ์ธ๋ฑ์‹ฑ๋„ ๊ฐ€๋Šฅ

๐Ÿ—ƒ๏ธ ๋ฒกํ„ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฒกํ„ฐ ์ž„๋ฒ ๋”ฉ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ.
    • Faiss
      • https://github.com/facebookresearch/faiss

      • Facebook AI(ํ˜„ Meta)๊ฐ€ ๊ฐœ๋ฐœํ•œ ๋ฒกํ„ฐ ์œ ์‚ฌ๋„ ๊ฒ€์ƒ‰ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
      • C++๋กœ ์ž‘์„ฑ๋œ ์ฝ”์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ Python ๋ž˜ํผ ์ œ๊ณต
      • k-ํ‰๊ท  ํด๋Ÿฌ์Šคํ„ฐ๋ง, ๊ทผ์ ‘ ๊ทธ๋ž˜ํ”„ ๊ธฐ๋ฐ˜ ๋ฐฉ์‹ ๋“ฑ ๋‹ค์–‘ํ•œ ์ธ๋ฑ์‹ฑ ๋ฐฉ๋ฒ• ์ง€์›

๐Ÿ—ƒ๏ธ Vector-capable SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

  • ๊ธฐ์กด SQL DB์— ๋ฒกํ„ฐ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ ์‹œ์Šคํ…œ.
    • Timescale
      • https://www.timescale.com/ai

      • PostgreSQL ๊ธฐ๋ฐ˜์˜ ๋ฒกํ„ฐ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ์ œ๊ณต
      • ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ์— ์ตœ์ ํ™”๋œ ๋ฒกํ„ฐ ๊ฒ€์ƒ‰ ์ง€์›
      • DiskANN ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ๋ฐ˜์˜ ๋น ๋ฅธ ์œ ์‚ฌ๋„ ๊ฒ€์ƒ‰ ์ œ๊ณต

๐Ÿ—ƒ๏ธ Vector-capable NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

  • ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์œ„ํ•œ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๋ฒกํ„ฐ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ ์ œ๊ณต.
    • Cassandra
      • LLamaIndex - Cassandra Index Demo

      • 5.0 ๋ฒ„์ „๋ถ€ํ„ฐ ๋ฒกํ„ฐ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
      • Storage-Attached Indexing(SAI)๋ฅผ ํ†ตํ•œ ํšจ์œจ์ ์ธ ๋ฒกํ„ฐ ์ธ๋ฑ์‹ฑ ์ œ๊ณต
      • ๋ถ„์‚ฐ ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ™œ์šฉํ•œ ๋Œ€๊ทœ๋ชจ ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
  • (์ฐธ๊ณ ) SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค vs NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

    • SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ „ํ†ต์ ์ธ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(Relational Database Management Systems, RDBMS)๋กœ, ๋ฐ์ดํ„ฐ๊ฐ€ ํ…Œ์ด๋ธ” ํ˜•ํƒœ๋กœ ๊ตฌ์กฐํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋น„๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ, ์ •ํ˜• ๋ฐ์ดํ„ฐ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋น„์ •ํ˜•(Unstructured) ๋ฐ์ดํ„ฐ์™€ ๋ฐ˜์ •ํ˜•(Semi-structured) ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • SQL vs NoSQL: ์ฃผ์š” ์ฐจ์ด์  ์ •๋ฆฌ

      ํŠน์ง• SQL NoSQL
      ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๊ณ ์ •๋œ ์Šคํ‚ค๋งˆ ์Šคํ‚ค๋งˆ๊ฐ€ ์œ ์—ฐํ•˜๊ฑฐ๋‚˜ ์—†์Œ
      ๋ฐ์ดํ„ฐ ๊ด€๊ณ„ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ์ง€์› ๋น„๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
      ํ™•์žฅ์„ฑ ์ˆ˜์ง์  ํ™•์žฅ(๋” ๊ฐ•๋ ฅํ•œ ์„œ๋ฒ„) ์ˆ˜ํ‰์  ํ™•์žฅ(๋…ธ๋“œ ์ถ”๊ฐ€)
      ์ฟผ๋ฆฌ ์–ธ์–ด ํ‘œ์ค€ SQL ์‚ฌ์šฉ ๋‹ค์–‘ํ•œ API ๋ฐ ์ž์ฒด ์ฟผ๋ฆฌ ์–ธ์–ด ์‚ฌ์šฉ
      ํŠธ๋žœ์žญ์…˜ ์ง€์› ACID ์†์„ฑ ๋ณด์žฅ BASE ์†์„ฑ(์ตœ์ข… ์ผ๊ด€์„ฑ) ์ œ๊ณต
      ์ฒ˜๋ฆฌ ๋ฐ์ดํ„ฐ ์œ ํ˜• ์ •ํ˜• ๋ฐ์ดํ„ฐ ๋น„์ •ํ˜• ๋ฐ ๋ฐ˜์ •ํ˜• ๋ฐ์ดํ„ฐ
      ์ ํ•ฉํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€ ๊ธˆ์œต, ERP, CRM ๋“ฑ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ์†Œ์…œ ๋ฏธ๋””์–ด, IoT, ๋กœ๊ทธ ๋ถ„์„

๐Ÿ—ƒ๏ธ Text Search Databases

  • ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ๋ฒกํ„ฐ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ๋„ ์ ์ง„์ ์œผ๋กœ ๋„์ž….
    • Elasticsearch
      • LLamaIndex - Elasticsearch Index Demo

      • Apache Lucene ๊ธฐ๋ฐ˜์˜ ์˜คํ”ˆ์†Œ์Šค ์ „๋ฌธ ๊ฒ€์ƒ‰ ์—”์ง„
      • ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๋ถ„์„๊ณผ ์‹œ๊ฐํ™” ๊ธฐ๋Šฅ ์ œ๊ณต
      • ๊ตฌ์กฐํ™”/๋น„๊ตฌ์กฐํ™” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•œ ์ „๋ฌธ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ์ œ๊ณต

2.2. ๊ฒ€์ƒ‰๊ธฐ(Retriever)

๊ฒ€์ƒ‰๊ธฐ(Retriever)๋Š” RAG ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ์— ๋Œ€ํ•ด ์ ์ ˆํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ™œ์šฉํ•ด ๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ํ•ต์‹ฌ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.

  • ์•„๋ž˜๋Š” ๊ฒ€์ƒ‰๊ธฐ ์ƒ์„ฑ๊ณผ ๊ฒ€์ƒ‰ ๋ฐฉ์‹์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.


1. ๊ฒ€์ƒ‰๊ธฐ ์ƒ์„ฑ

์ฝ”๋“œ ์˜ˆ์‹œ

1
2
retriever = vector_db.as_retriever(search_type="similarity", 
                                   search_kwargs={"k": 5})

์ฃผ์š” ๋งค๊ฐœ๋ณ€์ˆ˜

  1. search_type:

    • ๊ฒ€์ƒ‰ ๋ฐฉ์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      • "similarity": ์œ ์‚ฌ๋„ ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰.
      • "mmr": MMR(Maximal Marginal Relevance) ๋ฐฉ์‹.
      • "similarity_score_threshold": ์œ ์‚ฌ๋„ ์ ์ˆ˜ ์ž„๊ณ„๊ฐ’์„ ์„ค์ •ํ•˜์—ฌ ํ•„ํ„ฐ๋ง.
  2. search_kwargs:

    • ๊ฒ€์ƒ‰์— ์‚ฌ์šฉ๋˜๋Š” ์ถ”๊ฐ€ ์ธ์ž๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
      • k: ๋ฐ˜ํ™˜ํ•  ๋ฌธ์„œ ์ˆ˜.
      • fetch_k: MMR ๊ฒ€์ƒ‰์—์„œ ์ดˆ๊ธฐ ํƒ์ƒ‰ ๋ฌธ์„œ ์ˆ˜.
      • lambda_mult: MMR ๊ฒฐ๊ณผ์—์„œ ์œ ์‚ฌ์„ฑ๊ณผ ๋‹ค์–‘์„ฑ ๊ฐ„์˜ ๊ท ํ˜• ์กฐ์ ˆ.


2. ๊ฒ€์ƒ‰ ๋ฐฉ๋ฒ•

๊ฒ€์ƒ‰๊ธฐ๋Š” ์‚ฌ์šฉ์ž์˜ ์งˆ์˜(Query)๋ฅผ ๋ฒกํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ์ด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด ๋ฒกํ„ฐ๋“ค๊ณผ ๋น„๊ตํ•˜์—ฌ ๊ฐ€์žฅ ๊ด€๋ จ์„ฑ ๋†’์€ ๋ฌธ์„œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

(1) ์œ ์‚ฌ๋„ ๊ฒ€์ƒ‰(Similarity Search)

  • ์›๋ฆฌ:
    • ๋ฒกํ„ฐ ๊ฐ„์˜ ์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ์งˆ์˜์™€ ๊ฐ€์žฅ ์œ ์‚ฌํ•œ ๋ฌธ์„œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
  • ์žฅ์ :
    • ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜๊ณ  ๋น ๋ฅธ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅ.
  • ๋‹จ์ :
    • ๋ฐ˜ํ™˜๋œ ๋ฌธ์„œ๊ฐ€ ์ค‘๋ณต๋˜๊ฑฐ๋‚˜ ๋‹ค์–‘์„ฑ์ด ๋‚ฎ์„ ์ˆ˜ ์žˆ์Œ.
  • ์‚ฌ์šฉ ์‚ฌ๋ก€:
    • ์ถ”์ฒœ ์‹œ์Šคํ…œ, ๋‹จ์ˆœ ์ •๋ณด ๊ฒ€์ƒ‰.
  • ์ฝ”๋“œ ์˜ˆ์‹œ:
    1
    2
    
    retriever = vector_db.as_retriever(search_type="similarity", 
                                       search_kwargs={"k": 5})
    

(2) MMR (Maximal Marginal Relevance)

  • ์›๋ฆฌ:
    • ์งˆ์˜์— ๋Œ€ํ•œ ์œ ์‚ฌ๋„์™€ ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ ๊ฐ„ ๋‹ค์–‘์„ฑ์„ ๋™์‹œ์— ๊ณ ๋ คํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    • lambda_mult ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์œ ์‚ฌ์„ฑ๊ณผ ๋‹ค์–‘์„ฑ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ์กฐ์ •.
  • ์žฅ์ :
    • ๊ฒฐ๊ณผ์˜ ๋‹ค์–‘์„ฑ์„ ํ™•๋ณด.
    • ์ค‘๋ณต ๋ฌธ์„œ๋ฅผ ๋ฐฉ์ง€.
  • ๋‹จ์ :
    • ๊ณ„์‚ฐ ๋น„์šฉ์ด ๋” ๋†’์Œ.
  • ์‚ฌ์šฉ ์‚ฌ๋ก€:
    • ๋ฌธ์„œ ์š”์•ฝ, ์ค‘๋ณต ์—†๋Š” ์ •๋ณด ์ œ๊ณต.
  • ์ฝ”๋“œ ์˜ˆ์‹œ:
    1
    2
    3
    4
    5
    
    retriever = vector_db.as_retriever(search_type="mmr",
                                       search_kwargs={"k": 5,
                                                      "fetch_k": 10,
                                                      "lambda_mult": 0.6}
    )
    

(3) ์œ ์‚ฌ๋„ ์ ์ˆ˜ ์ž„๊ณ„๊ฐ’ ๊ฒ€์ƒ‰(Similarity Score Threshold)

  • ์›๋ฆฌ:
    • ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ค‘, ์œ ์‚ฌ๋„ ์ ์ˆ˜๊ฐ€ ํŠน์ • ์ž„๊ณ„๊ฐ’ ์ด์ƒ์ธ ๋ฌธ์„œ๋งŒ ๋ฐ˜ํ™˜.
  • ์žฅ์ :
    • ์งˆ์˜์™€ ๊ด€๋ จ ์—†๋Š” ๋ฌธ์„œ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ํ•„ํ„ฐ๋ง.
  • ๋‹จ์ :
    • ์ž„๊ณ„๊ฐ’ ์„ค์ •์ด ์–ด๋ ค์›€(๋„ˆ๋ฌด ๋†’์œผ๋ฉด ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋ถ€์กฑ, ๋„ˆ๋ฌด ๋‚ฎ์œผ๋ฉด ๋ถˆํ•„์š”ํ•œ ๊ฒฐ๊ณผ ํฌํ•จ).
  • ์‚ฌ์šฉ ์‚ฌ๋ก€:
    • ๊ฒ€์ƒ‰ ์ •ํ™•๋„๊ฐ€ ์ค‘์š”ํ•œ ์ƒํ™ฉ.
  • ์ฝ”๋“œ ์˜ˆ์‹œ:
    1
    2
    3
    4
    
    retriever = vector_db.as_retriever(
        search_type="similarity_score_threshold",
        search_kwargs={"score_threshold": 0.8}
    )
    

2.3. ์ƒ์„ฑ๊ธฐ

์•ž ์žฅ 2.2 ๊ฒ€์ƒ‰๊ธฐ์—์„œ ๋งŒ๋“  ๊ฒ€์ƒ‰๊ธฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋™์ž‘์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  1. ์งˆ์˜(Query) ์ฒ˜๋ฆฌ: ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ์„ ๋ฒกํ„ฐ๋กœ ๋ณ€ํ™˜.
  2. ๋ฒกํ„ฐ ๋น„๊ต: ์งˆ์˜ ๋ฒกํ„ฐ์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด ์ €์žฅ๋œ ๋ฒกํ„ฐ ๊ฐ„์˜ ์œ ์‚ฌ๋„ ๊ณ„์‚ฐ.
  3. ๋ฌธ์„œ ์„ ํƒ: ์„ ํƒ๋œ ๊ฒ€์ƒ‰ ๋ฐฉ์‹์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ ๋ฌธ์„œ ํ•„ํ„ฐ๋ง(์œ ์‚ฌ๋„, MMR, ์ž„๊ณ„๊ฐ’ ๊ธฐ์ค€).
  4. ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜: ์„ ํƒ๋œ ๋ฌธ์„œ๋ฅผ ๋ฐ˜ํ™˜.

๐Ÿค” ํ•˜์ง€๋งŒ ๊ฒ€์ƒ‰๊ธฐ๋งŒ์œผ๋กœ๋Š” ์ตœ์ข…์ ์ธ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์ด ์ถ”๊ฐ€์ ์œผ๋กœ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

=> ์ด ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ์ƒ์„ฑ๊ธฐ(Generator)์ž…๋‹ˆ๋‹ค.

  • ๊ฒ€์ƒ‰๊ธฐ๋Š” ๊ด€๋ จ ๋ฌธ์„œ๋ฅผ ์ž˜ ์ฐพ์•„๋‚ด์ง€๋งŒ, ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•˜๊ธฐ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:
    • ๋ฌธ์„œ๊ฐ€ ๋„ˆ๋ฌด ๊ธธ๊ฑฐ๋‚˜ ์งˆ๋ฌธ๊ณผ ๊ด€๋ จ ์—†๋Š” ์„ธ๋ถ€ ์ •๋ณด ํฌํ•จ ๊ฐ€๋Šฅ.
    • ์งˆ๋ฌธ์˜ ๋งฅ๋ฝ์— ๋งž๋Š” ์š”์•ฝ์ด ํ•„์š”.
    • ์‚ฌ์šฉ์ž์—๊ฒŒ ์ตœ์ ํ™”๋œ ๋‹ต๋ณ€์ด ์š”๊ตฌ๋จ.
  • ๋”ฐ๋ผ์„œ ์ƒ์„ฑ๊ธฐ๋Š” ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ๋ฅผ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž ์งˆ๋ฌธ์— ๋งž๋Š” ๊ฐ„๊ฒฐํ•˜๊ณ  ์ •ํ™•ํ•œ ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

๊ฒ€์ƒ‰๊ธฐ์™€ ์ƒ์„ฑ๊ธฐ์˜ ์—ฐ๊ฒฐ

๊ฒ€์ƒ‰๊ธฐ์™€ ์ƒ์„ฑ๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ๋ฆ„์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค:

  1. ์งˆ์˜(Query) โ†’ ๊ฒ€์ƒ‰๊ธฐ:

    • ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ์„ ๋ฒกํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์œ ์‚ฌํ•œ ๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰.
  2. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ โ†’ ์ƒ์„ฑ๊ธฐ:

    • ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ LLM(Language Model)์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์งˆ๋ฌธ์— ๋Œ€ํ•œ ์ตœ์ ํ™”๋œ ๋‹ต๋ณ€ ์ƒ์„ฑ.
  3. LLM โ†’ ์‘๋‹ต ์ƒ์„ฑ:

    • ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ์™€ ์งˆ๋ฌธ์„ ๊ฒฐํ•ฉํ•œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ํ†ตํ•ด LLM์ด ๋‹ต๋ณ€์„ ์ƒ์„ฑ.

2.3.1. RAG ํ”„๋กฌํ”„ํŠธ

์ƒ์„ฑ๊ธฐ์˜ ํ•ต์‹ฌ์€ ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ๋ฅผ ์งˆ๋ฌธ๊ณผ ํ•จ๊ป˜ ์–ธ์–ด ๋ชจ๋ธ์— ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ํ”„๋กฌํ”„ํŠธ๋ฅผ ์„ค๊ณ„ํ•˜์—ฌ LLM์ด ํ™˜๊ฐ(Hallucination)์„ ์ค„์ด๊ณ  ๋ช…ํ™•ํ•œ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•˜๋„๋ก ์œ ๋„ํ•ฉ๋‹ˆ๋‹ค.

  • ํ”„๋กฌํ”„ํŠธ ์˜ˆ์‹œ

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
      prompt = PromptTemplate.from_template(
      """
      ๋‹น์‹ ์€ ์งˆ๋ฌธ ๋‹ต๋ณ€ ์ž‘์—…์„ ์œ„ํ•œ ์–ด์‹œ์Šคํ„ดํŠธ์ž…๋‹ˆ๋‹ค.
      ์ œ๊ณต๋œ ์ปจํ…์ŠคํŠธ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์งˆ๋ฌธ์— ๋‹ต๋ณ€ํ•ด ์ฃผ์„ธ์š”.
      ๋‹ต์„ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ชจ๋ฅธ๋‹ค๊ณ  ๋ง์”€ํ•ด ์ฃผ์„ธ์š”.
      ํ•œ๊ตญ์–ด๋กœ ๋‹ต๋ณ€ํ•ด ์ฃผ์„ธ์š”.
      
      #์งˆ๋ฌธ: {question}
      #์ปจํ…์ŠคํŠธ: {context}
      #๋‹ต๋ณ€:
      """
      )
    
  • ์ด ํ”„๋กฌํ”„ํŠธ๋Š” RAG(Retrieval-Augmented Generation) ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ์œผ๋กœ, ์ฃผ์–ด์ง„ ์งˆ๋ฌธ์— ๋Œ€ํ•ด ๊ฒ€์ƒ‰๋œ ์ปจํ…์ŠคํŠธ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ•œ๊ตญ์–ด๋กœ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ(question)๊ณผ ๊ฒ€์ƒ‰๊ธฐ๋ฅผ ํ†ตํ•ด ์–ป์€ ๊ด€๋ จ ๋ฌธ๋งฅ(context)์ด ๊ฐ๊ฐ {question}๊ณผ {context} ์œ„์น˜์— ์‚ฝ์ž…๋ฉ๋‹ˆ๋‹ค.

    • question: ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ.
    • context: ๊ฒ€์ƒ‰๊ธฐ๋ฅผ ํ†ตํ•ด ๋ฐ˜ํ™˜๋œ ๊ด€๋ จ ๋ฌธ์„œ.
    • ๊ฒฐ๊ณผ : LLM์€ ์งˆ๋ฌธ๊ณผ ๊ด€๋ จ ๋ฌธ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ •ํ™•ํ•˜๊ณ  ์š”์•ฝ๋œ ๋‹ต๋ณ€์„ ์ƒ์„ฑ.

2.3.2. ์–ธ์–ด ๋ชจ๋ธ ์ƒ์„ฑ

์ƒ์„ฑ๊ธฐ๋Š” LLM์„ ํ™œ์šฉํ•˜์—ฌ ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ์™€ ์งˆ๋ฌธ์„ ๋ฐ”ํƒ•์œผ๋กœ ๋‹ต๋ณ€์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. OpenAI์˜ GPT-4, Hugging Face ๋ชจ๋ธ ๋“ฑ ๋‹ค์–‘ํ•œ ์–ธ์–ด ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ฝ”๋“œ ์˜ˆ์‹œ
1
2
3
4
from langchain.chat_models import ChatOpenAI

llm = ChatOpenAI(model_name="gpt-4", temperature=0.5, max_tokens=1000)

  • temperature: Temperature๋Š” LLM์˜ ์ถœ๋ ฅ ๋‹ค์–‘์„ฑ๊ณผ ์ฐฝ์˜์„ฑ์„ ์กฐ์ ˆํ•˜๋Š” ํ•ต์‹ฌ ํŒŒ๋ผ๋ฏธํ„ฐ์ž…๋‹ˆ๋‹ค. ๋‚ฎ์€ Temperature์€ ์‚ฌ์‹ค์ ์ด๊ณ  ๊ฐ„๊ฒฐํ•œ ์‘๋‹ต์„, ๋†’์€ Temperature์€ ํ† ํฐ์˜ ๋ฌด์ž‘์œ„์„ฑ์ด ์ฆ๊ฐ€ํ•˜์—ฌ ๋ณด๋‹ค ๋‹ค์–‘ํ•˜๊ณ  ์ฐฝ์กฐ์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์ด‰์ง„ํ•ฉ๋‹ˆ๋‹ค.

    • Temperature ์„ ํƒ Tips
      • 0.0-0.5: ์ •ํ™•์„ฑ์ด ์ค‘์š”ํ•œ ์ž‘์—…(์˜ˆ: ๊ณ ๊ฐ ์„œ๋น„์Šค, ๊ธฐ์ˆ  ๋ฌธ์„œ)
      • 0.6-0.7: ์ผ๋ฐ˜์ ์ธ ์šฉ๋„
      • 0.8-1.0: ์ฐฝ์˜์  ์ž‘์—…
  • max_tokens: Max tokens๋Š” ๋ชจ๋ธ์ด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ถœ๋ ฅ ํ…์ŠคํŠธ์˜ ์ตœ๋Œ€ ๊ธธ์ด๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, ํ”„๋กฌํ”„ํŠธ์˜ ํ† ํฐ ์ˆ˜์™€ max_tokens์˜ ํ•ฉ์ด ๋ชจ๋ธ์˜ ์ปจํ…์ŠคํŠธ ๊ธธ์ด๋ฅผ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    • Max Tokens ์„ค์ • Tips
      • ๋ชจ๋ธ์˜ ์ปจํ…์ŠคํŠธ ๊ธธ์ด ์ œํ•œ ๊ณ ๋ ค
      • ์‹ค์ œ ํ•„์š”ํ•œ ์ถœ๋ ฅ ๊ธธ์ด์— ๋งž๊ฒŒ ์ ์ ˆํžˆ ์„ค์ •
      • ์งง์€ ์‘๋‹ต์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋” ๋‚ฎ์€ ๊ฐ’ ์„ค์ •

(์ถ”๊ฐ€) Top-P(sampling)๋Š” ๋ชจ๋ธ์ด ๋‹ค์Œ ํ† ํฐ(๋‹จ์–ด)์„ ์„ ํƒํ•  ๋•Œ ๋ˆ„์  ํ™•๋ฅ ์„ ๊ธฐ์ค€์œผ๋กœ ์„ ํƒ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์ž…๋‹ˆ๋‹ค.

  • ํ™•๋ฅ ์ด ๋†’์€ ํ† ํฐ๋ถ€ํ„ฐ ๋ˆ„์  ํ™•๋ฅ ์„ ๊ณ„์‚ฐํ•˜์—ฌ ์„ค์ •๋œ P๊ฐ’์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€์˜ ํ† ํฐ๋“ค๋งŒ ์„ ํƒ ๋Œ€์ƒ์œผ๋กœ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด Top-P๊ฐ€ 0.9๋ผ๋ฉด, ํ™•๋ฅ ์ด ๋†’์€ ์ˆœ์„œ๋Œ€๋กœ ํ† ํฐ๋“ค์„ ๋”ํ•ด๊ฐ€๋‹ค๊ฐ€ ํ•ฉ์ด 90%๊ฐ€ ๋˜๋Š” ์ง€์ ๊นŒ์ง€์˜ ํ† ํฐ๋“ค๋งŒ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.

(Tips) Top-P & Temperature์™€์˜ ๊ด€๊ณ„

  • Temperature์™€ Top-P๋Š” ๋ชจ๋‘ ํ…์ŠคํŠธ ์ƒ์„ฑ์˜ ๋‹ค์–‘์„ฑ์„ ์ œ์–ดํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์ด์ง€๋งŒ:
    • Temperature๋Š” ์ „์ฒด ํ™•๋ฅ  ๋ถ„ํฌ๋ฅผ ์กฐ์ •ํ•˜์—ฌ ๋‹ค์–‘์„ฑ์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
    • Top-P๋Š” ์„ ํƒ ๊ฐ€๋Šฅํ•œ ํ† ํฐ์˜ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•˜์—ฌ ๋‹ค์–‘์„ฑ์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
  • ์œ„ ๊ทธ๋ฆผ์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค์ • ์‹œ, ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ๋ณ€๊ฒฝํ•˜๋ผ๊ณ  ๊ถŒ์žฅํ•˜๋Š” ์ด์œ ๋Š”:
    • ๋‘ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋™์‹œ์— ์กฐ์ •ํ•˜๋ฉด ์˜๋„์น˜ ์•Š์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
    • Temperature์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ Top-P๋Š” ๋†’์€ Temperature์—์„œ ์™„์ „ํžˆ ์ด์ƒํ•œ ํ† ํฐ์ด ์„ ํƒ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

(์˜ˆ์‹œ) Top-P ๊ฐ’์— ๋”ฐ๋ฅธ โ€œ๊ฐ•์•„์ง€๋Š” ์–ด๋–ค ๋™๋ฌผ์ธ๊ฐ€์š”?โ€์— ๋Œ€ํ•œ ๋‹ต๋ณ€ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ๋‚ฎ์€ Top-P (0.3)

    ๋ชจ๋ธ์€ ๊ฐ€์žฅ ํ™•๋ฅ ์ด ๋†’์€ ๋ช‡ ๊ฐ€์ง€ ์„ ํƒ์ง€๋งŒ ๊ณ ๋ คํ•˜์—ฌ ๋‹ต๋ณ€:

    โ€œ๊ฐ•์•„์ง€๋Š” ๊ฐœ๊ณผ์— ์†ํ•˜๋Š” ํฌ์œ ๋ฅ˜์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๊ณผ ํ•จ๊ป˜ ์‚ฌ๋Š” ๋ฐ˜๋ ค๋™๋ฌผ์ž…๋‹ˆ๋‹ค.โ€

  • ๋†’์€ Top-P (0.9)

    ๋” ๋งŽ์€ ์„ ํƒ์ง€๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ๋‹ค์–‘ํ•œ ํ‘œํ˜„ ๊ฐ€๋Šฅ:

    โ€œ๊ฐ•์•„์ง€๋Š” ๊ฐœ๊ณผ์— ์†ํ•˜๋Š” ํฌ์œ ๋ฅ˜์ด๋ฉด์„œ, ์ถฉ์‹คํ•œ ๋ฐ˜๋ ค๋™๋ฌผ์ž…๋‹ˆ๋‹ค. ๋†€๋ผ์šด ํ›„๊ฐ๊ณผ ์ฒญ๊ฐ์„ ๊ฐ€์กŒ์œผ๋ฉฐ, ๋‹ค์–‘ํ•œ ํฌ๊ธฐ์™€ ํ’ˆ์ข…์ด ์žˆ๊ณ , ์ธ๊ฐ„๊ณผ ํŠน๋ณ„ํ•œ ์œ ๋Œ€๊ด€๊ณ„๋ฅผ ํ˜•์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ •์ด ํ’๋ถ€ํ•œ ๋™๋ฌผ์ž…๋‹ˆ๋‹ค.โ€

(์˜ˆ์‹œ) Temperature ๊ฐ’์— ๋”ฐ๋ฅธ โ€œ๊ฐ•์•„์ง€๋Š” ์–ด๋–ค ๋™๋ฌผ์ธ๊ฐ€์š”?โ€์— ๋Œ€ํ•œ ๋‹ต๋ณ€ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค

  • ๋‚ฎ์€ Temperature (0.2)

    ๋” ์‚ฌ์‹ค์ ์ด๊ณ  ์ผ๊ด€๋œ ๋‹ต๋ณ€:

    โ€œ๊ฐ•์•„์ง€๋Š” ๊ฐœ๊ณผ์— ์†ํ•˜๋Š” ๋ฐ˜๋ ค๋™๋ฌผ์ž…๋‹ˆ๋‹ค. ์ถฉ์‹คํ•˜๊ณ  ์‚ฌ๋žŒ๊ณผ ์ž˜ ์–ด์šธ๋ฆฌ๋ฉฐ ๋ณดํ˜ธ์ž์—๊ฒŒ ์ถฉ์„ฑ์‹ฌ์ด ๊ฐ•ํ•ฉ๋‹ˆ๋‹ค.โ€

  • ๋†’์€ Temperature (0.8)

    ๋” ์ฐฝ์˜์ ์ด๊ณ  ๋‹ค์–‘ํ•œ ๋‹ต๋ณ€:

    โ€œ๊ฐ•์•„์ง€๋Š” ์šฐ๋ฆฌ์˜ ์‚ถ์„ ํ–‰๋ณต์œผ๋กœ ๋ฌผ๋“ค์ด๋Š” ๋งˆ๋ฒ• ๊ฐ™์€ ์กด์žฌ์˜ˆ์š”! ๋•Œ๋กœ๋Š” ์žฅ๋‚œ๊พธ๋Ÿฌ๊ธฐ ๊ด‘๋Œ€์ฒ˜๋Ÿผ, ๋•Œ๋กœ๋Š” ๋“ ๋“ ํ•œ ์ˆ˜ํ˜ธ์ฒœ์‚ฌ์ฒ˜๋Ÿผ ์šฐ๋ฆฌ ๊ณ์„ ์ง€์ผœ์ฃผ์ฃ .โ€


2.3.3. Chaining

LangChain์„ ํ™œ์šฉํ•˜๋ฉด ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ์™€ ์งˆ๋ฌธ์„ ๊ฒฐํ•ฉํ•ด ์ž์—ฐ์Šค๋Ÿฌ์šด ํ๋ฆ„์œผ๋กœ ์ƒ์„ฑ๊ธฐ์™€ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ฒด์ด๋‹(Chaining)์ด๋ผ๊ณ  ํ•˜๋ฉฐ, ๊ฒ€์ƒ‰๊ณผ ์ƒ์„ฑ ๋‹จ๊ณ„๋ฅผ ํ•˜๋‚˜์˜ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

LCEL(LangChain Expression Language)์„ ์‚ฌ์šฉํ•˜์—ฌ Chain์„ ์—ฐ๊ฒฐํ•˜๋ฉด ๋ณต์žกํ•œ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์˜ ๋…ผ๋ฆฌ์  ํ๋ฆ„์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(์ฐธ๊ณ ) LCEL(LangChain Expression Language)

LangChain Expression Language(LCEL)์€ LangChain ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด์—์„œ ๋‹ค์–‘ํ•œ ์ปดํฌ๋„ŒํŠธ(Ex. ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ, ์–ธ์–ด ๋ชจ๋ธ, ์ถœ๋ ฅ ํŒŒ์„œ ๋“ฑ)๋ฅผ ์„ ์–ธ์  ๋ฐฉ์‹์œผ๋กœ ๊ฒฐํ•ฉํ•˜์—ฌ ์ฒด์ธ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

  • ์ด๋ฅผ ํ†ตํ•ด ๋ณต์žกํ•œ LLM(Large Language Model) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐ„๊ฒฐํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ฃผ์š” ํŠน์ง•:
    • ์„ ์–ธ์  ๊ตฌ๋ฌธ: ๋ณต์žกํ•œ ๋กœ์ง์„ ๊ฐ„๋‹จํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฌ์šด ๋ฐฉ์‹์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋ชจ๋“ˆ์„ฑ: ๋‹ค์–‘ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‰ฝ๊ฒŒ ์กฐํ•ฉํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์œ ์—ฐ์„ฑ: ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ LLM ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํ™•์žฅ์„ฑ: ์‚ฌ์šฉ์ž ์ •์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‰ฝ๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ตœ์ ํ™”: ์‹คํ–‰ ์‹œ ์ž๋™์œผ๋กœ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ:
    • Runnable: ๋ชจ๋“  LCEL ์ปดํฌ๋„ŒํŠธ์˜ ๊ธฐ๋ณธ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
    • Chain: ์—ฌ๋Ÿฌ Runnable์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • RunnableMap: ์—ฌ๋Ÿฌ Runnable์„ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • RunnableSequence: Runnable์˜ ์‹œํ€€์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
    • RunnableLambda: ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜๋ฅผ Runnable๋กœ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค

์ฝ”๋“œ ์˜ˆ์‹œ 1

  • ๋‹จ์ผ ์ฒด์ธ : ์ฒด์ด๋‹(Chaining)์€ ๊ฒ€์ƒ‰๊ธฐ์—์„œ ๋ฐ˜ํ™˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž์—ฐ์–ด ๋ชจ๋ธ(LLM)๋กœ ์ „๋‹ฌํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์„ ๋‹จ์ผ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
1
2
3
4
5
6
7
8
9
10
11
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser

# ๊ฒ€์ƒ‰ ๋ฌธ์„œ ํ˜•์‹ํ™” ํ•จ์ˆ˜
def format_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)

chain = {
    "question": RunnablePassthrough(),
    "context": faiss_retriever | format_docs
} | prompt | llm | StrOutputParser()

์ฃผ์š” ๊ตฌ์„ฑ์š”์†Œ ์„ค๋ช…:

  • RunnablePassThrough():

    • ์ž…๋ ฅ๋œ ์งˆ๋ฌธ์„ ๊ทธ๋Œ€๋กœ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
    • โ€œquestionโ€ ํ‚ค๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋œ ์งˆ๋ฌธ์€ ๋ณ€ํ™˜ ์—†์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
  • retriever | format_docs:

    • ๊ฒ€์ƒ‰๊ธฐ(retriever)๋ฅผ ํ†ตํ•ด ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ๋ฅผ ํฌ๋งทํŒ…ํ•˜์—ฌ โ€œcontextโ€๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
    • format_docs๋Š” ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ์˜ ๋‚ด์šฉ์„ ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด๋กœ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  • prompt | llm | StrOutputParser():

    • ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ(context)์™€ ์งˆ๋ฌธ(question)์„ ๊ฒฐํ•ฉํ•˜์—ฌ LLM์— ์ „๋‹ฌํ•˜๊ณ , ์‘๋‹ต์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ์ƒ์„ฑ๋œ ์‘๋‹ต์€ ๋ฌธ์ž์—ด ํ˜•ํƒœ(StrOutputParser)๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

์œ„์—์ฒ˜๋Ÿผ chain์„ ์ •์˜ํ•˜๊ณ  ์•„๋ž˜ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ ์˜ˆ์‹œ 2

  • ๋ณต์ˆ˜ ์ฒด์ธ: LCEL์„ ํ™œ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ์ฒด์ธ์„ ์—ฐ๊ฒฐํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ฒด์ธ์„ ์—ฐ๊ฒฐํ•˜์—ฌ ๋‹ค๋‹จ๊ณ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•œ ์ถ”๊ฐ€ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableParallel, RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser

# ์ฒซ ๋ฒˆ์งธ ์ฒด์ธ: ํ•œ๊ตญ์–ด ์งˆ๋ฌธ์„ ์˜์–ด๋กœ ๋ฒˆ์—ญ (KOR2ENG)
prompt1 = ChatPromptTemplate.from_template(
    "[{korean_input}] translate the question into English. 
    Don't say anything else, just translate it."
)

chain1 = (
    prompt1
    | llm
    | StrOutputParser()
)

# ๋‘ ๋ฒˆ์งธ ์ฒด์ธ: ๋ฒˆ์—ญ๋œ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋Œ€๋‹ต ์ƒ์„ฑ
prompt2 = ChatPromptTemplate.from_messages([
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "{input}"}
])

chain2 = (
    {"input": chain1}  # chain1์˜ ์ถœ๋ ฅ์ด chain2์˜ input์œผ๋กœ ์ „๋‹ฌ๋จ
    | prompt2
    | llm
    | StrOutputParser()
)

# ์ฒด์ธ ์‹คํ–‰
result = chain2.invoke({"korean_input": "๋Œ€ํ†ต๋ น์ œ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ค˜"})
print(result)

์ฃผ์š” ๊ตฌ์„ฑ์š”์†Œ ์„ค๋ช…:

  • chain1: ํ•œ๊ตญ์–ด -> ์˜์–ด ๋ฒˆ์—ญ (KOR2ENG)

    • ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ๋ฐ›์€ ํ•œ๊ตญ์–ด ์งˆ๋ฌธ(korean_input)์„ ์˜์–ด๋กœ ๋ฒˆ์—ญ.
    • ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ๊ณผ LLM์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒˆ์—ญ ์ž‘์—… ์ˆ˜ํ–‰.
  • chain2: ์˜์–ด ์งˆ๋ฌธ -> ๋‹ต๋ณ€ ์ƒ์„ฑ

    • chain1์˜ ์ถœ๋ ฅ(๋ฒˆ์—ญ๋œ ์˜์–ด ์งˆ๋ฌธ)์„ ์ž…๋ ฅ๋ฐ›์•„ ๋‹ต๋ณ€ ์ƒ์„ฑ.
    • ๋ฒˆ์—ญ๋œ ์งˆ๋ฌธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ LLM์„ ํ†ตํ•ด ์ตœ์ ์˜ ๋‹ต๋ณ€์„ ๋ฐ˜ํ™˜.
  • ์ฒด์ธ ์—ฐ๊ฒฐ:

    • chain1์˜ ์ถœ๋ ฅ์€ ์ž๋™์œผ๋กœ chain2์˜ ์ž…๋ ฅ(input)์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
    • LCEL ๋ฌธ๋ฒ•์„ ํ†ตํ•ด ์ฒด์ธ์„ ์ง๊ด€์ ์ด๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์—ฐ๊ฒฐ.

์ฒด์ธ ํ๋ฆ„

  • ๊ทธ๋ ‡๋‹ค๋ฉด chain2.invoke({"korean_input": "๋Œ€ํ†ต๋ น์ œ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ค˜"})์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœ์ด ๋ ๊นŒ์š”?
    1. chain2.invoke() ํ˜ธ์ถœ
      • ์ž…๋ ฅ: {"korean_input": "๋Œ€ํ†ต๋ น์ œ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ค˜"}
      • korean_input์€ chain1์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
    2. chain1 ์‹คํ–‰: ๋ฒˆ์—ญ ์ž‘์—…
      • prompt1์—์„œ ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
        1
        2
        3
        
               
        [๋Œ€ํ†ต๋ น์ œ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ค˜] translate the question into English. 
        Don't say anything else, just translate it.
        
      • LLM์ด ์ด ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ฒˆ์—ญ๋œ ์˜์–ด ์งˆ๋ฌธ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
        1
        2
        
               
        "Explain about the presidential system."
        
    3. ๋ฒˆ์—ญ ๊ฒฐ๊ณผ๋ฅผ chain2๋กœ ์ „๋‹ฌ
      • chain1์˜ ์ถœ๋ ฅ์ธ ๋ฒˆ์—ญ๋œ ์งˆ๋ฌธ โ€œExplain about the presidential system.โ€์ด chain2์˜ ์ž…๋ ฅ์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
    4. chain2 ์‹คํ–‰: ๋Œ€๋‹ต ์ƒ์„ฑ
      • prompt2์˜ ํ…œํ”Œ๋ฆฟ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค:

        1
        2
        3
        
               
        SYSTEM: You are a helpful assistant.
        USER: Explain about the presidential system.
        
      • LLM์ด ์ด ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋Œ€๋‹ต์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:

        1
        2
        
               
         "A presidential system is a form of government where the president is the head of state and government, often elected by the people."
        

(์ •๋ฆฌ) ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„: korean_input โ†’ chain1 โ†’ chain2.

์ฝ”๋“œ ์˜ˆ์‹œ 3

  • ๋ณ‘๋ ฌ ์ฒด์ธ: LCEL์€ ์ฒด์ธ์„ ์œ ์—ฐํ•˜๊ฒŒ ์—ฐ๊ฒฐํ•˜๊ฑฐ๋‚˜ ๋ณ‘๋ ฌ ์‹คํ–‰์„ ์ง€์›ํ•˜์—ฌ ๋” ๋ณต์žกํ•œ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableParallel

# ๋‘ ๊ฐœ์˜ ์ฒด์ธ ์ƒ์„ฑ
joke_chain = (
			ChatPromptTemplate.from_template("{topic}์— ๊ด€ํ•œ ์งง์€ ๋†๋‹ด์„ ๋งํ•ด์ค˜")
			| llm 
            | StrOutputParser()
            )

poem_chain = (
			ChatPromptTemplate.from_template("{topic}์— ๊ด€ํ•œ 5์ค„ ํ˜„๋Œ€์‹œ๋ฅผ ์จ์ค˜")
            | llm 
            | StrOutputParser()
            )

# ๋ณ‘๋ ฌ ์‹คํ–‰
parallel_chain = RunnableParallel({"joke": joke_chain, "poem": poem_chain})

# ์‹คํ–‰
response = parallel_chain.invoke({"topic": "AI"})
print(response["joke"].content)
print(response["poem"].content)

์ฃผ์š” ๊ตฌ์„ฑ์š”์†Œ ์„ค๋ช…:

  • RunnableParallel:

    • ๋‘ ๊ฐœ์˜ ์ฒด์ธ์„ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • joke_chain๊ณผ poem_chain์ด ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ, ๋™์ผํ•œ ์ž…๋ ฅ ๋ณ€์ˆ˜(topic)๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.
  • joke_chain:

    • ์ž…๋ ฅ๋œ ์ฃผ์ œ(topic)์— ๋Œ€ํ•ด ์งง์€ ๋†๋‹ด์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ํ”„๋กฌํ”„ํŠธ์™€ ์–ธ์–ด ๋ชจ๋ธ(LLM)์„ ์—ฐ๊ฒฐํ•˜์—ฌ ์‘๋‹ต์„ ์ƒ์„ฑ.
  • poem_chain:

    • ๋™์ผํ•œ ์ฃผ์ œ์— ๋Œ€ํ•ด ์งง์€ ์‹œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • joke_chain๊ณผ ๋™์ผํ•œ ๊ตฌ์กฐ๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ, ์‘๋‹ต์˜ ๋‚ด์šฉ์€ ์‹œ(poem)๋กœ ์„ค์ •.
  • ๊ฒฐ๊ณผ ๋ณ‘ํ•ฉ:

    • RunnableParallel์€ ๋‘ ์ฒด์ธ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณ‘ํ•ฉํ•˜์—ฌ โ€œjokeโ€์™€ โ€œpoemโ€ ํ‚ค์— ์ €์žฅ๋œ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Chapter 3: Advanced RAG

Advanced RAG๋ž€?

Advanced RAG๋Š” Naive RAG์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉด์„œ๋„, ๊ฒ€์ƒ‰ ํ’ˆ์งˆ ํ–ฅ์ƒ๊ณผ ๋‹ต๋ณ€ ์ƒ์„ฑ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์ถ”๊ฐ€์ ์ธ ์ „๋žต๊ณผ ๊ณผ์ •์„ ํฌํ•จํ•œ ๊ณ ๋„ํ™”๋œ RAG ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

  • ์ด ๊ตฌ์กฐ๋Š” Naive RAG์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ ์ •ํ™•๋„ ์ €ํ•˜์™€ ์ค‘๋ณต๋œ ์‘๋‹ต ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , ๋”์šฑ ๋ณต์žกํ•œ ์งˆ๋ฌธ์— ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฒ€์ƒ‰ ํ’ˆ์งˆ ํ–ฅ์ƒ์ด๋ผ๋Š” ๋ชฉํ‘œ๋ฅผ ๋‘๊ณ , ์•„๋ž˜ ์‚ฌํ•ญ๋“ค์ด ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ์ง€์‹ํ™” ์ฆ๊ฐ•(Knowledge Enrichment):
      • ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ๋ฅผ ์ถ”๊ฐ€ ๊ฐ€๊ณตํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ์ง€์‹๊ณผ ์—ฐ๊ฒฐํ•˜์—ฌ ์ •๋ณด์˜ ๊นŠ์ด๋ฅผ ๊ฐ•ํ™”.
      • ์˜ˆ: ์š”์•ฝ, ํ†ตํ•ฉ, ๋„๋ฉ”์ธ ์ง€์‹ ์ ์šฉ.
    • ๊ฒ€์ƒ‰ ์ „ ์ตœ์ ํ™”(Pre-Retrieval Process):
      • ๊ฒ€์ƒ‰ ์ „ ์ฟผ๋ฆฌ๋ฅผ ์ตœ์ ํ™”ํ•˜๊ฑฐ๋‚˜ ํ•„ํ„ฐ๋ง.
      • ์˜ˆ: ์ ํ•ฉํ•œ ํ‚ค์›Œ๋“œ ์ถ”์ถœ, ๋ถˆํ•„์š”ํ•œ ์ฟผ๋ฆฌ ์ œ๊ฑฐ.
    • ๊ฒ€์ƒ‰ ํ›„ ์ตœ์ ํ™”(Post-Retrieval Process):
      • ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๊ฑฐ๋‚˜ ์ค‘์š”๋„๋ฅผ ์žฌ์กฐ์ •ํ•˜์—ฌ ์ ํ•ฉํ•œ ๋ฌธ์„œ๋งŒ ์„ ํƒ.
      • ์˜ˆ: MMR(Maximal Marginal Relevance) ๋ฐฉ์‹ ์ ์šฉ, ๊ด€๋ จ์„ฑ ์ ์ˆ˜ ๊ธฐ๋ฐ˜ ์žฌ์ •๋ ฌ.

๊ฐ๊ฐ์˜ ๊ฐœ์„ ์‚ฌํ•ญ์— ๋Œ€ํ•ด์„œ ์•„๋ž˜์—์„œ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


์ฃผ์š” ๊ธฐ์ˆ  ๋ฐ ์ตœ์ ํ™”

1. ์ง€์‹ํ™” ์ฆ๊ฐ•(Knowledge Enrichment)์ด๋ž€?

์ง€์‹ํ™” ์ฆ๊ฐ•์€ ๊ธฐ์กด์˜ ๊ฒ€์ƒ‰ ๊ณผ์ •์„ ๋‹จ์ˆœํžˆ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์—์„œ ๋‚˜์•„๊ฐ€, ๊ฒ€์ƒ‰๋œ ์ •๋ณด๋ฅผ ๋”์šฑ ๊ตฌ์กฐ์ ์ด๊ณ  ํ’๋ถ€ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ๊ฒ€์ƒ‰ ํ’ˆ์งˆ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ์ฃผ์š” ๊ธฐ์ˆ ๊ณผ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค:

  • Document Level

    • ๊ตฌ์กฐ์  ํŒŒ์‹ฑ (Structural Parsing)

      • ๋ฌธ์„œ์˜ ๋ฌธ๋‹จ, ์„น์…˜, ํ‘œ์™€ ๊ฐ™์€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์ •๋ณด์˜ ๊ตฌ์กฐ๋ฅผ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค.
      • ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ ๊ตฌ์กฐ์  ๋ฐ์ดํ„ฐ๋Š” ๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ์˜ ๋งฅ๋ฝ์„ ๋”์šฑ ์ •๊ตํ•˜๊ฒŒ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ ์ฒ˜๋ฆฌ (Multi-Modal Processing)

      • ํ…์ŠคํŠธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ด๋ฏธ์ง€, ํ‘œ, ๋„ํ‘œ์™€ ๊ฐ™์€ ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜์—ฌ, ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ํ†ตํ•ฉ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
      • ์ด๋ฅผ ํ†ตํ•ด ๋‹จ์ˆœ ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์˜ ๊ฒ€์ƒ‰์—์„œ ๋ฒ—์–ด๋‚˜, ๋ณด๋‹ค ์˜๋ฏธ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋กœ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ฆ๊ฐ• (Metadata Enrichment)

      • ๋ฌธ์„œ์˜ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ, ์ž‘์„ฑ์ž, ์นดํ…Œ๊ณ ๋ฆฌ, ์‹œ๊ฐ„ ์Šคํƒฌํ”„ ๋“ฑ ๋ฉ”ํƒ€์ •๋ณด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฒ€์ƒ‰์˜ ์ •ํ™•์„ฑ๊ณผ ์†๋„๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค.
      • ์˜ˆ: ์—”ํ„ฐํ‹ฐ ์ถ”์ถœ(์ธ๋ฌผ, ์žฅ์†Œ, ์‚ฌ๊ฑด ๋“ฑ)์„ ํ†ตํ•ด ์ƒ์„ฑ๋œ ์ง€์‹ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์— ๋ฐ˜์˜.
  • Model Level

    • ์ž„๋ฐฐ๋”ฉ ๋ชจ๋ธ ํŒŒ์ธํŠœ๋‹(Finetune Embedding Models)
      • ์งˆ๋ฌธ๊ณผ ๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ ๊ฐ„์˜ ์˜๋ฏธ์  ๊ด€๋ จ์„ฑ์„ ๊ฐ•ํ™”ํ•˜๊ธฐ ์œ„ํ•ด, ์‚ฌ์ „ ํ•™์Šต๋œ ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ์„ ํŠน์ • ๋„๋ฉ”์ธ์— ๋งž๊ฒŒ ์กฐ์ •ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.
      • ํŠนํžˆ ๋„๋ฉ”์ธ ํŠนํ™” ๊ฒ€์ƒ‰์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ์ผ๋ฐ˜์ ์ธ ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ๋กœ๋Š” ๋ถ€์กฑํ•  ์ˆ˜ ์žˆ์–ด, ํŒŒ์ธํŠœ๋‹์„ ํ†ตํ•ด ์ •ํ™•๋„๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค.

2. ๊ฒ€์ƒ‰ ์ „ ์ตœ์ ํ™” (Pre-Retrieval Optimization)

2.1. HyDE (Hypothetical Document Embeddings)

  • ๊ฐœ๋…: ์‚ฌ์šฉ์ž๊ฐ€ ์ œ์‹œํ•œ ์งˆ๋ฌธ์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ โ€œ๊ฐ€์ƒ์˜ ๋ฌธ์„œโ€๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ ๊ฒ€์ƒ‰ ๊ณผ์ •์— ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

  • ํ•ต์‹ฌ ํŠน์ง•
    1. ๊ฐ€์ƒ ๋ฌธ์„œ ์ƒ์„ฑ: ๋Œ€๊ทœ๋ชจ ์–ธ์–ด ๋ชจ๋ธ(LLM)์„ ์‚ฌ์šฉํ•˜์—ฌ, ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ์„ ์ƒ์„ธํžˆ ๋‹ต๋ณ€ํ•˜๋Š” ๋ฌธ์„œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    2. ์ž„๋ฒ ๋”ฉ ํ™œ์šฉ: ์ƒ์„ฑ๋œ ๊ฐ€์ƒ ๋ฌธ์„œ๋ฅผ ์ž„๋ฒ ๋”ฉํ•˜์—ฌ ๊ฒ€์ƒ‰ ํ”„๋กœ์„ธ์Šค์— ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  • ์žฅ์ :
    • ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ์ด ๊ตฌ์ฒด์ ์ด์ง€ ์•Š์„ ๋•Œ๋„ ํšจ๊ณผ์ ์ธ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • ๊ฐ€์ƒ์˜ ๋‹ต๋ณ€์„ ํ†ตํ•ด, ์‚ฌ์šฉ์ž๊ฐ€ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๋ฌธ๋งฅ์„ ๋ณด์™„ํ•ฉ๋‹ˆ๋‹ค.

  • ํ™œ์šฉ ์˜ˆ์‹œ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from langchain.prompts.chat import SystemMessagePromptTemplate

def generate_hypothetical_document(query):
    template = 
    "Imagine you are an expert writing a detailed explanation on the topic: '{query}'. 
    
    Your response should be comprehensive and include all key points from top search results."
    
    system_message_prompt = SystemMessagePromptTemplate.from_template(template=template)
    
    chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt])
    
    messages = chat_prompt.format_prompt(query=query).to_messages()
    
    response = llm(messages=messages)
    
    return response.content

(์ฐธ๊ณ ) Langchain ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ Hyde ๊ตฌํ˜„

  • HypotheticalDocumentEmbedder๋ฅผ ํ†ตํ•œ ๊ฐ€์ƒ ๋ฌธ์„œ ์ƒ์„ฑ:
    • HypotheticalDocumentEmbedder.from_llm ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, LLM๊ณผ ๊ธฐ๋ณธ ์ž„๋ฒ ๋”ฉ(Base Embedding)์„ ๊ฒฐํ•ฉํ•œ HyDE ๋ชจ๋ธ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • HypotheticalDocumentEmbedder๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฃผ์š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:
      • llm: ์–ธ์–ด ๋ชจ๋ธ (์˜ˆ: OpenAI์˜ GPT ๋ชจ๋ธ)
      • Embeddings: ๊ธฐ๋ณธ ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ
      • prompt_key: ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ์„ ์„ ํƒํ•˜๋Š” ํ‚ค
    • prompt_key='web_search'๋Š” ๊ฐ€์ƒ ๋ฌธ์„œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ™œ์šฉ๋˜๋Š” ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ์€ ์ƒ์„ฑ๋œ ๊ฐ€์ƒ ๋ฌธ์„œ์˜ ๋‚ด์šฉ๊ณผ ํ˜•์‹์„ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
      • prompt_key='web_search' ํ”„๋กฌํ”„ํŠธ๋Š” ์›น ๊ฒ€์ƒ‰๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด, ์‚ฌ์šฉ์ž ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๊ฐ€์ƒ์˜ ์›น ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋‚˜ ๊ด€๋ จ ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
        1
        2
        3
        4
        5
        
              
        web_search_template = """
        Please write a passage to answer the question
        Question: {QUESTION}
        Passage:"""
        
      • ๋งŒ์•ฝ ํŠน์ • ๋„๋ฉ”์ธ์ด๋‚˜ ๋ชฉ์ ์— ๋งž๋Š” ๋งž์ถคํ˜• ํ”„๋กฌํ”„ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด, custom_prompt ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ง์ ‘ ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
        1
        2
        3
        4
        5
        
              
         custom_prompt = PromptTemplate(
                                       input_variables=["question"],
                                       template="์ตœ์‹  ๊ธฐ์ˆ  ๋™ํ–ฅ์— ๋Œ€ํ•ด ์ƒ์„ธํžˆ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”: {question}"
                                       )
        
  • (์˜ˆ์‹œ) ๋ฒกํ„ฐ ์Šคํ† ์–ด(Vector Store) ๊ตฌ์„ฑ:
    • FAISS.from_documents๋Š” Facebook AI๊ฐ€ ๊ฐœ๋ฐœํ•œ FAISS(Facebook AI Similarity Search) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์„œ๋ฅผ ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.
    • ์ด๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:
      • documents: split_documents๋ฅผ ํ†ตํ•ด ๋ถ„ํ• ๋œ ๋ฌธ์„œ๋“ค
      • embedding: hyde_embedding์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์„œ๋ฅผ ๋ฒกํ„ฐํ™”
  • (์˜ˆ์‹œ) ๊ฒ€์ƒ‰ ์‹คํ–‰:
    • hyde_retriever.as_retriever๋ฅผ ํ†ตํ•ด MMR(Maximal Marginal Relevance) ๋ฐฉ์‹์œผ๋กœ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
      • search_type="mmr":
        • MMR(Maximal Marginal Relevance) ๊ฒ€์ƒ‰ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ ๋‹ค์–‘์„ฑ๊ณผ ๊ด€๋ จ์„ฑ์„ ๋ชจ๋‘ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.
      • search_kwargs:
        • k : ๊ฒ€์ƒ‰ํ•  ๋ฌธ์„œ์˜ ์ˆ˜ (์ด๋ฏธ์ง€์—์„œ๋Š” 30์œผ๋กœ ์„ค์ •)
        • fetch_k : k+10์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ์ถ”๊ฐ€ ํ›„๋ณด ๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰
        • lambda_mult : 0.15๋กœ ์„ค์ •ํ•˜์—ฌ ๋‹ค์–‘์„ฑ๊ณผ ๊ด€๋ จ์„ฑ ์‚ฌ์ด์˜ ๊ท ํ˜•์„ ์กฐ์ ˆ

2.2. Multi-Query

  • ๊ฐœ๋…: Multi-Query๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋‹จ์ผ ์งˆ๋ฌธ(์ฟผ๋ฆฌ)์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•˜์œ„ ์งˆ๋ฌธ์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๊ฒ€์ƒ‰ ๊ณผ์ •์˜ ํ’ˆ์งˆ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

    • ๋‹จ์ผ ์งˆ๋ฌธ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์˜๋„๋‚˜ ์˜๋ฏธ์˜ ํ•œ๊ณ„๋ฅผ ๋ณด์™„ํ•˜๋ฉฐ, ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ ๋‹ค์–‘์„ฑ๊ณผ ํฌ๊ด„์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ํŠนํžˆ ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ๋‰˜์•™์Šค๊ฐ€ ํ•„์š”ํ•œ ์งˆ๋ฌธ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ๊ฐ•๋ ฅํ•œ ํšจ๊ณผ๋ฅผ ๋ฐœํœ˜ํ•ฉ๋‹ˆ๋‹ค.

    • ์˜ˆ๋ฅผ ๋“ค์–ด, โ€œ2025๋…„ ํ•œ๊ตญ ๊ธˆ๋ฆฌ ์ „๋ง์€?โ€์ด๋ผ๋Š” ์งˆ๋ฌธ์— ๋Œ€ํ•ด ๋‹ค์–‘ํ•œ ๊ด€์ (์ •์ฑ…, ๊ฒฝ์ œ ์ƒํ™ฉ, ๊ธ€๋กœ๋ฒŒ ๋™ํ–ฅ ๋“ฑ)์—์„œ ๊ด€๋ จ ๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ , ์ด๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์ข…ํ•ฉ์ ์ธ ๋‹ต๋ณ€์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ์˜ˆ์‹œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain.llms import ChatOpenAI
from langchain.prompts.chat import ChatPromptTemplate
from langchain.schema import RunnablePassthrough
from langchain.chains import Chain

# ์–ธ์–ด ๋ชจ๋ธ ๋ฐ ๊ธฐ๋ณธ ๊ฒ€์ƒ‰๊ธฐ ์„ค์ •
llm = ChatOpenAI(temperature=0.5)  # ์งˆ๋ฌธ ํ™•์žฅ์„ ์œ„ํ•œ LLM ์„ค์ •
retriever = faiss_retriever  # ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰๊ธฐ

# Multi-Query Retriever ์ƒ์„ฑ
multi_query_retriever = MultiQueryRetriever.from_llm(
    retriever=retriever,  # FAISS ๊ธฐ๋ฐ˜ ๊ธฐ๋ณธ ๊ฒ€์ƒ‰๊ธฐ
    llm=llm               # ์งˆ๋ฌธ ํ™•์žฅ์„ ์œ„ํ•œ LLM
)

# LCEL ์Šคํƒ€์ผ Chain ๊ตฌ์„ฑ
prompt_template = """
You are an assistant answering user questions based on the following retrieved context.

Context:
{context}

Question:
{question}

Provide a concise and structured response in bullet points.
"""
prompt = ChatPromptTemplate.from_template(prompt_template)

# LCEL Chain ์„ค์ •
chain = (
    {
        "question": RunnablePassthrough(),  # ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์งˆ๋ฌธ
        "context": multi_query_retriever | format_docs,  # ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์ •๋ฆฌ ๋ฐ ํ˜•์‹ํ™”
    }
    | prompt  # ํ”„๋กฌํ”„ํŠธ ์ƒ์„ฑ
    | llm     # LLM์„ ์‚ฌ์šฉํ•œ ์‘๋‹ต ์ƒ์„ฑ
    | StrOutputParser()  # ๊ฒฐ๊ณผ ํ˜•์‹ํ™”
)

# LCEL Chain ์‹คํ–‰
query = "2025๋…„ ํ•œ๊ตญ ๊ธˆ๋ฆฌ ์ „๋ง์€?"
response = chain.invoke(query)

# ๊ฒฐ๊ณผ ์ถœ๋ ฅ
print("Generated Response:")
print(response)

(์ฐธ๊ณ ) format_docs?

format_docs๋Š” ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ๋ฅผ ํŠน์ • ํ˜•์‹์œผ๋กœ ์ •๋ฆฌํ•˜๊ฑฐ๋‚˜, LLM์— ์ „๋‹ฌํ•˜๊ธฐ ์ ํ•ฉํ•œ ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” ํ•จ์ˆ˜ ๋˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ๊ฐ€ LLM์—์„œ ๋” ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • ์œ„ ์ฝ”๋“œ์—์„œ๋Š” format_docs๋Š” MultiQueryRetriever์™€ LLM ๊ฐ„์˜ ์ค‘๊ฐ„ ๋‹จ๊ณ„๋ฅผ ๋‹ด๋‹นํ•˜๋ฉฐ, ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์ •๋ฆฌํ•œ ๋’ค ํ”„๋กฌํ”„ํŠธ์— ์‚ฝ์ž…๋  ์ˆ˜ ์žˆ๋„๋ก ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.
  • ์•„๋ž˜๋Š” format_docs๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด์—ฌ์ฃผ๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
def format_docs(docs):
    """
    ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ๋ฅผ ์ •๋ฆฌํ•˜๊ณ  LLM์— ์ ํ•ฉํ•œ ํฌ๋งท์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜.
    """
    formatted = []
    for doc in docs:
        # ๋ฌธ์„œ ๋‚ด์šฉ์„ ์š”์•ฝํ•˜๊ฑฐ๋‚˜ ์ •๋ฆฌ
        content = doc.page_content
        metadata = doc.metadata
        # ์˜ˆ: ์ œ๋ชฉ๊ณผ ์ฃผ์š” ๋‚ด์šฉ๋งŒ ์ถ”์ถœ
        formatted_content = f"Title: {metadata.get('title', 'Untitled')}\nContent: {content[:500]}..."
        formatted.append(formatted_content)
    return "\n\n".join(formatted)

  • ํ•ต์‹ฌ ํŠน์ง•

    • 1) ์งˆ๋ฌธ ํ™•์žฅ

      • ์ž‘๋™ ๋ฐฉ์‹:
        • AI ์–ธ์–ด ๋ชจ๋ธ(LLM)์„ ํ™œ์šฉํ•˜์—ฌ, ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ์„ ๋‹ค์–‘ํ•œ ๊ด€์ ์—์„œ ์žฌ๊ตฌ์„ฑํ•˜๊ณ  ๊ด€๋ จ ํ•˜์œ„ ์งˆ๋ฌธ๋“ค์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
      • ๋ชฉ์ :
        • ๋‹จ์ผ ์งˆ๋ฌธ์ด ๊ฐ€์ง€๋Š” ํ‘œํ˜„์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ณ , ๋‹ค์–‘ํ•œ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.
      • ์˜ˆ์‹œ:
        1
        2
        
        ์› ์งˆ๋ฌธ (Original Question, 1๊ฐœ):
        "2025๋…„ ํ•œ๊ตญ ๊ธˆ๋ฆฌ ์ „๋ง์€?"
        
        1
        2
        3
        4
        
        ์ƒ์„ฑ๋œ ํ•˜์œ„ ์งˆ๋ฌธ(Generated Question, 3๊ฐœ):
        "2025๋…„ ํ•œ๊ตญ ๊ธˆ๋ฆฌ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ฃผ์š” ์š”์ธ์€ ๋ฌด์—‡์ธ๊ฐ€?"
        "๊ธ€๋กœ๋ฒŒ ๊ฒฝ์ œ ์ƒํ™ฉ์ด 2025๋…„ ํ•œ๊ตญ ๊ธˆ๋ฆฌ์— ๋ฏธ์น  ์˜ํ–ฅ์€?"
        "ํ•œ๊ตญ์€ํ–‰์˜ ์ •์ฑ…์ด 2025๋…„ ๊ธˆ๋ฆฌ ๋ณ€ํ™”์— ์–ด๋–ป๊ฒŒ ์ž‘์šฉํ• ๊นŒ?"
        
    • 2) ๊ฒฐ๊ณผ ํ†ตํ•ฉ

      • ์ž‘๋™ ๋ฐฉ์‹:
        • ์ƒ์„ฑ๋œ ํ•˜์œ„ ์งˆ๋ฌธ ๊ฐ๊ฐ์— ๋Œ€ํ•ด ๋…๋ฆฝ์ ์œผ๋กœ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•œ ํ›„, ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ๋“ค์„ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋กœ ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค.
      • ์ฃผ์š” ๊ณผ์ •:
        • ์ค‘๋ณต ์ œ๊ฑฐ: ๋™์ผํ•œ ์ •๋ณด๊ฐ€ ์ค‘๋ณต๋˜๋ฉด ์ œ๊ฑฐํ•˜์—ฌ ํšจ์œจ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.
        • ๊ฒฐ๊ณผ ์ •๋ ฌ: ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ์— ๊ด€๋ จ์„ฑ ์ ์ˆ˜๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
      • ๋ชฉ์ :

        ๋‹ค์–‘ํ•œ ๊ด€์ ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋” ํ’๋ถ€ํ•˜๊ณ  ์‹ ๋ขฐ์„ฑ ๋†’์€ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

      • ์˜ˆ์‹œ: ``` ์ƒ์„ฑ๋œ ํ•˜์œ„ ์งˆ๋ฌธ๋“ค(Generated Question, 3๊ฐœ): โ€œ2025๋…„ ํ•œ๊ตญ ๊ธˆ๋ฆฌ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ฃผ์š” ์š”์ธ์€?โ€ โ€œ๊ธ€๋กœ๋ฒŒ ๊ฒฝ์ œ ์ƒํ™ฉ์ด ํ•œ๊ตญ ๊ธˆ๋ฆฌ์— ๋ฏธ์น  ์˜ํ–ฅ์€?โ€ โ€œํ•œ๊ตญ์€ํ–‰์˜ ์ •์ฑ…์ด 2025๋…„ ๊ธˆ๋ฆฌ ๋ณ€ํ™”์— ์–ด๋–ป๊ฒŒ ์ž‘์šฉํ• ๊นŒ?โ€

      ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ(Retrieved Documents, 3๊ฐœ): ๋ฌธ์„œ 1: ํ•œ๊ตญ์€ํ–‰ ๋ฐœํ‘œ ์ž๋ฃŒ, ๊ธˆ๋ฆฌ ์ •์ฑ… ๋ณด๊ณ ์„œ. ๋ฌธ์„œ 2: ๊ธ€๋กœ๋ฒŒ ๊ฒฝ์ œ ๋ณด๊ณ ์„œ์—์„œ ๋ฐœ์ทŒ๋œ ๊ธˆ๋ฆฌ ๊ด€๋ จ ์ •๋ณด. ๋ฌธ์„œ 3: ๊ธˆ๋ฆฌ ๋ณ€ํ™”์™€ ์‹œ์žฅ ๋ฐ˜์‘์— ๋Œ€ํ•œ ์ „๋ฌธ๊ฐ€ ์ธํ„ฐ๋ทฐ. ```

  • ์žฅ์ :

    • ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ ๋‹ค์–‘์„ฑ ์ฆ๊ฐ€
      • ๋‹จ์ผ ์ฟผ๋ฆฌ๋กœ๋Š” ํƒ์ง€ํ•˜๊ธฐ ์–ด๋ ค์šด ๋‹ค์–‘ํ•œ ๋งฅ๋ฝ๊ณผ ๊ด€์ ์„ ํฌ์ฐฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • ์˜ˆ: ์ •์ฑ…, ์‹œ์žฅ, ๊ธ€๋กœ๋ฒŒ ์ƒํ™ฉ ๋“ฑ ๋‹ค์–‘ํ•œ ์ธก๋ฉด์—์„œ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณต.
    • ์‚ฌ์šฉ์ž ์˜๋„ ํŒŒ์•… ๊ฐ•ํ™”
      • ์งˆ๋ฌธ์˜ ๋ช…์‹œ์  ์˜๋ฏธ๋ฅผ ๋„˜์–ด, ์•”๋ฌต์  ๋งฅ๋ฝ๊ณผ ์˜๋„๋ฅผ ํ•ด์„ํ•ฉ๋‹ˆ๋‹ค.
      • ์ด๋ฅผ ํ†ตํ•ด ๋” ์™„๋ฒฝํ•œ ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
    • ํฌ๊ด„์  ๊ฒฐ๊ณผ ์ œ๊ณต
      • ๋‹จ์ˆœํžˆ ๊ด€๋ จ ๋ฌธ์„œ๋งŒ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋‹ค์ธต์ ์ด๊ณ  ์ข…ํ•ฉ์ ์ธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
      • ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฉด์ ์ธ ์ฃผ์ œ์— ์ ํ•ฉ.
    • ์ž๋™ํ™”๋œ ํ”„๋กฌํ”„ํŠธ ์ตœ์ ํ™”
      • ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์งˆ๋ฌธ์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์žฌ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„, AI๊ฐ€ ์งˆ๋ฌธ์„ ์ž๋™์œผ๋กœ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.

4. ๊ฒ€์ƒ‰ ๋‹จ๊ณ„: Retrieval (Ensemble Retrieval)

Ensemble Retrieval์€ ์—ฌ๋Ÿฌ ๊ฒ€์ƒ‰๊ธฐ(Retriever)๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๊ฐ๊ฐ์˜ ์žฅ์ ์„ ์กฐํ•ฉํ•˜๊ณ  ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” RAG(Retrieval-Augmented Generation) ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.

  • ์„œ๋กœ ๋‹ค๋ฅธ ํŠน์„ฑ์„ ๊ฐ€์ง„ Dense Retrieval(๊ณ ๋ฐ€๋„ ๊ฒ€์ƒ‰)์™€ Sparse Retrieval(ํฌ์†Œ ๊ฒ€์ƒ‰)๋ฅผ ์ ์ ˆํžˆ ๊ฒฐํ•ฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๊ฒ€์ƒ‰ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๋›ฐ์–ด๋‚œ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

1. ๊ฒ€์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • 1. Sparse Retrieval

    • Sparse Retrieval์€ ์ „ํ†ต์ ์ธ ํ‚ค์›Œ๋“œ ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰ ๋ฐฉ์‹์œผ๋กœ, ๋‹จ์–ด์˜ ์กด์žฌ ์—ฌ๋ถ€์™€ ๋นˆ๋„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ๋ฅผ ํฌ์†Œ ๋ฒกํ„ฐ(sparse vector) ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•˜๋ฉฐ, ๊ฐ ๋‹จ์–ด๋Š” ๋…๋ฆฝ์ ์ธ ์ฐจ์›์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค(TF-IDF, BM25 ๋“ฑ). ์ฃผ๋กœ ์ „ํ†ต์ ์ธ ์ •๋ณด ๊ฒ€์ƒ‰(Information Retriever) ๋ชจ๋ธ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

    ์žฅ์ 

    • ์†๋„์™€ ํšจ์œจ์„ฑ: ๋‹จ์–ด์˜ ๋นˆ๋„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๊ฐ„๋‹จํ•œ ๊ณ„์‚ฐ์ด๋ฏ€๋กœ ์—ฐ์‚ฐ ์†๋„๊ฐ€ ๋น ๋ฆ…๋‹ˆ๋‹ค.
    • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ: ํฌ์†Œ ํ–‰๋ ฌ(sparse matrix)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์š”๊ตฌ๋Ÿ‰์ด ์ƒ๋Œ€์ ์œผ๋กœ ์ ์Šต๋‹ˆ๋‹ค.
    • ์ •ํ™•ํ•œ ํ‚ค์›Œ๋“œ ๋งค์นญ: ํŠน์ • ๋‹จ์–ด๊ฐ€ ๋ฌธ์„œ์— ์กด์žฌํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ฒ€์ƒ‰์—์„œ ๋†’์€ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•ฉ๋‹ˆ๋‹ค.

    ๋‹จ์ 

    • ๋ฌธ๋งฅ์  ์˜๋ฏธ ๋ถ€์กฑ: ๋™์˜์–ด๋‚˜ ์œ ์‚ฌ์–ด๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋ฉฐ, ๋‹จ์ˆœํ•œ ๋‹จ์–ด ์ผ์น˜์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค.
    • ์ถ”๊ฐ€ ํ•™์Šต ๋ถˆ๊ฐ€๋Šฅ: ์‚ฌ์ „ ๊ตฌ์ถ•๋œ ๋ชจ๋ธ์— ์˜์กดํ•˜๋ฏ€๋กœ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ์— ์ ์‘ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    • ๋ณต์žกํ•œ ์งˆ๋ฌธ ์ฒ˜๋ฆฌ ์–ด๋ ค์›€: ๋ฌธ๋งฅ์  ์˜๋„ ํŒŒ์•…์ด๋‚˜ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ์‘๋‹ต์ด ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค.

    ํ™œ์šฉ ์˜ˆ์‹œ

    • BM25์™€ TF-IDF๋Š” Sparse Retrieval์—์„œ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, ๋‰ด์Šค ๊ธฐ์‚ฌ๋‚˜ ๊ฒ€์ƒ‰ ์—”์ง„๊ณผ ๊ฐ™์€ ํ‚ค์›Œ๋“œ ์ค‘์‹ฌ ๊ฒ€์ƒ‰์— ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • 2. Dense Retrieval

    • Dense Retrieval์€ ์‹ ๊ฒฝ๋ง ๊ธฐ๋ฐ˜ ๋ชจ๋ธ(BERT, RoBERTa ๋“ฑ)์„ ํ™œ์šฉํ•˜์—ฌ ๋ฌธ๋งฅ์  ์˜๋ฏธ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฐ€์ง‘ ๋ฒกํ„ฐ(dense vector)๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ์™€ ์งˆ๋ฌธ์„ ๊ณ ์ฐจ์› ๊ณต๊ฐ„์—์„œ ์˜๋ฏธ์ ์œผ๋กœ ์œ ์‚ฌํ•œ ๋ฒกํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์ฐจ์›์ด ๋‹จ์–ด ๊ฐ„ ๊ด€๊ณ„๋ฅผ ํฌํ•จํ•˜๋ฏ€๋กœ ๋ณต์žกํ•œ ๋ฌธ๋งฅ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์žฅ์ 

    • ๋ฌธ๋งฅ์  ์˜๋ฏธ ์ดํ•ด: ๋™์˜์–ด๋‚˜ ์œ ์‚ฌ์–ด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฌธ๋งฅ์  ์˜๋ฏธ์— ๊ธฐ๋ฐ˜ํ•œ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • ์ง€์†์ ์ธ ํ•™์Šต: ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋กœ ์ถ”๊ฐ€ ํ•™์Šต์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ์„ ์ง€์†์ ์œผ๋กœ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋ณต์žกํ•œ ์งˆ๋ฌธ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ: ๋‹จ์ˆœํ•œ ํ‚ค์›Œ๋“œ ๋งค์นญ์„ ๋„˜์–ด ๋ฌธ๋งฅ๊ณผ ์˜๋„๋ฅผ ํŒŒ์•…ํ•˜์—ฌ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

    ๋‹จ์ 

    • ์—ฐ์‚ฐ ๋น„์šฉ: ๋ฒกํ„ฐ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ๋น„๊ตํ•˜๋Š” ๊ณผ์ •์—์„œ ๋†’์€ ์—ฐ์‚ฐ ๋น„์šฉ์ด ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค.
    • ๋ฉ”๋ชจ๋ฆฌ ์š”๊ตฌ๋Ÿ‰: ๋ฐ€์ง‘ ๋ฒกํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์†Œ๋ชจํ•ฉ๋‹ˆ๋‹ค.
    • ํ•™์Šต ๋ฐ์ดํ„ฐ ์˜์กด: ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์€ ํ•™์Šต ๋ฐ์ดํ„ฐ์˜ ์งˆ๊ณผ ์–‘์— ํฌ๊ฒŒ ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

    ํ™œ์šฉ ์˜ˆ์‹œ

    • Dense Retrieval์€ ํ•™์ˆ  ๋…ผ๋ฌธ ๊ฒ€์ƒ‰, ์ž์—ฐ์–ด ๊ธฐ๋ฐ˜ ์งˆ์˜์‘๋‹ต ์‹œ์Šคํ…œ, ๊ทธ๋ฆฌ๊ณ  ์˜๋ฏธ๋ก ์  ๋ฌธ์„œ ๊ฒ€์ƒ‰๊ณผ ๊ฐ™์€ ๋ณต์žกํ•œ ๊ฒ€์ƒ‰ ์ž‘์—…์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Sparse vs Dense Retrieval: ๋น„๊ต์™€ ์กฐํ•ฉ

ํŠน์ง• Sparse Retrieval Dense Retrieval
์•Œ๊ณ ๋ฆฌ์ฆ˜ BM25, TF-IDF ๋“ฑ ์ „ํ†ต์  IR ๋ชจ๋ธ BERT, RoBERTa ๋“ฑ ์‹ ๊ฒฝ๋ง ๊ธฐ๋ฐ˜ ๋ชจ๋ธ
์—ฐ์‚ฐ ํšจ์œจ์„ฑ ๊ณ„์‚ฐ ๋ณต์žก๋„ ๋‚ฎ์Œ ๊ณ„์‚ฐ ๋ณต์žก๋„ ๋†’์Œ
๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ๋ฉ”๋ชจ๋ฆฌ ์š”๊ตฌ๋Ÿ‰ ๋‚ฎ์Œ ๋ฉ”๋ชจ๋ฆฌ ์š”๊ตฌ๋Ÿ‰ ๋†’์Œ
๊ฒ€์ƒ‰ ์„ฑ๋Šฅ ๋‹จ์ˆœ ๋‹จ์–ด ๋งค์นญ์—์„œ ๋†’์€ ์ •ํ™•๋„ ๋ฌธ๋งฅ์  ์˜๋ฏธ ์ดํ•ด์—์„œ ๋†’์€ ์ •ํ™•๋„
ํ›ˆ๋ จ ํ•„์š”์„ฑ ์‚ฌ์ „ ๊ตฌ์ถ•๋œ ๋ชจ๋ธ ์‚ฌ์šฉ, ์ถ”๊ฐ€ ํ›ˆ๋ จ ๋ถˆํ•„์š” ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ํ•™์Šต ํ•„์š”
์ฃผ์š” ์žฅ์  ๋น ๋ฅธ ๊ฒ€์ƒ‰ ์†๋„, ์ ์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ๋ฌธ๋งฅ ์ดํ•ด ๋ฐ ์œ ์‚ฌ์–ด ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
์ฃผ์š” ๋‹จ์  ๋ฌธ๋งฅ์  ์˜๋ฏธ ์ดํ•ด ๋ถ€์กฑ ๋†’์€ ๊ณ„์‚ฐ ๋น„์šฉ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์š”๊ตฌ

2. Ensemble Retrieval๋กœ์˜ ํ™•์žฅ

Sparse Retrieval๊ณผ Dense Retrieval์€ ๊ฐ๊ฐ์˜ ์žฅ์ ๊ณผ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ์ž์ฃผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • Sparse Retrieval: ํ‚ค์›Œ๋“œ ๊ธฐ๋ฐ˜ ์ •ํ™•๋„๋ฅผ ๋ณด์žฅํ•˜๋ฉฐ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ธ ๊ฒ€์ƒ‰์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • Dense Retrieval: ๋ฌธ๋งฅ์  ์˜๋ฏธ๋ฅผ ์ดํ•ดํ•˜๊ณ  ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Ensemble Retrieval: ๋‘ ๊ฒ€์ƒ‰ ๋ฐฉ์‹์„ ์กฐํ•ฉํ•˜์—ฌ ๋†’์€ ๊ฒ€์ƒ‰ ์ •ํ™•๋„์™€ ์†๋„๋ฅผ ๋™์‹œ์— ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Ensemble Retrieval ๊ตฌํ˜„ ์˜ˆ์‹œ:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from langchain_community.retrievers import BM25Retriever, EnsembleRetriever
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS

# Embeddings ์ดˆ๊ธฐํ™”
embeddings = OpenAIEmbeddings()

# Sparse ๊ฒ€์ƒ‰๊ธฐ (BM25) ์ดˆ๊ธฐํ™”
bm25_retriever = BM25Retriever.from_documents(
    split_documents,
    k=20  # ๊ฒ€์ƒ‰ํ•  ๋ฌธ์„œ ์ˆ˜
)

# Dense ๊ฒ€์ƒ‰๊ธฐ (FAISS) ์ดˆ๊ธฐํ™”
faiss_retriever = FAISS.load_local(
    "dense_index", 
    embeddings,
    allow_dangerous_deserialization=True
).as_retriever()

# Ensemble ๊ฒ€์ƒ‰๊ธฐ ์ƒ์„ฑ
ensemble_retriever = EnsembleRetriever(
    retrievers=[bm25_retriever, faiss_retriever],
    weights=[0.4, 0.6]
)

chain = (
    {
        "question": RunnablePassthrough(),  # ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์งˆ๋ฌธ
        "context": ensemble_retriever | format_docs,  # ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ํฌ๋งทํŒ…
    }
    | prompt  # ํ”„๋กฌํ”„ํŠธ ์ ์šฉ
    | llm     # LLM์„ ์‚ฌ์šฉํ•ด ์‘๋‹ต ์ƒ์„ฑ
    | StrOutputParser()  # ์ถœ๋ ฅ ํ˜•์‹ ์ •๋ฆฌ
)

์ถœ๋ ฅ ์˜ˆ์‹œ

Ensemble Retrieval ๊ฒ€์ƒ‰ ๊ณผ์ •

  • ์ž…๋ ฅ๋œ ์งˆ๋ฌธ: "2025๋…„ ํ•œ๊ตญ ๊ธˆ๋ฆฌ ์ „๋ง์€?"
  • ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ด ์งˆ๋ฌธ์€ RunnablePassthrough๋ฅผ ํ†ตํ•ด ์ฒด์ธ์˜ ์ฒซ ๋‹จ๊ณ„๋กœ ์ „๋‹ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋‘ ๊ฒ€์ƒ‰๊ธฐ(Sparse์™€ Dense)๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    • Sparse Retrieval(BM25 ๋“ฑ): ๋‹จ์–ด ๋นˆ๋„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ด€๋ จ ๋ฌธ์„œ๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰.
    • Dense Retrieval(FAISS ๋“ฑ): ๋ฌธ๋งฅ์  ์˜๋ฏธ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ๊ด€๋ จ ๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰.
  • ์ด ๋‘ ๊ฒ€์ƒ‰๊ธฐ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ€์ค‘์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.

    • ์ฝ”๋“œ์—์„œ ์„ค์ •๋œ weights์— ๋”ฐ๋ผ Dense์™€ Sparse ๊ฒ€์ƒ‰๊ธฐ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๊ฒฐํ•ฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ์ตœ์ข…์ ์œผ๋กœ ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ๋Š” 42๊ฐœ์ž…๋‹ˆ๋‹ค.
  • ํ•ด์„

    • weights=[0.4, 0.6]์˜ ์˜๋ฏธ, ๊ฐ ๊ฒ€์ƒ‰๊ธฐ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ˆœ์œ„๋ฅผ ๋งค๊น€.
      • BM25 ๊ฒฐ๊ณผ์— 0.4 ๊ฐ€์ค‘์น˜ ์ ์šฉ
      • FAISS ๊ฒฐ๊ณผ์— 0.6 ๊ฐ€์ค‘์น˜ ์ ์šฉ
    • ๋‘ ๊ฒ€์ƒ‰๊ธฐ์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ค‘์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์žฌ์ •๋ ฌ, ๊ฐ ๋ฌธ์„œ๋Š” ๋‘ ๊ฒ€์ƒ‰๊ธฐ์˜ ์ ์ˆ˜๋ฅผ ์กฐํ•ฉํ•œ ์ตœ์ข… ์ ์ˆ˜๋ฅผ ๋ฐ›์Œ.
    • ๋‘ ๊ฐ€์ง€๊ฐ€ ๊ท ํ˜•์žˆ๊ฒŒ ๋ฐ˜์˜๋œ ์ตœ์ ์˜ ๋ฌธ์„œ ์ง‘ํ•ฉ ์ด 42๊ฐœ๊ฐ€ ์„ ํƒ๋จ.


5. ๊ฒ€์ƒ‰ ํ›„: Re-Ranking

Re-Ranking(๋ฆฌ๋žญํ‚น)์€ ์ดˆ๊ธฐ ๊ฒ€์ƒ‰ ๋‹จ๊ณ„์—์„œ ์ˆ˜์ง‘๋œ ํ›„๋ณด ๋ฌธ์„œ(๋˜๋Š” ์ฒญํฌ)์˜ ์ˆœ์œ„๋ฅผ ์žฌ์กฐ์ •ํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

(์•ž์—์„œ Ensemble Retrieval ์ดํ›„ ์ผ์ข…์˜ ์žฌ์ˆœ์œ„ํ™”(Re-Ranking) ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ๋‹ค๊ณ  ๋ด๋„ ๋ฉ๋‹ˆ๋‹ค.)

  • LLM ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰์—์„œ๋Š” ์ž…๋ ฅ ํ† ํฐ ์ˆ˜ ์ œํ•œ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์งˆ๋ฌธ๊ณผ ๊ฐ€์žฅ ๊ด€๋ จ์„ฑ์ด ๋†’์€ ๋ฌธ์„œ๋ฅผ ์„ ํƒํ•ด ์ตœ์ข… ์ˆœ์œ„๋กœ ์ •๋ ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํŠนํžˆ ๊ธด ๋ฌธ์„œ์—์„œ ๋‹ค์ˆ˜์˜ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ, ๊ด€๋ จ์„ฑ์ด ๋‚ฎ์€ ๋ฌธ๋งฅ ์ œ๊ฑฐ ๋ฐ ์ตœ์ ํ™”๋œ ์ˆœ์œ„ ๊ฒฐ์ •์— ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ž‘๋™ ์›๋ฆฌ

Re-Ranking์˜ ์ž‘๋™ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. ์ดˆ๊ธฐ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ˆ˜์ง‘:
  • Retriever(๊ฒ€์ƒ‰๊ธฐ)๊ฐ€ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์…‹์—์„œ ๊ด€๋ จ ํ›„๋ณด ๋ฌธ์„œ๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๋‹จ๊ณ„์—์„œ ๋น ๋ฅธ ๊ฒ€์ƒ‰์„ ์œ„ํ•ด Dense ํ˜น์€ Sparse ๋ฐฉ์‹์˜ ๊ฒ€์ƒ‰๊ธฐ๊ฐ€ ์ฃผ๋กœ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.
  1. Re-Ranker๋กœ ์ˆœ์œ„ ์žฌ์กฐ์ •:

    • ์ดˆ๊ธฐ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์™€ ์งˆ๋ฌธ์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„, ๊ฐ ์ฒญํฌ์˜ ๊ด€๋ จ์„ฑ ์ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
    • ๊ณ„์‚ฐ๋œ ์ ์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ›„๋ณด ๋ฌธ์„œ์˜ ์ˆœ์œ„๋ฅผ ์žฌ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ƒ์œ„ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜:

    • ์„ค์ •๋œ ์ƒ์œ„ N๊ฐœ์˜ ๊ฒฐ๊ณผ๋งŒ ์„ ํƒํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ์˜ˆ์‹œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from langchain.retrievers import ContextualCompressionRetriever
from langchain_cohere import CohereRerank

# Cohere Reranker ์„ค์ •
COHERE_API_KEY = "your_cohere_api_key"
reranker = CohereRerank(model="rerank-multilingual-v3.0", top_n=3)

# ๋ฆฌ๋žญํ‚น์„ ์ ์šฉํ•œ ๊ฒ€์ƒ‰๊ธฐ ์ƒ์„ฑ
reranking_retriever = ContextualCompressionRetriever(
    base_compressor=reranker,
    base_retriever=faiss_retriever  # ์ดˆ๊ธฐ ๊ฒ€์ƒ‰ ๋‹จ๊ณ„์—์„œ ์‚ฌ์šฉํ•œ Retriever
)

# ์งˆ์˜์— ๋”ฐ๋ฅธ ๊ฒ€์ƒ‰ ์‹คํ–‰
test_question = "2025๋…„ ํ•œ๊ตญ ๊ธˆ๋ฆฌ ์ „๋ง์€?"
retrieved_chunks = reranking_retriever.invoke(test_question)

# ์ตœ์ข… ๊ฒฐ๊ณผ ํ™•์ธ
print(len(retrieved_chunks))  # ์ถœ๋ ฅ: 3
for chunk in retrieved_chunks:
    print(chunk.page_content)

์ถœ๋ ฅ ๊ฒฐ๊ณผ ํ•ด์„

  • retrieved_chunks์˜ ๊ธธ์ด๋Š” 3์œผ๋กœ, ์ดˆ๊ธฐ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ 30๊ฐœ ์ค‘ ๊ฐ€์žฅ ๊ด€๋ จ์„ฑ์ด ๋†’์€ 3๊ฐœ์˜ ๋ฌธ์„œ๋งŒ ์ตœ์ข…์ ์œผ๋กœ ๋ฐ˜ํ™˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ตœ์ƒ์œ„ ๋ฌธ์„œ๋“ค์€ ์งˆ๋ฌธ "2025๋…„ ํ•œ๊ตญ ๊ธˆ๋ฆฌ ์ „๋ง์€?"๊ณผ ๊ด€๋ จ์„ฑ์ด ๋†’์€ ๋‚ด์šฉ์„ ํฌํ•จํ•˜๋ฉฐ, LLM์ด ํ™œ์šฉ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ์ค€๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ Re-Ranking์€ ์ดˆ๊ธฐ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์ตœ์ ํ™”ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์งˆ๋ฌธ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


6. ๊ฒ€์ƒ‰ ํ›„: Compression

Compression์€ ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ๋“ค์˜ ๊ธธ์ด๋ฅผ ์ค„์ด๊ฑฐ๋‚˜ ์š”์•ฝ(Summarization)ํ•˜์—ฌ ๊ด€๋ จ์„ฑ์ด ๋†’์€ ์ •๋ณด๋งŒ ์œ ์ง€ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ์ด๋Š” LLM์˜ ํ† ํฐ ์ œํ•œ ๋ฌธ์ œ๋ฅผ ๊ทน๋ณตํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋ฌธ์„œ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์ž‘๋™ ์›๋ฆฌ

  1. ๋ฌธ์„œ ์••์ถ• ๊ณผ์ •
    • ์ดˆ๊ธฐ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋Š” ์—ฌ๋Ÿฌ ๋ฌธ์„œ(chunk)๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.
    • ContextualCompressionRetriever๋Š” base_compressor์™€ base_retriever๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
    • base_compressor๋กœ LLM์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์„œ๋ฅผ ์••์ถ•ํ•˜๊ฑฐ๋‚˜ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค.

  1. ๊ฒฐ๊ณผ ๋น„๊ต
    • ์˜ˆ์‹œ์—์„œ ์ดˆ๊ธฐ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋Š” 30๊ฐœ์˜ chunk๋กœ ๊ตฌ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • Compression ๊ณผ์ •์„ ํ†ตํ•ด 5๊ฐœ์˜ chunk๋กœ ์••์ถ•๋˜์—ˆ์œผ๋ฉฐ, ์ด๋Š” Query์˜ ๋งฅ๋ฝ(Context)์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ ๊ตฌํ˜„

1
2
3
4
5
6
7
8
from langchain.retrievers.document_compressors import LLMChainExtractor

compressor_from_llm = LLMChainExtractor.from_llm(llm)

compression_retriever = ContextualCompressionRetriever(
    base_compressor=compressor_from_llm,
    base_retriever=faiss_retriever
)

์œ„ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด Compression ๊ณผ์ •์ด ์ˆ˜ํ–‰๋˜๋ฉฐ, ํ•ต์‹ฌ์ ์ธ ์ •๋ณด๋งŒ ๋‚จ๊ธฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


7. ๋‹ค์–‘ํ•œ ์กฐํ•ฉ: Multi-query Ensemble + Re-Ranking

์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ์—ฌ๋Ÿฌ ๊ฒ€์ƒ‰ ๊ธฐ๋ฒ•๊ณผ ์ˆœ์œ„ ์กฐ์ •(Re-Ranking)์„ ๊ฒฐํ•ฉํ•˜์—ฌ ๊ฒ€์ƒ‰ ํ’ˆ์งˆ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๊ณ ๊ธ‰ RAG ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. ์œ„ ๋‚ด์šฉ๊ณผ ์ข€ ์œ ์‚ฌํ•œ ๋ถ€๋ถ„๋“ค์ด ์žˆ๊ธด ํ•˜์ง€๋งŒ Multi-query Ensemble๊ณผ Re-Ranking์„ ๊ฐ™์ด ์“ธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ฐ•์กฐํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„๋กœ ์ฑ•ํ„ฐ๋กœ ์ถ”๊ฐ€ํ•˜์‹  ๊ฒƒ ๊ฐ™๊ตฐ์š” ๐Ÿค”

๊ตฌ์„ฑ ์š”์†Œ

  1. Multi-query Retrieval

    • Multi-query Retrieval์€ ํ•˜๋‚˜์˜ ์งˆ๋ฌธ์„ ๋‹ค์–‘ํ•œ ๊ด€์ ์œผ๋กœ ํ™•์žฅํ•˜์—ฌ ๊ฒ€์ƒ‰ ๋ฒ”์œ„๋ฅผ ๋„“ํž™๋‹ˆ๋‹ค.

    • ์˜ˆ: โ€œ2025๋…„ ํ•œ๊ตญ ๊ธˆ๋ฆฌ ์ „๋งโ€ โ†’ โ€œ2025๋…„ ๊ธˆ๋ฆฌ ๋ณ€ํ™” ์˜ˆ์ธกโ€, โ€œํ•œ๊ตญ์˜ ๊ธˆ๋ฆฌ ์ˆ˜์ค€ ์ „๋งโ€

  2. Ensemble Retrieval

    • Ensemble Retrieval์€ Sparse Retriever(BM25)์™€ Dense Retriever๋ฅผ ์กฐํ•ฉํ•ฉ๋‹ˆ๋‹ค.

    • ๊ฐ ๊ฒ€์ƒ‰๊ธฐ์˜ ๊ฒฐ๊ณผ์— ๊ฐ€์ค‘์น˜๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ๊ฒ€์ƒ‰ ํ’ˆ์งˆ์„ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.

  3. Re-Ranking

    • Re-Ranking์€ Ensemble ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ Re-Ranker๋กœ ๋‹ค์‹œ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.

    • LLM ๊ธฐ๋ฐ˜ Re-Ranker๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ จ์„ฑ์ด ๋†’์€ ๋ฌธ์„œ ์ˆœ์œผ๋กœ ์žฌ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

์ž‘๋™ ์›๋ฆฌ

  • Multi-query๋กœ ์ƒ์„ฑ๋œ ์งˆ๋ฌธ๋“ค์€ Ensemble Retrieval๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
  • ๊ฒ€์ƒ‰๋œ ๊ฒฐ๊ณผ(44๊ฐœ chunk)๋Š” ReRanking์„ ํ†ตํ•ด 3๊ฐœ์˜ chunk๋กœ ์••์ถ•๋ฉ๋‹ˆ๋‹ค.
  • ์ตœ์ข…์ ์œผ๋กœ ๊ฐ€์žฅ ๊ด€๋ จ์„ฑ์ด ๋†’์€ ๋ฌธ์„œ๋“ค๋งŒ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.
  • Re-Ranking์„ ํ†ตํ•ด ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ์กฐ์ •ํ•˜์—ฌ ์ตœ์ ์˜ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ๊ตฌํ˜„

1
2
3
4
5
6
7
8
9
10
11
from langchain.retrievers.contextual_compression import ContextualCompressionRetriever
from langchain.retrievers import MultiQueryRetriever
from langchain.retrievers import EnsembleRetriever
from langchain.retrievers.document_compressors import CrossEncoderReranker
from langchain_community.cross_encoders import HuggingFaceCrossEncoder

# Define MultiQuery_Ensemble_reranking_retriever
MultiQuery_Ensemble_reranking_retriever = ContextualCompressionRetriever(
															base_compressor=reranker,
															base_retriever=MultiQuery_Ensemble_retriever
)

8. ํ”„๋กœ์„ธ์Šค ์ฆ๊ฐ•(Process Augmentation)

ํ”„๋กœ์„ธ์Šค ์ฆ๊ฐ•(Process Augmentation)์€ ๋‹จ์ผ ๊ฒ€์ƒ‰ ๋ฐ ์ƒ์„ฑ ๋‹จ๊ณ„๋ฅผ ๋„˜์–ด ๋‹ค๋‹จ๊ณ„ ๊ฒ€์ƒ‰, ์ ์ง„์  ์ถ”๋ก , ์ ์‘์  ๊ฒ€์ƒ‰ ๋ฐฉ์‹์„ ๋„์ž…ํ•˜์—ฌ ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ ‘๊ทผ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด๋Š” RAG(Retrieval-Augmented Generation)์—์„œ ์ •๋ณด๋ฅผ ๋ณด๋‹ค ์ •๊ตํ•˜๊ณ  ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ์กด์˜ ๋‹จ์ผ ๊ฒ€์ƒ‰๊ณผ ์‘๋‹ต ์ƒ์„ฑ ํ”„๋กœ์„ธ์Šค๋Š” ์ œํ•œ๋œ ์ •๋ณด๋งŒ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜, ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ์ถฉ๋ถ„ํžˆ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค ์ฆ๊ฐ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ๋ณด์™„ํ•ฉ๋‹ˆ๋‹ค.

    • Iterative Search(๋ฐ˜๋ณต์  ๊ฒ€์ƒ‰): ์ด์ „ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒ€์ƒ‰์„ ๋ฐ˜๋ณตํ•˜์—ฌ ๋”์šฑ ํ’๋ถ€ํ•œ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘.
    • Recursive Search(์žฌ๊ท€์  ๊ฒ€์ƒ‰): ๋ฌธ์ œ๋ฅผ ์„ธ๋ถ€์ ์ธ ํ•˜์œ„ ๋ฌธ์ œ๋กœ ๋ถ„ํ•ดํ•˜๊ณ  ๋‹จ๊ณ„์ ์œผ๋กœ ํ•ด๊ฒฐ.
    • Adaptive Search(์ ์‘์  ๊ฒ€์ƒ‰): ๊ฒ€์ƒ‰๊ณผ ์ƒ์„ฑ ๊ณผ์ •์—์„œ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์œ ์—ฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌ.

ํ”„๋กœ์„ธ์Šค ์ฆ๊ฐ• ์œ ํ˜• (์œ„ ๊ทธ๋ฆผ ์ฐธ๊ณ )

1) Iterative Search (๋ฐ˜๋ณต์  ๊ฒ€์ƒ‰)

  • ํŠน์ง•:
    • Query๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ณด๊ฐ•ํ•˜์—ฌ ๊ด€๋ จ ์ •๋ณด๋ฅผ ๋‹จ๊ณ„์ ์œผ๋กœ ์ˆ˜์ง‘.
    • Judge ๋‹จ๊ณ„๋ฅผ ํ†ตํ•ด ๊ฒ€์ƒ‰ ๋ฐ ์ƒ์„ฑ์˜ ์ •ํ™•๋„๋ฅผ ์ ๊ฒ€.
  • ์ข…๋ฃŒ ์กฐ๊ฑด:
    • ์‚ฌ์ „ ์„ค์ •๋œ ์ตœ๋Œ€ ๋ฐ˜๋ณต ํšŸ์ˆ˜(Max Times) ๋˜๋Š” ์ •ํ™•๋„ ๊ธฐ์ค€(Threshold)์„ ๋งŒ์กฑํ•  ๋•Œ ์ข…๋ฃŒ.
  • ํ™œ์šฉ ์‚ฌ๋ก€:
    • ์‚ฌ์šฉ์ž์˜ ์ถ”๊ฐ€์ ์ธ ์งˆ๋ฌธ์ด ํ•„์š”ํ•œ ์ƒํ™ฉ์—์„œ ์ ์ง„์ ์œผ๋กœ ๋‹ต๋ณ€์„ ์™„์„ฑ.

2) Recursive Search (์žฌ๊ท€์  ๊ฒ€์ƒ‰)

  • ํŠน์ง•:
    • ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ํ•˜์œ„ ๋ฌธ์ œ๋กœ ๋ถ„ํ•ด(Query Transformation).
    • ๋ฌธ์ œ๋ฅผ ์ ์ง„์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ฉฐ ์ „์ฒด ๋‹ต๋ณ€์„ ์ƒ์„ฑ.
  • ์ข…๋ฃŒ ์กฐ๊ฑด:
    • ์„ค์ •๋œ ์ตœ๋Œ€ ์žฌ๊ท€ ๊นŠ์ด(Max Depth) ๋˜๋Š” ํŠธ๋ฆฌ ๊ตฌ์กฐ ๊ธฐ๋ฐ˜์˜ Threshold๋ฅผ ๋งŒ์กฑํ•  ๋•Œ ์ข…๋ฃŒ.
  • ํ™œ์šฉ ์‚ฌ๋ก€:
    • ์ˆ˜ํ•™์  ์ฆ๋ช…, ๋‹จ๊ณ„์  ์ถ”๋ก ์ด ํ•„์š”ํ•œ ๋…ผ๋ฆฌ์  ๋ฌธ์ œ ํ•ด๊ฒฐ.

3) Adaptive Search (์ ์‘์  ๊ฒ€์ƒ‰)

  • ํŠน์ง•:
    • ๊ฒ€์ƒ‰ ํ•„์š”์„ฑ์„ ๋™์ ์œผ๋กœ ํŒ๋‹จํ•˜์—ฌ ๊ฒ€์ƒ‰ ๋˜๋Š” ์ƒ์„ฑ ํ”„๋กœ์„ธ์Šค๋ฅผ ์„ ํƒ.
    • Generate ๋‹จ๊ณ„์—์„œ ํŠน์ • ํ† ํฐ(์˜ˆ: Special Token)์„ ์ƒ์„ฑํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ œ์–ด.
  • ์ข…๋ฃŒ ์กฐ๊ฑด:
    • ๊ด€๋ จ ์ •๋ณด๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ˆ˜์ง‘๋˜์—ˆ๊ฑฐ๋‚˜ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ ์ž๋™ ์ข…๋ฃŒ.
  • ํ™œ์šฉ ์‚ฌ๋ก€:
    • ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณ€ํ™”ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋‚˜ ์™ธ๋ถ€ ์ง€์‹์— ์˜์กดํ•˜๋Š” ์‘๋‹ต ์ƒ์„ฑ.

RAG ์‹œ์Šคํ…œ ๊ตฌํ˜„ ์˜ˆ์‹œ

  1. ์ž…๋ ฅ ์ฒ˜๋ฆฌ: ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ํ•„ํ„ฐ๋ง ๋ฐ ์ˆ˜์ •(๊ฐ€๋“œ๋ ˆ์ผ + ์ฟผ๋ฆฌ ์žฌ์ž‘์„ฑ).
  2. ๊ฒ€์ƒ‰ ๋‹จ๊ณ„: ์ฟผ๋ฆฌ๋ฅผ ์ž„๋ฒ ๋”ฉํ•˜์—ฌ ๊ณ„์ธต์  ๊ฒ€์ƒ‰ ์ˆ˜ํ–‰.
  3. ๊ฒฐ๊ณผ ์ •์ œ: ๋ฆฌ๋žญ์ปค๋ฅผ ํ†ตํ•ด ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์ •์ œ ๋ฐ ์ˆœ์œ„ ์กฐ์ •.
  4. ์ƒ์„ฑ ๋‹จ๊ณ„: ์„ ํƒ๋œ ์ฒญํฌ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋‹ต๋ณ€ ์ƒ์„ฑ.
  5. ์ถœ๋ ฅ ์ฒ˜๋ฆฌ: ์ƒ์„ฑ๋œ ๋‹ต๋ณ€์ด ์ ์ ˆํ•œ์ง€ ๊ฒ€์ฆ(์ถœ๋ ฅ ๊ฐ€๋“œ๋ ˆ์ผ).

Chapter 4: RAG ํ‰๊ฐ€ํ•˜๊ธฐ

RAG ํ‰๊ฐ€์˜ ์ค‘์š”์„ฑ

  • RAG ์‹œ์Šคํ…œ์˜ ํ’ˆ์งˆ์„ ํ‰๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋ชจ๋ธ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ณ  ์‹ ๋ขฐ๋„๋ฅผ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.
  • ์ฃผ์š” ํ‰๊ฐ€ ๋Œ€์ƒ

    1. ๊ฒ€์ƒ‰ ํ’ˆ์งˆ: ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ ์ •ํ™•์„ฑ ๋ฐ ๊ด€๋ จ์„ฑ.
    2. ์ƒ์„ฑ ํ’ˆ์งˆ: LLM์ด ์ƒ์„ฑํ•œ ๋‹ต๋ณ€์˜ ํ’ˆ์งˆ.
    3. ์‚ฌ์šฉ์ž ๊ฒฝํ—˜: ์‹ค๋ฌด์—์„œ์˜ ์‘๋‹ต ์‹ ๋ขฐ์„ฑ๊ณผ ์ผ๊ด€์„ฑ.

  1. ์œ ์‚ฌ๋„ ๋ฐ ๊ด€๋ จ์„ฑ ํ‰๊ฐ€

  • ๊ธฐ๋ณธ ํ‰๊ฐ€ ๊ธฐ์ค€
    • ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ์˜ ๋ฒกํ„ฐ ์œ ์‚ฌ๋„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒ€์ƒ‰ ํ’ˆ์งˆ์„ ์ธก์ •.
    • ์œ ์‚ฌ๋„ ์ง€ํ‘œ: Cosine Similarity ๋“ฑ.
  • ํ‰๊ฐ€ ๋ฐฉ์‹
    • ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ๋ฒกํ„ฐ์™€ ์ž…๋ ฅ ๋ฒกํ„ฐ ๊ฐ„์˜ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ.
    • ์œ ์‚ฌ๋„ ์ ์ˆ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ ํ’ˆ์งˆ์„ ํ‰๊ฐ€.

์ธก์ • ์ฝ”๋“œ ์˜ˆ์‹œ

์ธก์ • ์ถœ๋ ฅ ์˜ˆ์‹œ


  1. LLM ํ‰๊ฐ€ : Metric

2.1. ํ›Œ๋ฅญํ•œ ํ‰๊ฐ€ ์ง€ํ‘œ์˜ ์กฐ๊ฑด

  • Quantitative (๊ณ„๋Ÿ‰์ ):

    • ์ ์ˆ˜ ๊ณ„์‚ฐ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๋ฉฐ, ํ’ˆ์งˆ ๊ฐœ์„ ์„ ์œ„ํ•ด ์‹œ๊ฐ„์— ๋”ฐ๋ผ ํ‰๊ฐ€ ์ ์ˆ˜์˜ ๋ณ€ํ™”๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ: BLEU, ROUGE ๊ฐ™์€ ์ ์ˆ˜ ๊ธฐ๋ฐ˜ ์ง€ํ‘œ.
  • Reliable (์‹ ๋ขฐ์„ฑ):

    • ํ‰๊ฐ€ ๊ฒฐ๊ณผ์— ์ผ๊ด€์„ฑ์ด ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ๋™์ผํ•œ ์ƒํ™ฉ์—์„œ ํ‰๊ฐ€๋ฅผ ๋ฐ˜๋ณตํ–ˆ์„ ๋•Œ ๊ฒฐ๊ณผ๊ฐ€ ๋™์ผํ•˜๊ฒŒ ๋‚˜์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ: ํ†ต๊ณ„์  ํ‰๊ฐ€ ๋ฉ”ํŠธ๋ฆญ์˜ ์žฌํ˜„ ๊ฐ€๋Šฅ์„ฑ.
  • Accurate (์ •ํ™•์„ฑ):

    • ํ‰๊ฐ€ํ•˜๋ ค๋Š” ๋ชฉํ‘œ์™€ ๋ถ€ํ•ฉํ•˜๋ฉฐ ๋ถ€์กฑํ•จ์ด ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ: Human Evaluation์„ ํ†ตํ•œ ์ •๋ฐ€ํ•œ ๋ถ„์„.

2.2. Types of Metric Scores

  • Human Evaluation

    • ํ‰๊ฐ€ ๋ฐฉ์‹: ์‚ฌ๋žŒ์ด ์ง์ ‘ ํ‰๊ฐ€ํ•˜์—ฌ ์ƒ์„ฑ๋œ ํ…์ŠคํŠธ์˜ ์œ ์ฐฝ์„ฑ, ๊ด€๋ จ์„ฑ, ๋…ผ๋ฆฌ์  ์ผ๊ด€์„ฑ, ์‚ฌ์‹ค์  ์ •ํ™•์„ฑ์„ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.
    • ์žฅ์ : ์‹ค์ œ ์‚ฌ์šฉ์ž ๊ด€์ ์—์„œ์˜ ์ง๊ด€์ ์ธ ํ‰๊ฐ€ ๊ฐ€๋Šฅ.
    • ๋‹จ์ : ๋น„์šฉ๊ณผ ์‹œ๊ฐ„์ด ๋งŽ์ด ๋“ค๋ฉฐ, ํ‰๊ฐ€์ž์˜ ์ฃผ๊ด€์ด ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Statistical Evaluation

    • ๋Œ€ํ‘œ ๋ฉ”ํŠธ๋ฆญ: BLEU, ROUGE, METEOR, Levenshtein Distance.
      • BLEU (Bilingual Evaluation Understudy): N-gram ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฌธ์žฅ์˜ ์ •ํ™•๋„๋ฅผ ๊ณ„์‚ฐ.
      • ROUGE (Recall-Oriented Understudy for Gisting Evaluation): ์›๋ฌธ๊ณผ ์š”์•ฝ๋ฌธ ๊ฐ„์˜ N-gram ๋˜๋Š” ๋‹จ์–ด์˜ ์ค‘๋ณต ์ •๋„๋ฅผ ์ธก์ •.
      • METEOR (Metric for Evaluation of Translation with Explicit Ordering): ๋‹จ์–ด์˜ ๋™์˜์–ด์™€ ์–ดํ˜• ๋ณ€ํ™”๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌ BLEU๋ณด๋‹ค ์œ ์—ฐํ•˜๊ฒŒ ํ‰๊ฐ€.
      • Levenshtein Distance: ํ…์ŠคํŠธ ๊ฐ„์˜ ํŽธ์ง‘ ๊ฑฐ๋ฆฌ(์‚ฝ์ž…, ์‚ญ์ œ, ๊ต์ฒด)๋กœ ํ…์ŠคํŠธ ๊ฐ„ ์ฐจ์ด๋ฅผ ๊ณ„์‚ฐ.
    • ์žฅ์ : ์ž๋™ํ™”๋œ ํ‰๊ฐ€๋กœ ๋น ๋ฅด๊ณ  ๋น„์šฉ ํšจ์œจ์ .
    • ๋‹จ์ : N-gram ๊ธฐ๋ฐ˜ ํ‰๊ฐ€๋กœ ๋ฌธ๋งฅ ๋ฐ ์˜๋ฏธ๋ฅผ ์ถฉ๋ถ„ํžˆ ๋ฐ˜์˜ํ•˜์ง€ ๋ชปํ•  ๊ฐ€๋Šฅ์„ฑ.
  • LLM-based Evaluation

    • ํ‰๊ฐ€ ๋ฐฉ์‹์˜ ํ•ต์‹ฌ ๊ธฐ์ˆ ์  ์ ‘๊ทผ๋ฒ•๊ณผ ์‚ฌ์šฉ๋œ ๋ชจ๋ธ ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ Natural Language Process Model, Embedding Model, Large Language Model๋กœ ๋ฉ”ํŠธ๋ฆญ์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Œ.

      • Natural Language Process Model: ๋…ผ๋ฆฌ์  ๊ด€๊ณ„์™€ ๋ฌธ๋งฅ์  ์œ ์‚ฌ์„ฑ ํ‰๊ฐ€์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค.

        • NLI (Natural Language Inference): ๋…ผ๋ฆฌ์  ๊ด€๊ณ„(ํฌํ•จ, ๋ชจ์ˆœ, ์ค‘๋ฆฝ)๋ฅผ ํ‰๊ฐ€.
        • BLEURT: ์‚ฌ์ „ ํ›ˆ๋ จ๋œ BERT ๋ชจ๋ธ์„ ํ™œ์šฉํ•ด ๋ฌธ๋งฅ์  ์œ ์‚ฌ์„ฑ์„ ํ‰๊ฐ€.
      • Embedding Model: ํ…์ŠคํŠธ์˜ ๋ฒกํ„ฐ ํ‘œํ˜„์„ ํ™œ์šฉํ•œ ์˜๋ฏธ์  ์œ ์‚ฌ์„ฑ ํ‰๊ฐ€์— ์ดˆ์ ์„ ๋งž์ถฅ๋‹ˆ๋‹ค.

        • BERTScore: BERT ์ž„๋ฒ ๋”ฉ์„ ์‚ฌ์šฉํ•ด ๋‘ ํ…์ŠคํŠธ ๊ฐ„์˜ ์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„๋ฅผ ๊ณ„์‚ฐ.
        • MoverScore: Earth Moverโ€™s Distance(EMD)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…์ŠคํŠธ ๊ฐ„ ๋‹จ์–ด ์ด๋™ ๊ฑฐ๋ฆฌ(Transport Cost)๋ฅผ ์ธก์ •.
      • Large Language Model: ๋Œ€๊ทœ๋ชจ ์–ธ์–ด ๋ชจ๋ธ์„ ํ™œ์šฉํ•œ ๋‹ค๊ฐ์ ์ด๊ณ  ๊ณ ์ฐจ์›์ ์ธ ํ‰๊ฐ€๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

        • QAG Score: ์งˆ๋ฌธ ์ƒ์„ฑ๊ณผ ์ •๋‹ต ๋น„๊ต๋ฅผ ํ†ตํ•ด ํ…์ŠคํŠธ์˜ ํ•ต์‹ฌ ์ •๋ณด์™€ ์‚ฌ์‹ค์„ฑ์„ ํ‰๊ฐ€.
        • GPTScore: GPT ๋ชจ๋ธ์˜ ์ƒ์„ฑ ํ™•๋ฅ  ๊ธฐ๋ฐ˜์œผ๋กœ ํ…์ŠคํŠธ์˜ ์ž์—ฐ์Šค๋Ÿฌ์›€๊ณผ ์ผ๊ด€์„ฑ์„ ํ‰๊ฐ€.
        • SelfCheckGPT: ๋ชจ๋ธ์ด ์ƒ์„ฑํ•œ ํ…์ŠคํŠธ์˜ ํ’ˆ์งˆ์„ ์Šค์Šค๋กœ ํ‰๊ฐ€ํ•˜์—ฌ ์‘๋‹ต์˜ ์ผ๊ด€์„ฑ๊ณผ ์ •๋ณด์˜ ์‚ฌ์‹ค์„ฑ์„ ์ ๊ฒ€.
        • G-Eval: Chain-of-Thought(CoT) ๋ฐ ํ”„๋กฌํ”„ํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์—…๋ณ„ ํ‰๊ฐ€ ๊ธฐ์ค€์— ๋”ฐ๋ผ ์ƒ์„ฑ ํ…์ŠคํŠธ๋ฅผ ํ‰๊ฐ€.
        • Prometheus: ๋‹ค์ค‘ ์ง€ํ‘œ ๊ธฐ๋ฐ˜์œผ๋กœ ํŠน์ • ๋„๋ฉ”์ธ์ด๋‚˜ ์ž‘์—… ๋ชฉ์ ์— ๋งž์ถ˜ ๋งž์ถคํ˜• ํ‰๊ฐ€.
    • ์žฅ์ : LLM์„ ํ™œ์šฉํ•˜์—ฌ ๊ณ ์ฐจ์›์ ์ธ ํ‰๊ฐ€ ๊ฐ€๋Šฅ.
    • ๋‹จ์ : ํ‰๊ฐ€ ๋ชจ๋ธ์˜ ํŽธํ–ฅ์„ฑ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ€ ์™œ๊ณก๋  ๊ฐ€๋Šฅ์„ฑ.

(์ฐธ๊ณ ) ๋ถ„๋ฅ˜์— ๋”ฐ๋ผ์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด๋„ ์ •์˜๋  ์ˆ˜๋„ ์žˆ์Œ.

  • Statistical Scorers๋Š” ํ†ต๊ณ„์  ํ‰๊ฐ€ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”ํŠธ๋ฆญ๋“ค๋กœ, ์ฃผ๋กœ N-gram๊ณผ ๊ฐ™์€ ์–ธ์–ด ํ†ต๊ณ„์  ํŠน์ง•์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ํ…์ŠคํŠธ ๊ฐ„์˜ ์œ ์‚ฌ๋„๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  • Model-Based Scorers๋Š” ์‚ฌ์ „ ํ›ˆ๋ จ๋œ ๋ชจ๋ธ์„ ํ™œ์šฉํ•˜์—ฌ ํ…์ŠคํŠธ ๊ฐ„์˜ ์˜๋ฏธ์  ์œ ์‚ฌ์„ฑ์„ ํ‰๊ฐ€ํ•˜๊ฑฐ๋‚˜, ๋ชจ๋ธ์ด ์ƒ์„ฑํ•œ ์‘๋‹ต ์ž์ฒด๋ฅผ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ต์ง‘ํ•ฉ(Statistical โˆฉ Model-Based)์€ ์–‘์ชฝ ํŠน์„ฑ์„ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ํ•ด์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ตฌ๋ถ„ Statistical Scorers Model-Based Scorers ๊ต์ง‘ํ•ฉ
ํ‰๊ฐ€ ๋ฐฉ์‹ ๋‹จ์ˆœ N-gram ์ผ์น˜, ํ†ต๊ณ„์  ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ ์‚ฌ์ „ ํ›ˆ๋ จ๋œ NLP ๋ชจ๋ธ ํ™œ์šฉ ํ†ต๊ณ„์  ๊ณ„์‚ฐ + ์ž„๋ฒ ๋”ฉ ๊ธฐ๋ฐ˜ ์˜๋ฏธ ํ‰๊ฐ€
์žฅ์  ๋น ๋ฅด๊ณ  ๋น„์šฉ ํšจ์œจ์ , ์ž๋™ํ™” ๊ฐ€๋Šฅ ๋ฌธ๋งฅ์  ์˜๋ฏธ์™€ ๊ตฌ์กฐ์  ํ‰๊ฐ€ ๊ฐ€๋Šฅ ํšจ์œจ์„ฑ๊ณผ ์ •ํ™•์„ฑ์„ ๊ท ํ˜• ์žˆ๊ฒŒ ๊ฒฐํ•ฉ
๋‹จ์  ๋ฌธ๋งฅ ๋ฐ˜์˜ ๋ถ€์กฑ, ์˜๋ฏธ์  ์—ฐ๊ฒฐ์„ฑ ๋ฏธํก ๊ณ„์‚ฐ ๋น„์šฉ ๋†’์Œ, ํŽธํ–ฅ ๊ฐ€๋Šฅ์„ฑ ๊ณ„์‚ฐ ๋น„์šฉ๊ณผ ๋„๋ฉ”์ธ ์˜์กด์„ฑ ์ผ๋ถ€ ์กด์žฌ
๋Œ€ํ‘œ ๋ฉ”ํŠธ๋ฆญ BLEU, ROUGE, METEOR, Levenshtein Distance BERTScore, GPTScore, SelfCheckGPT, Prometheus BERTScore, MoverScore

2.3. Strategies for LLM Evaluation

  1. ๋ชจ๋ธ ์ถœ๋ ฅ์˜ ํ˜•ํƒœ์™€ ํ‰๊ฐ€ ๋ชฉํ‘œ ์ •์˜: ์ •๋‹ต์ด ๋ช…ํ™•ํ•œ์ง€, ์•„๋‹ˆ๋ฉด ์œ ์‚ฌ์„ฑ์ด๋‚˜ ํ’ˆ์งˆ ํ‰๊ฐ€์ธ์ง€.
  2. ์ž๋™ํ™”์˜ ๊ฐ€๋Šฅ์„ฑ ๋ฐ ๋น„์šฉ ํšจ์œจ์„ฑ ๊ณ ๋ ค: Human Evaluation์„ ํฌํ•จํ• ์ง€, LLM ๊ธฐ๋ฐ˜์œผ๋กœ ๋Œ€์ฒดํ• ์ง€.
  3. ์ƒํ™ฉ์— ๋งž๋Š” ๋ฉ”ํŠธ๋ฆญ ์„ ํƒ: Accuracy, Similarity, Creativity ๋“ฑ.

2.4. LLM ํ‰๊ฐ€ ๋ฉ”ํŠธ๋ฆญ์˜ ์„ธ๋ถ€ ๋‚ด์šฉ

์•„๋ž˜๋Š” LLM(Large Language Model)์„ ํ‰๊ฐ€ํ•˜๋Š” LLM ํ‰๊ฐ€ ๋ฉ”ํŠธ๋ฆญ์— ๋Œ€ํ•ด์„œ ๊ฐ•์˜ ๋‚ด์šฉ๊ณผ ํ•ด๋‹น ๋‚ด์šฉ์„ ๋ณด์ถฉํ• ๋งŒํ•œ ์ž๋ฃŒ๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ์ฒจ๋ถ€ํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

1. NLI (Natural Language Inference)

  • ์„ค๋ช…:
    • NLI๋Š” ์ž์—ฐ์–ด ์ถ”๋ก ์„ ํ†ตํ•ด ๋‘ ํ…์ŠคํŠธ(๊ธฐ์ค€ ํ…์ŠคํŠธ์™€ ์ƒ์„ฑ ํ…์ŠคํŠธ)๊ฐ€ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์–ผ๋งˆ๋‚˜ ๊ด€๋ จ์ด ์žˆ๋Š”์ง€๋ฅผ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    • ๊ธฐ์ค€ ํ…์ŠคํŠธ(Premise)๋ฅผ ์ „์ œ๋กœ ์‚ผ๊ณ , ์ƒ์„ฑ๋œ ํ…์ŠคํŠธ๋ฅผ ๊ฐ€์„ค(Hypothesis)๋กœ ๋ณด์•„ ๋‘˜ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.
    • ํฌํ•จ(Entailment): ๊ฐ€์„ค์ด ์ „์ œ๋ฅผ ์ง€์ง€ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ชจ์ˆœ(Contradiction): ๊ฐ€์„ค์ด ์ „์ œ์™€ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.
    • ์ค‘๋ฆฝ(Neutral): ๋‘ ๋ฌธ์žฅ์ด ๋…ผ๋ฆฌ์ ์œผ๋กœ ์—ฐ๊ด€์€ ์žˆ์ง€๋งŒ ์ง์ ‘์ ์œผ๋กœ ์ง€์ง€ํ•˜๊ฑฐ๋‚˜ ๋ชจ์ˆœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ํŠน์ง•:

    • NLI๋Š” ์ƒ์„ฑ๋œ ํ…์ŠคํŠธ์™€ ๊ธฐ์ค€ ํ…์ŠคํŠธ ๊ฐ„์˜ ๋…ผ๋ฆฌ์  ๊ด€๊ณ„๋ฅผ ํ‰๊ฐ€ํ•˜๋ฉฐ, ์˜๋ฏธ์  ์ผ๊ด€์„ฑ์„ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.
  • ์žฅ์ :

    • NLI๋Š” ๋‹จ์ˆœ ๋‹จ์–ด ๋งค์นญ์ด ์•„๋‹ˆ๋ผ, ํ…์ŠคํŠธ์˜ ๋…ผ๋ฆฌ์  ๊ด€๊ณ„๋ฅผ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฒˆ์—ญ, ์š”์•ฝ, ์ •๋ณด ์ถ”์ถœ ๋“ฑ ๋‹ค์–‘ํ•œ ์ž‘์—…์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹จ์ :

    • ๋ชจ๋ธ์ด ํ…์ŠคํŠธ ๊ฐ„ ๊ด€๊ณ„๋ฅผ ์ถฉ๋ถ„ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋ฉด ํ‰๊ฐ€๊ฐ€ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํ…์ŠคํŠธ ๋ณต์žก์„ฑ์— ๋”ฐ๋ผ ๋ฏผ๊ฐํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

2. BLEURT (Bilingual Evaluation Understudy with Representations from Transformers)

  • ์„ค๋ช…:
    • BLEURT๋Š” BERT๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋œ ํ‰๊ฐ€ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ์‚ฌ์ „ ํ•™์Šต๋œ BERT ๋ชจ๋ธ์ด ๋ฌธ๋งฅ์„ ์ดํ•ดํ•˜๋ฉฐ, ๊ธฐ์ค€ ํ…์ŠคํŠธ์™€ ์ƒ์„ฑ ํ…์ŠคํŠธ ๊ฐ„์˜ ์˜๋ฏธ์  ์œ ์‚ฌ์„ฑ์„ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    • BLEURT๋Š” ๋‹จ์ˆœํ•œ ๋‹จ์–ด ๋งค์นญ ๋ฐฉ์‹์ด ์•„๋‹Œ, ๋ฌธ์žฅ์˜ ๊นŠ์€ ์˜๋ฏธ์™€ ๋ฌธ๋งฅ์  ์ผ์น˜๋ฅผ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ํŠน์ง•:

    • BLEURT๋Š” ๋ฌธ๋งฅ์  ์˜๋ฏธ๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌ ๋‘ ํ…์ŠคํŠธ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์œ ์‚ฌํ•œ์ง€ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ์žฅ์ :

    • ๋‹จ์ˆœ ํ†ต๊ณ„์  ํ‰๊ฐ€๋ณด๋‹ค ๋ฌธ์žฅ์˜ ์˜๋ฏธ ์ฐจ์ด๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.
    • BLEU์™€ ROUGE๋ณด๋‹ค ์ •ํ™•ํ•œ ํ‰๊ฐ€๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • ์‚ฌ์ „ ํ›ˆ๋ จ๋œ BERT๋ฅผ ์‚ฌ์šฉํ•ด ๋น ๋ฅด๊ณ  ํšจ๊ณผ์ ์œผ๋กœ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹จ์ :

    • BERT ๋ชจ๋ธ ์‚ฌ์šฉ์œผ๋กœ ์ธํ•ด ์ž์›์ด ์†Œ๋ชจ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํŠน์ • ๋„๋ฉ”์ธ์—์„œ๋Š” ์ ์‘๋ ฅ์ด ๋‚ฎ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. BERTScore

  • ์„ค๋ช…:
    • BERTScore๋Š” BERT ์ž„๋ฒ ๋”ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ ํ…์ŠคํŠธ์™€ ๊ธฐ์ค€ ํ…์ŠคํŠธ์˜ ์˜๋ฏธ์  ์œ ์‚ฌ์„ฑ์„ ๋ฒกํ„ฐ ๊ณต๊ฐ„์—์„œ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ๋‹จ์–ด ๊ฐ„์˜ ์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ๋‘ ํ…์ŠคํŠธ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋น„์Šทํ•œ์ง€๋ฅผ ์ ์ˆ˜๋กœ ์‚ฐ์ถœํ•ฉ๋‹ˆ๋‹ค.

  • ํŠน์ง•:

    • BERTScore๋Š” BERT์˜ ๋ฌธ๋งฅ ์ดํ•ด ๋Šฅ๋ ฅ์„ ํ™œ์šฉํ•˜์—ฌ ๋‹จ์ˆœํ•œ n-gram ๊ธฐ๋ฐ˜ ์ ์ˆ˜๋ณด๋‹ค ์ •ํ™•ํ•˜๊ฒŒ ์˜๋ฏธ์™€ ์œ ์‚ฌ์„ฑ์„ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ์žฅ์ :

    • ๋†’์€ ์˜๋ฏธ์  ์ •ํ™•๋„๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฒˆ์—ญ, ์š”์•ฝ, ์ƒ์„ฑ ํ…์ŠคํŠธ ํ‰๊ฐ€ ๋“ฑ ๋‹ค์–‘ํ•œ ์ž‘์—…์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹จ์ :

    • ๊ณ„์‚ฐ์— ๋งŽ์€ ์ž์›์ด ์†Œ๋ชจ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • BERT ํ›ˆ๋ จ ๋„๋ฉ”์ธ๊ณผ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์—์„œ๋Š” ์ •ํ™•๋„๊ฐ€ ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. MoverScore

  • ์„ค๋ช…:
    • MoverScore๋Š” Earth Moverโ€™s Distance (EMD) ๊ฐœ๋…์„ ํ™œ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ ํ…์ŠคํŠธ์™€ ๊ธฐ์ค€ ํ…์ŠคํŠธ์˜ ์˜๋ฏธ์  ์œ ์‚ฌ์„ฑ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
    • ๋‹จ์–ด ์ž„๋ฒ ๋”ฉ ๋ฒกํ„ฐ ๊ฐ„์˜ ์ด๋™ ๊ฑฐ๋ฆฌ(์ด๋™ ๋น„์šฉ)๋ฅผ ์ตœ์†Œํ™”ํ•˜์—ฌ ๋‘ ํ…์ŠคํŠธ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์œ ์‚ฌํ•œ์ง€๋ฅผ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  • ํŠน์ง•:

    • ๋‹จ์–ด ์ด๋™ ๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ˜ ํ‰๊ฐ€๋กœ ์˜๋ฏธ์ ์œผ๋กœ ๋น„์Šทํ•œ ๋‹จ์–ด๋“ค ๊ฐ„์˜ ์œ ์‚ฌ์„ฑ์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์žฅ์ :

    • ๋‹จ์–ด ์ด๋™ ๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ˜์œผ๋กœ ์ •๋ฐ€ํ•œ ์œ ์‚ฌ์„ฑ์„ ์ธก์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋ฒˆ์—ญ, ์š”์•ฝ ๋“ฑ ๋‹ค์–‘ํ•œ NLP ์ž‘์—…์— ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋‹จ์ :

    • ์ด๋™ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ์ด ๋ณต์žกํ•˜๊ณ  ์ž์›์ด ๋งŽ์ด ์†Œ๋ชจ๋ฉ๋‹ˆ๋‹ค.
    • ๊ธด ๋ฌธ์žฅ์€ ๋‹จ์–ด ์ˆ˜์ค€์—์„œ ํ‰๊ฐ€ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. GPTScore

  • ์„ค๋ช…:
    • GPTScore๋Š” GPT์™€ ๊ฐ™์€ ๋Œ€ํ˜• ์–ธ์–ด ๋ชจ๋ธ(LLM)์˜ ์ž„๋ฒ ๋”ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ๋งฅ์  ์˜๋ฏธ์™€ ๋ฌธ์žฅ์˜ ์ž์—ฐ์Šค๋Ÿฌ์›€์„ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    • ์ƒ์„ฑ๋œ ๋ฌธ์žฅ์˜ ๊ฐ ํ† ํฐ(๋‹จ์–ด)์ด ์ฃผ์–ด์ง„ ์กฐ๊ฑด์—์„œ ์–ผ๋งˆ๋‚˜ ๋†’์€ ํ™•๋ฅ ๋กœ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€๋ฅผ ์ ์ˆ˜ํ™”ํ•ฉ๋‹ˆ๋‹ค.

  • ํŠน์ง•:

    • GPTScore๋Š” ๋‹จ์–ด ์ˆ˜์ค€์„ ๋„˜์–ด ๋ฌธ์žฅ ์ „์ฒด์˜ ์˜๋ฏธ์  ์œ ์‚ฌ์„ฑ๊ณผ ๋ฌธ๋งฅ์  ์ž์—ฐ์Šค๋Ÿฌ์›€์„ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์žฅ์ :

    • ๋Œ€ํ˜• ์–ธ์–ด ๋ชจ๋ธ์˜ ๊ฐ•๋ ฅํ•œ ๋ฌธ๋งฅ ์ดํ•ด ๋Šฅ๋ ฅ์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฒˆ์—ญ, ์š”์•ฝ, ์ƒ์„ฑ ํ…์ŠคํŠธ ํ‰๊ฐ€ ๋“ฑ ๋‹ค์–‘ํ•œ ์ž‘์—…์— ์ ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹จ์ :

    • ์‚ฌ์šฉ๋œ ๋ชจ๋ธ์— ๋”ฐ๋ผ ์„ฑ๋Šฅ์ด ์ œํ•œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๊ณ„์‚ฐ ๋น„์šฉ์ด ๋งŽ์ด ์†Œ๋ชจ๋ฉ๋‹ˆ๋‹ค.

6. QAG Score (Question-Answer Generation)

  • ์„ค๋ช…:
    • QAG๋Š” ์งˆ๋ฌธ-๋‹ต๋ณ€ ์ƒ์„ฑ ๋ฐฉ์‹์„ ํ™œ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ ํ…์ŠคํŠธ์™€ ๊ธฐ์ค€ ํ…์ŠคํŠธ ๊ฐ„์˜ ์‚ฌ์‹ค์  ์ผ๊ด€์„ฑ์„ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    • ๊ธฐ์กด Question Generation๊ณผ์˜ ์ฐจ์ด์ ์€ ์ƒ์„ฑ๋œ ํ…์ŠคํŠธ์—์„œ ์งˆ๋ฌธ์„ ๋งŒ๋“ค๊ณ , ์ด์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ๊ธฐ์ค€ ํ…์ŠคํŠธ์™€ ์ผ์น˜ํ•˜๋Š”์ง€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

(์ฐธ๊ณ ) ํ•ด๋‹น ๋…ผ๋ฌธ์€ Question-Answer Generation Task Pipeline์„ ๋‹ค๋ฃจ๊ธด ํ–ˆ์ง€๋งŒ, ์ •ํ™•ํ•˜๊ฒŒ Scoring์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฃจ๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ํŠน์ง•:

    • ์งˆ๋ฌธ-๋‹ต๋ณ€ ํ˜•์‹์œผ๋กœ ํ…์ŠคํŠธ์˜ ํ•ต์‹ฌ ์˜๋ฏธ๋ฅผ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ์žฅ์ :

    • ํ…์ŠคํŠธ์˜ ์‚ฌ์‹ค์  ํ’ˆ์งˆ์„ ์ •๋ฐ€ํ•˜๊ฒŒ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    • ์งˆ๋ฌธ๊ณผ ๋‹ต๋ณ€ ๋ฐฉ์‹์œผ๋กœ ํ…์ŠคํŠธ์˜ ํ•ต์‹ฌ ์ •๋ณด๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹จ์ :

    • ์ถ”๊ฐ€์ ์ธ ์งˆ๋ฌธ ์ƒ์„ฑ ๊ณผ์ •์ด ํ•„์š”ํ•ด ์‹œ๊ฐ„์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค.
    • QA ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์— ๋”ฐ๋ผ ํ‰๊ฐ€ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

7. SelfCheckGPT

  • ์„ค๋ช…:
    • SelfCheckGPT๋Š” ๋ชจ๋ธ์ด ์Šค์Šค๋กœ ํ…์ŠคํŠธ์˜ ํ’ˆ์งˆ์„ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    • ๋ชจ๋ธ์ด ์ž‘์„ฑํ•œ ์—ฌ๋Ÿฌ ์‘๋‹ต์„ ๋น„๊ตํ•ด ์œ ์‚ฌ์„ฑ์ด ๋ฐ˜๋ณต๋˜๋ฉด ์ผ๊ด€์„ฑ์ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.

  • ํŠน์ง•:

    • ์ƒ์„ฑ๋œ ํ…์ŠคํŠธ๊ฐ€ ์ด์ „ ์ •๋ณด์™€ ์–ผ๋งˆ๋‚˜ ์ž˜ ์—ฐ๊ฒฐ๋˜๋Š”์ง€๋ฅผ ์ ๊ฒ€ํ•ฉ๋‹ˆ๋‹ค.
  • ์žฅ์ :

    • ์‚ฌ๋žŒ์ด ํ•„์š” ์—†์ด ๋ชจ๋ธ์ด ์Šค์Šค๋กœ ํ…์ŠคํŠธ ํ’ˆ์งˆ์„ ์ ๊ฒ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ •๋ณด ์ผ๊ด€์„ฑ๊ณผ ์‚ฌ์‹ค์„ฑ์„ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹จ์ :

    • ๋ณต์žกํ•œ ์‚ฌ์‹ค ๊ฒ€์ฆ์—๋Š” ์•ฝํ•ฉ๋‹ˆ๋‹ค.
    • ๋ชจ๋ธ์˜ ์‹ ๋ขฐ์„ฑ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

8. G-Eval

  • ์„ค๋ช…:
    • G-Eval์€ GPT-4๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ CoT (Chain-of-Thought)์™€ ์–‘์‹ ์ฑ„์šฐ๊ธฐ(Form-filling) ๋ฐฉ์‹์„ ๊ฒฐํ•ฉํ•˜์—ฌ ํ‰๊ฐ€ ๊ธฐ์ค€์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค.

    • ํ‰๊ฐ€ ํ•ญ๋ชฉ(์˜ˆ: ์ผ๊ด€์„ฑ, ์ •ํ™•์„ฑ ๋“ฑ)์„ ์ •์˜ํ•˜๊ณ  ์ด์— ๋”ฐ๋ผ ์ ์ˆ˜๋ฅผ ๋งค๊น๋‹ˆ๋‹ค.

  • ํŠน์ง•:

    • ํ‰๊ฐ€ ๊ธฐ์ค€์„ ์„ธ๋ถ„ํ™”ํ•˜์—ฌ ์ •๋ฐ€ํ•œ ํ‰๊ฐ€๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์žฅ์ :

    • ๋‹ค์–‘ํ•œ ์ž‘์—…์—์„œ ๋งž์ถคํ˜• ํ‰๊ฐ€๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • CoT ๋ฐฉ์‹์œผ๋กœ ํ‰๊ฐ€์˜ ์ •๋ฐ€๋„๊ฐ€ ๋†’์•„์ง‘๋‹ˆ๋‹ค.
  • ๋‹จ์ :

    • ํ”„๋กฌํ”„ํŠธ ์„ค๊ณ„๊ฐ€ ์ž˜๋ชป๋˜๋ฉด ํ‰๊ฐ€ ๊ฒฐ๊ณผ์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

9. Prometheus

  • ์„ค๋ช…:
    • Prometheus๋Š” ํ•œ๊ตญ๊ณผํ•™๊ธฐ์ˆ ์›(KAIST)๊ณผ LG AI์—ฐ๊ตฌ์›์ด ๊ฐœ๋ฐœํ•œ ์˜คํ”ˆ ์†Œ์Šค ํ‰๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ํŠน์ • ๋„๋ฉ”์ธ์ด๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋งž์ถฐ ํ‰๊ฐ€ ๊ธฐ์ค€์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํŠน์ง•:

    • ์‚ฌ์ „ ์ •์˜๋œ ํ‰๊ฐ€ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋‹ค์–‘ํ•œ ํ‰๊ฐ€ ์ง€ํ‘œ(์ •ํ™•์„ฑ, ์œ ์ฐฝ์„ฑ, ์ผ๊ด€์„ฑ, ์‚ฌ์‹ค์„ฑ ๋“ฑ)๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์žฅ์ :

    • ๋‹ค์–‘ํ•œ ์ง€ํ‘œ์™€ ์‚ฌ์šฉ์ž ๋งž์ถคํ˜• ํ‰๊ฐ€๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • ํŠน์ • ๋„๋ฉ”์ธ์— ๊ตญํ•œ๋˜์ง€ ์•Š๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹จ์ :

    • ํ”„๋กฌํ”„ํŠธ ์„ค๊ณ„๊ฐ€ ํ‰๊ฐ€ ๊ฒฐ๊ณผ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. RAG ํ‰๊ฐ€

์•„๋ž˜๋Š” RAG(Retrieval-Augmented Generation)๋ฅผ ํ‰๊ฐ€ํ•˜๋Š” RAG ํ‰๊ฐ€ ๋ฉ”ํŠธ๋ฆญ์— ๋Œ€ํ•ด์„œ ๊ฐ•์˜ ๋‚ด์šฉ๊ณผ ํ•ด๋‹น ๋‚ด์šฉ์„ ๋ณด์ถฉํ• ๋งŒํ•œ ์ž๋ฃŒ๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ์ฒจ๋ถ€ํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

Background

RAG ์‹œ์Šคํ…œ์€ ๊ฒ€์ƒ‰ ๋‹จ๊ณ„์™€ ์ƒ์„ฑ(๋‹ต๋ณ€) ๋‹จ๊ณ„์˜ ํ‰๊ฐ€๊ฐ€ ๋ชจ๋‘ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฐ ๋‹จ๊ณ„์˜ ์„ธ๋ถ€ ํ‰๊ฐ€ ์š”์†Œ์™€ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1. Input

  • [Q] Question: ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์งˆ๋ฌธ์œผ๋กœ, RAG ํŒŒ์ดํ”„๋ผ์ธ์˜ ์‹œ์ž‘์ ์ž…๋‹ˆ๋‹ค.

2. RAG Pipeline

RAG ํŒŒ์ดํ”„๋ผ์ธ์€ ํฌ๊ฒŒ ๋‘ ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค:

  • Retriever (๊ฒ€์ƒ‰๊ธฐ):
    • ๋ฌธ์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์งˆ๋ฌธ๊ณผ ๊ด€๋ จ๋œ ์ปจํ…์ŠคํŠธ([C] Retrieval Context)๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ฌ ๊ฒ€์ƒ‰ ํ‰๊ฐ€

  • ๋ชฉ์ : ๊ฒ€์ƒ‰๋œ ์ปจํ…์ŠคํŠธ๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ์— ์–ผ๋งˆ๋‚˜ ๊ด€๋ จ์„ฑ์ด ์žˆ๋Š”์ง€๋ฅผ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ฒ€์ƒ‰๋œ ์ปจํ…์ŠคํŠธ([C] Retrieval Context)๊ฐ€ ์งˆ๋ฌธ([Q] Question)๊ณผ ์–ผ๋งˆ๋‚˜ ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ํ‰๊ฐ€ ๋ฉ”ํŠธ๋ฆญ:
    • Contextual Recall: ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ๊ฐ€ ์งˆ๋ฌธ๊ณผ ๊ด€๋ จ๋œ ๋‚ด์šฉ์„ ์–ผ๋งˆ๋‚˜ ๋งŽ์ด ํฌํ•จํ•˜๋Š”์ง€.
    • Contextual Precision: ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ์˜ ๋น„์œจ ์ค‘ ๊ด€๋ จ๋œ ๋‚ด์šฉ์ด ์–ผ๋งˆ๋‚˜ ๋˜๋Š”์ง€.
    • Contextual Relevancy: ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ๊ฐ€ ์งˆ๋ฌธ์˜ ์˜๋ฏธ์™€ ์–ผ๋งˆ๋‚˜ ์œ ์‚ฌํ•œ์ง€.
  • Generator (์ƒ์„ฑ๊ธฐ):
    • ๊ฒ€์ƒ‰๋œ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ต๋ณ€([A] Actual Output)์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ฌ ์ƒ์„ฑ ํ‰๊ฐ€

  • ๋ชฉ์ : ์ƒ์„ฑ๋œ ๋‹ต๋ณ€์ด ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ ๋ฐ ์งˆ๋ฌธ์— ์–ผ๋งˆ๋‚˜ ์ž˜ ๋ถ€ํ•ฉํ•˜๋Š”์ง€๋ฅผ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    • ์ƒ์„ฑ๋œ ๋‹ต๋ณ€([A] Actual Output)์ด ๊ฒ€์ƒ‰๋œ ์ปจํ…์ŠคํŠธ([C] Retrieval Context), ์งˆ๋ฌธ([Q] Question), Ground Truth([G] Ground Truth)์™€ ์–ผ๋งˆ๋‚˜ ์ผ์น˜ํ•˜๋Š”์ง€ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ํ‰๊ฐ€ ๋ฉ”ํŠธ๋ฆญ:
    • Answer Relevancy: ์ƒ์„ฑ๋œ ๋‹ต๋ณ€์ด ์งˆ๋ฌธ๊ณผ ์–ผ๋งˆ๋‚˜ ๊ด€๋ จ ์žˆ๋Š”์ง€.
    • Faithfulness: ์ƒ์„ฑ๋œ ๋‹ต๋ณ€์ด ๊ฒ€์ƒ‰๋œ ์ปจํ…์ŠคํŠธ์— ์–ผ๋งˆ๋‚˜ ์ถฉ์‹คํ•œ์ง€.

3. LLM Output

  • [A] Actual Output: RAG ์‹œ์Šคํ…œ์ด ์ƒ์„ฑํ•œ ์ตœ์ข… ๋‹ต๋ณ€.
  • [G] Ground Truth: ํ‰๊ฐ€์˜ ๊ธฐ์ค€์ด ๋˜๋Š” ์ •๋‹ต ๋ฐ์ดํ„ฐ.

3.1 Model-based Scorer

RAG ํ‰๊ฐ€์—์„œ LLM Evaluation Metric์„ ์‚ฌ์šฉํ•˜์—ฌ ์งˆ๋ฌธ, ๊ฒ€์ƒ‰๋œ ์ปจํ…์ŠคํŠธ, ์ƒ์„ฑ๋œ ๋‹ต๋ณ€, Ground Truth(Golden Data)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ ์ˆ˜๋ฅผ ์‚ฐ์ถœํ•˜๋Š” ๊ณผ์ •์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

1. ์ž…๋ ฅ/ํ‰๊ฐ€ ์š”์†Œ

RAG ํ‰๊ฐ€์— ํ•„์š”ํ•œ ์ฃผ์š” ์ž…๋ ฅ ๊ฐ’(arguments from LLM application)๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • Input (์งˆ๋ฌธ): ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์งˆ๋ฌธ.
  • Actual Output (์‹ค์ œ ์ถœ๋ ฅ): RAG ์‹œ์Šคํ…œ์ด ์ƒ์„ฑํ•œ ๋‹ต๋ณ€.
  • Retrieval Context (๊ฒ€์ƒ‰ ์ปจํ…์ŠคํŠธ): ์งˆ๋ฌธ์— ๋Œ€ํ•ด ๊ฒ€์ƒ‰๋œ ๊ด€๋ จ ๋ฌธ์„œ๋‚˜ ํ…์ŠคํŠธ.
  • Ground Truth (์ •๋‹ต ๋ฐ์ดํ„ฐ): ์ด์ƒ์ ์ธ ์ •๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ธฐ์ค€ ๊ฐ’.

2. LLM Evaluation Metric

  • Scorer (์ ์ˆ˜ ์‚ฐ์ถœ๊ธฐ):

    • ์ž…๋ ฅ ์š”์†Œ๋“ค(Input, Actual Output, Retrieval Context, Ground Truth)์„ ๋น„๊ตํ•˜์—ฌ ์ ์ˆ˜๋ฅผ ์‚ฐ์ถœํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ: Fine-tuned BERT, GPT ๋ชจ๋ธ์ด ์ž…๋ ฅ ๊ฐ’๊ณผ ์ถœ๋ ฅ ๊ฐ’ ๊ฐ„์˜ ์œ ์‚ฌ์„ฑ์„ ๊ณ„์‚ฐ.
  • Thresholding (์ž„๊ณ„๊ฐ’ ํ‰๊ฐ€):

    • Scorer๊ฐ€ ์‚ฐ์ถœํ•œ ์ ์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ตœ์†Œ ์ž„๊ณ„๊ฐ’(Threshold)์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ์ ์ˆ˜๊ฐ€ ์ž„๊ณ„๊ฐ’์„ ์ดˆ๊ณผํ•˜๋ฉด โ€œPassed(โœ”๏ธ)โ€๋กœ ํ‰๊ฐ€๋˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด โ€œFailed(โŒ)โ€๋กœ ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค.
  • Score์™€ Reason(Optional):

    • ์ ์ˆ˜์™€ ํ•จ๊ป˜ ์„ ํƒ์ ์œผ๋กœ ์ด์œ (Reason)๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์™œ ํ•ด๋‹น ์ ์ˆ˜๋ฅผ ๋ฐ›์•˜๋Š”์ง€ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3.2 Ground Truth

1. Ground Truth๋ž€?

  • ์ •์˜: Ground Truth๋Š” ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ์— ์ ํ•ฉํ•œ ์ด์ƒ์ ์ธ ๋‹ต๋ณ€์ด๋‚˜ ๋ฌธ์„œ์˜ ์ฒญํฌ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

    • ์ด๋Š” RAG ์‹œ์Šคํ…œ์—์„œ ํ‰๊ฐ€ ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • ํŠน์ง•:

    • ์ •๋‹ต ๋ฐ์ดํ„ฐ: ํ•™์Šต ๋ฐ ํ‰๊ฐ€ ๊ณผ์ •์—์„œ ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์„ ํŒ๋‹จํ•˜๋Š” ๊ธฐ์ค€์  ์—ญํ• .
    • End-to-End ํ‰๊ฐ€: RAG ์‹œ์Šคํ…œ์˜ ๊ฒ€์ƒ‰ ๋ฐ ์ƒ์„ฑ ๊ณผ์ •์„ ์ข…ํ•ฉ์ ์œผ๋กœ ๋น„๊ต ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ.
    • ์ด์ƒ์  ์ƒํƒœ: ์‹ค์ œ ํ˜„์žฅ์—์„œ ์ค€๋น„ํ•˜๊ธฐ ์–ด๋ ต๊ณ , ๋งŽ์€ ๋น„์šฉ๊ณผ ๋…ธ๋ ฅ์ด ํ•„์š”.

๐Ÿ† Golden Data ?

  • Ground Truth๋Š” ํ•™์Šต ๋ฐ ํ‰๊ฐ€ ๊ธฐ์ค€์ด ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ผ๋ฉด, Golden Data๋Š” ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ฒด์ ์ธ ํ‰๊ฐ€๋ฅผ ์œ„ํ•œ ์ƒ˜ํ”Œ๋ง๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • Golden Data๋Š” Ground Truth ๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ • ๋ชฉ์ ์— ๋งž๊ฒŒ ์„ ๋ณ„ํ•˜์—ฌ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋Ÿฌํ•œ Ground_truth๋Š” ์–ด๋–ป๊ฒŒ ๋ง๋“ค ์ˆ˜ ์žˆ์„๊นŒ์š”?

2. Ground Truth ์ƒ์„ฑ ๊ณผ์ •

์•„๋ž˜ ์ด๋ฏธ์ง€์—์„œ ์ œ์‹œ๋œ ๋‚ด์šฉ์€ Ground Truth๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

๊ฐ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

(1) ๋ฌธ์„œ ํŒŒ์‹ฑ ๋ฐ ์ „์ฒ˜๋ฆฌ

  • PDF/์›๋ฌธ ๋ฌธ์„œ ์ฒ˜๋ฆฌ:
    • ์›๋ณธ ๋ฌธ์„œ๋ฅผ ์ฝ์–ด์„œ ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜(parsing).
    • ๊ธด ํ…์ŠคํŠธ๋ฅผ ์ ์ ˆํ•œ ํฌ๊ธฐ๋กœ ๋‚˜๋ˆ„๋Š” chunking ์ž‘์—…์„ ์ˆ˜ํ–‰.
  • ์ฒญํฌ ๋‹จ์œ„ ์ƒ์„ฑ:
    • ํ…์ŠคํŠธ๋ฅผ ์งง์€ ๋ฌธ์žฅ์ด๋‚˜ ๋‹จ๋ฝ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ํ‰๊ฐ€ ๋‹จ์œ„๋กœ ์‚ฌ์šฉ.

(2) ์งˆ๋ฌธ ์ƒ์„ฑ

  • Random Pick:
    • ์ƒ์„ฑ๋œ ์ฒญํฌ ์ค‘ ์ผ๋ถ€๋ฅผ ๋ฌด์ž‘์œ„๋กœ ์„ ํƒ. (random ground truth)
  • ์งˆ๋ฌธ ์ƒ์„ฑ:
    • ์„ ํƒ๋œ ์ฒญํฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ด€๋ จ๋œ ์งˆ๋ฌธ์„ ์ž๋™ ์ƒ์„ฑ.
    • ์˜ˆ๋ฅผ ๋“ค์–ด:
      • ํ…์ŠคํŠธ ์ฒญํฌ: โ€œI like apple. I mean the fruit apple, not the smartphone.โ€
      • ์ƒ์„ฑ๋œ ์งˆ๋ฌธ: โ€œWhat is your favorite fruit?โ€

(3) ๋‹ต๋ณ€ ์ƒ์„ฑ

  • Retrieval GT(๊ฒ€์ƒ‰ ๊ธฐ๋ฐ˜ ์ •๋‹ต):
    • ์„ ํƒ๋œ ์ฒญํฌ(retrieval ground truth)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ต๋ณ€ ์ƒ์„ฑ.
  • Generation GT(์ƒ์„ฑ ๊ธฐ๋ฐ˜ ์ •๋‹ต):
    • ์งˆ๋ฌธ๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ ์ ˆํ•œ ๋‹ต๋ณ€์„ ์ƒ์„ฑ.

(4) ๊ฒฐ๊ณผ ๊ฒ€ํ† 

  • ์ƒ์„ฑ๋œ ์งˆ๋ฌธ-๋‹ต๋ณ€ ์Œ์˜ ํ’ˆ์งˆ์„ ์ˆ˜๋™์œผ๋กœ ๊ฒ€ํ† ํ•˜๊ฑฐ๋‚˜ LLM ๊ธฐ๋ฐ˜ ์ž๋™ํ™” ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ตœ์ข… Ground Truth ํ’ˆ์งˆ์„ ๋ณด์žฅ.

3.3 RAG ํ‰๊ฐ€๋ฅผ ์œ„ํ•œ Framework

๊ฐ•์˜ ์ž๋ฃŒ์—์„œ๋Š” ๋Œ€ํ‘œ์ ์ธ ํ‰๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ(Evaluation Framework)๋กœ Ragas์™€ DeepEval, ๊ทธ๋ฆฌ๊ณ  Pheonix๋ฅผ ์˜ˆ๋กœ ๋“ญ๋‹ˆ๋‹ค.

์„ธ ํ”„๋ ˆ์ž„์›Œํฌ ๋ชจ๋‘ ๋Œ€ํ˜• ์–ธ์–ด ๋ชจ๋ธ(LLM) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ํ‰๊ฐ€ํ•˜๊ณ  ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

Ragas

Ragas๋Š” ๋ฌธ์„œ์—์„œ ์ฒญํฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์งˆ๋ฌธ-๋‹ต๋ณ€ ์Œ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

Ragas์˜ ์ฃผ์š” ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • ์ž๋™ํ™”๋œ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ: ๋ฌธ์„œ๋กœ๋ถ€ํ„ฐ ์ฒญํฌ๋ฅผ ์ถ”์ถœํ•˜๊ณ , ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์งˆ๋ฌธ-๋‹ต๋ณ€ ์Œ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„์šฉ ํšจ์œจ์„ฑ: ๋ฐ์ดํ„ฐ ์ƒ์„ฑ ๊ณผ์ •์„ ์ž๋™ํ™”ํ•จ์œผ๋กœ์จ ์ˆ˜๋™์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋น„์šฉ์„ ํฌ๊ฒŒ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ •๋Ÿ‰์  ํ‰๊ฐ€: ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ LLM ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์ •๋Ÿ‰์ ์œผ๋กœ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

DeepEval

DeepEval์€ LLM์„ ์œ„ํ•œ ์œ ๋‹› ํ…Œ์ŠคํŠธ ๋„๊ตฌ๋กœ, Ground Truth ์ƒ์„ฑ ๋ฐ ํ‰๊ฐ€๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

DeepEval์˜ ์ฃผ์š” ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • LLM ๊ธฐ๋ฐ˜ ํ‰๊ฐ€: LLM์„ ์‚ฌ์šฉํ•˜์—ฌ Ground Truth๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ํŒŒ์ด์ฌ ์นœํ™”์  ์ ‘๊ทผ: ํŒŒ์ด์ฌ์œผ๋กœ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•˜๊ฒŒ LLM ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์šฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค์–‘ํ•œ ๋ฉ”ํŠธ๋ฆญ ์ œ๊ณต: ๊ด€๋ จ์„ฑ, ์‚ฌ์‹ค์˜ ์ผ๊ด€์„ฑ, ๋…์„ฑ, ํŽธํ–ฅ์„ฑ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฉ”ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•˜์—ฌ LLM ์‘๋‹ต์„ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • CI/CD ํ†ตํ•ฉ: ํ…Œ์ŠคํŠธ๋ฅผ ์ œํ’ˆ ๊ฐœ๋ฐœ ํŒŒ์ดํ”„๋ผ์ธ์— ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด, ์ง€์†์ ์ธ ํ†ตํ•ฉ๊ณผ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • Web UI ์ œ๊ณต: ํ…Œ์ŠคํŠธ, ๊ตฌํ˜„, ๋น„๊ต๋ฅผ ์œ„ํ•œ ์›น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Phoenix

Phoenix๋Š” Arize AI์—์„œ ๊ฐœ๋ฐœํ•œ ์˜คํ”ˆ์†Œ์Šค LLM ๊ด€์ฐฐ์„ฑ ๋ฐ ํ‰๊ฐ€ ํ”Œ๋žซํผ์œผ๋กœ, LLM ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐœ๋ฐœ, ๋””๋ฒ„๊น…, ํ‰๊ฐ€๋ฅผ ์œ„ํ•œ ์ข…ํ•ฉ์ ์ธ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Phoenix์˜ ์ฃผ์š” ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • ํŠธ๋ ˆ์ด์‹ฑ: LLM ์ž‘์—…์˜ ์‹คํ–‰ ๋ฉ”ํŠธ๋ฆญ์„ ์ถ”์ ํ•˜๊ณ  ๋ชจ๋ธ ๋™์ž‘์„ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ์ง€์—ฐ ์‹œ๊ฐ„, ํ† ํฐ ์‚ฌ์šฉ๋Ÿ‰ ๋“ฑ์˜ ์„ฑ๋Šฅ ๋ฉ”ํŠธ๋ฆญ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ ํŠน์ • ์ŠคํŒฌ์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ณ  ๊ด€๋ จ ๋กœ๊ทธ์™€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ‰๊ฐ€: ์‚ฌ์ „ ํ…Œ์ŠคํŠธ๋œ ํ‰๊ฐ€ ํ…œํ”Œ๋ฆฟ์„ ์ œ๊ณตํ•˜์—ฌ ๋ชจ๋ธ ํ’ˆ์งˆ์„ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ •์˜, ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ ์ˆ˜์ง‘, ์ž๋™ ํ‰๊ฐ€๋ฅผ ์œ„ํ•œ ๋ณ„๋„ LLM ํ™œ์šฉ ๋“ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์‹คํ—˜ ๋ฐ ๋””๋ฒ„๊น…: ํ”„๋กœํ† ํƒ€์ดํ•‘ ๋ฐ ๋””๋ฒ„๊น… ๋‹จ๊ณ„์—์„œ ์ฝ”๋“œ ๊ณ„์ธก์„ ํ†ตํ•ด ์ƒ์„ธํ•œ ์‹คํ–‰ ํ๋ฆ„ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ณ , ํ”„๋กฌํ”„ํŠธ ๋ฐ ๋ชจ๋ธ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•œ ์‹คํ—˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒ€์ƒ‰ ๋ฐ ์ถ”์ถœ(RAG) ๋ถ„์„: ๊ฒ€์ƒ‰ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ๊ฐํ™”ํ•˜๊ณ  ์ฒญํฌ ์ƒ์„ฑ, ์ปจํ…์ŠคํŠธ ์ถ”์ถœ, ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ ๋“ฑ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ ๋””๋ฒ„๊น…: LLM ํ˜ธ์ถœ์—์„œ ์‚ฌ์šฉ๋œ ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ๊ณผ ์ตœ์ข… ์ƒ์„ฑ๋œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ ์ง€์›: ์ฃผํ”ผํ„ฐ ๋…ธํŠธ๋ถ, ๋กœ์ปฌ ํ™˜๊ฒฝ, ์ปจํ…Œ์ด๋„ˆ, ํด๋ผ์šฐ๋“œ ๋“ฑ ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ ๋ชจ๋ธ ํ†ตํ•ฉ: LlamaIndex, LangChain ๋“ฑ์˜ ํ”„๋ ˆ์ž„์›Œํฌ์™€ OpenAI, Amazon Bedrock ๋“ฑ ๋‹ค์–‘ํ•œ LLM ๋ชจ๋ธ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

(์ฐธ๊ณ ) Retrieval-Augmented Generation for Large Language Models: A Survey

  • ๋งํฌ : https://arxiv.org/pdf/2312.10997v1
  • ๋ณธ ๋…ผ๋ฌธ์—์„œ๋Š” RAGAS์™€ ARES๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ํ‰๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.
  • ์•„๋ž˜ ๋‚ด์šฉ์€ ๋…ผ๋ฌธ ๋‚ด์šฉ์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • RAGAS:
    • ์ด ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ์ด ๊ด€๋ จ์„ฑ๊ณผ ์ค‘์š”์„ฑ์„ ๊ฐ€์ง„ ๋ฌธ๋‹จ์„ ์‹๋ณ„ํ•˜๋Š” ๋Šฅ๋ ฅ, LLM์ด ์ด๋Ÿฌํ•œ ๋ฌธ๋‹จ์„ ์–ผ๋งˆ๋‚˜ ์ถฉ์‹คํžˆ ์‚ฌ์šฉํ•˜๋Š”์ง€, ์ƒ์„ฑ์˜ ์งˆ์„ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    • RAGAS๋Š” ๊ฐ„๋‹จํ•œ ์ˆ˜๋™ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ธ ๊ฐ€์ง€ ํ’ˆ์งˆ ์ธก๋ฉด(๋‹ต๋ณ€์˜ ์‹ ๋ขฐ์„ฑ, ๋‹ต๋ณ€์˜ ๊ด€๋ จ์„ฑ, ๋ฌธ๋งฅ์˜ ๊ด€๋ จ์„ฑ)์„ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ชจ๋“  ํ”„๋กฌํ”„ํŠธ๋Š” OpenAI API๋ฅผ ํ†ตํ•ด gpt-3.5-turbo-16k ๋ชจ๋ธ๋กœ ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค.
  • ARES:
    • ARES๋Š” RAG ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ์„ ์ž๋™์œผ๋กœ ํ‰๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด Context Relevance, Answer Faithfulness, Answer Relevance์˜ ์„ธ ๊ฐ€์ง€ ์ธก๋ฉด์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
    • RAGAS์™€ ์œ ์‚ฌํ•œ ํ‰๊ฐ€ ์ง€ํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๋” ์ƒˆ๋กœ์šด ์„ค์ •์— ๋Œ€ํ•œ ์ ์‘์„ฑ์ด ๋–จ์–ด์ง€๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • ARES๋Š” ์†Œ๋Ÿ‰์˜ ์ˆ˜๋™ ์ฃผ์„ ๋ฐ์ดํ„ฐ์™€ ํ•ฉ์„ฑ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‰๊ฐ€ ๋น„์šฉ์„ ์ค„์ด๋ฉฐ, Predictive-Driven Reasoning (PDR)์„ ์‚ฌ์šฉํ•ด ํ‰๊ฐ€์˜ ์ •ํ™•๋„๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค.

3.4 RAGAs ๊ธฐ๋ฐ˜ Ground Truth ์ƒ์„ฑ

RAGAs๋ฅผ ํ™œ์šฉํ•˜์—ฌ RAG ํ‰๊ฐ€๋ฅผ ์œ„ํ•œ Ground Truth๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

RAGAs ์„ค์ • ๋ฐ ํ™œ์šฉ

  1. ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ:

    1
    2
    3
    
    from ragas.llms import LangchainLLMWrapper
    from ragas.embeddings import LangchainEmbeddingsWrapper
    from ragas.testset import TestsetGenerator
    
  2. ๋ชจ๋ธ ๋ฐ ์ž„๋ฒ ๋”ฉ ์ดˆ๊ธฐํ™”:

    1
    2
    
    llm = LangchainLLMWrapper("openai-gpt")  # LLM ๋ชจ๋ธ ์ดˆ๊ธฐํ™”
    embeddings = LangchainEmbeddingsWrapper("openai-embedding")  # ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ ์ดˆ๊ธฐํ™”
    
  3. ํ…Œ์ŠคํŠธ์…‹ ์ƒ์„ฑ๊ธฐ ์ •์˜:

    1
    2
    3
    4
    
    generator = TestsetGenerator(
        llm=llm,
        embedding_model=embeddings
    )
    
  4. Ground Truth ์ƒ์„ฑ:

    1
    2
    3
    4
    
    dataset = generator.generate_with_langchain_docs(
        split_documents=split_documents,  # ์‚ฌ์ „ ๋ถ„๋ฆฌ๋œ ๋ฌธ์„œ
        testset_size=10  # ์ƒ์„ฑํ•  ์งˆ๋ฌธ-๋‹ต๋ณ€ ์Œ ๊ฐœ์ˆ˜
    )
    
  5. ๋ฐ์ดํ„ฐ์…‹ ํ™•์ธ:

    1
    
    print(dataset.to_pandas())  # Pandas ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ํ˜•์‹์œผ๋กœ ํ™•์ธ
    

์œ„ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด ์งˆ๋ฌธ๊ณผ, GT๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


3.5 RAG ํ‰๊ฐ€: RAG Triad

RAG Triad๋Š” RAG(Retrieval-Augmented Generation) ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ์„ ํ‰๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ์„ธ ๊ฐ€์ง€ ํ•ต์‹ฌ ํ‰๊ฐ€ ์ง€ํ‘œ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.

  • ์ด๋Š” โ€˜์งˆ์˜ (Query)โ€™, โ€˜์ปจํ…์ŠคํŠธ (Context)โ€™, โ€˜์‘๋‹ต (Response)โ€™์˜ ์„ธ ์š”์†Œ๊ฐ€ โ€˜์ ์ ˆํ•œ (Relevance)โ€™ ๋‚ด์šฉ์„ ๋‹ด๊ณ  ์žˆ๋Š”์ง€ ํ‰๊ฐ€ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ฒ€์ƒ‰๊ณผ ์ƒ์„ฑ์˜ ๊ท ํ˜•์„ ํ‰๊ฐ€ํ•˜๊ณ  ์ž ์žฌ์ ์ธ ์‹คํŒจ ๋ชจ๋“œ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค.

  • RAG ํ‰๊ฐ€์˜ ์„ธ ๊ฐ€์ง€ ํ•ต์‹ฌ
    1. ๊ฒ€์ƒ‰ ํ’ˆ์งˆ(Search Quality): ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ ์ •ํ™•์„ฑ.
    2. ์ƒ์„ฑ ํ’ˆ์งˆ(Generation Quality): ์ƒ์„ฑ๋œ ๋‹ต๋ณ€์˜ ์ •ํ™•์„ฑ๊ณผ ๊ด€๋ จ์„ฑ.
    3. ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(User Experience): ์‚ฌ์šฉ์ž ์นœํ™”์„ฑ, ์‘๋‹ต ์‹œ๊ฐ„ ๋“ฑ.

(์ฐธ๊ณ ) DeepEval ์‹ค์Šต

์œ ํ˜• 1: ๊ธฐ๋ณธ ์ถœ๋ ฅ ํ’ˆ์งˆ ํ‰๊ฐ€

  • G-Eval ๋ฉ”ํŠธ๋ฆญ
    • โ€œcriteriaโ€์™€ โ€œevaluation_stepsโ€๋Š” ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ์ด๋“ค ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด์•ผ ํ•จ.
    • CoT(Chain-of-Thoughts)๋ฅผ ํ™œ์šฉํ•œ ํ‰๊ฐ€ ์ฒด๊ณ„์˜ ์ค‘์š”์„ฑ ๋ฐ ์‹ค์ œ ํ™œ์šฉ ์‚ฌ๋ก€(์˜ˆ: ๋‹จ๊ณ„๋ณ„ reasoning).

  • ๋‹ต๋ณ€ ๊ด€๋ จ์„ฑ ํ‰๊ฐ€

    • ์ œ๊ณต๋œ ์ž…๋ ฅ๊ณผ ๋น„๊ตํ•˜์—ฌ, LLM์˜ ์ถœ๋ ฅ์ด ์–ผ๋งˆ๋‚˜ ๊ด€๋ จ์„ฑ์ด ์žˆ๋Š”์ง€ ํ‰๊ฐ€.
    • ํŠน์ง•:
      • ์ž์ฒด ์„ค๋ช…ํ˜• ์ง€ํ‘œ๋กœ, ์ ์ˆ˜์— ๋Œ€ํ•œ ์ด์œ (reason)๋ฅผ ํ•จ๊ป˜ ์ถœ๋ ฅ.
      • ์ž„๊ณ„๊ฐ’(Threshold): 0.7 ์ด์ƒ์ด๋ฉด ๊ด€๋ จ์„ฑ์ด ์žˆ๋‹ค๊ณ  ๊ฐ„์ฃผ.

  • ํŽธํ–ฅ์„ฑ(bias) ๋ฐ ๋…์„ฑ(toxicity) ํ‰๊ฐ€

    • Bias (ํŽธํ–ฅ์„ฑ): ์ถœ๋ ฅ์— ์„ฑ๋ณ„, ์ธ์ข…, ์ •์น˜์  ํŽธํ–ฅ์„ฑ์ด ํฌํ•จ๋˜์—ˆ๋Š”์ง€ ํ‰๊ฐ€.
      • ํŠน์ง•: ์ž„๊ณ„๊ฐ’: 0.5 ์ด์ƒ์ผ ๊ฒฝ์šฐ, ํŽธํ–ฅ์ ์ด๋ผ๊ณ  ํŒ๋‹จ.

    • Toxicity (๋…์„ฑ): ์ถœ๋ ฅ์ด ๋ชจ์š•์ ์ด๊ฑฐ๋‚˜ ์œ ํ•ดํ•œ ์–ธ์–ด๋ฅผ ํฌํ•จํ•˜๋Š”์ง€ ํ‰๊ฐ€.
      • ํŠน์ง•: ์ž„๊ณ„๊ฐ’: 0.5 ์ด์ƒ์ผ ๊ฒฝ์šฐ, ๋…์„ฑ์ด ์žˆ๋‹ค๊ณ  ํŒ๋‹จ.

  • ๋Œ€ํ™” ์™„์ „์„ฑ ๋ฐ ๊ด€๋ จ์„ฑ ํ‰๊ฐ€

    • Conversation Completeness (๋Œ€ํ™” ์™„์ „์„ฑ): ๋Œ€ํ™” ์ „๋ฐ˜์—์„œ ์‚ฌ์šฉ์ž์˜ ์š”๊ตฌ๋ฅผ ์ถฉ์กฑํ•˜๋Š”์ง€ ํ‰๊ฐ€.
      • ํŠน์ง•: ์ž„๊ณ„๊ฐ’: 0.5 ์ด์ƒ์ด๋ฉด ๋Œ€ํ™”๊ฐ€ ์ถฉ๋ถ„ํžˆ ์™„์ „ํ•˜๋‹ค๊ณ  ๊ฐ„์ฃผ.

    • Conversation Relevancy (๋Œ€ํ™” ๊ด€๋ จ์„ฑ): ๋Œ€ํ™” ๋งฅ๋ฝ์—์„œ ์ง€์†์ ์œผ๋กœ ๊ด€๋ จ์„ฑ ์žˆ๋Š” ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋Š”์ง€ ํ‰๊ฐ€.
      • ํŠน์ง•: ์ž„๊ณ„๊ฐ’: 0.5 ์ด์ƒ์ด๋ฉด ๊ด€๋ จ์„ฑ์ด ์žˆ๋‹ค๊ณ  ๊ฐ„์ฃผ.

DeepEval์˜ Test Dataset ์ƒ์„ฑ

  • ํ”„๋กœ์„ธ์Šค ๊ฐœ์š”
    • ๋ฌธ์„œ ์ฒญํฌํ™”:
      • ์›๋ณธ ๋ฌธ์„œ๋ฅผ ์ฒญํฌ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ๊ฐ ์ฒญํฌ๋ฅผ ์ž„๋ฒ ๋”ฉํ•˜์—ฌ ๋…ธ๋“œ ์ปฌ๋ ‰์…˜ ์ƒ์„ฑ.
    • ์œ ์‚ฌ ๋…ธ๋“œ ๊ฒ€์ƒ‰ ๋ฐ ์ปจํ…์ŠคํŠธ ์ƒ์„ฑ:
      • ๊ฐ ์ฒญํฌ์— ๋Œ€ํ•ด ์œ ์‚ฌํ•œ ๋…ธ๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๊ทธ๋ฃนํ™”.
    • ํ•ฉ์„ฑ ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ์ƒ์„ฑ:
      • ์ƒ์„ฑ๋œ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์งˆ๋ฌธ-๋‹ต๋ณ€ ์Œ์„ ์ƒ์„ฑํ•˜์—ฌ Golden Dataset์„ ํ˜•์„ฑ.

  • ์ž„๊ณ„๊ฐ’ ์„ค์ •
    • ํ’ˆ์งˆ์ด ๋‚ฎ์€ ์ž…๋ ฅ ๋ฐ ์ปจํ…์ŠคํŠธ๋Š” ๊ฑฐ๋ถ€๋˜๋ฉฐ, ๊ธฐ๋ณธ ์ž„๊ณ„๊ฐ’(0.5)์ด ์„ค์ •๋จ.

    • ์ปจํ…์ŠคํŠธ ํ’ˆ์งˆ์ด๋‚˜ ์œ ์‚ฌ๋„๊ฐ€ ๊ธฐ์ค€ ๋ฏธ๋‹ฌ์ผ ๊ฒฝ์šฐ ์žฌ์‹œ๋„ ๊ฐ€๋Šฅ.

์ฝ”๋“œ ์‹ค์Šต

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from deepeval.dataset import EvaluationDataset
from deepeval.synthesizer import Synthesizer

# Synthesizer ์ดˆ๊ธฐํ™”
synthesizer = Synthesizer(
    model="gpt-4o-mini",            # ๊ธฐ๋ณธ GPT ๋ชจ๋ธ ์„ค์ •
    critic_model="gpt-4o-mini",     # ํ‰๊ฐ€ ๊ธฐ์ค€(Critic) ๋ชจ๋ธ ์„ค์ •
    embedder=embeddings,            # ๋ฌธ์„œ ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ
    context_quality_threshold=0.6,  # ์ปจํ…์ŠคํŠธ ํ’ˆ์งˆ ์ž„๊ณ„๊ฐ’ ์„ค์ •
    context_similarity_threshold=0.7,  # ์ปจํ…์ŠคํŠธ ์œ ์‚ฌ๋„ ๊ธฐ์ค€
    context_max_retries=4,          # ์ปจํ…์ŠคํŠธ ์ƒ์„ฑ ์žฌ์‹œ๋„ ํšŸ์ˆ˜
    synthetic_input_quality_threshold=0.8,  # ํ•ฉ์„ฑ ์ž…๋ ฅ ํ’ˆ์งˆ ๊ธฐ์ค€
    synthetic_input_max_retries=5   # ํ•ฉ์„ฑ ์ž…๋ ฅ ์žฌ์‹œ๋„ ํšŸ์ˆ˜
)

  1. Synthesizer ์ดˆ๊ธฐํ™”
    • Synthesizer ๊ฐ์ฒด๋Š” ๋ฌธ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ์„ฑ ์งˆ๋ฌธ-๋‹ต๋ณ€ ์Œ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ๋งค๊ฐœ๋ณ€์ˆ˜:
      • model๊ณผ critic_model: ์ƒ์„ฑ๊ณผ ํ‰๊ฐ€์— ์‚ฌ์šฉํ•  GPT ๋ชจ๋ธ.
      • embedder: ๋ฌธ์„œ๋ฅผ ์ž„๋ฒ ๋”ฉํ•˜์—ฌ ์œ ์‚ฌ๋„ ๊ณ„์‚ฐ์— ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋ธ.
      • context_quality_threshold: ์ปจํ…์ŠคํŠธ์˜ ์ตœ์†Œ ํ’ˆ์งˆ ๊ธฐ์ค€ (0.6).
      • context_similarity_threshold: ์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…์ŠคํŠธ์˜ ์œ ์‚ฌ๋„๋ฅผ ํ‰๊ฐ€ (๊ธฐ๋ณธ๊ฐ’: 0.7).
      • context_max_retries: ๊ธฐ์ค€ ๋ฏธ๋‹ฌ ์‹œ ์ปจํ…์ŠคํŠธ ์ƒ์„ฑ ์žฌ์‹œ๋„ ํšŸ์ˆ˜ (4ํšŒ).
      • synthetic_input_quality_threshold: ํ•ฉ์„ฑ ์ž…๋ ฅ์˜ ํ’ˆ์งˆ ๊ธฐ์ค€ (0.8).
      • synthetic_input_max_retries: ํ•ฉ์„ฑ ์ž…๋ ฅ ์ƒ์„ฑ ์žฌ์‹œ๋„ ํšŸ์ˆ˜ (5ํšŒ).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Test Dataset ์ƒ์„ฑ
dataset = EvaluationDataset()

# Prompt Customization
dataset.generate_goldens_from_docs(
    synthesizer=synthesizer,
    document_paths=['/content/drive/MyDrive/RAG docs/๊ฒฝ๊ธฐ_์ฐจ๋ณ„ํ™”_์ „๋ง.pdf'],  # ๋ฌธ์„œ ๊ฒฝ๋กœ ์„ค์ •
    scenario="A typical users asking question to obtain information using plain Korean instructions",
    task="Answering to user questions by sending queries to the database and returning the results to the user.",
    input_format="Korean instructions for retrieving information from a database",
    expected_output_format="Korean informations based on the given input"
)

  1. Test Dataset ์ƒ์„ฑ

    • generate_goldens_from_docs ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด Test Dataset ์ƒ์„ฑ.
    • ๋งค๊ฐœ๋ณ€์ˆ˜:
      • document_paths: ๋ฌธ์„œ ๊ฒฝ๋กœ ๋ฆฌ์ŠคํŠธ.
      • scenario: ์‚ฌ์šฉ ์‚ฌ๋ก€ ์„ค๋ช… (์˜ˆ: ์‚ฌ์šฉ์ž ์š”์ฒญ ์‹œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค).
      • task: ์ž‘์—…์˜ ๋ชฉํ‘œ ์„ค๋ช… (์˜ˆ: ์งˆ์˜์‘๋‹ต).
      • input_format: ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ํ˜•์‹ (ํ•œ๊ตญ์–ด ์งˆ์˜ ํ˜•์‹).
      • expected_output_format: ์ถœ๋ ฅ ๋ฐ์ดํ„ฐ์˜ ํ˜•์‹ (ํ•œ๊ตญ์–ด ์ •๋ณด).
  2. Prompt Customization

    • ๊ฐ„๋‹จํ•œ ํ”„๋กฌํ”„ํŠธ ์„ค์ •์„ ํ†ตํ•ด ํ•œ๊ตญ์–ด ๊ธฐ๋ฐ˜์˜ Golden Dataset ์ƒ์„ฑ ๊ฐ€๋Šฅ.
    • ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋งž๋Š” ๋‹ค์–‘ํ•œ ์–ธ์–ด ์ง€์›.

๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์—์„œ๋Š” ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ Markdown ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅํ•˜์—ฌ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค:

1
2
3
4
display(Markdown(f"**Input**: {dataset.goldens[2].input}"))
display(Markdown(f"**Context**: {dataset.goldens[2].context}"))
display(Markdown(f"**Expected_output**: {dataset.goldens[2].expected_output}"))

๊ฒฐ๊ณผ:

  • Input: 2025๋…„ ์ฃผ์š”๊ตญ GDP ์„ฑ์žฅ๋ฅ  ๋ฐ ์ธํ”Œ๋ ˆ์ด์…˜์„ ์ฐจ๋ณ„ํ™”์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ด๋–ป๊ฒŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‚˜์š”?
  • Context: 2025๋…„ ๊ฒฝ์ œ ์ „๋ง ๋ณด๊ณ ์„œ์— ๋”ฐ๋ฅด๋ฉด ์‚ฐ์—… ์ƒ์‚ฐ์ด ๊ฐ์†Œ ์ถ”์„ธ์— ์žˆ์œผ๋ฉฐ, ๊ตญ์ œ ๊ธˆ์œต ๊ธฐ๊ด€์˜ ๋ถ„์„ ๋ณด๊ณ ์„œ๋ฅผ ํ†ตํ•ด ๊ฒฝ์ œ ์ƒํ™ฉ ๋น„๊ต ๊ฐ€๋Šฅ.
  • Expected Output: ์ฃผ์š”๊ตญ GDP ์„ฑ์žฅ๋ฅ  ์ •๋ณด๋ฅผ ๋น„๊ตํ•˜๊ณ , IMF ๋ฐ OECD ๋ณด๊ณ ์„œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฒฝ์ œ์  ์ธ์‚ฌ์ดํŠธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ ํ˜• 2: ์ปจํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ํ‰๊ฐ€

  • ๋ฌธ๋งฅ์  ๊ด€๋ จ์„ฑ (Contextual Relevance)

    • ๊ฒ€์ƒ‰๋œ ์ปจํ…์ŠคํŠธ๊ฐ€ ์งˆ๋ฌธ์˜ ๋งฅ๋ฝ๊ณผ ์–ผ๋งˆ๋‚˜ ์˜๋ฏธ์ ์œผ๋กœ ๊ด€๋ จ์ด ์žˆ๋Š”์ง€๋ฅผ ํ‰๊ฐ€.
    • ๊ตฌ์ฒด์  ๊ธฐ์ค€์€ ์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„์™€ ๊ฐ™์€ ์ž„๋ฒ ๋”ฉ ๋น„๊ต ๋ฐฉ์‹ ์‚ฌ์šฉ. ``` from deepeval.metrics import ContextualRelevancyMetric

    ๋ฌธ๋งฅ์  ๊ด€๋ จ์„ฑ ํ‰๊ฐ€ ๋ฉ”ํŠธ๋ฆญ ์ดˆ๊ธฐํ™”

    metric = ContextualRelevancyMetric( threshold=0.7, # ์ž„๊ณ„๊ฐ’: 0.7 ์ด์ƒ์ด๋ฉด Pass model=โ€gpt-4o-miniโ€, # ํ‰๊ฐ€์— ์‚ฌ์šฉํ•  ๋ชจ๋ธ include_reason=True # ์ ์ˆ˜์— ๋Œ€ํ•œ ์ด์œ ๋ฅผ ์ถœ๋ ฅ )

    ํ‰๊ฐ€ ๊ตฌ์„ฑ์š”์†Œ ์ƒ์„ฑ

    question = dataset.goldens[2].input # ์ž…๋ ฅ ์งˆ๋ฌธ actual_output = chain.invoke(question) # ์‹ค์ œ ์ถœ๋ ฅ retrieval_context = dataset.goldens[2].context # ๊ฒ€์ƒ‰๋œ ์ปจํ…์ŠคํŠธ

    ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ƒ์„ฑ

    test_case = LLMTestCase( input=question, actual_output=actual_output, retrieval_context=retrieval_context )

    ๋ฌธ๋งฅ์  ๊ด€๋ จ์„ฑ ํ‰๊ฐ€ ์ˆ˜ํ–‰

    metric.measure(test_case)

    ```

  • ํ‰๊ฐ€ ๊ฒฐ๊ณผ ํ•ด์„

    • ์ถœ๋ ฅ ์ ์ˆ˜: 0.5 (๊ธฐ์ค€ ๋ฏธ๋‹ฌ)
      • ์ด์œ (Reason): ๊ฒ€์ƒ‰๋œ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋‹จ์ˆœํžˆ ์ˆซ์ž ์˜ˆ์ธก๋งŒ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์งˆ๋ฌธ์˜ ๋งฅ๋ฝ์  ์š”๊ตฌ(์˜ˆ: ์ง€์ •ํ•™์  ์œ„ํ—˜, OPEC ๊ฒฐ์ •์˜ ์˜ํ–ฅ)๋ฅผ ๋ฐ˜์˜ํ•˜์ง€ ๋ชปํ•จ.
    • ์ž„๊ณ„๊ฐ’ ๋ฏธ๋‹ฌ (์„ค์ •๋œ threshold=0.7๋ฅผ ๋„˜์ง€ ๋ชปํ•ด Fail๋กœ ์ฒ˜๋ฆฌ.)
      • Fail ์ด์œ :
        • โ€œWTI ํ‰๊ท  ๊ฐ€๊ฒฉโ€์— ๋Œ€ํ•œ ์งˆ๋ฌธ์€ ์ง€์ •ํ•™์  ์œ„ํ—˜๊ณผ ๊ฐ™์€ ๋ณต์žกํ•œ ์š”์ธ์„ ๊ณ ๋ คํ•ด์•ผ ํ•˜์ง€๋งŒ, ์ปจํ…์ŠคํŠธ๊ฐ€ ๋‹จ์ˆœ ์ˆ˜์น˜ ์ •๋ณด๋งŒ ์ œ๊ณต.
  • ์ถฉ์‹ค๋„ (Faithfulness) ํ‰๊ฐ€

    • ์ถœ๋ ฅ์ด ๊ฒ€์ƒ‰๋œ ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ ์™œ๊ณก ์—†์ด ์ •๋ณด๋ฅผ ๋ฐ˜์˜ํ–ˆ๋Š”์ง€ ํ™•์ธ.
    • ์ถฉ์‹ค๋„๊ฐ€ ๋‚ฎ์€ ์ถœ๋ ฅ์€ RAG ํŒŒ์ดํ”„๋ผ์ธ์—์„œ โ€œํ™˜๊ฐโ€์œผ๋กœ ๊ฐ„์ฃผ. ```

    from deepeval.metrics import FaithfulnessMetric

    ์ถฉ์‹ค๋„ ํ‰๊ฐ€ ๋ฉ”ํŠธ๋ฆญ ์ดˆ๊ธฐํ™”

    metric = FaithfulnessMetric( threshold=0.7, # ์ž„๊ณ„๊ฐ’: 0.7 ์ด์ƒ์ด๋ฉด Pass model=โ€gpt-4o-miniโ€, # ํ‰๊ฐ€์— ์‚ฌ์šฉํ•  ๋ชจ๋ธ include_reason=True # ์ ์ˆ˜์— ๋Œ€ํ•œ ์ด์œ ๋ฅผ ์ถœ๋ ฅ )

    ํ‰๊ฐ€ ๊ตฌ์„ฑ์š”์†Œ ์ƒ์„ฑ

    question = dataset.goldens[2].input # ์ž…๋ ฅ ์งˆ๋ฌธ actual_output = chain.invoke(question) # ์‹ค์ œ ์ถœ๋ ฅ retrieval_context = dataset.goldens[2].context # ๊ฒ€์ƒ‰๋œ ์ปจํ…์ŠคํŠธ

    ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ƒ์„ฑ

    test_case = LLMTestCase( input=question, actual_output=actual_output, retrieval_context=retrieval_context )

    ์ถฉ์‹ค๋„ ํ‰๊ฐ€ ์ˆ˜ํ–‰

    metric.measure(test_case)

    ```

  • ํ‰๊ฐ€ ๊ฒฐ๊ณผ ํ•ด์„
    • ์ถœ๋ ฅ ์ ์ˆ˜: 0.71 (์ž„๊ณ„๊ฐ’ ์ดˆ๊ณผ, Pass)
      • ์ด์œ (Reason): ์ถœ๋ ฅ์ด ์ง€์ •ํ•™์  ์œ„ํ—˜๊ณผ OPEC ๊ฒฐ์ •์˜ WTI ํ‰๊ท  ๊ฐ€๊ฒฉ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์–ธ๊ธ‰ํ–ˆ์œผ๋‚˜, ๊ฒ€์ƒ‰๋œ ์ปจํ…์ŠคํŠธ์™€ ์ผ๋ถ€ ๋ถˆ์ผ์น˜ ๋ฐœ์ƒ.
    • ์ž„๊ณ„๊ฐ’ ์ดˆ๊ณผ (์„ค์ •๋œ threshold=0.7๋ฅผ ์ดˆ๊ณผํ•˜์—ฌ Pass๋กœ ์ฒ˜๋ฆฌ.)
      • Pass ์ด์œ :
        • ์ถœ๋ ฅ์ด ์ „์ฒด์ ์œผ๋กœ ์ปจํ…์ŠคํŠธ์˜ ์ •๋ณด๋ฅผ ๋ฐ˜์˜ํ•˜๊ณ  ์žˆ์Œ.
        • ์ผ๋ถ€ ์ถ”๊ฐ€์ ์ธ ๋…ผ๋ฆฌ๊ฐ€ ํฌํ•จ๋˜์—ˆ์ง€๋งŒ, ์‚ฌ์‹ค์  ์™œ๊ณก์€ ์—†์Œ.

์œ ํ˜• 3: ์‹ฌ์ธต ํ’ˆ์งˆ ํ‰๊ฐ€

์•„๋ž˜๋Š” 3๊ฐ€์ง€ ํ’ˆ์งˆ ํ‰๊ฐ€ Metric์„ ํ•œ๋ฒˆ์— ์ฝ”๋“œ๋กœ ๋ฌถ์–ด์„œ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from deepeval.metrics import ContextualPrecisionMetric, ContextualRecallMetric
from deepeval.metrics.ragas import RagasMetric

# ๋ฌธ๋งฅ์  ์ •๋ฐ€์„ฑ ๋ฉ”ํŠธ๋ฆญ ์ •์˜
contextual_precision_metric = ContextualPrecisionMetric(
    threshold=0.7,  # ํ‰๊ฐ€ ํ†ต๊ณผ ๊ธฐ์ค€
    model="gpt-4o-mini",  # ์‚ฌ์šฉ ๋ชจ๋ธ
    include_reason=True  # ์ ์ˆ˜ ๊ณ„์‚ฐ ์ด์œ  ํฌํ•จ ์—ฌ๋ถ€
)

# ๋ฌธ๋งฅ์  ์žฌํ˜„์„ฑ ๋ฉ”ํŠธ๋ฆญ ์ •์˜
contextual_recall_metric = ContextualRecallMetric(
    threshold=0.7,  # ํ‰๊ฐ€ ํ†ต๊ณผ ๊ธฐ์ค€
    model="gpt-4o-mini",  # ์‚ฌ์šฉ ๋ชจ๋ธ
    include_reason=True  # ์ ์ˆ˜ ๊ณ„์‚ฐ ์ด์œ  ํฌํ•จ ์—ฌ๋ถ€
)

# RAGAS ๋ฉ”ํŠธ๋ฆญ ์ •์˜
ragas_metric = RagasMetric(
    threshold=0.5,  # ํ‰๊ฐ€ ํ†ต๊ณผ ๊ธฐ์ค€
    model="gpt-4o-mini"  # ์‚ฌ์šฉ ๋ชจ๋ธ
)

# ํ‰๊ฐ€ ๊ตฌ์„ฑ ์š”์†Œ ์ƒ์„ฑ
question = dataset.golden_data[2].input  # ์งˆ๋ฌธ ๋ฐ์ดํ„ฐ
actual_output = chain.invoke(question)  # ๋ชจ๋ธ ์ถœ๋ ฅ
retrieval_context = dataset.golden_data[2].context  # ๊ฒ€์ƒ‰๋œ ์ปจํ…์ŠคํŠธ
expected_output = dataset.golden_data[2].expected_output  # ๊ธฐ๋Œ€ ์ถœ๋ ฅ (Ground Truth)

# ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ƒ์„ฑ (Type3๋Š” expected_output ํฌํ•จ)
test_case_type3 = LLMTestCase(
    input=question,
    actual_output=actual_output,
    retrieval_context=retrieval_context,
    expected_output=expected_output
)

# ๋ฉ”ํŠธ๋ฆญ ํ‰๊ฐ€
contextual_precision_metric.measure(test_case_type3)
contextual_recall_metric.measure(test_case_type3)
ragas_metric.measure(test_case_type3)

๊ฐ๊ฐ์˜ ๊ฒฐ๊ณผ ํ•ด์„ ๋ฐ ์„ค๋ช…์€ ์•„๋ž˜์—์„œ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฌธ๋งฅ์  ์ •๋ฐ€์„ฑ (Contextual Precision)

    • ๊ด€๋ จ ์ปจํ…์ŠคํŠธ์™€ ๋ฌด๊ด€ํ•œ ์ปจํ…์ŠคํŠธ์˜ ์ˆœ์œ„๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ •ํ™•๋„๋ฅผ ์ธก์ •.
    • RAG ์‹œ์Šคํ…œ์—์„œ ๊ฒ€์ƒ‰๊ธฐ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์ธ ๋ฉ”ํŠธ๋ฆญ.

    • ์ถœ๋ ฅ ์˜ˆ์‹œ:
      • ์ข…ํ•ฉ ์ ์ˆ˜: 0.83
      • ํ•ด์„ค: ๊ฒ€์ƒ‰๋œ ์ฒซ ๋ฒˆ์งธ ๋…ธ๋“œ๋Š” GDP ์„ฑ์žฅ๋ฅ ๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋†’์€ ์ˆœ์œ„๋ฅผ ๋ฐ›์•˜์ง€๋งŒ, ๋‘ ๋ฒˆ์งธ ๋…ธ๋“œ๋Š” ์‹ค์—…๋ฅ  ์ •๋ณด๋กœ ๊ด€๋ จ์„ฑ์ด ๋‚ฎ์•„ ์ ์ˆ˜๊ฐ€ ๊ฐ์†Œํ•จ.
  • ๋ฌธ๋งฅ์  ์žฌํ˜„์„ฑ (Contextual Recall)

    • ๊ฒ€์ƒ‰๋œ ์ปจํ…์ŠคํŠธ๊ฐ€ Ground Truth์™€ ์–ผ๋งˆ๋‚˜ ์ผ์น˜ํ•˜๋Š”์ง€๋ฅผ ์ธก์ •.
    • ์žฌํ˜„์„ฑ์ด ๋‚ฎ์œผ๋ฉด RAG ํŒŒ์ดํ”„๋ผ์ธ์˜ ๊ฒ€์ƒ‰ ๊ณผ์ •์ด ๋ถ€์ •ํ™•ํ•˜๋‹ค๊ณ  ํ‰๊ฐ€.

    • ์ถœ๋ ฅ ์˜ˆ์‹œ:
      • ์ข…ํ•ฉ ์ ์ˆ˜: 0.75
      • ํ•ด์„ค: ๊ฒ€์ƒ‰๋œ ๋ฌธ์žฅ์ด GDP ์„ฑ์žฅ๊ณผ ๋ฌผ๊ฐ€ ์•ˆ์ •ํ™”์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ž˜ ํฌํ•จํ•˜๊ณ  ์žˆ์ง€๋งŒ, ์‹ค์—…๋ฅ ์— ๋Œ€ํ•œ ์ •๋ณด ๋ถ€์กฑ์œผ๋กœ ์ ์ˆ˜๊ฐ€ ๊ฐ์†Œํ•จ.
  • RAGAS ๋ฉ”ํŠธ๋ฆญ (RAGAS Metric)

    • RAG ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ƒ์„ฑ๊ธฐ ๋ฐ ๊ฒ€์ƒ‰๊ธฐ๋ฅผ ์ข…ํ•ฉ์ ์œผ๋กœ ํ‰๊ฐ€ํ•˜๋Š” ํ•ต์‹ฌ ์ง€ํ‘œ.
    • ๊ฐ ๋ฉ”ํŠธ๋ฆญ(๋‹ต๋ณ€ ๊ด€๋ จ์„ฑ, ์ถฉ์‹ค๋„, ์ •๋ฐ€์„ฑ, ์žฌํ˜„์„ฑ)์˜ ํ‰๊ท  ์ ์ˆ˜๋ฅผ ๊ณ„์‚ฐ.

    • ์ถœ๋ ฅ ์˜ˆ์‹œ:
      • ์ข…ํ•ฉ ์ ์ˆ˜: 0.605
      • ํ•ด์„ค: ๊ฐ ๋ฉ”ํŠธ๋ฆญ์˜ ์„ธ๋ถ€ ์ ์ˆ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ RAG ์‹œ์Šคํ…œ์˜ ์ „๋ฐ˜์ ์ธ ์„ฑ๋Šฅ์„ ํ‰๊ฐ€.

์ด์ƒ์œผ๋กœ ๊ฐ•์˜ ์ž๋ฃŒ์— ์žˆ๋Š” ๋ชจ๋“  ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด๋ณด์•˜๋Š”๋ฐ์š”.

์ž๋ฃŒ๋ฅผ ํ† ๋Œ€๋กœ ์กฐ์‚ฌํ•˜๋ฉด์„œ ์ž‘์„ฑํ•œ ๋ธ”๋กœ๊ทธ์ด๋ฏ€๋กœ, ์‹ค์ œ ๊ฐ•์—ฐ ๋‚ด์šฉ๊ณผ๋Š” ์ƒ์ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ’Œ

์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.



-->