๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
1๏ธโƒฃ AI•DS/๐ŸŒ LLM

[์ฑ…์Šคํ„ฐ๋””] 10-(1). ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ๋กœ ๋ฐ์ดํ„ฐ ์˜๋ฏธ ์••์ถ•ํ•˜๊ธฐ

by isdawell 2025. 9. 18.
728x90

 

 

โ–บ  [Remind]  ํ”„๋กฌํ”„ํŠธ์— ์š”์ฒญ์˜ ๋งฅ๋ฝ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•ด LLM์˜ ์ƒ์„ฑ ํ’ˆ์งˆ์„ ํ–ฅ์ƒํ•˜๋Š” RAG 

โ–บ  [Key ํ…์ŠคํŠธ๋ฅผ ์ˆซ์ž๋กœ ํ‘œํ˜„ํ•˜๋ ค๋˜ ๋‹ค์–‘ํ•œ ์‹œ๋„ > AI๋ถ„์•ผ์—์„œ๋Š” ํ…์ŠคํŠธ๋ฅผ ์˜๋ฏธ๋ฅผ ๋‹ด์•„ ๋” ์••์ถ•์ ์ธ ์ž„๋ฒ ๋”ฉ ๋ฒกํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐœ์ „ํ•ด์˜ด 

 

 

 

1.   ํ…์ŠคํŠธ ์ž„๋ฒ ๋”ฉ ์ดํ•ดํ•˜๊ธฐ 


 

โ–บ  RAG์—์„œ ์งˆ๋ฌธ๊ณผ ๋งฅ๋ฝ ์ •๋ณด์˜ ํ…์ŠคํŠธ๊ฐ€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜์ง€ ์•Š๋”๋ผ๋„ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ '์ž„๋ฒ ๋”ฉ' ํ‘œํ˜„ ๋ฐฉ์‹ ๋•Œ๋ฌธ์ด๋‹ค. ํ…์ŠคํŠธ ์ž„๋ฒ ๋”ฉ(=๋ฌธ์žฅ ์ž„๋ฒ ๋”ฉ) ๋ชจ๋ธ์€ ๋ฌธ์žฅ์˜ ์˜๋ฏธ๋ฅผ ๋‹ด์•„ ์ž„๋ฒ ๋”ฉ ๋ฒกํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๋ฏ€๋กœ, ๋ฌธ์ž์—ด์ด ๋™์ผํ•˜์ง€ ์•Š๋”๋ผ๋„ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์œ ์‚ฌ๋„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ Semantic search (์˜๋ฏธ๊ฒ€์ƒ‰)์ด๋ผ๊ณ  ํ•œ๋‹ค. 

 

โ–บ  ์ž„๋ฒ ๋”ฉ : ๋ฐ์ดํ„ฐ์˜ ์˜๋ฏธ๋ฅผ ์••์ถ•ํ•œ ์ˆซ์ž ๋ฐฐ์—ด

 

 

1.1   ๋ฌธ์žฅ์ž„๋ฒ ๋”ฉ ๋ฐฉ์‹์˜ ์žฅ์ 

 

โ  ํ…์ŠคํŠธ ์ž„๋ฒ ๋”ฉ (=๋ฌธ์žฅ์ž„๋ฒ ๋”ฉ) 

 โ†ช๏ธŽ  ๋ฐ์ดํ„ฐ์˜ ์˜๋ฏธ๋ฅผ ์ˆซ์ž๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๋ฐ์ดํ„ฐ๊ฐ€ ์„œ๋กœ ์œ ์‚ฌํ•œ์ง€, ๊ด€๋ จ์žˆ๋Š”์ง€ ๋“ฑ์˜ ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ํ™œ์šฉ ๊ฐ€๋Šฅ

 โ†ช๏ธŽ  ๋ฌธ์žฅ ์ž„๋ฒ ๋”ฉ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”์‚ฌ์ธ์œ ์‚ฌ๋„ ๋“ฑ์„ ํ†ตํ•ด ๋‹จ์–ด๋‚˜ ๋ฌธ์žฅ ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค (ex. ํ•™๊ต-๊ณต๋ถ€ : 0.6๋งŒํผ ์œ ์‚ฌ, ํ•™๊ต-์šด๋™ : 0.3๋งŒํผ ์œ ์‚ฌ)

 

from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity

# SentenceTransformer ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฌธ์žฅ์ž„๋ฒ ๋”ฉ ๊ตฌํ˜„
smodel = SentenceTransformer('snunlp/KR-SBERT-V40K-klueNLI-augSTS')
dense_embeddings = smodel.encode(['ํ•™๊ต', '๊ณต๋ถ€', '์šด๋™'])
cosine_similarity(dense_embeddings) # ์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„


# array([[1.0000001 , 0.5950744 , 0.32537547],
#       [0.5950744 , 1.0000002 , 0.54595673],
#       [0.32537547, 0.54595673, 0.99999976]], dtype=float32)

 

 

 

1.2 ์›ํ•ซ์ธ์ฝ”๋”ฉ 

 

โ  ์›ํ•ซ์ธ์ฝ”๋”ฉ

 โ†ช๏ธŽ  ํ•™๊ต = [1, 0, 0] , ๊ณต๋ถ€ = [0, 1, 0], ์šด๋™ = [0, 0, 1] ์‹์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์›ํ•ซ์ธ์ฝ”๋”ฉ์€ ๋ฒ”์ฃผํ˜• ๋ฐ์ดํ„ฐ ์‚ฌ์ด์— ์˜๋„ํ•˜์ง€ ์•Š์€ ๊ด€๊ณ„๊ฐ€ ๋‹ด๊ธฐ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ, ์ถฉ๋ถ„ํžˆ ๊ด€๋ จ์ด ์žˆ๋Š” ๋‹จ์–ด ์‚ฌ์ด์˜ ๊ด€๊ณ„๋„ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ๊ฐ€๋ น, ํ•™๊ต์™€ ๊ณต๋ถ€ ์‚ฌ์ด์—๋Š” '๋ฐฐ์šด๋‹ค' ๋Š” ๊ณตํ†ต์ ์ด ์žˆ์œผ๋‚˜ ์›ํ•ซ์ธ์ฝ”๋”ฉ์—์„œ๋Š” ๊ทธ ์˜๋ฏธ๋ฅผ ์‚ด๋ฆด ์ˆ˜ ์—†๋‹ค. 

 

import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

word_dict = {"school": np.array([[1, 0, 0]]),
"study": np.array([[0, 1, 0]]),
"workout": np.array([[0, 0, 1]])
}

# ๋‘ ๋‹จ์–ด ์‚ฌ์ด์˜ ์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„ ๊ณ„์‚ฐํ•˜๊ธฐ
cosine_school_study = cosine_similarity(word_dict["school"], word_dict['study']) # 0
cosine_school_workout = cosine_similarity(word_dict['school'], word_dict['workout']) # 0

 

โ†ช๏ธŽ  ํ•™๊ต์™€ ๊ณต๋ถ€์˜ ์œ ์‚ฌ๋„, ํ•™๊ต์™€ ์šด๋™์˜ ์œ ์‚ฌ๋„๊ฐ€ ๋ชจ๋‘ 0์œผ๋กœ ๋‚˜์˜จ๋‹ค. 

 

 

 

1.3  ๋ฐฑ์˜ค๋ธŒ์›Œ์ฆˆ 

 

โ  ๋ฐฑ์˜ค๋ธŒ์›Œ์ฆˆ

 

 โ†ช๏ธŽ  ๋น„์Šทํ•œ ๋‹จ์–ด๊ฐ€ ๋งŽ์ด ๋‚˜์˜ค๋ฉด ๋น„์Šทํ•œ ๋ฌธ์žฅ ๋˜๋Š” ๋ฌธ์„œ๋ผ๋Š” ๊ฐ€์ •์„ ํ™œ์šฉํ•ด ๋ฌธ์„œ๋ฅผ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. "๋‹จ์–ด์˜ ์ˆœ์„œ์— ๊ด€๊ณ„์—†์ด" ํ•ด๋‹น ๋ฌธ์„œ์— ๋“ฑ์žฅํ•œ ๋‹จ์–ด์™€ ๊ทธ "๋“ฑ์žฅ ํšŸ์ˆ˜" ๋ฅผ ์ง‘๊ณ„ํ•œ๋‹ค. ๊ฐ€๋ น, ๊ฒฝ์ œ๊ธฐ์‚ฌ์—๋Š” '๋Œ€์ถœ', '๋ถ€๋™์‚ฐ', '์ฆ์‹œ'๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ์ž์ฃผ ๋“ฑ์žฅํ•˜๊ณ , IT๊ธฐ์‚ฌ์—๋Š” ๊ฒฝ์ œ๊ธฐ์‚ฌ๋ณด๋‹ค '๋ถ€๋™์‚ฐ' ๋“ฑ์žฅ ํšŸ์ˆ˜๋Š” ๋‚ฎ์„ ๊ฒƒ์ด๋‹ค. 

 

 โ†ช๏ธŽ  ์ง๊ด€์ ์ด๊ณ  ๊ฐ„๋‹จํ•ด์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋‚˜, ๋ฐฑ์˜ค๋ธŒ์›Œ์ฆˆ ๋ฐฉ์‹์€ ์–ด๋–ค ๋‹จ์–ด๊ฐ€ ๋งŽ์ด ๋‚˜์™”๋‹ค๊ณ  ํ•˜์—ฌ ๋ฌธ์„œ์˜ ์˜๋ฏธ๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ํฌ๊ฒŒ ๋„์›€์ด ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ๊ฐ€๋ น ์€/๋Š”/์ด/๊ฐ€ ๊ฐ™์€ ์กฐ์‚ฌ๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ํ•œ๊ตญ์–ด ๋ฌธ์„œ์— ๋“ฑ์žฅํ•œ๋‹ค. ๋˜ํ•œ ๋ฒ”์šฉ์ ์œผ๋กœ ์ž์ฃผ ์“ฐ์ด๋Š” ๋‹จ์–ด๋Š” (ex.AI) ๋ฌธ์„œ์˜ ์˜๋ฏธ๋ฅผ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋œ๋‹ค. 

 

 

 

 

1.4 TF-IDF

 

โ  TF-IDF

 

 

 โ†ช๏ธŽ  BoW์˜ ํ•œ๊ณ„์˜€๋˜ '์–ด๋А ๋ฌธ์„œ์—๋‚˜ ๋‚˜์˜ค๋Š” ๋‹จ์–ด' ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด, ํŠน์ • ๋ฌธ์„œ์—์„œ ํŠน์ • ๋‹จ์–ด๊ฐ€ ๋“ฑ์žฅํ•œ ํšŸ์ˆ˜์™€, ํŠน์ • ๋‹จ์–ด๊ฐ€ ๋“ฑ์žฅํ•œ ๋ฌธ์„œ์˜ ์ˆ˜๋ฅผ ํ™œ์šฉํ•ด, ์–ด๋А ๋ฌธ์„œ์—๋‚˜ ์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” ๋‹จ์–ด๋Š” ์ค‘์š”๋„๋ฅผ ์ž‘๊ฒŒํ•˜๋Š” ๊ณ„์‚ฐ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค. 

 

 


โ  ํฌ์†Œ๋ฒกํ„ฐ (Sparsity)

 โ†ช๏ธŽ  ์›ํ•ซ์ธ์ฝ”๋”ฉ, ๋ฐฑ์˜ค๋ธŒ์›Œ์ฆˆ, TF-IDF๋Š” ๋ฌธ์„œ์— ๋“ฑ์žฅํ•˜๋Š” ๋‹จ์–ด์˜ ์ˆ˜๋งŒํผ ์ฐจ์›์ด ์ปค์ง€๊ธฐ ๋•Œ๋ฌธ์—, ๋งŒ์•ฝ ์ด 10,000๊ฐœ์˜ ๋‹จ์–ด๊ฐ€ ์ „์ฒด ๋ฌธ์„œ์—์„œ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค๋ฉด, ํ•˜๋‚˜์˜ ๋ฌธ์žฅ๊ณผ ๋ฌธ์„œ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด 10,000์ฐจ์›์˜ ๋ฒกํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์–ด ํ•„์—ฐ์ ์œผ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ์ˆ˜๊ฐ€ 0์ธ ๋ฒกํ„ฐ(ํฌ์†Œ๋ฒกํ„ฐ)๊ฐ€ ๋œ๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ํฌ์†Œํ•œ ๋ฒกํ„ฐ๋Š” ์˜๋ฏธ๋ฅผ '์••์ถ•'ํ•ด์„œ ๋‹ด๊ณ ์žˆ์ง€ ๋ชปํ•˜๋ฏ€๋กœ ๋ฒกํ„ฐ์™€ ๋ฒกํ„ฐ ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ํ™œ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค. 

 


โ  ๋ฐ€์ง‘์ž„๋ฒ ๋”ฉ (Dense embedding)

 โ†ช๏ธŽ  ์›Œ๋“œํˆฌ๋ฒก๊ณผ ๋ฌธ์žฅ ์ž„๋ฒ ๋”ฉ์€ ๋ณดํ†ต 100~1000์ฐจ์› ์ •๋„๋กœ ํ›จ์”ฌ ์••์ถ•๋œ ํ˜•ํƒœ์ธ๋ฐ, ํฌ์†Œํ•œ ๋ฒกํ„ฐ์™€ ๋Œ€๋น„ํ•ด ๋ฐ€์ง‘์ž„๋ฒ ๋”ฉ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. 

 

 

 

 

 

1.5 ์›Œ๋“œํˆฌ๋ฐฑ 

 

โ  Word2Vec

 

 โ†ช๏ธŽ  ๋‹จ์–ด๊ฐ€ 'ํ•จ๊ป˜ ๋“ฑ์žฅํ•˜๋Š” ๋นˆ๋„' ์ •๋ณด๋ฅผ ํ™œ์šฉํ•ด ๋‹จ์–ด์˜ ์˜๋ฏธ๋ฅผ ์••์ถ•ํ•˜๋Š” ๋‹จ์–ด ์ž„๋ฒ ๋”ฉ ๋ฐฉ๋ฒ• (ex. AI&ML, ํ•œ๊ฐ•&์ž์ „๊ฑฐ)

 โ†ช๏ธŽ  ํŠน์ • ๋‹จ์–ด ์ฃผ๋ณ€์— ์–ด๋–ค ๋‹จ์–ด๊ฐ€ ์žˆ๋Š”์ง€ ์˜ˆ์ธกํ•˜๋Š” ๋ชจ๋ธ์„ ํ†ตํ•ด, ๋‹จ์–ด์˜ ์˜๋ฏธ๋ฅผ ํ‘œํ˜„ํ•œ ์ž„๋ฒ ๋”ฉ์„ ๋ชจ๋ธ์ด ์ƒ์„ฑํ•˜๋„๋ก ํ•œ๋‹ค. 

 

 

 

 โ†ช๏ธŽ CBOW : ์ฃผ๋ณ€ ๋‹จ์–ด๋กœ ๊ฐ€์šด๋ฐ ๋‹จ์–ด๋ฅผ ์˜ˆ์ธกํ•˜๋Š” ๋ฐฉ์‹

 โ†ช๏ธŽ SkipGram : ์ค‘๊ฐ„ ๋‹จ์–ด๋กœ ์ฃผ๋ณ€ ๋‹จ์–ด๋ฅผ ์˜ˆ์ธกํ•˜๋Š” ๋ฐฉ์‹ 

 

 

 

 โ†ช๏ธŽ  ์ฃผ๋ณ€ ๋‹จ์–ด๋ฅผ ์˜ˆ์ธกํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด ํ•™์Šตํ•œ ๋ชจ๋ธ๋กœ ๋‹จ์–ด๋ฅผ ์ž„๋ฒ ๋”ฉ ๋ฒกํ„ฐ๋กœ ๋ณ€ํ™˜ํ–ˆ์„ ๋•Œ, '์—ฌ์ž'๋ผ๋Š” ๋‹จ์–ด์™€ '๋‚จ์ž'๋ผ๋Š” ๋‹จ์–ด์˜ ์ž„๋ฒ ๋”ฉ ๋ฒกํ„ฐ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ์™€ ๋ฐฉํ–ฅ์ด '์—ฌ์™•'๊ณผ '์™•' ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ ๋ฐ ๋ฐฉํ–ฅ๊ณผ ๋น„์Šทํ•˜๊ฒŒ ๋‚˜์™”๋‹ค. ๋‹จ์–ด์˜ ์˜๋ฏธ๋ฅผ ์••์ถ•ํ•ด ์ˆซ์ž๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹จ์–ด์™€ ๋‹จ์–ด ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๊ณ , ๊ทธ ๊ด€๊ณ„์—๋„ ์˜๋ฏธ๊ฐ€ ๋‹ด๊ฒจ์ ธ ์žˆ๋‹ค. 

 

 

 

2.  ๋ฌธ์žฅ ์ž„๋ฒ ๋”ฉ ๋ฐฉ์‹


2.1   ๋ฌธ์žฅ ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•

 

โ  ๋ฌธ์žฅ์ž„๋ฒ ๋”ฉ

 โ†ช๏ธŽ  ํ…์ŠคํŠธ๋ฅผ ํ™œ์šฉํ•  ๋•Œ๋Š” ๋‹จ์–ด๋‹จ์œ„๋ณด๋‹ค๋Š”, ๋ฌธ์žฅ์ด๋‚˜ ๋ฌธ๋‹จ ๋‹จ์œ„ ๊ฐ™์€ ๋” ํฐ ๋‹จ์œ„๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋ฌธ์žฅ ์ž„๋ฒ ๋”ฉ์„ ํ™œ์šฉํ•˜๋ฉด ๋ฌธ์žฅ ์‚ฌ์ด์˜ ์œ ์‚ฌ๋„๋‚˜ ๊ด€๋ จ์„ฑ์„ ๋ฒกํ„ฐ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์‰ฝ๊ฒŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.  

 โ†ช๏ธŽ  ํŠธ๋žœ์Šคํฌ๋จธ ์ธ์ฝ”๋” ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•œ BERT๋Š” ์ž…๋ ฅ ๋ฌธ์žฅ์„ ๋ฌธ์žฅ ์ž„๋ฒ ๋”ฉ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š”๋ฐ ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ์„ ๋ณด์ธ๋‹ค. 

 

 

โ  BERT์˜ ๋ฌธ์žฅ ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ์‹

 

 

โ†ช๏ธŽ  1) ๊ต์ฐจ์ธ์ฝ”๋” 

 โ˜‡  ๋‘ ๋ฌธ์žฅ์„ ํ•จ๊ป˜ BERT ์ž…๋ ฅ์œผ๋กœ ๋„ฃ๊ณ  ๋ชจ๋ธ์ด ์ง์ ‘ ๋‘ ๋ฌธ์žฅ ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ 0๊ณผ 1์‚ฌ์ด์˜ ๊ฐ’์œผ๋กœ ์ถœ๋ ฅํ•œ๋‹ค. 

 โ˜‡ ๊ณ„์‚ฐ๋Ÿ‰์ด ๋งŽ์ง€๋งŒ, ๋‘ ๋ฌธ์žฅ์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๊ณ ๋ คํ•˜์—ฌ ๋” ์ •ํ™•ํ•œ ๊ด€๊ณ„ ์˜ˆ์ธก์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 

 โ˜‡ ๊ทธ๋Ÿฌ๋‚˜, ๋‹ค๋ฅธ ๋ฌธ์žฅ๊ณผ ๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ์˜ ์œ ์‚ฌ๋„๋ฅผ ์•Œ๊ณ  ์‹ถ์„ ๋•Œ ๋™์ผ ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณตํ•ด์•ผ ํ•ด์„œ ๋ชจ๋“  ๋ฌธ์žฅ ์กฐํ•ฉ์— ๋Œ€ํ•ด ์œ ์‚ฌ๋„๋ฅผ ๊ณ„์‚ฐํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ™•์žฅ์„ฑ์ด ๋–จ์–ด์ง„๋‹ค. 

 

