Langtrace로 Mistral AI RAG 관찰 가능성(Observability) 확보하기
Langtrace로 Mistral AI RAG 관찰 가능성(Observability) 확보하기
Langtrace AI로 OpenTelemetry 기반 추적을 Mistral에 설정하는 방법을 보여주는 노트북이에요. 미국 헌법 PDF 문서를 챗봇처럼 질의하는 간단한 RAG 앱을 만들고, 그 전체 실행을 Langtrace에서 모니터링하는 흐름을 다룹니다.
출처: 문서
본문
이 노트북의 목표는 미국 헌법 PDF에 대해 대화할 수 있는 간단한 RAG 앱을 만들고, Mistral의 실행을 Langtrace로 추적하는 거예요. 처음 두 스크린샷은 RAG 앱 전체의 Trace와 span 구조를, 다음 두 스크린샷은 Mistral 실행의 상세 내역을 보여줍니다.
필요한 패키지를 설치하고 클라이언트를 초기화합니다.
%pip install mistralai langtrace-python-sdk chromadb pypdf langchain langchain-community
import chromadb
from mistralai import Mistral
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from chromadb.utils import embedding_functions
from langtrace_python_sdk import langtrace, with_langtrace_root_span
langtrace.init(api_key='<langtrace_api_key>')
mistral = Mistral(api_key='<mistral_api_key>')
client = chromadb.Client()
Langchain으로 PDF를 청크로 나누기
PDF를 로드하고 RecursiveCharacterTextSplitter로 청크를 나눕니다.
def load_and_split_pdf(pdf_path):
loader = PyPDFLoader(pdf_path)
data = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
chunks = text_splitter.split_documents(data)
return chunks
Chroma 설정하고 PDF 청크 넣기
RAG에서 사용할 기본 임베딩 함수를 지정해 Chroma 컬렉션을 만듭니다. PDF 청크를 컬렉션에 추가합니다.
def setup_chroma():
return client.get_or_create_collection(
name="mistral-rag",
embedding_function=embedding_functions.DefaultEmbeddingFunction(),
)
def add_documents_to_collection(collection, chunks):
for i, chunk in enumerate(chunks):
collection.add(
documents=[chunk.page_content],
metadatas=[{"source": chunk.metadata["source"]}],
ids=[str(i)],
)
컬렉션 조회하기
사용자 쿼리를 받아 청크된 PDF에서 가장 가까운 3개 결과를 가져오고 프롬프트 구조를 만든 뒤, 쿼리와 프롬프트를 Mistral에 넘겨 실제 응답을 받습니다.
def query_pdf(collection, query):
results = collection.query(query_texts=[query], n_results=3)
# Construct the prompt with context
context = "\n".join(results["documents"][0])
prompt = f"""Use the following context to answer the question. If you cannot answer based on the context, say so.
Context:
{context}
Question: {query}
Answer:"""
response = mistral.chat.complete(
model="mistral-large-latest",
messages=[{"role": "user", "content": prompt}],
)
return response.choices[0].message.content
전체를 실행하고 Langtrace로 모니터링하기
@with_langtrace_root_span 데코레이터로 main 함수 전체를 하나의 루트 span으로 묶어 실행합니다.
@with_langtrace_root_span("main")
def main():
print("Creating collection")
collection = setup_chroma()
print("Loading and splitting pdf")
chunks = load_and_split_pdf("https://www.govinfo.gov/content/pkg/CDOC-112hdoc129/pdf/CDOC-112hdoc129.pdf")
print("Adding documents to collection")
add_documents_to_collection(collection, chunks)
print("Querying pdf")
print(query_pdf(collection, "What is the purpose of the constitution?"))
if __name__ == "__main__":
main()
이제 Langtrace에서 모든 inference 호출에 대한 트레이스를 볼 수 있어요. chromadb에서 어떤 프롬프트가 가져와져 Mistral로 보내졌는지와 그 응답까지 확인할 수 있습니다.
더 알아보기 (Learn more)
- Langtrace AI 공식 문서 — OpenTelemetry 기반 LLM 추적 SDK
langtrace_python_sdk— Langtrace의 Python SDKwith_langtrace_root_span— 함수를 루트 span으로 감싸는 데코레이터mistral.chat.complete()— Mistral 대화 완성 API (여기서는mistral-large-latest)