n8n의 RAG
검색 증강 생성(RAG)은 언어 모델과 외부 데이터 소스를 결합하여 AI 응답을 개선하는 기법입니다. 벡터 저장소는 고차원 벡터(텍스트, 이미지 또는 기타 데이터의 수치적 표현)를 저장하고 검색하도록 설계된 특수 데이터베이스입니다.
n8n의 RAG#
RAG란?#
검색 증강 생성(RAG)은 언어 모델과 외부 데이터 소스를 결합하여 AI 응답을 개선하는 기법입니다. 모델의 내부 학습 데이터에만 의존하는 대신, RAG 시스템은 관련 문서를 검색하여 최신 정보, 도메인 특화 지식 또는 독점 지식에 기반한 응답을 생성합니다. RAG 워크플로는 일반적으로 이 외부 데이터를 효율적으로 관리하고 검색하기 위해 벡터 저장소에 의존합니다.
벡터 저장소란?#
벡터 저장소는 고차원 벡터(텍스트, 이미지 또는 기타 데이터의 수치적 표현)를 저장하고 검색하도록 설계된 특수 데이터베이스입니다. 문서를 업로드하면 벡터 저장소가 이를 청크로 분할하고 임베딩 모델을 사용하여 각 청크를 벡터로 변환합니다.
키워드 매칭이 아닌 의미적 유사성을 기반으로 결과를 구성하는 유사성 검색을 사용하여 이러한 벡터를 쿼리할 수 있습니다. 따라서 벡터 저장소는 대규모 지식 집합을 검색하고 추론해야 하는 RAG 및 기타 AI 시스템의 강력한 기반이 됩니다.
n8n에서 RAG 사용하기#
👉 RAG Starter Template으로 n8n에서 RAG를 체험해 보세요. 템플릿에는 파일 업로드용 워크플로와 쿼리용 워크플로 두 가지가 포함되어 있습니다.
벡터 저장소에 데이터 삽입하기#
에이전트가 커스텀 지식에 접근하려면 먼저 해당 데이터를 벡터 저장소에 업로드해야 합니다.
- 소스 데이터를 가져오는 데 필요한 노드를 추가합니다.
- Vector Store 노드(예: Simple Vector Store)를 삽입하고 Insert Documents 작업을 선택합니다.
- 텍스트를 벡터 임베딩으로 변환하는 임베딩 모델을 선택합니다. 올바른 임베딩 모델 선택에 대한 자세한 내용은 FAQ를 참고하세요.
- 콘텐츠를 청크로 분할하는 Default Data Loader 노드를 추가합니다. 기본 설정을 사용하거나 직접 청킹 전략을 정의할 수 있습니다.
- Character Text Splitter: 문자 길이로 분할합니다.
- Recursive Character Text Splitter: Markdown, HTML, 코드 블록 또는 단순 문자로 재귀적으로 분할합니다 (대부분의 사용 사례에 권장).
- Token Text Splitter: 토큰 수로 분할합니다.
- (선택 사항) 각 청크에 메타데이터를 추가하여 컨텍스트를 풍부하게 하고 나중에 더 나은 필터링이 가능하도록 합니다.
데이터 쿼리하기#
두 가지 주요 방법으로 데이터를 쿼리할 수 있습니다: 에이전트를 사용하거나 노드를 통해 직접 쿼리하는 방법입니다.
에이전트 사용하기#
- 워크플로에 에이전트를 추가합니다.
- 벡터 저장소를 도구로 추가하고 에이전트가 언제 사용할지 이해할 수 있도록 설명을 입력합니다.
- 제한을 설정하여 반환할 청크 수를 정의합니다.
- Include Metadata를 활성화하여 각 청크에 추가 컨텍스트를 제공합니다.
- 데이터 삽입 시 사용한 것과 동일한 임베딩 모델을 추가합니다.
비용이 높은 모델의 토큰을 절약하려면 먼저 Vector Store Question Answer tool을 사용하여 관련 데이터를 검색한 후 결과를 Agent에 전달하면 됩니다. 실제 예시는 이 템플릿을 참고하세요.
노드 직접 사용하기#
- 캔버스에 벡터 저장소 노드를 추가하고 Get Many 작업을 선택합니다.
- 쿼리 또는 프롬프트를 입력합니다.
- 반환할 청크 수에 대한 제한을 설정합니다.
- 필요한 경우 Include Metadata를 활성화합니다.
FAQ#
올바른 임베딩 모델은 어떻게 선택하나요?#
올바른 임베딩 모델은 사례마다 다릅니다.
일반적으로 소형 모델(예: text-embedding-ada-002)은 더 빠르고 저렴하여 짧고 범용적인 문서나 경량 RAG 워크플로에 적합합니다. 대형 모델(예: text-embedding-3-large)은 더 나은 의미적 이해를 제공합니다. 긴 문서, 복잡한 주제 또는 정확도가 중요한 경우에 가장 적합합니다.
내 사용 사례에 가장 적합한 텍스트 분할 방식은?#
이것 또한 데이터에 크게 의존합니다.
- 소형 청크(예: 200~500 토큰)는 세밀한 검색에 적합합니다.
- 대형 청크는 더 많은 컨텍스트를 포함할 수 있지만 희석되거나 노이즈가 발생할 수 있습니다.
적절한 오버랩 크기를 사용하는 것이 AI가 청크의 컨텍스트를 이해하는 데 중요합니다. 그래서 Markdown이나 코드 블록 분할을 사용하면 청크의 품질을 높이는 데 도움이 되는 경우가 많습니다.
또 다른 좋은 접근 방식은 청크에 더 많은 컨텍스트를 추가하는 것입니다(예: 청크가 어떤 문서에서 왔는지 정보 추가). 이에 대해 더 읽고 싶다면 Anthropic의 훌륭한 글을 확인해 보세요.
