์๋ฒ ๋ฉ(Embedding)์ด๋?
1. ์๋ฒ ๋ฉ(Embedding) ์ ์
์๋ฒ ๋ฉ(Embedding)์ ๋ฐ์ดํฐ๋ฅผ ๊ณ ์ ๋ ํฌ๊ธฐ์ ๋ฒกํฐ ๊ณต๊ฐ(Vector Space) ์ผ๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ด๋ค.
ํนํ ์์ฐ์ด ์ฒ๋ฆฌ(NLP) ๋ฐ ์ถ์ฒ ์์คํ , ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๋ฑ์์ ์์ฃผ ์ฌ์ฉ๋๋ค. ์ฃผ๋ก ๊ณ ์ฐจ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฐจ์ ์ฐ์ ๊ณต๊ฐ์ผ๋ก
๋งคํํ๋ ๊ณผ์ ์ ์๋ฏธํ๋ค.
๐น ํต์ฌ ๊ฐ๋
- ๊ณ ์ฐจ์ → ์ ์ฐจ์ ๋ณํ: ๋จ์ด, ๋ฌธ์ฅ, ์ด๋ฏธ์ง ๋ฑ์ ์์น ๋ฒกํฐ(embedding vector) ๋ก ๋ณํ
- ์ ์ฌ์ฑ ๋ณด์กด: ์๋ฏธ์ ์ผ๋ก ๋น์ทํ ๋ฐ์ดํฐ๋ ๋ฒกํฐ ๊ณต๊ฐ์์๋ ๊ฐ๊น๊ฒ ์์น
- ํ์ต ๊ธฐ๋ฐ ๋ณํ: ๋จ์ ๋งคํ์ด ์๋๋ผ ํ์ต์ ํตํด ์๋ฏธ ์๋ ๋ณํ์ ์ํ
2. ์๋ฒ ๋ฉ์ ํ์ฉ ์ฌ๋ก
1) ์์ฐ์ด ์ฒ๋ฆฌ(NLP)
ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ๋ฒกํฐ๋ก ๋ณํํ์ฌ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ด ์ดํดํ ์ ์๋๋ก ํ๋ค.
- ๋ํ์ ์ธ ๋ฐฉ๋ฒ:
- Word2Vec: ๋จ์ด๋ฅผ ๋ฒกํฐ๋ก ๋ณํํ์ฌ ์๋ฏธ๊ฐ ๋น์ทํ ๋จ์ด๋ผ๋ฆฌ ๊ฐ๊น์ด ๊ณต๊ฐ์ ๋ฐฐ์น
- GloVe(Global Vectors for Word Representation): ํต๊ณ ๊ธฐ๋ฐ ๋จ์ด ์๋ฒ ๋ฉ
- FastText: ๋ถ๋ถ ๋จ์ด(subword)๊น์ง ํ์ตํ์ฌ ์ผ๋ฐํ ์ฑ๋ฅ ํฅ์
- BERT, GPT ์๋ฒ ๋ฉ: ์ฌ์ ํ์ต๋ ์ธ์ด ๋ชจ๋ธ์ ํ์ฉํ ๋ฌธ๋งฅ ๊ธฐ๋ฐ ์๋ฒ ๋ฉ
- ์์:
- "๊ฐ์์ง"์ "๊ณ ์์ด"์ ๋ฒกํฐ๋ ๊ฐ๊น์ด ์์น
- "๊ฐ์์ง" - "๊ฐ" โ "๊ณ ์์ด" - "๊ณ ์์ด๊ณผ ๋๋ฌผ"
2) ์ถ์ฒ ์์คํ
์ฌ์ฉ์์ ์์ดํ (์: ์ํ, ์ํ)์ ๋ฒกํฐํํ์ฌ ์ ์ฌ๋๊ฐ ๋์ ์์ดํ ์ ์ถ์ฒํ๋ค.
- ์: ๋ทํ๋ฆญ์ค, ์๋ง์กด์ ์ถ์ฒ ์์คํ
- ํ์ ํํฐ๋ง(Collaborative Filtering) ๊ธฐ๋ฐ ์๋ฒ ๋ฉ ํ์ฉ
- ์์:
- ์ฌ์ฉ์์ ์์ฒญ ๋ด์ญ์ ๊ธฐ๋ฐ์ผ๋ก ๋น์ทํ ์ฌ์ฉ์ ๊ทธ๋ฃน์ ์ฐพ์ ์ํ ์ถ์ฒ
3) ์ด๋ฏธ์ง ๋ฐ ์์ฑ ์ฒ๋ฆฌ
์ด๋ฏธ์ง๋ฅผ ๋ฒกํฐ๋ก ๋ณํํ์ฌ ์ ์ฌํ ์ด๋ฏธ์ง ๊ฒ์, ์ผ๊ตด ์ธ์ ๋ฑ์ ํ์ฉ
- CNN(Convolutional Neural Network)์ ํ์ฉํ ์ด๋ฏธ์ง ์๋ฒ ๋ฉ
- ์ผ๊ตด ์ธ์(FaceNet)
- ์์:
- ๊ตฌ๊ธ ์ด๋ฏธ์ง ๊ฒ์์์ ์ ์ฌํ ์ด๋ฏธ์ง ์ฐพ๊ธฐ
- ์ผ๊ตด ์ธ์์ ํตํด ์ฌ์ฉ์ ์ธ์ฆ
3. ์๋ฒ ๋ฉ ํ์ต ๋ฐฉ๋ฒ
1) ์ง๋ ํ์ต(Supervised Learning)
- ์ ๋ต ๋ ์ด๋ธ์ ์ฌ์ฉํ์ฌ ๋ฒกํฐ๋ฅผ ํ์ต
- ์: ๊ฐ์ ๋ถ์ ๋ชจ๋ธ์์ ๊ธ์ /๋ถ์ ๋ฐ์ดํฐ ํ์ต
2) ๋น์ง๋ ํ์ต(Unsupervised Learning)
- ๋ฐ์ดํฐ ์์ฒด์ ํจํด์ ํ์ตํ์ฌ ๋ฒกํฐ ์์ฑ
- ์: Word2Vec, GloVe ๋ฑ ๋จ์ด ์๋ฒ ๋ฉ
3) ์ฌ์ ํ์ต(Pre-trained Embeddings)
- ๋๊ท๋ชจ ๋ฐ์ดํฐ์์ ๋ฏธ๋ฆฌ ํ์ต๋ ์๋ฒ ๋ฉ์ ํ์ฉํ์ฌ ํน์ ์์ ์ ์ ์ฉ
- ์: BERT, GPT, FastText ๋ฑ
4. ์๋ฒ ๋ฉ์ ์ฅ์ ๊ณผ ํ๊ณ
โ ์ฅ์
- ๊ณ ์ฐจ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฐจ์์ผ๋ก ๋ณํํ์ฌ ๊ณ์ฐ ํจ์จ ์ฆ๊ฐ
- ์ ์ฌ์ฑ ์ ๋ณด ๋ณด์กด์ผ๋ก ์๋ฏธ ์๋ ๋ฐ์ดํฐ ๊ด๊ณ ํ์ต ๊ฐ๋ฅ
- ๋ฅ๋ฌ๋ ๋ชจ๋ธ๊ณผ ๊ฒฐํฉํ์ฌ ์ฑ๋ฅ ํฅ์
โ ํ๊ณ
- ํ๋ จ ๋ฐ์ดํฐ์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ์ข์ฐ๋จ (๋ฐ์ดํฐ ํธํฅ ๋ฌธ์ )
- ํน์ ๋๋ฉ์ธ์ ์ต์ ํ๋์ง ์์ผ๋ฉด ์ผ๋ฐํ ์ฑ๋ฅ ์ ํ ๊ฐ๋ฅ
5. ์ ๋ฆฌ
- ์๋ฒ ๋ฉ์ ๋ฐ์ดํฐ๋ฅผ ๋ฒกํฐ๋ก ๋ณํํ์ฌ ๋จธ์ ๋ฌ๋ ๋ฐ ๋ฅ๋ฌ๋ ๋ชจ๋ธ์ด ์ดํดํ ์ ์๋๋ก ๋ง๋๋ ๊ณผ์ ์ด๋ค
- NLP(Word2Vec, BERT), ์ถ์ฒ ์์คํ , ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๋ฑ ๋ค์ํ ๋ถ์ผ์์ ํ์ฉํ๋ค
- ์๋ฏธ๋ฅผ ๋ณด์กดํ๋ฉฐ ์ ์ฌํ ๋ฐ์ดํฐ๋ ๊ฐ๊น์ด ๋ฒกํฐ ๊ณต๊ฐ์ ๋ฐฐ์นํ๋ค
6. ์ค์ ํ์ฉ ์์
- Django + Streamlit ํ๋ก์ ํธ์์ ์ฌํ์ง ์ถ์ฒ ์์คํ
์ ๋ง๋ค ๋:
- ์ฌ์ฉ์ ์ ํธ๋๋ฅผ ์๋ฒ ๋ฉ ๋ฒกํฐ๋ก ๋ณํํด ์ถ์ฒ ๋ชจ๋ธ ์ ์ฉ ๊ฐ๋ฅ
- AI ๊ธฐ๋ฐ ์ผ์ ์ถ์ฒ์์ ์ต์ ๋ฃจํธ ์ถ์ฒ์ ํ์ฉ ๊ฐ๋ฅ
1. ๋ฐ์ดํฐ ์ค๋น
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
# ์์ ๋ฐ์ดํฐ: ์ฌํ์ง ์ ๋ณด
data = {
"id": [1, 2, 3, 4, 5],
"location": ["์์ธ", "์ ์ฃผ๋", "๋ถ์ฐ", "๊ฒฝ์ฃผ", "๊ฐ๋ฆ"],
"description": [
"ํ์ฅ๊ณผ ์ ํต ์์ฅ์ด ์ ๋ช
ํ ๋์",
"์๋ฆ๋ค์ด ํด๋ณ๊ณผ ํด์์ง๊ฐ ์๋ ์ฌ",
"ํ๊ธฐ์ฐฌ ํด์ ๋์์ ๋ค์ํ ๋จน๊ฑฐ๋ฆฌ",
"์ญ์ฌ์ ์ธ ์ ์ ๊ณผ ์ ํต ๋ฌธํ๊ฐ ํ๋ถ",
"์์ฐ ๊ฒฝ๊ด๊ณผ ์ํ ๋ช
์๋ก ์ ๋ช
"
]
}
df = pd.DataFrame(data)
# TF-IDF ๋ฒกํฐํ (ํ
์คํธ ์๋ฒ ๋ฉ)
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(df["description"])
# ๋ฐ์ดํฐํ๋ ์ ์ถ๋ ฅ
import ace_tools as tools
tools.display_dataframe_to_user(name="์ฌํ์ง ๋ฐ์ดํฐ", dataframe=df)
2. ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ์ ์๋ฒ ๋ฉ ๋ณํ
# ์ฌ์ฉ์์ ์ ํธ๋ ์
๋ ฅ
user_input = "๋๋ ๋ฐ๋ค์ ํด๋ณ์ด ์๋ ์ฌํ์ง๋ฅผ ์ข์ํด"
# ์ฌ์ฉ์ ์
๋ ฅ์ ์๋ฒ ๋ฉ ๋ฒกํฐ๋ก ๋ณํ
user_tfidf = vectorizer.transform([user_input])
# ์ฌํ์ง์ ์ฌ์ฉ์ ์
๋ ฅ ๊ฐ ์ฝ์ฌ์ธ ์ ์ฌ๋ ๊ณ์ฐ
cosine_similarities = cosine_similarity(user_tfidf, tfidf_matrix).flatten()
# ์ ์ฌ๋๊ฐ ๋์ ์์๋๋ก ์ ๋ ฌํ์ฌ ์ถ์ฒ
recommended_idx = cosine_similarities.argsort()[::-1] # ๋์ ์์๋๋ก ์ ๋ ฌ
top_recommendations = df.iloc[recommended_idx[:3]] # ์์ 3๊ฐ ์ถ์ฒ
# ์ถ์ฒ ๊ฒฐ๊ณผ ์ถ๋ ฅ
tools.display_dataframe_to_user(name="์ถ์ฒ ์ฌํ์ง", dataframe=top_recommendations)
3. ์ถ์ฒ ์์คํ ์ Django + Streamlit์ ์ ์ฉ
import streamlit as st
# Streamlit ์น ์ฑ UI
st.title("AI ์ฌํ์ง ์ถ์ฒ ์์คํ
๐๏ธ")
# ์ฌ์ฉ์ ์
๋ ฅ๋ฐ๊ธฐ
user_input = st.text_area("๋น์ ์ด ๊ฐ๊ณ ์ถ์ ์ฌํ ์คํ์ผ์ ์
๋ ฅํ์ธ์:", "")
if st.button("์ถ์ฒ ๋ฐ๊ธฐ"):
if user_input:
# ์ฌ์ฉ์ ์
๋ ฅ์ ๋ฒกํฐํ
user_tfidf = vectorizer.transform([user_input])
# ์ฝ์ฌ์ธ ์ ์ฌ๋ ๊ณ์ฐ
cosine_similarities = cosine_similarity(user_tfidf, tfidf_matrix).flatten()
recommended_idx = cosine_similarities.argsort()[::-1] # ๋์ ์์๋๋ก ์ ๋ ฌ
top_recommendations = df.iloc[recommended_idx[:3]] # ์์ 3๊ฐ ์ถ์ฒ
# ๊ฒฐ๊ณผ ์ถ๋ ฅ
st.subheader("โจ ์ถ์ฒ ์ฌํ์ง โจ")
for i, row in top_recommendations.iterrows():
st.write(f"๐ **{row['location']}** - {row['description']}")
else:
st.warning("์ฌํ ์คํ์ผ์ ์
๋ ฅํด์ฃผ์ธ์!")
'AI ๐ค > ML & DL ๐ง ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[250307] FAISS vs ChromaDB ์ฐจ์ด์ (3) | 2025.03.07 |
---|---|
[250304] RAG ์ ๋ฆฌ (1) | 2025.03.04 |
[250214] Parser ์ ๋ฆฌ (0) | 2025.02.14 |
[250212] LangChain์ด ๋ญ๋ฐ~ (2) | 2025.02.12 |
[250210] LLM ํน๊ฐ ๋๋ฒ์งธ ์๊ฐ~ (1) | 2025.02.10 |