대규모 언어 모델의 적용은 다양한 분야에 걸쳐 변화를 가져왔으며 자연어 처리 및 이해의 새로운 영역을 형성했습니다. 인간과 유사한 텍스트를 생성하는 것으로 유명한 LLM은 챗봇, 콘텐츠 생성, 심지어 복잡한 문제 해결 작업에도 혁명을 일으켰습니다.
그러나 인상적인 기능에도 불구하고 LLM은 특히 상황 인식 및 확장된 상호 작용에 대한 정확성 유지와 관련하여 주목할만한 과제에 직면해 있습니다. 일반적인 함정은 생성된 콘텐츠가 유창하더라도 부정확하거나 관련성이 없는 상태로 표류할 수 있는 " 환각 "에 대한 경향입니다.
RAG(Retrieval-Augmented Generation) 및 벡터 데이터베이스 와 같은 기술이 중추적인 역할을 하는 곳이 바로 여기입니다. 방대한 데이터 세트에서 관련 정보를 동적으로 검색하는 RAG와 LLM을 통합함으로써 이러한 제한을 크게 완화할 수 있습니다. 구조화된 벡터 데이터를 효율적으로 처리하고 검색할 수 있는 LLM과 벡터 데이터베이스 간의 시너지 효과는 LLM 응용 프로그램에 새로운 수준의 깊이, 컨텍스트 및 안정성을 제공할 것을 약속합니다.
이 블로그에서 독자는 다음을 기대할 수 있습니다.
검색 증강 생성(RAG)은 AI 및 자연어 처리 분야의 혁신적인 패러다임입니다. 이는 정보 검색을 언어 생성 프로세스에 통합함으로써 기존 언어 모델에서 상당한 변화를 가져옵니다. 이러한 하이브리드 접근 방식은 상황에 따라 정확할 뿐만 아니라 외부 데이터 소스의 최신 지식이 주입된 응답을 생성하는 AI 모델의 기능을 향상시킵니다.
RAG의 시작은 GPT(Generative Pre-trained Transformer)와 같은 표준 언어 모델의 한계를 극복하려는 탐구로 거슬러 올라갑니다. 기존 모델은 일관된 텍스트를 생성하는 데 능숙함에도 불구하고 특히 구체적인 실시간 지식이 필요한 쿼리의 경우 정확한 사실 기반 응답을 제공하는 데 어려움을 겪는 경우가 많습니다.
다음은 벡터 데이터베이스와 통합하여 검색 증강 생성(RAG)이 작동하는 방식에 대한 설명입니다.
수집 및 인덱싱 : 워크플로는 시스템 인텔리전스의 기초가 되는 포괄적인 기술 자료 로 시작됩니다. 이 기술 자료는 일반적으로 사용자가 쿼리할 수 있는 정보가 포함된 대규모 문서 모음입니다. 이러한 문서는 FAQ 시트 및 기사부터 구조화된 정보 데이터베이스에 이르기까지 무엇이든 될 수 있습니다. 이러한 문서를 활용하기 전에 사전 처리되어 임베딩으로 변환되는 수집 프로세스를 거칩니다. 임베딩 모델 (종종 정교한 기계 학습 알고리즘)을 사용하여 텍스트 정보를 벡터 임베딩으로 변환합니다. 이러한 임베딩은 유사성 비교에 최적인 다차원 공간에서 문서의 의미론적 내용을 수치적으로 나타냅니다.
고객 상호 작용 : 모든 것은 고객이 애플리케이션과 상호 작용하고 쿼리를 제기하는 것으로 시작됩니다. 이 쿼리는 정보에 대한 요청이거나 고객이 AI가 대답하기를 기대하는 질문입니다.
쿼리 임베딩 : 원시 고객 쿼리는 임베딩 모델에 의해 처리됩니다. 이 모델은 텍스트 쿼리를 고차원 공간에서 쿼리의 의미론적 의미를 포착하는 숫자 표현인 벡터로 변환합니다.
벡터 데이터베이스 검색 : 쿼리 벡터는 고차원 벡터 데이터를 처리하도록 설계된 특수 데이터베이스인 벡터 데이터베이스로 전송됩니다. 데이터베이스는 유사성 검색을 수행하여 가장 관련성이 높은 문서 임베딩을 검색합니다. 이러한 임베딩은 시스템에 수집된 기술 자료의 사전 처리된 지식을 나타냅니다.
컨텍스트 검색 : 검색된 문서 임베딩은 원래 쿼리와 결합되어 쿼리와 관련 컨텍스트를 모두 포함하는 프롬프트를 형성합니다.
언어 모델 응답 생성 : 이 강화된 프롬프트는 LLM(언어 학습 모델)에 공급됩니다. LLM은 검색된 문서의 컨텍스트를 사용하여 정확하고 유익하며 상황에 맞게 고객의 쿼리와 관련된 응답을 생성합니다.
생성적 응답(Generative Response) : 마지막으로 LLM은 생성적 응답을 생성하고 이는 앱을 통해 고객에게 다시 전달됩니다. 이 응답은 모델의 사전 훈련된 지식을 기반으로 할 뿐만 아니라 지식 베이스에서 검색된 특정 정보로 보강되어 사용자의 요청과 관련성이 높습니다.
벡터 데이터베이스는 종종 기계 학습에 모델을 삽입하는 것과 같은 프로세스를 통해 수치 벡터 형식으로 변환된 데이터를 저장하고 관리합니다. 임베딩은 원래 입력의 의미적 또는 맥락적 특징을 포착하는 데이터(종종 고차원 벡터)의 숫자 표현입니다. 텍스트 데이터의 경우 임베딩은 단어, 문장 또는 전체 문서를 컴퓨터가 처리할 수 있는 형식으로 변환합니다. 기계 학습 모델, 특히 신경망은 유사한 의미가 벡터 공간에서 가깝도록 이러한 임베딩을 생성하는 데 사용됩니다. 이러한 데이터베이스는 벡터 공간 내에서 주어진 쿼리 벡터에 가장 가까운 데이터 포인트를 찾는 유사성 검색을 효율적으로 수행하도록 설계되었습니다.
프로세스를 자세히 살펴보면 다음과 같습니다.
데이터 저장 : 문서가 수집되면 임베딩 모델(예: 신경망)이 텍스트를 고차원 벡터로 변환합니다. 각 벡터는 문서의 의미론적 의미를 숫자 형식으로 나타냅니다. 그런 다음 이러한 벡터는 벡터 데이터베이스에 저장됩니다.
인덱싱 : 빠른 검색을 용이하게 하기 위해 데이터베이스는 IVF(Inverted File Index) 또는 HNSW(Hierarchical Navigable Small World)와 같은 고차원 공간에 적합한 알고리즘을 사용하여 이러한 벡터에 인덱스를 구축합니다. 색인 유형 선택은 검색 속도와 정확성 사이의 균형을 유지합니다.
유사성 검색 : 쿼리 시에도 동일한 임베딩 모델을 사용하여 벡터로 변환됩니다. 그런 다음 벡터 데이터베이스는 인덱스를 사용하여 쿼리 벡터와 가장 유사한 벡터를 빠르게 찾습니다. 유사성은 유클리드 거리 또는 코사인 유사성과 같은 거리 측정법에 의해 결정됩니다.
임베딩의 장점 :
의미적 유사성 : 임베딩은 의미적으로 유사한 항목이 벡터 공간에서 더 가까워지도록 설계되어 시스템이 맥락과 의미를 이해할 수 있도록 합니다. 예를 들어, 유전체학 분야에서는 유전자 발현 데이터를 임베딩으로 인코딩하여 다양한 유전자와 표현형 간의 관계를 나타내는 패턴을 밝힐 수 있습니다. 이는 전통적인 분석을 통해 명확하지 않을 수 있는 질병에 대한 바이오마커를 식별하는 데 도움이 될 수 있습니다.
복잡한 관계 : 전통적인 표현에서는 놓칠 수 있는 데이터의 복잡한 관계와 미묘한 차이를 포착할 수 있습니다. Netflix 또는 Spotify와 같은 스트리밍 서비스에서 사용되는 추천 시스템에서 실용적인 응용 프로그램을 볼 수 있습니다. 이러한 플랫폼은 임베딩을 사용하여 사용자 선호도와 콘텐츠 기능을 이해함으로써 사용자의 이전 선택과 유사점을 공유하는 영화나 노래를 추천합니다. 콘텐츠의 다양성에도 불구하고 임베딩은 사용자 소비의 더 깊은 패턴을 고려하여 장르나 아티스트를 뛰어넘는 미묘한 추천을 허용합니다.
균일성 : 임베딩은 다양한 데이터 유형을 균일한 벡터 형식으로 변환하여 비교 및 검색과 같은 작업을 단순화합니다.
RAG 및 벡터 DB( Milvus )에 대한 로컬 개발 환경을 생성하려면 몇 가지 주요 단계가 필요합니다.
다음은 체계적인 가이드입니다.
전제 조건 :
시스템에 Python 3.6+가 설치되어 있는지 확인하세요.
Milvus를 실행하려면 Docker가 필요합니다.
가상환경 :
새로운 가상 환경을 생성하고 다음을 사용하십시오.
python3 -m venv rag-milvus-env source rag-milvus-env/bin/activate # Install supporting dependencies pip install transformers datasets faiss-cpu torch sentence-transformers pymilvus
도커를 사용하는 Milvus :
Milvus Docker 이미지를 가져와 실행합니다. (다른 벡터 DB를 사용할 수도 있습니다.)
아래 단계를 사용하거나 여기에 제공된 시작 가이드를 따를 수 있습니다.
docker pull milvusdb/milvus:latest docker run -d --name milvus_cpu -p 19530:19530 -p 19121:19121 milvusdb/milvus:latest
설정 데이터 :
이제 일부 샘플 데이터를 다운로드하고 임베딩을 생성하여 컬렉션에 삽입해 보겠습니다.
import requests import csv url = "http://qim.fs.quoracdn.net/quora_duplicate_questions.tsv" # Download the file response = requests.get(url) response.raise_for_status() # This will raise an error if the download failed # Decode the content and split into lines lines = response.content.decode('utf-8').splitlines() questions = [] # Process the lines reader = csv.reader(lines, delimiter='\t') next(reader) # Skip the header row for row in reader: questions.extend([row[1], row[4]]) # Assuming the questions are in the 2nd and 3rd columns questions = questions[:10000]
임베딩 생성
from sentence_transformers import SentenceTransformer # transformer to create embeddings model = SentenceTransformer('all-MiniLM-L6-v2') embeddings = model.encode(questions)
벡터 DB에 삽입합니다.
# connect to db connections.connect() embedding_size = 384 # Prepare the collection schema fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True), FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=embedding_size) ] schema = CollectionSchema(fields, "questions") collection = Collection("questions", schema) # Insert the document embeddings mr = collection.insert([embeddings]) # to get document, in practice this would be some external DB. id_to_question = {str(mr.primary_keys[i]): questions[i] for i in range(len(questions))} # List all collections collections = list_collections() print(collections)
컬렉션을 색인화합니다.
from pymilvus import Collection index_params = { "metric_type": "L2", "index_type": "HNSW", # Index of type HNSW, refer to docs for other types. "params": { "M": 16, # Example value, adjust as needed "efConstruction": 200 } } collection = Collection("questions") collection.create_index( field_name="embedding", index_params=index_params )
문서 쿼리
query = "What is artificial intelligence?" query_embedding = model.encode(query) collection.load() # Define search parameters search_params = {"metric_type": "L2", "params": {"nprobe": 10}} # Perform the search results = collection.search( data=[query_vector], anns_field="embedding", param=search_params, limit=10, expr=None, consistency_level="Strong" ) # Process results for result in results: milvus_id = str(result.id) # Convert ID to string for dictionary lookup original_question = id_to_question[milvus_id] print(f"Milvus ID: {milvus_id}, Similar Question: {original_question}")
벡터 db에서 의미상 유사한 문서를 얻으면 이 컨텍스트 + 입력 쿼리를 LLM에 전달할 수 있으며 이는 이제 LLM에 컨텍스트가 있으므로 훨씬 더 나은 결과를 얻을 수 있습니다.
결론적으로 RAG를 Milvus와 같은 벡터 데이터베이스와 통합하면 LLM 응용 프로그램에서 가장 시급한 과제 중 일부, 특히 깊은 맥락 이해와 동적 정보 검색이 필요한 과제에 대한 강력한 솔루션을 제공합니다. LLM의 생성 능력과 벡터 데이터베이스의 정확성 및 효율성을 결합함으로써 기업은 AI 기반 응답의 관련성과 정확성을 크게 향상시켜 사용자에게 가치 있고 상황에 맞게 풍부한 상호 작용을 제공할 수 있습니다.
AI가 계속 발전함에 따라 이러한 기술의 융합은 단순한 단계가 아니라 도약을 의미하며 AI가 모든 부문에서 보다 정교하고 다양하며 미묘한 애플리케이션을 지원할 수 있는 미래를 예고합니다. 이 블로그는 혁신가와 실무자가 이러한 도구를 사용하여 실험을 시작하고 엔터프라이즈 AI 애플리케이션 영역에서 가능한 것의 경계를 넓힐 수 있는 무대를 마련했습니다.