카테고리 없음

스파르타 AI-8기 TIL(11/15) -> 개인과제 공부: 계속

kimjunki-8 2024. 11. 15. 23:00

그전에 LLM과 벡터 검색의 서로 다른 역할과 흐름 차이를 먼저 보겠습니다.

대규모 언어 모델(LLM)을 구축하는 과정과 각 단계에 대해 좀 더 깊이 알아보겠습니다.

LLM
1. 데이터 수집 및 전처리 (Data Collection and Preprocessing)
작동 방식:
LLM을 훈련시키기 위해 가장 중요한 첫 단계는 다양한 소스에서 데이터를 수집하는 것입니다. 예를 들어, 뉴스 기사, 책, 논문, 웹페이지 등에서 텍스트 데이터를 수집할 수 있습니다.
데이터는 반드시 전처리 과정을 거쳐야 합니다. 데이터 전처리 단계에서는 불필요한 문자를 제거하거나, 텍스트를 표준화하여 모델이 학습하기 쉬운 형태로 변환합니다. 예를 들어, 특수문자 제거, 소문자화, 불용어(stop words) 제거 등의 작업을 할 수 있습니다.
토큰화 (tokenization): 문장을 더 작은 단위(토큰)로 나누어 모델이 처리할 수 있게 만듭니다.

모델 예시:
SentencePiece: 언어 모델 훈련에서 자주 사용하는 토큰화 도구로, 텍스트를 단어가 아닌 서브워드 단위로 나누어 모델이 적은 양의 데이터로도 잘 학습할 수 있도록 돕습니다.
spaCy: NLP 처리에 자주 쓰이는 라이브러리로, 텍스트 전처리, 토큰화, 품사 태깅 등을 쉽게 수행할 수 있습니다.

2. 모델 아키텍처 설계 (Model Architecture Design)
작동 방식:
LLM의 핵심은 Transformer 모델입니다. 이 모델은 Self-attention mechanism을 사용하여 문맥을 이해하고, 전체 문장에서 중요한 부분에 집중할 수 있습니다.
Transformer는 주로 두 가지 주요 블록으로 구성됩니다:
Encoder: 입력 문장을 이해하는 역할을 하며, 입력된 텍스트에서 정보를 추출합니다.
Decoder: Encoder에서 추출된 정보를 바탕으로 새로운 텍스트를 생성하거나, 질문에 대한 답을 생성하는 역할을 합니다.
Pre-trained 모델 사용: 많은 LLM들이 처음부터 훈련되는 대신 pre-trained 모델을 사용합니다. 이런 모델들은 대량의 데이터로 미리 훈련되어 있으며, 후속 작업에 맞게 fine-tuning을 통해 특정 작업에 최적화됩니다.

모델 예시:
GPT-3: 생성형 언어 모델로, 트랜스포머 아키텍처를 기반으로 훈련되며 자연어 이해와 생성 능력을 갖추고 있습니다.
BERT: 문맥을 고려한 양방향 모델로, 질문 응답, 문서 분류, 텍스트 생성 등 여러 작업에서 강력한 성능을 보입니다.

3. 모델 학습 (Model Training)
작동 방식:
LLM 훈련은 주로 지도 학습(supervised learning) 방식이나 비지도 학습(unsupervised learning) 방식으로 진행됩니다. 예를 들어, 문장 간의 관계를 학습하거나, 주어진 텍스트를 바탕으로 후속 텍스트를 예측하는 방식입니다.
최적화: 훈련 과정에서 모델의 파라미터는 역전파(backpropagation) 기법을 통해 업데이트되며, 손실 함수(loss function)의 값을 최소화하는 방향으로 모델이 학습됩니다.
하이퍼파라미터 튜닝: 학습률, 배치 크기, 에폭 수 등을 조정하여 최적의 모델을 얻을 수 있습니다.

