코사인 유사도(Cosine Similarity)란? AI 검색이 비슷함을 계산하는 방법
TL;DR
코사인 유사도는 두 벡터가 같은 방향을 향하는 정도를 계산해 얼마나 비슷한지 보는 방법입니다. AI 검색에서는 질문과 문서를 임베딩 벡터로 바꾼 뒤, 방향이 가까운 문서를 더 관련성 높은 후보로 고르는 데 자주 씁니다. 초보자는 코사인 유사도를 "문장 뜻이 같은 방향을 보는 AI 검색 점수"로 이해하면 됩니다.
핵심 3줄 요약
- 핵심 1
코사인 유사도는 두 벡터의 크기보다 방향이 얼마나 비슷한지를 보는 계산 방법입니다. - 핵심 2
OpenAI 임베딩 문서는 텍스트 검색과 코드 검색에서 쿼리 임베딩과 문서 임베딩의 코사인 유사도를 계산해 높은 점수의 문서를 반환하는 예를 보여 줍니다. - 핵심 3
코사인 유사도 점수가 높다고 항상 정답이라는 뜻은 아니므로, 출처 원문, 최신성, 권한, 키워드 일치, 재정렬 결과를 함께 확인해야 합니다.
이 글에서 다룰 내용
- 코사인 유사도의 한 문장 정의
- 왜 AI 검색과 RAG에서 중요한지
- 쉬운 예시로 보는 작동 방식
- 임베딩, 벡터 검색, 거리, rerank와의 차이
- 실전에서 코사인 유사도를 보는 상황
- 초보자가 주의할 점
- 자주 묻는 질문과 출처
한 문장 정의: 코사인 유사도는 무엇인가요?
코사인 유사도는 두 숫자 벡터의 방향이 얼마나 비슷한지를 계산해 1에 가까울수록 더 비슷하다고 보는 유사도 측정 방법입니다.
scikit-learn 공식 문서는 cosine_similarity가 X와 Y 샘플 사이의 코사인 유사도를 계산하며, 정규화된 내적 형태로 표현된다고 설명합니다. 쉽게 말해 두 벡터가 같은 방향을 바라보면 점수가 높고, 서로 다른 방향을 바라보면 점수가 낮아집니다.
AI에서는 문장, 문서, 이미지, 코드 같은 자료를 임베딩이라는 숫자 벡터로 바꿀 수 있습니다. 그다음 질문 벡터와 문서 벡터의 코사인 유사도를 계산하면, 단어가 똑같이 겹치지 않아도 의미가 가까운 후보를 찾을 수 있습니다.
한 줄 정리: 코사인 유사도는 AI가 "이 질문과 이 문서가 의미상 얼마나 가까운가"를 숫자로 비교할 때 자주 쓰는 방법입니다.
왜 코사인 유사도가 중요한가요?
챗GPT, Claude, Gemini 같은 AI 도구를 쓸 때 사용자는 보통 자연어로 질문합니다. 하지만 검색 시스템은 내부에서 질문과 문서를 숫자 벡터로 바꿔 비교하는 경우가 많습니다. 이때 코사인 유사도는 "가장 가까운 후보를 먼저 가져오기" 위한 기본 기준 중 하나가 됩니다.
OpenAI 임베딩 문서는 텍스트 검색에서 질문과 각 문서의 임베딩 벡터 사이 코사인 유사도를 사용해 가장 높은 점수의 문서를 반환하는 예를 보여 줍니다. 코드 검색에서도 자연어 질문을 임베딩하고, 함수 임베딩과 코사인 유사도를 계산해 가장 관련 있는 코드를 찾는 흐름을 설명합니다.
마케터와 기획자에게도 이 개념은 중요합니다. AI 검색, 사내 문서 챗봇, RAG, 추천 시스템, 비슷한 고객 문의 찾기, 중복 콘텐츠 탐지에서 "유사도 점수"라는 말을 자주 보기 때문입니다. 점수의 의미를 알면 결과를 무작정 믿기보다, 왜 이 문서가 위에 올라왔는지 더 차분하게 볼 수 있습니다.
핵심 인사이트: 코사인 유사도는 AI 검색의 관련성 후보를 고르는 데 유용하지만, 최종 정답 판정 장치는 아닙니다.
쉬운 예시로 이해하기
감자나라ai님이 사내 자료 1,000개를 AI 검색에 넣었다고 가정해 보겠습니다. 사용자가 "신규 고객 온보딩 이메일 작성법"이라고 질문합니다.
일반 키워드 검색은 "신규", "고객", "온보딩", "이메일" 같은 단어가 들어간 문서를 먼저 찾습니다. 반면 임베딩 검색은 질문 전체의 의미를 숫자 벡터로 바꾸고, 각 문서도 숫자 벡터로 바꿉니다. 그 뒤 코사인 유사도로 방향이 가까운 문서를 찾습니다.
그래서 문서 제목이 "첫 구매자 환영 메일 템플릿"처럼 단어가 완전히 같지 않아도, 의미가 가깝다면 높은 점수를 받을 수 있습니다. 반대로 "이메일 서버 설정"처럼 이메일이라는 단어는 같지만 목적이 다르면 점수가 낮게 나올 수 있습니다.
예시 정리: 코사인 유사도는 같은 단어가 있는지보다, 임베딩 벡터가 같은 의미 방향을 향하는지를 봅니다.
코사인 유사도는 어떻게 작동하나요?
벡터는 숫자 목록입니다. 예를 들어 실제 AI 임베딩은 수백 개나 수천 개의 숫자로 구성될 수 있습니다. 코사인 유사도는 이 숫자 목록 두 개가 얼마나 같은 방향을 향하는지 계산합니다.
여기서 중요한 점은 크기보다 방향입니다. 어떤 문서 벡터의 숫자 크기가 크다고 해서 무조건 더 관련 있다는 뜻은 아닙니다. 코사인 유사도는 두 벡터를 정규화해 방향의 가까움을 봅니다. scikit-learn 문서도 코사인 유사도를 정규화된 내적으로 설명하고, L2 정규화된 데이터에서는 linear_kernel과 같다고 안내합니다.
OpenAI 임베딩 문서는 OpenAI embeddings가 길이 1로 정규화되어 있어 코사인 유사도를 점곱으로 더 빠르게 계산할 수 있고, 이 경우 코사인 유사도와 유클리드 거리가 같은 순위를 낼 수 있다고 설명합니다.
한 줄 정리: 코사인 유사도는 문장 자체를 읽는 것이 아니라, 문장을 숫자로 바꾼 뒤 두 숫자 방향이 얼마나 닮았는지 비교합니다.
헷갈리는 용어와 차이
코사인 유사도와 임베딩은 다릅니다
임베딩은 문장이나 문서를 숫자 벡터로 바꾸는 표현 방식입니다. 코사인 유사도는 그렇게 만든 두 벡터를 비교하는 계산 방법입니다. 쉽게 말하면 임베딩은 좌표를 만드는 일이고, 코사인 유사도는 좌표끼리 가까운 방향인지 재는 일입니다.
코사인 유사도와 벡터 검색은 다릅니다
벡터 검색은 많은 벡터 중에서 질문 벡터와 가까운 후보를 찾는 전체 과정입니다. 코사인 유사도는 그 과정에서 쓸 수 있는 점수 계산 방식 중 하나입니다. 벡터 검색 시스템은 코사인 유사도 외에도 dot product, Euclidean distance 같은 기준을 사용할 수 있습니다.
코사인 유사도와 거리(distance)는 방향이 반대입니다
유사도는 보통 높을수록 가깝다는 뜻입니다. 거리는 보통 낮을수록 가깝다는 뜻입니다. OpenAI 문서도 임베딩 벡터 사이의 거리가 짧을수록 유사성이 크다고 설명합니다. 그래서 시스템마다 "score가 높을수록 좋은지", "distance가 낮을수록 좋은지"를 확인해야 합니다.
코사인 유사도와 키워드 검색은 다릅니다
키워드 검색은 단어 일치에 강합니다. 제품명, 오류 코드, 법 조항 번호, 정확한 SKU처럼 글자가 중요할 때 유용합니다. 코사인 유사도 기반 의미 검색은 표현이 달라도 뜻이 가까운 문서를 찾는 데 강합니다. Pinecone 문서도 dense vector가 텍스트나 이미지의 의미를 숫자 목록으로 인코딩하고, 비슷한 의미의 항목이 벡터 공간에서 가까이 놓인다고 설명합니다.
코사인 유사도와 rerank는 다릅니다
코사인 유사도는 1차 후보를 빠르게 찾는 데 자주 쓰입니다. rerank는 그 후보들을 다시 읽고 순서를 재정렬하는 단계입니다. 중요한 검색 서비스에서는 코사인 유사도로 후보를 넓게 가져온 뒤, rerank 모델이나 규칙으로 더 정확한 순서를 만들기도 합니다.
비교 정리: 임베딩은 숫자 표현, 코사인 유사도는 벡터 비교 점수, 벡터 검색은 후보 찾기 과정, rerank는 후보 순서를 다시 고르는 단계입니다.
실전에서 코사인 유사도는 어디에 쓰이나요?
첫째, 사내 문서 검색에 씁니다. 사용자가 자연어로 질문하면 관련 매뉴얼, 회의록, 정책 문서를 먼저 찾는 데 활용할 수 있습니다.
둘째, RAG 시스템에서 후보 문서를 가져올 때 씁니다. AI가 답변하기 전에 관련 문서 조각을 찾아야 하는데, 이때 질문 임베딩과 문서 임베딩의 유사도를 계산해 상위 후보를 고릅니다.
셋째, 중복 콘텐츠나 비슷한 문의를 찾을 때 씁니다. 고객 문의, 블로그 글감, FAQ 항목이 서로 얼마나 비슷한지 비교해 중복 검토나 묶음 정리에 활용할 수 있습니다.
넷째, 추천 시스템에서 씁니다. OpenAI 임베딩 문서는 짧은 거리가 더 큰 유사성을 나타내므로 임베딩이 추천에 유용할 수 있다고 설명합니다. 예를 들어 사용자가 읽은 문서와 비슷한 문서를 추천하는 식입니다.
다섯째, 코드 검색에도 활용됩니다. OpenAI 문서는 자연어 질문을 임베딩하고, 코드 함수 임베딩과 코사인 유사도를 계산해 관련 코드 조각을 찾는 예를 제시합니다.
실전 팁: AI 검색 결과를 볼 때는 유사도 점수만 보지 말고, 원문 제목, 작성일, 출처, 문서 권한, 실제 답변에 쓰인 문단까지 함께 확인하세요.
초보자가 주의할 점
첫째, 점수가 높아도 정답이라고 단정하면 안 됩니다. 코사인 유사도는 관련 후보를 찾는 신호이지, 사실 검증이나 최신성 확인을 대신하지 않습니다.
둘째, 임베딩 모델이 달라지면 점수도 달라질 수 있습니다. 같은 문서라도 어떤 임베딩 모델을 썼는지, 텍스트를 어떻게 나눴는지, 정규화를 했는지에 따라 검색 결과가 달라질 수 있습니다.
셋째, 긴 문서를 잘못 나누면 좋은 문서도 낮게 나올 수 있습니다. 문서 전체를 한 덩어리로 넣거나, 반대로 너무 잘게 쪼개면 질문과 맞는 문단을 놓칠 수 있습니다.
넷째, 키워드가 중요한 검색에는 의미 검색만으로 부족할 수 있습니다. 제품명, 버전, 코드, 날짜, 계약 조항처럼 정확한 문자열이 중요한 경우에는 키워드 검색이나 필터를 함께 써야 합니다.
다섯째, 코사인 유사도를 무조건 믿으면 안 됩니다. 2024년 arXiv 논문은 임베딩에 코사인 유사도를 적용할 때 상황에 따라 결과가 불투명하거나 임의적일 수 있다고 경고합니다. 실무에서는 샘플 평가, 사람 검토, rerank, 키워드 필터를 함께 두는 편이 안전합니다.
주의: 코사인 유사도는 "비슷해 보이는 후보"를 찾는 도구이지, 출처 검증과 업무 판단을 자동으로 끝내는 장치가 아닙니다.
자주 묻는 질문
Q1. 코사인 유사도는 개발자만 알아야 하나요?
아닙니다. 직접 계산하지 않더라도 AI 검색, RAG, 챗봇, 추천, 중복 검사 결과를 해석해야 한다면 알아두는 편이 좋습니다. "왜 이 문서가 검색됐는가"를 이해하는 데 도움이 됩니다.
Q2. 코사인 유사도 점수는 몇 점이면 좋은가요?
만능 기준은 없습니다. 임베딩 모델, 데이터 종류, 문서 길이, 검색 목적에 따라 점수 분포가 달라집니다. 실무에서는 대표 질문으로 상위 결과를 직접 확인하고, 업무별 기준선을 따로 잡는 편이 좋습니다.
Q3. 코사인 유사도가 높으면 AI 답변도 정확한가요?
항상 그렇지는 않습니다. 관련 문서를 잘 찾는 것과 그 문서를 바탕으로 정확한 답변을 쓰는 것은 다른 문제입니다. 답변 생성 단계에서 출처 누락, 잘못된 요약, 오래된 정보가 생길 수 있습니다.
Q4. 코사인 유사도와 RAG는 어떤 관계인가요?
RAG는 AI가 답변하기 전에 외부 문서를 검색해 참고하게 하는 구조입니다. 코사인 유사도는 RAG에서 질문과 가까운 문서 조각을 찾는 데 자주 쓰이는 계산 기준 중 하나입니다.
Q5. 키워드 검색보다 코사인 유사도가 항상 좋은가요?
아닙니다. 자연어 의미가 중요하면 코사인 유사도 기반 검색이 유리할 수 있지만, 정확한 제품명, 코드, 날짜, 법 조항처럼 글자 일치가 중요한 경우에는 키워드 검색이 더 안전할 수 있습니다. 둘을 섞는 하이브리드 검색도 많이 씁니다.
Q6. 코사인 유사도를 낮추거나 높이는 방법이 있나요?
점수를 직접 조작하기보다 검색 품질을 개선해야 합니다. 문서를 적절한 크기로 나누고, 제목과 본문을 함께 임베딩하고, 오래된 문서를 필터링하고, 중요한 키워드는 별도 필터로 보강하고, 상위 결과를 샘플 평가하는 방식이 좋습니다.
출처
마무리
코사인 유사도는 AI 검색과 RAG를 이해할 때 자주 만나는 기본 용어입니다. 한 문장으로 다시 정리하면, 코사인 유사도는 두 벡터가 같은 방향을 향하는 정도를 계산해 의미상 가까운 후보를 찾는 방법입니다.
초보자는 세 가지만 기억하면 충분합니다. 첫째, 코사인 유사도는 임베딩 벡터를 비교하는 점수입니다. 둘째, 점수가 높다고 항상 정답은 아닙니다. 셋째, 중요한 업무에서는 유사도 점수에 원문 확인, 키워드 필터, 최신성 검토, 사람 검수를 붙여야 합니다.
AI 검색을 잘 쓰려면 "AI가 답을 만들었는가"만 보지 말고 "어떤 문서를 비슷하다고 골랐는가"를 함께 봐야 합니다. 코사인 유사도는 그 첫 번째 후보 선정 과정을 이해하게 해주는 핵심 단어입니다.
