티스토리 뷰
!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 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 중급개발자
- atom git 연동
- BERT
- 기술사
- 소프트웨어아키텍트
- 인공지능교육
- 클라우드 활용
- FinOps
- 핀옵스
- 핵심집중반
- 벡터db
- 모델저장
- 정보처리기술사
- 클라우드 비용절감
- python성능
- 경력자인공지능교육
- RegeneratorRuntime
- joblib
- 아이리포
- ci/cd
- MariaDB
- 123회기술사
- 고급개발자
- 인공지능주말교육
- 컴퓨터시스템응용기술사
- 두음신공
- argocd
- SWA
- mysql
- 정보관리기술사
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함