모델 예시:
OpenAI GPT-3: 대규모 데이터로 미리 훈련된 모델로, 텍스트 생성 능력이 뛰어납니다.
T5 (Text-to-Text Transfer Transformer): 텍스트를 입력으로 받아 텍스트를 출력하는 다양한 작업을 수행할 수 있도록 훈련된 모델입니다.

4. 모델 평가 및 성능 측정 (Model Evaluation and Performance Metrics)
작동 방식:
모델을 훈련시킨 후, 모델이 얼마나 잘 작동하는지 평가하기 위해 다양한 평가 지표를 사용합니다. 이 지표들은 주로 텍스트 생성의 품질을 측정합니다.
대표적인 지표들:
BLEU: 생성된 텍스트와 참조 텍스트 간의 일치도를 평가합니다.
ROUGE: 요약된 텍스트의 품질을 평가하며, 특히 텍스트 요약 모델에서 사용됩니다.
Perplexity: 모델이 텍스트를 얼마나 잘 예측하는지를 나타내는 지표로, 낮을수록 모델의 예측 성능이 좋습니다.

모델 예시:
GLUE (General Language Understanding Evaluation): 모델의 언어 이해 능력을 평가하는 벤치마크로, 여러 가지 자연어 처리 작업을 포함합니다.

5. 모델 최적화 및 경량화 (Model Optimization and Compression)
작동 방식:
훈련된 모델을 실제 환경에서 사용하기 위해선 모델 경량화가 필요할 수 있습니다. 너무 큰 모델은 추론 속도가 느리거나, 메모리 및 저장 공간을 많이 차지하기 때문입니다.
모델 경량화 방법:
Pruning: 불필요한 신경망 연결을 제거하여 모델의 크기를 줄입니다.
Quantization: 모델의 가중치를 8비트 혹은 16비트로 줄여 메모리와 계산 속도를 개선합니다.
Distillation: 더 작은 모델을 만들어 큰 모델의 지식을 "증류"하는 방법으로, 작은 모델이 큰 모델처럼 동작하도록 훈련합니다.

모델 예시:
DistilBERT: BERT 모델을 경량화한 모델로, 파라미터 수가 적어 빠르고 효율적입니다.
TinyBERT: BERT의 경량화 버전으로, 성능은 유지하면서도 모델 크기를 크게 줄일 수 있습니다.

6. 배포 및 운영 (Deployment and Maintenance)
작동 방식:
모델은 배포 후 실시간 응답을 제공하는 형태로 서비스를 제공합니다. 대규모 시스템에서는 API 서빙, 서버리스 아키텍처 등을 통해 모델을 실시간으로 배포하고, 다양한 사용자의 요청에 응답합니다.
모니터링: 배포된 모델의 성능을 실시간으로 모니터링하여 성능 저하가 발생할 경우 조치를 취합니다.
A/B 테스트: 두 가지 이상의 모델을 비교하여 더 나은 성능을 가진 모델을 선택하는 방식으로 최적의 모델을 찾습니다.

모델 예시:
TensorFlow Serving: TensorFlow로 훈련된 모델을 배포하는 도구로, 모델을 쉽게 서비스할 수 있습니다.
FastAPI: Python으로 API 서버를 구축할 때 자주 사용하는 프레임워크로, 빠르고 효율적으로 모델을 서빙할 수 있습니다.

7. 유지 보수 및 재훈련 (Maintenance and Retraining)
작동 방식:
주기적인 업데이트: 데이터의 변화나 새로운 요구 사항에 맞춰 주기적으로 모델을 업데이트하거나 재훈련해야 합니다.
피드백 루프: 사용자 피드백을 통해 모델이 잘못된 예측을 했을 경우, 이를 개선하기 위해 추가 학습을 진행합니다.
모델 예시:

Adaptive Models: 실시간 데이터를 기반으로 지속적으로 학습하며, 새로운 정보를 모델에 반영하는 형태의 모델입니다.
예시: OpenAI의 LLM을 이용해 자연어 질문에 답변하는 간단한 질의응답 시스템을 구현
import openai