โ†ช๏ธŽ  2) ๋ฐ”์ด์ธ์ฝ”๋”

 โ˜‡ ๊ฐ ๋ฌธ์žฅ์„ ๋…๋ฆฝ์ ์œผ๋กœ BERT ์ž…๋ ฅ์œผ๋กœ ๋„ฃ๊ณ , ๋ชจ๋ธ ์ถœ๋ ฅ ๊ฒฐ๊ณผ์ธ ๋ฌธ์žฅ ์ž„๋ฒ ๋”ฉ ๋ฒกํ„ฐ ์‚ฌ์ด์˜ ์œ ์‚ฌ๋„๋ฅผ ์ฝ”์‚ฌ์ธ์œ ์‚ฌ๋„์™€ ๊ฐ™์€ ๋ณ„๋„์˜ ๊ณ„์‚ฐ์„ ํ†ตํ•ด ๊ตฌํ•œ๋‹ค. 

 โ˜‡ ๋…๋ฆฝ์ ์œผ๋กœ ์ž„๋ฒ ๋”ฉ์„ ๊ณ„์‚ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์œ ์‚ฌ๋„๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ์‹ถ์€ ๋ฌธ์žฅ์ด ๋ฐ”๋€Œ๋”๋ผ๋„ ์ถ”๊ฐ€์ ์ธ ์—ฐ์‚ฐ์ด ํ•„์š” ์—†๋‹ค. 

 

 

 

