[AI] mongodb 로 RAG 구현해보자.

0

AI : Langchain (RAG)

목록 보기
38/38

1. mongodb 설치

macos 에서 설치 해보겠다.

1-1. 저장소 추가

% brew tap mongodb/brew

1-2. mongodb 설치

% brew install mongodb-community

2. mongodb start

% brew services start mongodb/brew/mongodb-community

3. compass 설치

https://www.mongodb.com/try/download/compass

4. Compass 실행 및 설정

4-1. Add new connection

4-2. Save & Connect

4-3. 생성 결과

5. DB & collection 생성

이제 mongodb 의 준비가 끝났다.

6. mongodb 데이터 부어넣기

6-1. 필요 패키지 설치

% uv pip install pymongo sentence_transformers

6-2. 실행 파일

from pymongo import MongoClient
from sentence_transformers import SentenceTransformer


# MongoDB 연결
client = MongoClient("mongodb://localhost:27017/")
db = client["exoluse"]
collection = db["exoluse"]

# 임베딩 모델
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")  # or bge-m3

# 샘플 문서들
docs = [
    "삼성전자는 최신 스마트폰 갤럭시 Z플립8을 공개하며 폴더블 시장을 선도하고 있습니다.",
    "애플은 이번 주 새로운 맥북 프로 모델과 iOS 업데이트를 발표했습니다.",
    "마이크로소프트는 클라우드 플랫폼 Azure에 AI 기능을 강화한 신규 서비스를 출시했습니다.",
    "구글은 인공지능 기반 검색 알고리즘 개선으로 더 정확한 검색 결과를 제공한다고 밝혔습니다.",
    "비트코인과 이더리움 가격이 최근 변동성을 보이며 암호화폐 시장이 주목받고 있습니다.",
    "엔비디아는 차세대 GPU ‘RTX 5090’ 출시를 앞두고 성능 공개 행사를 준비 중입니다.",
    "아마존 웹 서비스(AWS)는 서버리스 컴퓨팅 기능을 확장하여 개발자 생산성을 높이고 있습니다.",
    "한국의 스타트업들이 메타버스 플랫폼 개발에 박차를 가하며 글로벌 시장 진출을 노리고 있습니다.",
    "페이스북 모회사 메타는 VR 헤드셋 신제품을 발표하며 가상현실 생태계 확대를 추진하고 있습니다.",
    "테슬라는 자율주행 소프트웨어 업데이트를 통해 차량 안전성과 주행 효율을 강화했습니다.",
    "애플이 아이폰14 시리즈의 생산량을 대폭 늘릴 계획이라는 소식이 전해졌습니다.",
    "구글 클라우드는 최근 데이터 분석 서비스를 강화하는 새로운 기능을 공개했습니다.",
    "삼성전자는 반도체 사업에 2030년까지 170조원을 투자할 계획입니다.",
    "아마존은 물류 자동화를 위해 로봇 배송 시스템을 도입하고 있습니다.",
    "마이크로소프트는 오피스365에 AI 기반 글쓰기 보조 기능을 추가했습니다.",
    "틱톡은 쇼핑 기능을 강화해 소셜커머스 시장에 본격 진출했습니다.",
    "애플은 자체 설계 칩 ‘M3’의 성능과 전력 효율을 대폭 개선할 예정입니다.",
    "구글이 자율주행 자동차 개발 프로젝트에 10억 달러를 투자하기로 했습니다.",
    "넷플릭스는 새로운 추천 알고리즘으로 개인 맞춤형 콘텐츠 제공을 강화했습니다.",
    "페이스북은 사용자 프라이버시 보호를 위한 새로운 데이터 정책을 시행합니다.",
    "테슬라는 에너지 저장 시스템 분야에도 사업을 확장하고 있습니다.",
    "삼성전자는 스마트홈 기기 라인업을 확대하며 IoT 시장 공략에 나섰습니다.",
    "애플 워치는 건강 모니터링 기능을 지속적으로 업그레이드하고 있습니다.",
    "구글은 클라우드 AI 플랫폼에 자연어 처리 기능을 통합했습니다.",
    "아마존은 AI 기반 추천 시스템을 고도화해 고객 경험을 향상시키고 있습니다.",
    "마이크로소프트는 게임 스트리밍 서비스 확장을 위해 신규 서버를 구축했습니다.",
    "틱톡은 짧은 영상 콘텐츠에 대한 광고 상품을 새롭게 선보였습니다.",
    "삼성전자는 5G 네트워크 장비 사업을 확대할 방침입니다.",
    "애플은 iOS 보안 강화를 위한 새로운 암호화 기술을 도입했습니다.",
    "구글 지도는 실시간 교통 정보 업데이트 기능을 개선했습니다.",
    "테슬라는 전기차 충전 인프라 확대를 위해 글로벌 파트너십을 체결했습니다.",
    "페이스북 메신저에 새로운 그룹 채팅 기능이 추가되었습니다.",
    "아마존은 클라우드 컴퓨팅 가격 인하를 발표했습니다.",
    "마이크로소프트는 하이브리드 클라우드 솔루션 개발에 집중하고 있습니다.",
    "틱톡은 전 세계 사용자 수 20억 명을 돌파했습니다.",
    "삼성전자는 AI 기반 카메라 기능을 스마트폰에 적용했습니다.",
    "애플은 신규 iPad 모델을 출시하며 교육 시장을 겨냥하고 있습니다.",
    "구글은 개발자용 AI 툴킷을 공개했습니다.",
    "테슬라는 자율주행 관련 특허를 대거 출원했습니다.",
    "페이스북은 VR 기반 원격 근무 플랫폼 개발에 착수했습니다.",
    "아마존은 드론 배송 서비스 테스트를 확대하고 있습니다.",
    "마이크로소프트는 보안 강화 위한 클라우드 서비스 업데이트를 진행했습니다.",
    "틱톡은 인플루언서 마케팅 지원 프로그램을 시작했습니다.",
    "삼성전자는 차세대 배터리 기술 개발에 박차를 가하고 있습니다.",
    "애플은 AR 헤드셋 개발 프로젝트를 공개했습니다.",
    "구글은 AI 윤리 기준을 강화하는 정책을 발표했습니다.",
    "테슬라는 배터리 생산 공장을 확장 중입니다.",
    "페이스북은 새로운 광고 타겟팅 옵션을 도입했습니다.",
    "아마존은 헬스케어 사업에 진출하기 위해 협력사를 모집하고 있습니다.",
    "마이크로소프트는 교육용 AI 챗봇을 출시했습니다.",
    "틱톡은 전자상거래 연동 기능을 확대했습니다.",
    "삼성전자는 클라우드 게임 서비스에 진출할 계획입니다.",
    "애플은 프라이버시 보호 기능을 강화한 iOS 업데이트를 발표했습니다.",
    "구글은 차세대 스마트폰용 칩셋을 개발 중입니다.",
    "테슬라는 태양광 패널 사업에 투자하고 있습니다.",
    "페이스북은 소셜 오디오 서비스 출시를 준비 중입니다.",
    "아마존은 로봇 프로세스 자동화(RPA) 솔루션을 내놓았습니다.",
    "마이크로소프트는 AI 연구 센터를 신규 설립했습니다.",
    "틱톡은 라이브 스트리밍 기능을 강화했습니다.",
    "삼성전자는 폴더블 스마트폰 라인업을 확대하고 있습니다.",
    "애플은 신제품 발표 행사를 온라인으로 진행했습니다.",
    "구글은 AI 기반 번역 서비스 품질을 개선했습니다.",
    "테슬라는 신형 전기트럭 출시를 예고했습니다.",
    "페이스북은 메타버스 내 가상 자산 거래 기능을 선보였습니다.",
    "아마존은 클라우드 데이터 분석 서비스 경쟁력을 강화했습니다.",
    "마이크로소프트는 신규 게임 타이틀을 다수 출시했습니다.",
    "틱톡은 AI 편집 기능을 적용한 동영상 제작 도구를 출시했습니다.",
    "삼성전자는 차세대 OLED 디스플레이 생산 라인을 가동했습니다.",
    "애플은 앱스토어 정책을 개정해 개발자 수익 구조를 변경했습니다.",
    "구글은 지속 가능한 데이터 센터 운영을 위한 친환경 정책을 도입했습니다.",
    "테슬라는 완전자율주행(FSD) 기능 업그레이드를 배포했습니다.",
    "페이스북은 새로운 가상현실 콘텐츠를 공개했습니다.",
    "아마존은 스마트 스피커 기능을 확장했습니다.",
    "마이크로소프트는 협업툴 시장 점유율을 높이고 있습니다.",
    "틱톡은 사용자 개인정보 보호를 위한 기능을 강화했습니다.",
    "삼성전자는 AI 칩셋 개발을 본격화했습니다.",
    "애플은 건강 추적 기능을 탑재한 신제품을 출시했습니다.",
    "구글은 인공지능 교육 프로그램을 확대했습니다.",
    "테슬라는 전기차 배터리 수명 개선 기술을 개발 중입니다.",
    "페이스북은 소셜 미디어 중독 방지 기능을 연구하고 있습니다.",
    "아마존은 물류센터 자동화 로봇을 추가 도입했습니다.",
    "마이크로소프트는 클라우드 보안 서비스에 신규 기능을 탑재했습니다.",
    "틱톡은 쇼핑몰과의 제휴를 확대하고 있습니다.",
    "삼성전자는 6G 통신 기술 연구에 착수했습니다.",
    "애플은 음성인식 기능을 고도화하고 있습니다.",
    "구글은 클라우드 게임 스트리밍 서비스를 테스트 중입니다.",
    "테슬라는 배터리 재활용 기술을 개발하고 있습니다.",
    "페이스북은 사용자 경험 개선을 위한 인터페이스 개편을 진행했습니다."
]