# OpenAI API 키 설정
openai.api_key = "YOUR_OPENAI_API_KEY"  # OpenAI API 키를 입력하세요

# 질문에 대한 응답을 생성하는 함수 정의
def generate_answer_with_llm(question):
    # 프롬프트 설정
    prompt = f"The following is a question-answering session. 
    Please provide a detailed and informative answer.\n\nQuestion: {question}\nAnswer:"
    
    # LLM에 요청
    response = openai.Completion.create(
        model="text-davinci-003",  # LLM 모델 선택 (예: text-davinci-003)
        prompt=prompt,
        max_tokens=150, # 응답의 최대 토큰 수
        temperature=0.7 # 창의성 정도를 조절하는 파라미터 (0.7로 설정하여 적당히 창의적 응답을 생성)
    )
    
    # 응답 추출 및 반환
    answer = response.choices[0].text.strip()  # 응답에서 텍스트만 추출
    return answer

# 질문 예시
question = "What are the key benefits of using artificial intelligence in healthcare?"
answer = generate_answer_with_llm(question)
print("Answer:", answer)
모듈 임포트: 필요한 패키지를 불러옵니다. PyPDFLoader, RecursiveCharacterTextSplitter, OpenAIEmbeddings, FAISS 등은 LangChain과 FAISS를 사용하여 데이터를 로드하고 분할, 벡터화 및 검색을 수행하는 데 사용됩니다.

OpenAI API 키 설정: OpenAI API에 접근하기 위해 환경 변수에서 OPENAI_API_KEY를 가져옵니다. 이는 OpenAI의 임베딩 및 LLM 모델을 사용하기 위해 필수적입니다.

PDF 문서 로드 및 텍스트 분할: PDF 문서를 로드하고, RecursiveCharacterTextSplitter를 사용해 청크 단위로 분할합니다. 이렇게 하면 문서가 너무 길어지는 것을 방지하고, 검색 및 임베딩 처리가 효율적으로 이루어집니다.

임베딩 모델 설정: OpenAI의 text-embedding-ada-002 임베딩 모델을 사용하여 청크로 분할된 문서의 임베딩을 생성합니다. 이 모델은 문서의 의미적 유사성을 파악하는 데 탁월합니다.

FAISS 인덱스 생성: FAISS 인덱스를 생성하여 청크 임베딩을 벡터화된 데이터베이스에 저장합니다. FAISS는 유사성 검색을 수행하는 빠르고 효율적인 벡터 DB입니다.

검색 기능 설정: 검색 기능을 설정하여 질문과 유사한 문서를 검색할 수 있도록 합니다. k=3으로 설정해 질문에 가장 유사한 세 개의 문서를 반환하도록 합니다.

프롬프트 템플릿 설정: 검색된 문서와 질문을 기반으로 LLM이 응답을 생성할 수 있는 프롬프트를 정의합니다. 이 프롬프트는 시스템 지시어와 유저 메시지 두 부분으로 나뉩니다.

LLM 체인 구성: LLM 체인을 구성하여 문맥과 질문을 프롬프트에 넣어 응답을 생성하도록 합니다.

검색 및 응답 생성 함수 answer_question 정의: 사용자의 질문을 받아, 벡터 DB에서 관련 문서를 검색하고 이를 문맥으로 사용하여 응답을 생성하는 함수를 정의합니다.

질문에 대한 응답 출력: answer_question 함수를 통해 사용자가 입력한 질문에 대한 답변을 생성하고 이를 출력합니다.


