27

How: RAG Service 구현 (ChromaDB + LangChain)

RAG + Agent 파이프라인 통합

학습 목표
  • ChromaDB 기반 RAG Service를 구현할 수 있다
  • 문서 로딩, 임베딩, 검색 파이프라인을 만들 수 있다
  • 검색 결과를 구조화된 형태로 반환할 수 있다

RAG Service 구현

구현 범위

  1. ChromaDB 클라이언트 초기화
  2. 문서 로딩 (PDF, TXT)
  3. 청킹 (RecursiveCharacterTextSplitter)
  4. 임베딩 & 저장
  5. 유사도 검색

핵심 포인트

  • persist_directory 를 주면 재시작해도 벡터가 남는다
  • 메타데이터에 source, page 정보 포함
  • 검색 결과에 실리는 것은 점수가 아니라 거리다

import 경로를 먼저 확인한다

langchain 은 1.0 으로 올라오면서 본체를 얇게 만들고 기능을 배포판으로 나눠 내보냈다. 그래서 예전 자료에 흔한 from langchain.text_splitter import ... 는 D1 의 pyproject 가 요구하는 langchain>=1.0.0 환경에서 ModuleNotFoundError: No module named 'langchain.text_splitter' 로 죽는다. 지금 위치는 이렇다.

pip install langchain-text-splitters langchain-chroma langchain-openai
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_chroma import Chroma

langchain_community.vectorstores.Chroma 도 아직 import 되기는 하지만 sunset 예고가 붙어 있고, D1 의 pyproject 는 이미 langchain-chroma 를 의존성에 넣어 두었으니 그쪽으로 맞춘다. 앞으로 LangChain 예제가 import 줄에서 죽으면 이름이 사라진 것이 아니라 어느 배포판으로 옮겨 갔는지를 먼저 찾는 것이 순서다. 패키지 이름은 밑줄이 아니라 붙임표를 쓰고 (langchain-text-splitters), import 할 때는 밑줄을 쓴다(langchain_text_splitters).

점수인가 거리인가

similarity_search_with_score 가 돌려주는 두 번째 값의 뜻은 벡터스토어가 쓰는 공간에 따라 달라진다. Chroma 의 기본은 L2 거리라 작을수록 가깝다. 이 값을 유사도 라고 적어 컨텍스트에 실으면, 학습자도 그 텍스트를 읽는 LLM 도 큰 값을 더 관련 깊은 것으로 읽는다. W2 에서 코사인 유사도를 배운 뒤라 혼동이 더 크다. 필드 이름은 distance 로 두고, 사람이 볼 자리에서만 1/(1+거리) 로 뒤집어 함께 보여 준다.

에디터 로딩 중...
힌트 보기
  • persist_directory를 설정하면 재시작 시 벡터가 유지된다
  • similarity_search_with_score의 두 번째 값은 Chroma 기본 설정에서 L2 거리다 (작을수록 가깝다)
  • 분할기는 langchain-text-splitters, Chroma는 langchain-chroma 패키지에 있다
  • DirectoryLoader의 glob 패턴으로 파일 유형 필터링
  • search_as_text는 Agent Tool에서 사용할 텍스트 형태 반환
정답 보기
에디터 로딩 중...
AI로 학습하기 — 꿀팁
ChromaDB RAG 파이프라인 검색품질 점검AI 학습 팁

AI에게 문서 로딩·청킹·임베딩·검색 파이프라인에서 발생할 수 있는 노이즈와 검색 실패 케이스를 찾게 하세요.

이 ChromaDB + LangChain RAG Service 코드에서 청크 크기·오버랩 설정이 제조 매뉴얼 검색 정확도에 미치는 영향을 분석하고, 유사도 임계값 미달 시 폴백 처리, 빈 결과 반환 케이스, 동일 문서 중복 청킹 문제를 점검해줘.
이 팁이 도움이 됐나요?
용어