2.2   ๋ฐ”์ด์ธ์ฝ”๋” ๋ชจ๋ธ ๊ตฌ์กฐ 

 

โ  ๋ฐ”์ด์ธ์ฝ”๋”

 

 โ†ช๏ธŽ  ๋ฐ”์ด์ธ์ฝ”๋”๋Š” BERT๋ชจ๋ธ์˜ ์ถœ๋ ฅ์„ ํ’€๋ง์ธต์„ ํ†ตํ•ด ๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ๋ฌธ์žฅ ์ž„๋ฒ ๋”ฉ์œผ๋กœ ๋งŒ๋“ ๋‹ค. 

 โ†ช๏ธŽ  BERT๋Š” ์ž…๋ ฅ ํ† ํฐ๋งˆ๋‹ค ์ถœ๋ ฅ ์ž„๋ฒ ๋”ฉ์„ ์ƒ์„ฑํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ž…๋ ฅํ•˜๋Š” ๋ฌธ์žฅ ๊ธธ์ด๊ฐ€ ๋‹ฌ๋ผ์งˆ ๊ฒฝ์šฐ ์ถœ๋ ฅํ•˜๋Š” ์ž„๋ฒ ๋”ฉ์ˆ˜๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š”๋ฐ, ๋ฌธ์žฅ์˜ ๊ธธ์ด๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅผ ๋•Œ ๋‹ค๋ฅธ ๊ฐœ์ˆ˜์˜ ์ž„๋ฒ ๋”ฉ์ด ๋ฐ˜ํ™˜๋œ๋‹ค๋ฉด ๋ฌธ์žฅ ์‚ฌ์ด์˜ ์œ ์‚ฌ๋„๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๋ฏ€๋กœ ํ’€๋ง์ธต์„ ์‚ฌ์šฉํ•ด ๋ฌธ์žฅ์„ ๋Œ€ํ‘œํ•˜๋Š” 1๊ฐœ์˜ ์ž„๋ฒ ๋”ฉ์œผ๋กœ ํ†ตํ•ฉ์‹œํ‚จ๋‹ค. 

 โ†ช๏ธŽ  ํ’€๋ง์ธต์„ ์‚ฌ์šฉํ•ด, ๋ฌธ์žฅ์˜ ๊ธธ์ด๊ฐ€ ๋‹ฌ๋ผ์ ธ๋„ 1๊ฐœ์˜ ๊ณ ์ • ์ฐจ์›์ด ๋ฐ˜ํ™˜๋˜๋ฏ€๋กœ ์ฝ”์‚ฌ์ธ์œ ์‚ฌ๋„ ์—ฐ์‚ฐ์„ ํ•  ๋•Œ ๊ฑฐ๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 