벡터 검색(Vector DB의 구성 요소와 상세 개념)
1. 데이터 임베딩 (Data Embedding)
임베딩은 텍스트, 이미지, 오디오 등의 데이터를 고차원 벡터로 변환하여, 의미나 특징을 수치로 표현하는 작업입니다. 예를 들어, 문장을 512차원 벡터로 표현할 수 있습니다.
관련 모델: 임베딩을 수행하는 모델은 텍스트와 이미지 등 데이터의 유형에 따라 다릅니다.
텍스트 임베딩 모델:
BERT: 텍스트를 768차원 또는 1024차원 벡터로 임베딩.
Sentence-BERT: 문장 단위 임베딩에 최적화되어, 문장 간 유사도를 잘 표현.
OpenAI의 ada-002 모델: OpenAI API에서 제공되는 임베딩 전용 모델.
이미지 임베딩 모델:
CLIP: 텍스트와 이미지를 모두 임베딩하여 서로 비교 가능.
ResNet: 이미지 특징을 벡터화하여 임베딩하는 데 자주 사용.
오디오 임베딩 모델:
VGGish: 오디오 데이터를 벡터로 표현.
wav2vec: 음성 데이터를 임베딩하여 텍스트나 음성 간 유사도 분석에 사용.

2. 벡터 인덱싱 (Vector Indexing)
벡터 데이터가 많아지면, 효율적으로 검색할 수 있도록 벡터 인덱스가 필요합니다. 벡터 인덱싱은 벡터를 체계적으로 구조화하여 빠르게 검색하는 데 중점을 둡니다.
관련 인덱싱 방법:
Flat Index (Brute-Force Search): 모든 벡터를 비교하는 단순한 방식. 정확하나 느립니다.
Inverted File (IVF): 벡터들을 여러 클러스터로 나눠서, 검색 속도를 높입니다.
Product Quantization (PQ): 벡터 차원을 압축하여 검색 성능을 높이는 기법.
Hierarchical Navigable Small World (HNSW): 그래프 기반 인덱싱으로 대규모 데이터셋에서도 빠른 검색이 가능.
LSH (Locality-Sensitive Hashing): 유사한 벡터를 동일한 해시 버킷에 저장하여, 빠르게 비슷한 항목을 찾을 수 있습니다.
관련 모델 및 라이브러리:
FAISS (Facebook AI Similarity Search): IVF, PQ, HNSW 등 다양한 인덱싱 옵션을 제공.
Annoy: Spotify에서 개발한 라이브러리로, Approximate Nearest Neighbor 검색을 수행.
ScaNN: 구글에서 만든 벡터 검색 라이브러리로, 효율적인 인덱싱을 제공.

3. 유사성 검색 (Similarity Search)
쿼리 벡터와 데이터베이스 내 벡터 간의 유사성을 측정하여, 가장 유사한 벡터들을 찾는 과정입니다. 이때 유사성 측정 방식이 중요한 역할을 합니다.
유사성 측정 방법:
코사인 유사도 (Cosine Similarity): 벡터 간 각도로 유사도를 측정. 값이 클수록 유사합니다.
유클리드 거리 (Euclidean Distance): 벡터 간의 거리로 유사도를 측정. 거리가 짧을수록 유사합니다.
내적 (Dot Product): 두 벡터의 내적을 통해 유사도를 측정.
Jaccard Similarity: 벡터가 0과 1로 이루어진 경우, 공통된 요소의 비율을 통해 유사도를 계산합니다.
관련 라이브러리와 모델:
FAISS: 다양한 유사성 측정 방식을 지원하여 벡터 간 비교 성능을 높임.
Weaviate: 코사인 유사도, 유클리드 거리 등을 지원.
Pinecone: 다양한 유사도 측정 방식으로 검색 정확도를 높이는 클라우드 기반의 벡터 DB.

4. 벡터 인덱스 업데이트와 관리
벡터 DB는 동적으로 데이터가 추가, 삭제, 수정될 수 있습니다. 새로운 데이터가 추가되거나 오래된 데이터가 제거될 때 인덱스를 업데이트하는 작업이 필요합니다.
업데이트 방식:
Batch Update: 일정 시간마다 일괄적으로 인덱스를 업데이트하는 방식.
Real-time Update: 데이터 추가 시 바로 인덱스에 반영하는 방식. 성능에 영향을 줄 수 있지만 실시간성이 요구되는 서비스에 적합합니다.
관련 모델과 DB 솔루션:
Weaviate: 실시간 업데이트와 메타데이터 관리에 최적화된 Vector DB.
Chroma: 메타데이터와 함께 벡터 데이터를 실시간으로 업데이트하고 관리하는 기능 제공.

