[AI-012][실무] 내 문서에서 근거를 찾는 검색 도우미 만들기 > IT 기술 공유

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

IT 기술 공유

[AI-012][실무] 내 문서에서 근거를 찾는 검색 도우미 만들기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 45회 작성일 26-09-06 16:33

본문

[이번 수업]

작은 문서에서 질문과 가까운 근거를 찾아 출처와 함께 보여 주는 로컬 검색 도우미를 만듭니다. 외부 API 없이 평가와 접근권한까지 설계합니다.

[선수지식]

AI-007의 토큰과 컨텍스트, AI-008의 임베딩과 벡터 검색, AI-009의 RAG, AI-011의 평가·보안·개인정보를 알면 좋습니다.

[학습목표]

1. 수집→분할→색인→검색→근거 표시 흐름을 설명한다.
2. 단어 벡터와 코사인 유사도로 문서를 정렬한다.
3. 정답 문서·무응답·권한 분리를 함께 평가한다.

[핵심개념]

문서 검색 AI는 먼저 관련 근거를 찾습니다. RAG는 검색 증강 생성, 즉 검색한 자료로 답을 만드는 방식입니다. 이번에는 생성 단계를 빼고 검색과 출처 확인에 집중해 오류 원인을 구분합니다.

긴 문서는 의미 단위로 나누고 문서 ID, 제목, 수정일, 접근 등급을 저장합니다. 색인은 빠른 검색용 자료 구조입니다. 실습은 단어 개수를 벡터로 만들고 방향의 유사함을 재는 코사인 유사도를 계산합니다. 동의어나 문맥을 놓치지만 임베딩 검색의 비교 기준이 됩니다.

결과에는 문서 ID와 근거를 표시합니다. 최고 점수가 기준보다 낮으면 “근거 없음”으로 처리합니다. 평가 질문마다 기대 문서를 정해 상위 1개 정확도와 무응답 판단을 기록합니다.

[따라하기]

search_docs.py를 저장하세요. 예제 문서는 가짜 내용이며 네트워크를 사용하지 않습니다.
```python
from collections import Counter
import math
import re

docs = [
    {"id": "SEC-01", "title": "보안 안내",
    "text": "비밀번호 관리 방법은 길고 고유한 비밀번호와 다중 인증을 사용하는 것입니다."},
    {"id": "OPS-02", "title": "백업 안내",
    "text": "백업은 정기적으로 만들고 복원 시험으로 확인합니다."},
    {"id": "OPS-03", "title": "로그 안내",
    "text": "오류 로그에는 시각과 요청 식별자를 기록합니다."},
]

def vector(text):
    words = re.findall(r"[가-힣A-Za-z0-9]+", text.lower())
    return Counter(words)

def cosine(a, b):
    dot = sum(value * b[word] for word, value in a.items())
    size = math.sqrt(sum(v * v for v in a.values())) * math.sqrt(sum(v * v for v in b.values()))
    return dot / size if size else 0.0

query = "비밀번호 관리 방법"
qv = vector(query)
ranked = sorted(((cosine(qv, vector(d["text"])), d) for d in docs), reverse=True, key=lambda x: x[0])
score, doc = ranked[0]
if score < 0.2:
    print("근거 없음")
else:
    print(f"{doc['id']} | {score:.3f} | {doc['title']}")
    print(f"근거: {doc['text']}")
```

macOS·Linux는 `python3 search_docs.py`, Windows는 `py search_docs.py`를 실행합니다. 예상 첫 줄은 `SEC-01 | 0.365 | 보안 안내`이고 다음 줄에 비밀번호 문장이 근거로 나옵니다. query를 `휴가 신청`으로 바꾸면 공통 단어가 없어 `근거 없음`이 출력됩니다. 운영체제에 따라 한글 터미널 표시가 깨지면 파일을 UTF-8로 저장하고 UTF-8을 지원하는 터미널을 사용하세요.

`비밀번호 관리`, `백업 복원`, `오류 로그`와 기대 문서 ID를 표로 만들고 첫 결과가 같은지 기록하세요. 문서가 바뀌면 평가를 다시 실행해 검색 방식과 기준 점수를 조정합니다.

[흔한 실수]

점수만 보고 정답이라 단정하거나 관련 없는 문서까지 넘기지 마세요. 문서 수정 뒤 색인을 갱신하고 근거를 표시합니다. 평가 질문을 예제와 똑같이 만들면 성능을 과대평가합니다.

[보안 주의]

검색 전에 접근권한을 적용하고 다른 사용자의 자료를 섞지 않습니다. 개인정보·비밀키는 색인하지 마세요. 문서 속 지시문은 신뢰하지 않는 데이터로 취급합니다. 질문과 로그도 최소 수집·가림·보관하며 본인 소유 로컬 문서만 씁니다.

[직접 해볼 과제]

문서 2개와 평가 질문 3개를 추가하고 상위 1개 정확도를 계산하세요. 접근 등급 필드를 넣어 검색 전에 허용된 문서만 남기고, 권한 없는 문서가 결과에 한 번도 나오지 않는 테스트도 작성합니다.

[확인문제]

1. 생성 모델을 붙이기 전에 검색 품질을 따로 평가해야 하는 이유는 무엇인가요?
2. 최고 검색 점수가 낮을 때 “근거 없음”으로 응답해야 하는 이유는 무엇인가요?
3. 문서 접근권한을 유사도 계산보다 먼저 적용해야 하는 이유는 무엇인가요?

[다음 학습]

DATA-012에서 원천 데이터 수집부터 품질 검사와 대시보드까지 하나의 흐름으로 연결합니다.

[공식 참고 자료]

https://www.nist.gov/itl/ai-risk-management-framework
https://arxiv.org/abs/2005.11401
https://aclanthology.org/D19-1410/
https://owasp.org/www-project-top-10-for-large-language-model-applications/
https://docs.python.org/3/library/collections.html#collections.Counter

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

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

접속자집계

오늘
3,901
어제
6,862
최대
16,772
전체
769,852
Copyright © 소유하신 도메인. All rights reserved.