โ  Sentence-Transformers

 โ†ช๏ธŽ  bi-encoder ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ 

from sentence_transformers import SentenceTransformer, models

# ์‚ฌ์šฉํ•  BERT๋ชจ๋ธ 
word_embedding_model = models.Transformer('klue/roberta-base')

# ํ’€๋ง ์ธต์— ํ† ํฐ ์ž„๋ฒ ๋”ฉ ์ฐจ์› ์ž…๋ ฅํ•˜๊ธฐ : models.Pooling()
pooling_model = models.Pooling(word_embedding_model.get_word_embedding_dimension())

# ๋‘ ๋ชจ๋“ˆ ๊ฒฐํ•ฉ
model = SentenceTransformer(modules=[word_embedding_model, pooling_model])

 

 โ†ช๏ธŽ  model์ถœ๋ ฅ์„ ํ•ด๋ณด๋ฉด 3๊ฐ€์ง€ Pooling ๋ชจ๋“œ๊ฐ€ ๋ณด์ธ๋‹ค. Pooling ๋ชจ๋“œ๋ž€ ์–ธ์–ด ๋ชจ๋ธ์ด ์ถœ๋ ฅํ•œ ๊ฒจ๋กœ๊ฐ€ ์ž„๋ฒ ๋”ฉ์„ ๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ๋ฌธ์žฅ ์ž„๋ฒ ๋”ฉ์œผ๋กœ ํ†ตํ•ฉํ•  ๋•Œ ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค. 