5. 메타데이터 기반 필터링 (Metadata Filtering)
검색 결과의 정확도를 높이기 위해 메타데이터를 기반으로 필터링하여 필요한 정보만 반환할 수 있습니다. 예를 들어, 벡터 검색 결과에서 특정 날짜에 생성된 데이터만 반환하도록 설정할 수 있습니다.
필터링 방식:
범위 필터링 (Range Filtering): 특정 범위의 값에 해당하는 데이터만 선택.
태그 기반 필터링: 메타데이터에 지정된 태그를 기반으로 필터링.
중첩 필터링 (Nested Filtering): 여러 필터링 조건을 중첩하여 고급 필터링 수행.
관련 모델 및 벡터 DB:
Weaviate: 고급 메타데이터 필터링 기능을 제공하며, 다양한 조건 기반의 필터링을 지원.
Chroma: 메타데이터와 함께 벡터 데이터를 관리하여 필터링 작업을 최적화.

6. 확장성과 분산 처리 (Scalability and Distributed Processing)
대규모 벡터 데이터베이스에서는 데이터 양이 방대해질 경우 확장성이 필요합니다. 또한, 데이터를 여러 서버에 분산하여 처리하는 방식으로 속도를 높이고, 대규모 데이터에 대응할 수 있습니다.
확장 및 분산 처리 방식:
Sharding: 데이터베이스를 여러 조각으로 나눠서 분산 저장.
Replication: 데이터를 여러 노드에 복제하여 고가용성을 보장.
Parallel Processing: 대규모 데이터에 대한 병렬 검색 작업을 통해 처리 성능을 향상.
관련 벡터 DB 솔루션:
Pinecone: 클라우드 기반으로 확장성과 분산 처리가 잘 지원되며, 대규모 데이터를 처리하는 데 최적화.
Milvus: 대규모 벡터 데이터를 처리할 수 있도록 확장 가능한 분산 구조를 제공.

7. API 및 서비스 통합 (API and Service Integration) 
관련 API 및 통합 방식:
Python SDK: 많은 벡터 DB들이 Python SDK를 제공하여 Python 환경에서 벡터 DB와 쉽게 통신할 수 있도록 합니다.
Webhook 및 Event Handling: 특정 이벤트가 발생할 때 API를 통해 자동화된 작업을 실행할 수 있습니다.
관련 벡터 DB와 API 예시:
Weaviate: GraphQL API를 통해 메타데이터를 기반으로 다양한 쿼리 작업이 가능하며, 고급 필터링 쿼리 작성에 적합합니다.
Pinecone: REST API와 Python SDK를 제공하여 클라이언트가 쉽게 벡터 검색을 통합할 수 있습니다.
Chroma: REST API와 Python API를 통해 벡터와 메타데이터를 쉽게 추가하고 검색할 수 있습니다.

8. 모델과 애플리케이션과의 통합 (Integration with Models and Applications)
Vector DB는 종종 다른 애플리케이션이나 AI 모델과 통합하여 더 복잡한 기능을 제공합니다. 예를 들어, 검색 기반 모델, 질문-응답 모델, RAG 모델에서 벡터 DB를 활용하여 컨텍스트를 제공할 수 있습니다.

통합 방식:
RAG (Retrieval-Augmented Generation): OpenAI GPT-3, GPT-4와 같은 생성형 AI 모델과 통합하여, DB에서 검색된 정보를 기반으로 답변을 생성합니다.
Recommendation Systems: 유사성을 기반으로 추천을 제공하기 위해 벡터 DB와 임베딩 모델을 통합합니다.
Question Answering Models: 검색된 벡터 데이터를 기반으로 특정 질문에 대한 답변을 생성하는 데 활용됩니다.

