RAG Agent, Router, Guardrails, Reflection 패턴1. RAG AgentRAG Agent: ReAct Agent에 Retriever를 Tool로 등록해 질문마다 검색 필요 여부를 LLM이 판단하게 만든 대화형 RAG기본 RAG 파이프라인은 질문마다 검색을 수행하지만, Agent는 검색이 필요한 질문에만 Retriever Tool을 호출함Checkpointer를 연결하면 이전 대화를 기억하면서 검색할 수 있음 구분 기본 RAG 파이프라인 RAG Agent 검색 판단항상 검색LLM이 필요 여부 판단대화 기억별도 구현 필요Checkpointer로 유지검색 도구Retriever를 직접 호출Retriever를 Tool로 호출 2. Retriever를 Tool로 변환create_re..
ReAct Agent와 Memory & State 관리1. ReAct 패턴이란ReAct: Reasoning + Acting의 줄임말로, LLM이 스스로 다음 행동을 선택하며 반복하는 에이전트 패턴기반 기술은 Function Calling(Tool Use)으로, LLM이 텍스트 대신 어떤 함수를 어떤 인자로 호출할지 나타내는 tool_calls를 응답으로 반환시스템은 tool_calls를 받아 실제 함수를 실행하고 결과를 다시 LLM에게 전달함동작 흐름Think — LLM이 현재 메시지를 바탕으로 다음 행동을 결정Act — tool_calls 응답 → 시스템이 Tool을 실행Observe — Tool 결과를 LLM에게 전달위 과정을 반복하다가 tool_calls가 없으면 최종 답변(Answer)핵심은 매 ..
LangGraph 기초1. LangGraph가 필요한 이유LangGraph: 복잡한 제어 흐름과 상태 변화를 명시적인 그래프로 관리하게 해주는 프레임워크기존 LCEL Chain은 입력을 정해진 순서로 처리하는 직선형 파이프라인(입력 → 프롬프트 → 모델 → 출력 파서 → 결과)에 적합조건 분기, 반복/종료, 중간 상태 저장, 사람의 개입, 병렬 처리, 장애 복구 같은 요구사항은 Chain만으로 구현 시 제어 로직이 Chain 밖의 조건문/반복문으로 흩어짐분기·반복·상태 저장이 늘어날수록 실행 흐름 추적과 중간 재시작이 어려워짐검색 결과가 부족하면 질문을 바꿔 재검색하는 예시를 Python 루프로 구현하면, 모델 호출은 Chain 안에 있어도 반복/종료 조건은 Python 루프가 제어하게 되어 흐름 관리가..
RAG 평가: 검색 지표와 RAGAS·LLM-as-Judge1. RAG 평가 방법의 종류RAG 평가: 검색기가 정답 근거를 찾는지와, 그 근거로 만든 답변의 품질을 각각 측정하는 과정청크 크기, 검색 문서 수, 검색 전략, 프롬프트 선택의 기준을 세우려면 대표 질문 몇 개를 눈으로 보는 것만으로는 느리고 주관적임평가는 한 가지 도구에만 의존하지 않고 목적에 따라 조합함수동 확인대표 질문과 답변을 직접 읽는 방식초기 개발과 빠른 검증에 적합검색 지표Hit@k, Precision@k, Recall@k, MRR로 검색 설정을 비교검색 설정 비교에 적합RAGASLLM을 이용해 답변의 근거성과 관련성을 평가파이프라인 비교에 적합LLM-as-Judge도메인에 맞는 기준을 직접 정의해 평가규정 답변의 정확성·완전성 ..
벡터 DB와 RAG 검색 고도화1. 벡터 DB란?벡터 DB: 임베딩 벡터를 저장하고 유사도 검색을 수행하는 전용 데이터베이스일반 DB는 정확한 값 일치나 범위 검색에 최적화되어 있으나, 벡터 검색은 "가장 비슷한 벡터 k개"를 찾는 유사도 검색이 필요함RDB가 데이터를 표(Table)로 관리한다면, 벡터 DB는 데이터를 지도(Map)처럼 다차원 좌표 공간에 점으로 배치해 관리함좌표에서의 위치가 곧 의미이고, 검색은 거리를 재는 것임동작 흐름저장: 문서 → 청킹 → 임베딩 모델 → 벡터 + 메타데이터 → 벡터 DB에 저장(인덱스 구축)검색: 질문 → 임베딩 모델 → 질문 벡터 → 벡터 DB에서 ANN 검색 → 상위 k개 문서 반환검색 결과로 벡터가 아닌 원본 텍스트를 돌려받아야 LLM에 전달할 수 있으므로..
LangChain 구조화 출력 · Tool/Agent · RAG1. Output Parser와 구조화 출력 검증 단계Output Parser: 체인의 마지막에 연결해 LLM 응답을 필요한 Python 타입으로 변환하는 컴포넌트get_format_instructions()로 출력 규칙 문자열을 만들어 프롬프트에 넣는 방식이며, 모델에게 형식을 강제하는 것이 아니라 자연어 지시로 형식 준수를 유도하는 것모델이 지시를 어기면(설명 문장 추가, 필드 누락 등) 파싱 또는 검증 오류가 발생하므로 애플리케이션에서 이 실패를 처리해야 함PromptTemplate.partial(): 프롬프트 변수 중 일부(예: format_instructions)를 미리 채워 새 PromptTemplate을 만드는 메서드. 남은 변수..