โ˜‡ 1)  pooling_mode_cls_tokens : ์ฒซ๋ฒˆ์งธ ํ† ํฐ์ธ [CLS] ํ† ํฐ์˜ ์ถœ๋ ฅ์ž„๋ฒ ๋”ฉ์„ ๋ฌธ์žฅ ์ž„๋ฒ ๋”ฉ์œผ๋กœ ์‚ฌ์šฉ

โ˜‡ 2)  pooling_mode_mean_tokens : BERT ๋ชจ๋ธ์—์„œ ๋ชจ๋“  ์ž…๋ ฅ ํ† ํฐ์˜ ์ถœ๋ ฅ ์ž„๋ฒ ๋”ฉ์„ ํ‰๊ท ํ•œ ๊ฐ’์„ ๋ฌธ์žฅ์ž„๋ฒ ๋”ฉ์œผ๋กœ ์‚ฌ์šฉ

โ˜‡ 3) pooling_mode_max_tokens : BERT ๋ชจ๋ธ์˜ ๋ชจ๋“  ์ž…๋ ฅ ํ† ํฐ์˜ ์ถœ๋ ฅ ์ž„๋ฒ ๋”ฉ์—์„œ ๋ฌธ์žฅ ๊ธธ์ด ๋ฐฉํ–ฅ์—์„œ ์ตœ๋Œ“๊ฐ’์„ ์ฐพ์•„ ๋ฌธ์žฅ ์ž„๋ฒ ๋”ฉ์œผ๋กœ ์‚ฌ์šฉ 

 

 

 