관련 모델 및 DB 예시:
RAG 모델: OpenAI, Hugging Face의 트랜스포머 모델들과 FAISS를 통합하여 검색-생성형 작업에 사용.
Recommender Systems: Spotify에서 사용한 Annoy, Pinecone과 같은 DB를 사용하여 유사한 취향의 음악, 콘텐츠 추천을 제공합니다.
Question-Answering: BERT 모델과 FAISS를 조합하여, 질문에 대한 적절한 답변을 DB에서 검색하여 반환합니다.
벡터 DB의 전체 흐름 요약 및 작용
데이터 준비 및 임베딩 생성: 원본 데이터(텍스트, 이미지, 오디오)를 임베딩 모델로 변환하여 고차원 벡터를 생성합니다.

벡터 인덱싱: 벡터를 효율적으로 검색할 수 있도록 FAISS, Annoy, ScaNN과 같은 인덱스 방식을 선택하여 인덱싱합니다. 이때 데이터 양과 검색 속도 요구에 따라 최적의 인덱싱 방식을 선택합니다.

유사성 검색 및 필터링: 사용자의 쿼리와 가장 유사한 벡터를 검색하고 필요에 따라 메타데이터를 기반으로 필터링하여 최적의 결과를 반환합니다.

결과 통합: 검색된 벡터 데이터를 다른 AI 모델 또는 애플리케이션과 통합하여 RAG, 추천 시스템, 질문-응답 같은 복잡한 작업을 수행합니다.

실시간 업데이트 및 확장성 관리: 새로운 데이터가 추가되거나 기존 데이터가 삭제되는 경우, 인덱스를 실시간으로 업데이트하며 필요에 따라 분산 구조를 적용하여 확장성을 확보합니다.
예시: FAISS를 사용하여 문서 청크를 벡터화하고 이를 기반으로 유사 문서를 검색하는 예제
import numpy as np
from sentence_transformers import SentenceTransformer
import faiss

# 임베딩 모델 설정 (SentenceTransformer 사용)
embedding_model = SentenceTransformer('all-MiniLM-L6-v2')  # 문서 임베딩을 위한 모델

# 데이터 예시 (문서 청크들)
documents = [
    "Artificial intelligence can improve healthcare.",
    "Machine learning is a branch of artificial intelligence.",
    "Quantum computing is a revolutionary technology.",
    "AI applications include healthcare, finance, and retail.",
    "Deep learning enables image and speech recognition."
]

# 문서 벡터화
document_embeddings = embedding_model.encode(documents)

# FAISS 인덱스 생성
dimension = document_embeddings.shape[1]  # 벡터 차원 수
index = faiss.IndexFlatL2(dimension)      # L2 거리 기반의 인덱스 생성
index.add(document_embeddings)            # 인덱스에 벡터 추가

# 검색 함수 정의
def search_similar_documents(query, k=2):
    # 질의(query) 벡터화
    query_embedding = embedding_model.encode([query])
    
    # 유사한 문서 검색 (k개의 유사 문서 반환)
    distances, indices = index.search(query_embedding, k)
    
    # 결과 출력
    similar_docs = [(documents[idx], distances[0][i]) for i, idx in enumerate(indices[0])]
    return similar_docs

# 검색 예제
query = "Explain the uses of AI in different industries."
results = search_similar_documents(query)

# 검색 결과 출력
for doc, dist in results:
    print(f"Document: {doc} \nDistance: {dist}\n")

