Parquet CSV 전환 시점 판단법: 용량·읽기 속도·스키마

결론부터 말씀드리면, CSV 파일 하나의 용량이 커져서 열 때마다 버벅이거나 전체 컬럼 중 일부만 골라 쓰는 쿼리가 반복된다면 그때가 Parquet CSV 전환을 검토할 시점입니다. 컬럼 단위로 저장하는 구조 덕분에 용량은 눈에 띄게 줄고, 필요한 컬럼만 골라 읽는 작업에서는 읽기 속도 차이가 크게 벌어집니다. 다만 스키마가 자주 바뀌거나 작은 파일을 계속 append하는 로그성 파이프라인이라면 오히려 CSV … Read more

pandas merge 메모리 터짐 방지: 조인 전략과 category dtype

‘pandas merge 메모리’라는 키워드로 검색해서 들어오셨다면, 이미 merge() 한 줄 실행했다가 커널이 죽거나 스왑이 도는 상황을 겪으셨을 가능성이 큽니다. 결론부터 말씀드리면, 원인은 대개 두 가지입니다. 조인 방식(how, 조인 키 선택)이 결과 행 수를 불필요하게 부풀리고 있거나, 조인 키로 쓰는 문자열 컬럼이 object dtype이라 메모리를 과하게 먹고 있는 경우입니다. 이 글은 pandas 2.2 버전을 기준으로, 조인 … Read more

임베딩 차원 축소, 벡터 절반으로 줄여도 검색 품질 괜찮을까요

임베딩 차원 축소를 해서 벡터를 절반으로 잘라내도, MRL(Matryoshka Representation Learning) 방식으로 학습된 모델이라면 검색 품질 저하는 생각보다 크지 않은 경우가 많습니다. 다만 이 말은 아무 임베딩 모델에나 해당되는 이야기가 아니고, 모델이 애초에 그렇게 학습됐을 때만 성립합니다. 일반적인 방식으로 학습된 벡터를 그냥 절반으로 잘라내면 검색 품질이 급격히 무너지는 경우도 흔합니다. 이 글에서는 임베딩 차원 축소가 실제로 … Read more

임베딩 비용 줄이는 순서: 중복 제거→캐시→차원 축소

임베딩 비용을 줄이는 법이 궁금해서 검색하셨다면, 답은 순서에 있습니다. 무작정 더 저렴한 모델로 바꾸기 전에 중복 제거, 캐시, 차원 축소 순서로 손보면 같은 파이프라인에서도 서로 다른 지점의 비용이 줄어듭니다. 중복 제거와 캐시는 API 호출 자체(토큰 사용량)를 줄이고, 차원 축소는 벡터를 저장·검색하는 비용을 줄여서 손대는 대상이 다르기 때문입니다. 임베딩 비용은 왜 생각보다 빨리 늘어나나요? 임베딩 API … Read more

쿼리 재작성, 짧은 질문도 검색되게 만드는 법과 HyDE 비교

질문을 세 단어로 치면 검색 결과가 하나도 안 나오는데, 이유가 뭘까요? 벡터 검색기는 질문 문장 전체의 의미를 임베딩해서 찾는데, 단어 몇 개만 던지면 비교할 문맥이 부족해 관련 문서와의 유사도 점수가 낮게 나옵니다. 이럴 때 쓰는 방법이 쿼리 재작성이고, 그래도 리콜이 안 오르면 가상의 답변 문서를 먼저 만들어 검색하는 HyDE로 넘어갑니다. 두 방법 다 검색 품질을 … Read more

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

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