티스토리 뷰

IT신기술

RAG연계 예시

정두현의아이티세상 2025. 7. 8. 21:43
!pip install sentence-transformers scikit-learn matplotlib
!pip install faiss-cpu
 
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np

# 1. 임베딩 모델 불러오기 (문장을 숫자 벡터로 변환해줌)
#model = SentenceTransformer("all-MiniLM-L6-v2")  # 속도와 정확성 균형
# 1. 로컬 모델 저장 경로
model_dir = "./local_model/all-MiniLM-L6-v2"

# 2. 모델 로드 또는 저장
if not os.path.exists(model_dir):
    print("모델 다운로드 중...")
    model = SentenceTransformer("all-MiniLM-L6-v2")
    model.save(model_dir)
else:
    print("로컬 모델 불러오는 중...")
    model = SentenceTransformer(model_dir)


# 2. 내 문서들 (사내 문서, FAQ 등)
documents = [
    "우리 회사는 AI 기반 추천 서비스를 제공합니다.",
    "고객센터 운영시간은 오전 9시부터 오후 6시까지입니다.",
    "제품 환불은 배송일로부터 7일 이내에 가능합니다.",
    "모델 학습에는 GPU를 사용하는 것이 빠릅니다."
]

# 3. 벡터로 변환
doc_embeddings = model.encode(documents)

# 4. 벡터 DB 구축 (FAISS 사용)
dimension = doc_embeddings.shape[1]
index = faiss.IndexFlatL2(dimension)
index.add(doc_embeddings)

# 5. 질문 입력 (사용자 쿼리)
query = "환불 받을 수 있는 조건이 뭐야?"
#query = "GPU를 쓰면 뭐가 좋아?"
# 6. 쿼리를 벡터로 변환하고 검색
query_embedding = model.encode([query])
top_k = 2
D, I = index.search(query_embedding, top_k)

# 7. 가장 관련 있는 문서 출력
print("사용자 질문:", query)
print("\n[검색된 관련 문서]")
for idx in I[0]:
    print("-", documents[idx])
 
 
 
 
 
 
 
 
################ 시각화
#한글폰트 설치
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf
 
#폰트 정상확인
import matplotlib
import matplotlib.font_manager

[f.name for f in matplotlib.font_manager.fontManager.ttflist if 'Nanum' in f.name]
 
 
 
# 시각화 소스 시작
import os
import numpy as np
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
from sentence_transformers import SentenceTransformer

# 설치된 폰트 경로 확인
font_path = '/usr/share/fonts/truetype/nanum/NanumGothic.ttf'
font_name = fm.FontProperties(fname=font_path).get_name()
plt.rc('font', family=font_name)
plt.rcParams['axes.unicode_minus'] = False  # 마이너스 기호 깨짐 방지


# ✅ NumPy 최신버전 호환 패치 (np.float 오류 방지)
if not hasattr(np, 'float'):
    np.float = float

# 1. 로컬 모델 저장 경로
model_dir = "./local_model/all-MiniLM-L6-v2"

# 2. 모델 로드 또는 저장
if not os.path.exists(model_dir):
    print("모델 다운로드 중...")
    model = SentenceTransformer("all-MiniLM-L6-v2")
    model.save(model_dir)
else:
    print("로컬 모델 불러오는 중...")
    model = SentenceTransformer(model_dir)
#  "GPU를 쓰면 뭐가 좋아?",
# 3. 문장 리스트
documents = [
    "우리 회사는 AI 기반 추천 서비스를 제공합니다.",
    "고객센터 운영시간은 오전 9시부터 오후 6시까지입니다.",
    "제품 환불은 배송일로부터 7일 이내에 가능합니다.",
    "모델 학습에는 GPU를 사용하는 것이 빠릅니다.",
    "추천 시스템은 사용자 행동 데이터를 분석합니다.",
    "환불 요청은 고객센터를 통해 접수할 수 있습니다.",  
]

# 4. 임베딩 생성
embeddings = model.encode(documents)

# 5. 차원 축소 (PCA)
pca = PCA(n_components=2)
reduced = pca.fit_transform(embeddings)

# 6. 시각화
plt.figure(figsize=(10, 6))
for i, text in enumerate(documents):
    x, y = reduced[i]
    plt.scatter(x, y)
    plt.text(x + 0.01, y + 0.01, f"{i+1}. {text[:15]}...", fontsize=9)

plt.title("문장 벡터의 2차원 시각화 (PCA)")
plt.xlabel("PC 1")
plt.ylabel("PC 2")
plt.grid(True)
plt.show()
 
 

'IT신기술' 카테고리의 다른 글

고급 프롬프트 예시  (2) 2025.07.09
회귀모델 예시  (8) 2025.07.09
RAG구성시 전처리가 불필요한가?  (3) 2025.06.18
pandas-멀티인덱스  (1) 2024.10.04
redis설치및 2중화  (0) 2020.04.06
댓글