임베딩 모델 설정: SentenceTransformer의 all-MiniLM-L6-v2 모델을 사용하여 문서를 임베딩합니다.
문서 데이터 준비: 예시 데이터로 다섯 개의 문서 청크를 정의합니다.
문서 임베딩 생성: 각 문서를 벡터화하여 document_embeddings에 저장합니다.
FAISS 인덱스 생성: L2 거리 기반의 인덱스를 생성하고, 각 문서의 벡터를 인덱스에 추가합니다.
검색 함수 정의: search_similar_documents 함수는 입력된 질의를 벡터화한 후 유사한 문서를 검색합니다. 검색된 문서와 거리를 반환하여 유사도 확인이 가능합니다.
주요 개념
Vector DB: 벡터 형태의 데이터를 저장하고 유사 벡터를 빠르게 검색할 수 있도록 하는 데이터베이스입니다.
FAISS 인덱스: Facebook AI Research에서 개발한 벡터 검색 라이브러리로, 대규모 벡터 데이터에 대해 유사성 검색을 효율적으로 수행합니다.
거리 기반 검색: 벡터 간의 거리 (L2 거리)를 기준으로 검색하여 유사한 벡터를 찾습니다.


FAISS에서는 검색 함수를 따로 만드는 이유가 있습니다. 다른 고수준 라이브러리나 벡터 데이터베이스는 일반적으로 "검색" 기능을 내장하여 편리하게 제공하지만, FAISS는 벡터 검색을 효율적으로 수행하는 저수준 라이브러리이기 때문에 사용자 지정이 더 필요합니다. 이 때문에 FAISS를 사용하는 경우, 원하는 방식으로 검색 프로세스를 설정하는 검색 함수를 만들어야 할 때가 많습니다.

FAISS의 설계 철학은 대규모 데이터셋에서 빠르고 효율적인 벡터 검색을 목표로 하기 때문에, 검색 프로세스를 간단하게 사용할 수 있는 기능보다 성능 최적화와 유연성에 중점을 두고 있습니다.

다음은 FAISS에서 검색 함수를 생성해야 하는 주요 이유입니다.

1. 검색 방식의 유연성
FAISS는 벡터 간의 유사성을 측정하는 다양한 메트릭(L2 거리, 내적 등)을 지원하며, 여러 가지 인덱스 유형이 존재합니다. 예를 들어, 아래와 같은 인덱스가 있습니다:

IndexFlatL2: 단순한 L2 거리 기반의 인덱스.
IndexIVFFlat: 클러스터링을 활용한 인덱스(대규모 데이터에 적합).
IndexHNSW: 그래프 기반의 검색 인덱스.
각 인덱스는 다른 방식으로 검색을 수행하며, 검색 파라미터가 다를 수 있습니다. FAISS는 검색 설정과 동작을 코드로 세부적으로 제어할 수 있도록 설계되었기 때문에, 검색 함수를 통해 원하는 파라미터와 인덱스 설정을 맞추어야 할 때가 많습니다.

2. 검색 함수의 역할
FAISS는 고수준 함수가 아닌, 벡터의 추가 및 유사 벡터 검색 기능만 제공합니다. 특히, 검색 시 질의 벡터를 임베딩하는 과정이나 반환된 결과를 후처리하는 과정도 FAISS 내부에서 자동으로 지원하지 않기 때문에, 사용자가 직접 검색 함수를 작성해야 합니다.

일반적으로 검색 함수에서는 다음을 설정합니다:

입력 질의 벡터 임베딩: 검색 전, 질의 벡터를 문서 벡터와 같은 방식으로 임베딩합니다.
검색 파라미터 설정: 반환할 유사 문서의 개수(예: k=5)나 인덱스 유형을 정의합니다.
후처리: 검색 결과의 인덱스나 거리값을 기반으로 검색 결과를 사용하기 쉽게 가공합니다.
3. 고유한 검색 로직 구현
FAISS는 사용자가 고유의 검색 로직을 정의할 수 있도록 유연성을 제공합니다. 예를 들어, FAISS를 사용하는 응용 프로그램에서 검색 시 필터링 조건, 거리 계산 방식, 후처리 방법 등을 사용자가 원하는 대로 조합하여 구성할 수 있습니다.

일단 여기까지...