LlamaIndex와 Claude 3를 활용한 RAG 파이프라인 구축
이 글은 Claude 3를 깊이 있게 다루며 GPT와의 성능을 비교합니다. 완전한 RAG 파이프라인을 구축하는 과정을 안내하고, Claude 3가 차세대 LLM을 대표하는지 아니면 여전히 GPT가 선호되는 선택인지에 대한 통찰을 제공합니다. 이 글은 AI 번역본입니다. 오역이 있을 수 있으니 댓글로 알려 주세요.
Created on September 15|Last edited on September 15
Comment
이 글에서는 최신 발전을 활용하는 과정을 단계별로 안내합니다 대형 언어 모델우리는 특히 LLM을 통합하는 방법에 집중할 것입니다 검색 증강 생성 (RAG)를 사용하여 LlamaIndex 데이터 소스를 LLM에 연결하는 프레임워크와 이미지와 텍스트를 함께 분석할 수 있는 LLM인 Claude 3를 사용해 통찰력 있고 맥락에 맞는 응답을 생성합니다.
또한 Claude 3가 유명한 GPT-4와 어떻게 비교되는지, 과대평가일지 실제로 그럴 만한 가치가 있는지도 살펴보겠습니다.
이번에 다룰 내용
Claude 3 이해하기Claude 3 vs. GPT-4RAG 파이프라인이란 무엇인가요?1. 임베딩 생성2. 질의 임베딩3. 유사도 매칭4. 문서 검색5. 응답 생성W&B WeaveClaude 3 RAG 파이프라인 구축하기GPT-4 사용하기Claude 3가 차세대 핵심 주자일까?
Claude 3 이해하기
Claude 3 제품군은 Claude 3 Haiku, Claude 3 Sonnet, Claude 3 Opus 세 가지 모델로 구성됩니다. 모델이 올라갈수록 성능이 더 강력해지며, 사용자는 용도에 맞춰 지능, 속도, 비용의 최적 균형을 선택할 수 있습니다.
세 모델을 비교하면, Opus가 가장 성능이 뛰어나 수학 문제 해결과 창의적 콘텐츠 생성에서 더 높은 정확도를 제공합니다. 그다음은 Sonnet으로, Opus보다 비용이 낮으면서도 균형 잡힌 성능과 속도를 제공해 코드 생성과 요약에 가장 적합합니다. Haiku는 가장 빠르고 비용이 가장 낮은 모델로, 실시간 고객 채팅 같은 사용 사례에 특히 유용합니다.
아래 그림은 각 Claude 3 모델 간의 비용 차이를 보여줍니다.

Claude 3의 특별함은 다음과 같습니다 큰 컨텍스트 윈도우, 모델에 입력할 수 있는 텍스트의 분량을 나타냅니다. Claude 3 Opus는 200,000토큰의 컨텍스트 윈도우를 제공하며, 항상 99%가 넘는 재현율을 달성합니다. 이를 통해 법률 요약문이나 도서처럼 긴 문서도 분석할 수 있습니다.
아래 그래프는 컨텍스트 길이가 늘어날수록 각 모델의 재현율이 어떻게 변하는지를 보여줍니다. 주목할 점은 모든 Claude 버전에서 재현율이 90% 이상을 유지하며, 컨텍스트 길이가 길어질수록 두드러진 성능 향상에 기여한다는 것입니다.

Claude 3 vs. GPT-4
성능 측면에서 Claude 3는 더 뛰어납니다 GPT-4 추론, 요약, 사실 정보 제공, 수학 문제 해결, 코드 생성에서는 더 나은 성능을 보였으며, 반면 창의적 글쓰기와 이메일 초안 작성에서는 여전히 GPT-4가 앞섭니다.
두 모델 모두 이미지를 이해하고 분석할 수 있습니다. 다만 GPT-4와 달리 Claude 3는 이미지를 분석만 할 수 있고 생성할 수는 없습니다.
앞서 언급했듯이 Claude 3는 200,000토큰의 큰 컨텍스트 윈도우를 제공하는 반면, GPT-4는 8,192토큰입니다. 이는 짧은 컨텍스트 윈도우에 맞추기 위해 입력을 분할해야 했던 기존 워크플로를 단순화합니다. 이제 큰 입력을 하나의 입력으로 보낼 수 있어 모델이 문맥을 더 잘 이해하고, 결과적으로 더 나은 결과를 산출할 수 있습니다.
Claude 3는 GPT-4에 비해 더 낮은 비용으로 사용할 수 있습니다. 아래 표는 두 모델의 LLM 토큰과 비용을 종합적으로 정리해 비교를 ���습니다.

RAG 파이프라인이란 무엇인가요?
RAG은 LLM의 응답에 외부 정보를 통합해 품질을 향상하는 과정입니다 이미 학습된 범위를 넘어선 데이터다음과 같이 작동합니다:

출처: 작성자
1. 임베딩 생성
먼저 지식 베이스에 있는 문서에 대해 모델을 사용해 임베딩을 생성합니다. 이 임베딩은 문서의 의미를 표현하는 고차원 벡터입니다.
2. 질의 임베딩
질의나 프롬프트가 들어오면, 모델은 동일한 방식으로 해당 질의에 대한 임베딩을 생성합니다.
3. 유사도 매칭
그다음 시스템은 지식 베이스에 있는 문서 임베딩과 질의 임베딩을 비교해 가장 관련성이 높은 문서를 찾습니다. 보통 코사인 유사도나 기타 거리 지표를 사용하여 벡터 공간에서 질의가 각 문서와 얼마나 가깝고 연관되어 있는지를 측정합니다.
4. 문서 검색
가장 높은 유사도 점수를 가진 문서를 질의와 가장 관련성이 높은 것으로 보고 검색합니다.
5. 응답 생성
검색된 문서는 원래 질의와 함께 LLM에 입력되어, 종합적이고 문맥에 적합한 응답을 생성합니다.
W&B Weave
이 프로젝트에서는 W&B Weave 우리 RAG 파이프라인의 성능을 기록하고 추적하기 위해서입니다. Weave는 함수의 입력, 출력, 다양한 지표를 자동으로 수집해 주어 상세한 분석과 비교를 가능하게 합니다. 우리의 함수에 데코레이터를 추가함으로써 @weave.op(), 검색 및 생성 모델의 성능을 끊김 없이 기록하고 시각화할 수 있습니다.
구축할 때 RAG 시스템 평가, W&B Weave는 검색 컴포넌트가 관련 정보를 얼마나 잘 가져오는지, 또는 생성 모델의 응답 정확도를 평가하는 데 도움을 줍니다. RAG 파이프라인의 여러 구성 요소(예: 임베딩 함수)는 테스트 중인 LLM(예: GPT 또는 Claude)과 함께 튜닝할 수 있으며, 그 결과는 W&B Weave에 기록하여 비교함으로써 최적의 성능을 내는 구성을 결정할 수 있습니다.
예를 들어, 우리의 Claude 3 RAG 파이프라인에서는 Weave를 사용해 질의, 컨텍스트, 응답을 자동으로 기록합니다. 이를 통해 연구 논문 데이터셋에서 Claude 3가 정보를 얼마나 잘 검색하고 종합하는지 추적할 수 있으며, 개선이 필요한 지점을 더 쉽게 파악하고 파이프라인의 전체 성능을 검증할 수 있습니다.
Claude 3 RAG 파이프라인 구축하기
이제 Claude 3를 사용해 긴 연구 논문을 사람이 일일이 읽으며 필요한 정보를 찾는 대신, 분석하고 정보를 추출할 수 있는 완전한 RAG 파이프라인을 구축하겠습니다.
임베딩은 SentenceTransformer 임베딩 함수를 사용해 생성하고, 저장은 ChromaDB에 하며, 답변 생성은 Claude 3 Opus로 수행하겠습니다.
마지막으로, 결과를 GPT 3.5와 비교해 RAG 애플리케이션에 가장 적합한 LLM을 선택하겠습니다.
1. 필요한 패키지 설치하기
!pip install langchain!pip install chromadb!pip install sentence-transformers!pip install openai!pip install pypdf!pip install anthropic!pip install weave
2. 라이브러리 불러오기
import openaiimport chromadbfrom langchain.text_splitter import RecursiveCharacterTextSplitter, SentenceTransformersTokenTextSplitterfrom langchain_community.vectorstores import Chromafrom langchain.embeddings import OpenAIEmbeddingsfrom chromadb.utils.embedding_functions import SentenceTransformerEmbeddingFunctionimport pandas as pdfrom pypdf import PdfReaderimport anthropicimport weave
3. Claude API 키 설정하기
client = anthropic.Anthropic(api_key="YOUR API KEY HERE",)
4. W&B Weave 설정하기
여기에서 초기화합니다
weave.init('RAG_Claude_Research')
5. 데이터 불러오기
reader = PdfReader("/content/19_CVPR_Semantic Segmentation of Crop Type in Africa.pdf")pdf_texts = [p.extract_text().strip() for p in reader.pages]combined_text = ' '.join(pdf_texts)
6. 데이터 청크로 나누기
불러온 데이터는 해당 임베딩을 생성할 때 텍스트 내 컨텍스트를 효율적으로 처리할 수 있도록 청크로 나눕니다.
컨텍스트 길이가 너무 길면 환각이 발생할 수 있고, 너무 짧으면 충분한 맥락을 담지 못할 수 있습니다. 이 튜토리얼에서는 청크 크기를 1000으로 설정하고, 이전 청크와 200자 겹치도록 하겠습니다. 청크를 만든 뒤에는 SentenceTransformers를 사용해 이 작은 단위들을 문장 임베딩에 최적인 토큰으로 토크나이즈합니다.
character_splitter = RecursiveCharacterTextSplitter(chunk_size=1000,chunk_overlap=200)character_split_texts = character_splitter.split_text((combined_text))token_splitter = SentenceTransformersTokenTextSplitter(chunk_overlap=100, tokens_per_chunk=256)token_split_texts = []for combined_text in character_split_texts:token_split_texts += token_splitter.split_text(combined_text)
7. 임베딩 생성과 Chroma 컬렉션/벡터 스토어 만들기
그다음 문장을 임베딩으로 변환하고, Chroma를 사용해 임베딩을 생성·저장·검색할 수 있는 벡터 스토어를 만듭니다.
embedding_function = SentenceTransformerEmbeddingFunction()chroma_client = chromadb.Client()chroma_collection = client.create_collection(name = "research_paper", embedding_function=embedding_function)ids = [str(i) for i in range(len(token_split_texts))]chroma_collection.add(ids=ids, documents=token_split_texts)
8. 벡터 스토어에서 데이터 질의하기
임베딩을 사용할 준비가 되었으므로, 들어오는 질의를 처리하면서 임베딩에서 관련 청크를 검색하는 함수를 설정합니다. 검색된 청크는 Claude 3에 컨텍스트로 전달되어 최종 응답을 생성하며, 동시에 컨텍스트로 전달되는 토큰 수를 줄일 수 있게 해줍니다.
def llm_response(query, model):results = chroma_collection.query(query_texts=[query], n_results=10)retrieved_documents = results['documents'][0]relevant_passage="".join(retrieved_documents)return make_rag_prompt(model, relevant_passage, query)
9. RAG 응답을 위한 프롬프트 작성
Claude 3 모델에 접근하고, 시스템 프롬프트를 구성해 응답이 반환되도록 합니다.
model = 'claude-3-opus-20240229'@weave.op()def make_rag_prompt(model, context, query):response = client.messages.create(system = "You are a helpful reserach assistant. You will be shown data from a research paper and you have to answer questions about the paper",messages=[{"role": "user", "content": "Context: " + context + "\n\n Query: " + query},],model= model, # Choose the model you wish to usetemperature=0,max_tokens=160)return response.content[0].text
10. 결과 평가 및 W&B Weave에 로깅
이제 사용자 질의를 Claude 3 모델에 전달하고, 반환된 결과는 추적·기록·분석을 위해 Weights & Biases에 로깅합니다 Weave하나의 질의에 대한 응답 예시를 아래에 보여 주었으며, 동일한 과정을 다른 질의에도 반복할 수 있습니다. 우리는 다음을 추가했기 때문에 @weave.op() 우리용 데코레이터 make_rag_prompt 함수를 사용하면 질의, 컨텍스트, 응답이 Weights & Biases에 자동으로 로깅됩니다.
rag_results_claude=[]query = "Which crops are mapped in the paper?"rag_results_claude.append({"Query": query,"Response": llm_response(query, model)})print(rag_results_claude)
Claude 3를 사용한 질의 응답은 아래의 Weave에 표시되며, Weave는 적용된 함수의 입력과 출력을 자동으로 로깅합니다. 이 모델은 연구 논문에서 관련 정보를 정확히 식별하고 심도 있는 응답을 제공하여, 중요한 정보를 찾기 위해 일일이 훑어보지 않고도 연구 논문을 효율적으로 검토할 수 있게 해줍니다.


GPT-4 사용하기
Weave에서 실행한 GPT-4 결과는 다음과 같습니다:

Claude 3가 차세대 핵심 주자일까?
위 결과에서 보듯, Claude 3와 GPT-4는 RAG 파이프라인의 일부로 활용해 정보 추출과 분석을 수행할 때 모두 우수한 성능을 보입니다.
가장 큰 차이는 ‘깊이’입니다. Claude 3와 그가 제공하는 컨텍스트 윈도우는 훨씬 더 깊습니다. 이 때문에 Claude 3는 장문의 문서를 심층 분석해야 하는 상황, 특히 청킹으로 인해 문맥이 손실될 수 있는 경우에 탁월한 선택입니다.
또한 Claude 3의 출력 토큰 비용은 GPT-4보다 더 높다는 점을 유의해야 합니다. 따라서 Claude 3는 대용량 문서를 안전하게 처리하기 위해 LLM을 활용하려는 기업에 더 적합합니다.
향후 버전의 Claude는 이미지와 더불어 동영상 및 오디오 분석과 해석까지 포함한 멀티모달 처리를 지원할 것으로 예상됩니다.
Add a comment