2.3  Sentence-Transformers๋กœ ํ…์ŠคํŠธ์™€ ์ด๋ฏธ์ง€ ์ž„๋ฒ ๋”ฉ ์ƒ์„ฑํ•ด ๋ณด๊ธฐ

 

โ  ํ•œ๊ตญ์–ด ๋ฌธ์žฅ ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ๋กœ ์ž…๋ ฅ ๋ฌธ์žฅ ์‚ฌ์ด์˜ ์œ ์‚ฌ๋„ ๊ณ„์‚ฐ 

 โ†ช๏ธŽ  Sentence-Transformers ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ—ˆ๊น…ํŽ˜์ด์Šค ๋ชจ๋ธ์„ ๋ถˆ๋Ÿฌ์™€ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ํ—ˆ๊น…ํŽ˜์ด์Šค ๋ชจ๋ธ ํ—ˆ๋ธŒ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋ธ์ด๋ผ๋ฉด ํ…์ŠคํŠธ ๋ฟ ์•„๋‹ˆ๋ผ ์ด๋ฏธ์ง€ ๋ชจ๋ธ๋„ ๋ถˆ๋Ÿฌ์™€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

from sentence_transformers import SentenceTransformer, util

model = SentenceTransformer('snunlp/KR-SBERT-V40K-klueNLI-augSTS')
# ํ•œ๊ตญ์–ด ๋ฌธ์žฅ ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ์„ ๋ถˆ๋Ÿฌ์˜ด

