청크 오버랩으로 끊긴 문맥 살리기, 부모-자식 청크와 비교해보기

RAG로 챗봇을 만들어 놓고 나서, 분명 원본 문서에 정확한 답이 있는데도 챗봇이 엉뚱한 소리를 하는 경험 한 번쯤 해보셨을 겁니다. 검색된 조각을 열어보면 문장이 중간에서 뚝 끊겨 있고, 그 앞뒤 맥락이 통째로 날아간 경우가 많습니다. 이럴 때 가장 먼저 손볼 수 있는 값이 청크 오버랩이고, 그래도 부족하면 검색용 조각과 LLM에 넘길 조각을 아예 분리하는 부모 … Read more

RAG 권한 필터링, 검색 파이프라인 어디에 넣나

RAG(검색 증강 생성) 시스템에서 사용자마다 볼 수 있는 문서가 다르다면, 권한 필터링은 벡터 유사도 검색과 동시에 걸어야 합니다. 검색 결과를 다 받아온 뒤 나중에 걸러내는 방식은 결과 개수 부족과 정보 유출이라는 두 가지 문제를 동시에 안고 갑니다. 이 글에서는 벡터 DB 종류별로 메타데이터 필터를 어느 시점에 적용해야 하는지, 실제 코드와 함께 정리해 보겠습니다. 사내 문서, … Read more

RAG 최신성, 랭킹에 시간 가중치를 섞어 확보하기

RAG(검색 증강 생성) 시스템에서 최신 문서가 자꾸 밀려나는 이유는 벡터 유사도 점수만으로 랭킹을 매기기 때문입니다. 어제 올라온 릴리스 노트든 3년 전에 쓴 가이드든, 임베딩 공간에서 질문과 의미적으로 가깝기만 하면 똑같이 상위에 뜹니다. 이 글에서는 벡터 유사도 점수에 시간 가중치를 더해서 최신 문서를 우선 노출시키는 구체적인 공식과, LangChain·Elasticsearch에서 실제로 이걸 어떻게 구현하는지 코드로 짚어보겠습니다. RAG 최신성 … Read more

벡터 검색이 느려졌다면? 벡터 인덱스 종류와 파라미터 정리

문서가 몇만 건만 넘어도 벡터 검색이 갑자기 느려지는 이유가 뭘까요? 대부분은 인덱스 없이 저장된 벡터 전체를 하나하나 비교하는 방식을 그대로 쓰고 있기 때문이고, 이럴 때 HNSW나 IVF 같은 벡터 인덱스를 붙이면 비교 대상 자체를 크게 줄일 수 있습니다. 이 글에서는 두 인덱스가 속도를 버는 원리와 pgvector에서 실제로 걸어보는 방법, 파라미터를 어떻게 잡아야 하는지, 그리고 인덱스를 … Read more

검색은 맞는데 답이 틀릴 때, RAG 인용 검증부터 확인하세요

RAG를 도입하면 환각이 저절로 사라진다고 생각하는 분들이 많은데요, 실제로는 검색기가 정확한 문서를 가져와도 답변 단계에서 왜곡되는 경우가 흔합니다. 이럴 때 필요한 게 바로 RAG 인용 검증입니다. 검색된 근거 문서와 모델이 실제로 인용한 문장이 일치하는지 별도로 확인하는 절차인데요, 이 글에서는 근거 인용을 강제하는 프롬프트 설계부터 인용 검증을 코드로 자동화하는 방법까지 구체적으로 다룹니다. 왜 검색 결과는 맞는데 … Read more

PDF RAG 파싱, 표만 나오면 답이 깨지는 이유

결론부터 말씀드리면, 표가 든 PDF에서 RAG 답변이 틀어지는 원인은 대부분 파싱 단계에 있습니다. 텍스트 추출 라이브러리가 PDF 안의 글자를 화면에 보이는 순서가 아니라 문서 내부에 저장된 좌표 순서대로 읽어오기 때문에, 표의 행과 열이 뒤섞인 채로 임베딩되는 것입니다. PDF RAG 파싱을 할 때 표 추출과 레이아웃 순서를 얼마나 보존하느냐가 답변 품질을 가르는 핵심 변수입니다. 표가 많은 … Read more

시스템 프롬프트 유출, 어떤 경로로 일어나고 어디서 막아야 할까

이 글을 읽으면 시스템 프롬프트 유출이 실제로 어떤 경로로 발생하는지, 그리고 각 경로마다 어디에 차단 장치를 둬야 하는지 바로 확인할 수 있습니다. 결과부터 말씀드리면 유출은 대부분 ‘모델에게 직접 물어보기’가 아니라 역할극·번역·요약 요청처럼 우회된 질문에서 시작되고, 이를 막으려면 프롬프트 자체를 숨기는 것보다 응답을 검증하는 두 번째 단계를 두는 쪽이 훨씬 안정적입니다. 프롬프트 보안을 시스템 메시지 한 … Read more

골든 데이터셋 몇 건이면 충분할까 — 평가셋 크기와 갱신 주기 정하기

골든 데이터셋은 개수가 많을수록 신뢰도가 올라간다고 오해하는 경우가 흔합니다. 실제로는 100건 안팎이라도 실패 유형별로 고르게 담겨 있으면 충분한 평가셋 역할을 합니다. 반대로 500건을 모아도 비슷한 질문만 반복되면 LLM 평가용 회귀 테스트로서 의미가 크게 줄어듭니다. 이 글에서는 서비스 단계별로 골든 데이터셋을 몇 건, 어떤 구성으로 채워야 하는지와 갱신 주기를 어떻게 잡아야 하는지 구체적으로 정리해 보겠습니다. 골든 … Read more

LLM 테스트 작성법, 매번 다른 출력도 검증할 수 있습니다

LLM 테스트 작성은 정답 문자열을 통째로 비교하는 방식으로는 되지 않습니다. 같은 프롬프트를 열 번 넣어도 문장이 매번 조금씩 달라지는 비결정적 출력을 다뤄야 하기 때문에, 구조 검증·LLM 채점·골든셋 회귀라는 세 가지 방식을 겹쳐 써야 실제로 쓸모 있는 검증이 됩니다. 이 글에서는 각 방식을 동작하는 코드와 함께 정리하고, 어떤 상황에서 어느 방식이 무너지는지도 함께 살펴봅니다. 이 글은 … Read more

LLM 회귀 테스트: 모델 버전 고정으로 어제와 다른 답 잡기

결론부터 말씀드리면, 어제 잘 나오던 답이 오늘 갑자기 달라졌다면 첫 번째로 의심할 곳은 프롬프트가 아니라 모델 버전입니다. gpt-4o나 claude-3-5-sonnet-latest처럼 별칭(alias)으로 모델을 호출하고 있다면, 제공사가 내부적으로 스냅샷을 교체하는 순간 코드 한 줄 안 바꿨는데도 출력이 흔들립니다. 이 글에서는 모델 버전을 고정하는 구체적인 방법과, 그 위에 얹을 수 있는 최소 단위의 LLM 회귀 테스트 구성을 코드와 함께 … Read more