# 임베딩 생성 및 저장
vectors = []
for text in docs:
    vec = model.encode(text)
    vectors.append(vec)
    collection.insert_one({
        "text": text,
        "embedding": vec.tolist()
    })

6-3. insert 결과

총 88 Row 입력 완료

7. test

from pymongo import MongoClient
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
import requests


def ask_ollama_llm(prompt, model_name="exaone3.5:2.4b"):
    response = requests.post("http://localhost:11434/api/generate", json={
        "model": model_name,
        "prompt": prompt,
        "stream": False
    })
    return response.json()

client = MongoClient("mongodb://localhost:27017")
collection = client["exoluse"]["exoluse"]

model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")

query = "FSD"
query_embedding = model.encode(query).reshape(1, -1)

# 모든 문서 가져오기 (또는 일부만 가져오기)
docs = list(collection.find({}, {"text": 1, "embedding": 1}))

# 임베딩 벡터 추출
doc_embeddings = np.array([doc["embedding"] for doc in docs])
similarities = cosine_similarity(query_embedding, doc_embeddings)[0]

# 유사도 상위 1개 추출
top_k = 1
top_indices = similarities.argsort()[-top_k:][::-1]

context = [docs[i]["text"] for i in top_indices]

# 배열인 context를 문자열로 변환
context = "\n".join(context)

query = "FSD에 대해 알려줘!"

prompt = f"""
[|system|]
다음 문서를 참고해서 사용자 질문에 답해주세요.
문서에 없는 내용은 절대로 답변해서는 안됩니다. 있는 그대로만 답변해주세요!
[문서]
{context}
[|endofturn|]
[|user|]{query}
[|assistant|]
"""

answer = ask_ollama_llm(prompt)["response"]
print("RAG 응답:\n", answer)

8. 결과

벡터 데이터에서 먼저 찾은 후 참조하는 모습이다.
상위 1개만 검색해서 그런지 다른 내용은 찾을 수 없다.

profile
인공지능이라는 옷을 입었습니다. 뭔가 멋지면서도 잘 맞습니다.

0개의 댓글