embs = model.encode(['์ž ์ด ์•ˆ ์˜ต๋‹ˆ๋‹ค',
                     '์กธ์Œ์ด ์˜ต๋‹ˆ๋‹ค', 
                     '๊ธฐ์ฐจ๊ฐ€ ์˜ต๋‹ˆ๋‹ค']) # ๋ฌธ์žฅ ์ธ์ฝ”๋”ฉ

cos_scores = util.cos_sim(embs, embs) # ์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„ ๊ณ„์‚ฐ
print(cos_scores)
# tensor([[1.0000, 0.6410, 0.1887],
#         [0.6410, 1.0000, 0.2730],
#         [0.1887, 0.2730, 1.0000]])

 

 

 

โ  CLIP๋ชจ๋ธ์„ ํ™œ์šฉํ•œ ์ด๋ฏธ์ง€์™€ ํ…์ŠคํŠธ ์ž„๋ฒ ๋”ฉ ์œ ์‚ฌ๋„ ๊ณ„์‚ฐ 

 โ†ช๏ธŽ  ๊ณ ์–‘์ด, ๊ฐ•์•„์ง€ ์ด๋ฏธ์ง€์™€, ์ด๋ฏธ์ง€๋ฅผ ๋ฌ˜์‚ฌํ•˜๋Š” ํ…์ŠคํŠธ ์‚ฌ์ด์˜ ์œ ์‚ฌ๋„ ๊ณ„์‚ฐ > ๋™๋ฌผ ์ด๋ฏธ์ง€์™€ ๋™๋ฌผ ํ…์ŠคํŠธ๋ผ๋ฆฌ ๋Œ€์‘ํ–ˆ์„ ๋•Œ ์œ ์‚ฌ๋„๊ฐ€ ๋” ๋†’์Œ (๋ฐ˜๋Œ€๋ฉด ์œ ์‚ฌ๋„ ์ ์ˆ˜๊ฐ€ ๋‚ฎ์Œ)

