| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- function
- openai
- Pipelining
- html
- react
- MIPS
- control
- DB
- for
- web
- XML
- mysql
- Linux
- Java
- CSS
- data structure
- computer
- instruction
- AI
- javascript
- DATAPATH
- system
- DS
- Class
- Algorithm
- architecture
- python
- github
- Rag
- php
- Today
- Total
YYYEJI
[MAC] 벡터 저장소 기반 RAG 검색기 사용하기 본문
RAG란?
검색(Retrieval)과 생성(Generation)을 결합해, LLM이 더 정확하고 최신 정보로 답변하게 하는 방식입니다!
RAG 개념 알아보기
RAG란 무엇일까요??Retrieval-Augmented Geteration의 줄임말이며,LLM의 한계를 보완하기 위해 외부 지식 베이스에서 정보를 검색(Retrieval)해서 그 정보를 바탕으로 텍스트를 생성(Generation)하는 방식입니다!
yyyeji.tistory.com
↑↑↑ 더 자세히 알아보고 싶다면 ↑↑↑
코드만 살짝 들여다보겠습니다!
retriever = chroma_db.as_retriever( # 검색기
search_kwargs={"k": 2},
)
query = "탄소 제로 정책에 대해서 알려줘"
retrieved_docs = retriever.invoke(query)
print(f"쿼리: {query}")
print("검색 결과:")
for i, doc in enumerate(retrieved_docs, 1):
print(f"-{i}-\n{doc.page_content}\n[출처: {doc.metadata['source']}]")
print("-" * 100)
retriever = chroma_db.as_retriever()을 통해 백터 저장소를 문서 검색기로 변환합니다!
search_kwargs={"k":2}: 검색 시 가장 관련 있는 문서 2개만 가져오도록 설정했습니다!
미리 만들어둔 chroma_db는 아래 링크를 통해 확인 부탁드려요 ㅠ
[MAC] 벡터 저장소 ChromaDB 사용한 코드 살펴보기
벡터 저장소(Vector Store)이란?벡터 저장소란!!비정형 데이터를 벡터(숫자 배열)형태로 저장하고,빠르게 검색할 수 있게 해주는 특수한 데이터베이스에요!단순한 키워드 검색이 아니라 의미 기반
yyyeji.tistory.com
retrieved_docs=retriever.invoke(query)
invoke()함수를 통해 실제 검색을 실행합니다.
그렇게 결과를 출력하면

검색된 문서 내용을 출처 정보와 함께 번호를 붙여 순서대로 출력해줍니다!!

이번엔 임계값을 지정해서 유사도가 너무 낮은 문서는 검색 결과에서 빼고 출력해볼게요!
from langchain_community.utils.math import cosine_similarity
retriever = chroma_db.as_retriever(
search_type="similarity_score_threshold", # similarity_score_threshold 기준으로 정답 달라짐(?)
search_kwargs={"k": 5, "score_threshold": 0.3}, # 0.7 이상인 유사도만 추출, 처리 속도 높임
)
search_type = "similarity_score_threshold"를 통해 검색 방식을 지정합니다.
유사도를 계산한 뒤, 특정 임계값 이상인 문서만 반환합니다!!
불필요한 결과를 제거해서 검색 품질을 향상하고,
낮은 점수 문서는 아예 안 불러오기 때문에 처리량은 감소하고 속도는 향상하고,
의미적으로 멀리 떨어진 문서를 배제해 정확성을 향상시킵니다!
MMR(Maximal Marginal Relevance)
검색 결과에서 "관련성"과 "다양성"을 동시에 고려하는 방식입니다!!
# MMR - 다양성 고려 (lambda_mult 작을수록 더 다양하게 추출)
retriever = chroma_db.as_retriever(
search_type="mmr",
search_kwargs={"k":3,
"fetch_k": 8, # 내부적으로 8개 추출 -> mmr 알고리즘한테 넘김 -> 최종적으로 3(k)개 넘겨줌
"lambda_mult": 0.5}, # 다양성 지정 (높은 광역에서 값을 찾음), 높을수록 다양한 답변(1), 뻔한 답변(0)
)
# 쿼리와 유사한 문서 검색
retrieved_docs = retriever.invoke(query)
각 파라미터의 의미를 살펴보면
search_type="mmr" → MMR 알고리즘 적용
fetch_k=8 → 상위 8개 문서 가져온 후 MMR 적용(중복 줄이기 + 다양성 확보)
k=3 → 최종적으로 3개의 결과만 반환
하게 됩니다!!

'인공지능 챗봇' 카테고리의 다른 글
| [MAC] 의미론적 검색(Semantic Search)을 기반으로 한 RAG 살펴보기 (4) | 2025.08.06 |
|---|---|
| [MAC] Naive RAG 구현 코드 구현하기 (13) | 2025.08.05 |
| [MAC] 벡터 저장소 FAISS(Facebook AI Similarity Search) 사용한 코드 살펴보기 (2) | 2025.08.05 |
| [MAC] 벡터 저장소 ChromaDB 사용한 코드 살펴보기 (2) | 2025.08.05 |
| [MAC] 문서 임베딩(Document Embedding) 코드 파해치기 (6) | 2025.08.05 |