[AI-008][중급] 문장을 숫자로 바꿔 비슷한 글 찾기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[AI-008][중급] 문장을 숫자로 바꿔 비슷한 글 찾기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 120회 작성일 26-09-03 15:32

본문

[이번 수업]
컴퓨터가 문장의 의미를 비교할 수 있도록 임베딩으로 바꾸고, 질문과 가까운 글을 찾는 벡터 검색의 원리를 배웁니다. 외부 서비스 없이 작은 숫자 벡터를 직접 비교해 검색 순위가 만들어지는 과정을 확인합니다.

[선수지식]
AI-006의 언어 모델 개념, AI-007의 토큰, Python의 리스트·함수·정렬을 알고 있어야 합니다.

[학습목표]
1. 임베딩과 벡터 검색의 역할을 설명할 수 있습니다.
2. 코사인 유사도로 벡터의 방향이 얼마나 가까운지 계산할 수 있습니다.
3. 검색 점수와 정답 여부를 구분하고 결과를 평가할 수 있습니다.

[핵심개념]
임베딩(embedding)은 문장·단어·이미지 같은 대상을 일정한 길이의 숫자 배열인 벡터로 나타낸 것입니다. 텍스트 임베딩 모델은 학습 과정에서 비슷한 쓰임이나 의미를 가진 텍스트가 벡터 공간에서 가까워지도록 값을 익힙니다. 실제 임베딩은 수백 개 이상의 차원을 가질 수 있으며 사람이 각 숫자의 뜻을 직접 정하지 않습니다.

벡터 검색은 문서와 질문을 같은 임베딩 모델로 변환한 뒤 거리가 가깝거나 유사도가 높은 문서를 순서대로 찾습니다. 코사인 유사도는 두 벡터의 내적을 각 벡터 길이의 곱으로 나눈 값입니다. 크기보다 방향을 비교하므로 같은 방향에 가까울수록 점수가 높습니다. 어떤 거리 함수를 쓸지는 모델 설명과 저장소 설정에 맞춰야 합니다.

모델 이름이 같아도 버전이나 전처리가 다르면 결과가 달라질 수 있습니다. 서로 다른 모델의 벡터는 차원과 좌표 의미가 다르므로 한 검색 공간에서 바로 비교하지 않습니다. 모델을 바꾸면 문서와 질문을 함께 다시 변환하고 버전을 기록합니다. 검색 결과는 ‘벡터상 가까움’일 뿐 사실의 정확성이나 질문에 대한 정답 확률이 아닙니다. 실제 서비스에서는 대표 질문과 관련 문서 정답표를 만들어 상위 k개 안에 필요한 문서가 들어오는지 평가합니다.

모든 벡터를 비교하는 정확 검색은 이해하기 쉽지만 자료가 커지면 느려집니다. 근사 최근접 이웃 검색은 일부 결과를 놓칠 가능성인 재현율을 속도와 바꾸므로, 실제 자료로 속도와 검색 품질을 함께 측정해야 합니다.

[따라하기]
다음 코드를 vector_search.py로 저장하세요. 여기의 3차원 벡터는 계산 원리를 보여 주려고 손으로 만든 값이며 실제 모델 임베딩이 아닙니다.

```python
from math import sqrt

documents = {
    "고양이": [1.0, 0.9, 0.0],
    "강아지": [0.9, 1.0, 0.0],
    "데이터베이스": [0.0, 0.1, 1.0],
}
query = [1.0, 0.8, 0.0]

def cosine(a, b):
    if len(a) != len(b):
        raise ValueError("vector dimensions must match")
    dot = sum(x * y for x, y in zip(a, b))
    length_a = sqrt(sum(x * x for x in a))
    length_b = sqrt(sum(y * y for y in b))
    return dot / (length_a * length_b) if length_a and length_b else 0.0

ranked = sorted(
    ((name, cosine(query, vector)) for name, vector in documents.items()),
    key=lambda item: item[1],
    reverse=True,
)

for name, score in ranked:
    print(f"{name}: {score:.3f}")
```

Windows는 `py vector_search.py`, macOS와 Linux는 `python3 vector_search.py`로 실행합니다. 예상 결과입니다.

```text
고양이: 0.998
강아지: 0.987
데이터베이스: 0.062
```

질문 벡터와 방향이 가장 가까운 고양이가 먼저 나옵니다. 점수는 이 세 문서 안의 순위를 정하는 근거이지, 고양이가 질문의 정답이라는 보장은 아닙니다.

[흔한 실수]
서로 다른 모델이나 차원의 벡터를 섞거나, 코사인 거리와 유사도의 대소 방향을 반대로 정렬하기 쉽습니다. 점수를 확률처럼 해석하고 기준값을 임의로 정하는 것도 문제입니다. 문서를 너무 길거나 짧게 나눈 뒤 검색 평가 없이 저장소 크기와 인덱스만 키우지 마세요. 모델·버전·차원·거리 함수와 문서 원본 식별자를 함께 관리해야 합니다.

[보안 주의]
본인 소유의 로컬·격리 환경 자료만 사용하세요. 임베딩은 원문을 단순히 숨기는 암호화가 아니므로 개인정보나 비밀문서를 무조건 안전하게 만들지 않습니다. 수집 목적에 필요한 문장만 변환하고 원문과 벡터 저장소에 접근 권한·보관 기간·삭제 절차를 적용하세요. 외부 모델에 문서를 보낼 때는 전송 범위와 보존 정책을 먼저 확인해야 합니다.

[직접 해볼 과제]
질문 벡터를 `[0.1, 0.2, 1.0]`으로 바꾸고 순위를 다시 확인하세요. 이어서 `호랑이` 문서에 `[0.8, 0.6, 0.0]`을 추가한 뒤, 어떤 벡터가 어떤 순서가 될지 먼저 예상하고 실행 결과와 비교하세요.

[확인문제]
1. 서로 다른 임베딩 모델의 벡터를 바로 비교하면 안 되는 이유는 무엇인가요?
2. 코사인 유사도가 높다는 것은 무엇을 뜻하나요?
3. 벡터 검색 점수가 정답 확률이 아닌 이유는 무엇인가요?

[다음 학습]
다음 DATA-008에서는 원천 자료를 추출·변환·적재하는 ETL과 ELT 데이터 파이프라인을 배웁니다.

[공식 참고 자료]
텍스트 임베딩 공식 안내: https://www.tensorflow.org/text/guide/word_embeddings
코사인 유사도 공식 문서: https://scikit-learn.org/stable/modules/metrics.html#cosine-similarity
벡터 검색 공식 프로젝트 문서: https://github.com/pgvector/pgvector
Python 수학 함수 공식 문서: https://docs.python.org/3/library/math.html

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
1,593
어제
5,103
최대
16,772
전체
772,647
Copyright © 소유하신 도메인. All rights reserved.