from PIL import Image
from sentence_transformers import SentenceTransformer, util

model = SentenceTransformer('clip-ViT-B-32')

img_embs = model.encode([Image.open('dog.jpg'), Image.open('cat.jpg')])
text_embs = model.encode(['A dog on grass', 'Brown cat on yellow background'])

cos_scores = util.cos_sim(img_embs, text_embs)
print(cos_scores)
# tensor([[0.2771, 0.1509],
#         [0.2071, 0.3180]])

 

 

 

 

 

2.4   ์˜คํ”ˆ์†Œ์Šค์™€ ์ƒ์—…์šฉ ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ ๋น„๊ตํ•˜๊ธฐ 

 

โ  ์˜คํ”ˆ์†Œ์Šค๋ชจ๋ธ

 โ†ช๏ธŽ  Sentence-Transformers ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ์‚ฌ์ „ํ•™์Šต ๋ชจ๋ธ์„ ๋ถˆ๋Ÿฌ์™€ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ์‹

 โ†ช๏ธŽ  ์ž์‹ ์˜ ๋ฐ์ดํ„ฐ์— ๋งž์ถฐ fine-tuning์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Œ

 

โ  ์ƒ์—…์šฉ๋ชจ๋ธ

 โ†ช๏ธŽ  Open AI ์˜ text-embedding-ada-002

 โ†ช๏ธŽ  ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋กœ ํ•™์Šต๋œ ๋งŒํผ ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚จ 

 โ†ช๏ธŽ  LLM ํ…์ŠคํŠธ ์ƒ์„ฑ์— ๋น„ํ•ด ๋‚ฎ์€ ๋น„์šฉ์œผ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ 

728x90

๋Œ“๊ธ€