지능형 시스템에서 인컨텍스트 검색의 역할
이 글에서는 지능형 시스템에서 인컨텍스트 검색의 역할과 그 동작 방식을 자세히 살펴봅니다. 이 글은 AI로 번역되었습니다. 오역 가능성이 있으면 댓글로 알려주세요.
Created on September 15|Last edited on September 15
Comment
인공지능(AI) 시스템이 고도화됨에 따라, 관련 정보를 효율적으로 검색하고 통합하는 능력이 핵심 역량으로 떠오르고 있습니다. 전통적인 검색 방식, 예를 들어 검색 증강 생성 (RAG)은 명시적인 데이터베이스 조회와 키워드 매칭에 의존합니다. 그러나 이러한 방식은 동적인 환경에서는 한계가 있을 수 있습니다.
인컨텍스트 검색(ICR)은 생성이나 의사결정 과정 중에 AI 모델이 관련 정보를 동적으로 검색하고 활용할 수 있게 하는 대안적 접근 방식으로, 출력 결과를 더 관련된, 일관된, 그리고 개인화된.
이 글에서 우리는 다음을 다룹니다:
- 인컨텍스트 검색을 정의하고, RAG 및 인컨텍스트 학습과의 차이를 설명하세요.
- AI 시스템에서 사용되는 다양한 검색 메커니즘을 살펴보기.
- 컨텍스트 생성에서 프롬프트의 역할을 살펴보기.
- 경량 검색 시스템을 활용한 실용 구현을 제시하세요.
인컨텍스트 검색이란 무엇인가요?
인컨텍스트 검색(ICR)은 사전에 인덱싱된 데이터베이스에만 의존하지 않고, 실시간 컨텍스트를 바탕으로 AI 모델이 관련 정보를 검색하고 통합하는 기법입니다. 전통적인 검색 방식이 먼저 정보를 검색한 뒤 이를 사용하는 절차를 따르는 것과 달리, ICR은 동일한 과정 안에서 정보를 동적으로 검색하고 통합합니다.
인컨텍스트 검색은 RAG 및 인컨텍스트 학습과 어떻게 다른가
| Feature | In-Context Retrieval (ICR) | Retrieval-Augmented Generation (RAG) | In-Context Learning (ICL) |
|---|---|---|---|
| Definition | Dynamically retrieves relevant data during model execution | Fetches relevant data from an external source before text generation | Uses provided examples to generate relevant responses without explicit retrieval |
| Data Source | External APIs, databases, embeddings, real-time context | Pre-indexed knowledge bases, vector stores | No retrieval; uses in-prompt examples |
| Use Case | AI-powered search engines, adaptive chatbots | Fact-checking, document Q&A, research assistants | Few-shot learning, text classification |
AI 모델이 검색된 데이터를 통합하는 방법
- ICR: 실시간 정보 검색 결과에 따라 응답을 조정합니다(예: 속보 검색).
- RAG: 텍스트를 생성하기 전에 사전에 인덱싱된 데이터를 쿼리와 결합합니다.
- ICL: 외부 데이터를 검색하지 않고, 프롬프트 내부의 예시를 사용해 모델 출력을 유도합니다.
AI에서의 검색 유형

출처: 인포그래픽에서 생성됨
AI 검색 프로세스는 작업별 최적화를 위해 다양한 형태를 취할 수 있습니다.
1. 명시적 검색
- 외부 데이터베이스나 API를 직접 쿼리합니다.
- 예시: Google 검색은 웹 결과를 검색하여 표시합니다.
- 실제 활용 사례: 판례를 검색하는 법률 AI 어시스턴트
2. 암묵적 검색
- 사전 학습된 모델에 저장된 내부 지식을 활용합니다.
- 예시: 이전 문맥을 바탕으로 문장을 완성하는 GPT 모델.
- 실제 활용 사례: 내부 지식을 활용해 텍스트를 생성하는 GPT 모델
3. 맥락 기반 검색
- 실시간 사용자 맥락에 따라 관련 정보를 동적으로 검색합니다.
- 예시: AI 챗봇이 과거 사용자 상호작용을 검색하여 응답을 개인화합니다.
- 실제 활용 사례: 사용자 선호도에 따라 결과를 조정하는 개인화된 AI 검색 엔진
맥락 생성에서 프롬프트의 역할
프롬프트는 AI가 맥락을 추출하고 해석하기 위한 진입점 역할을 합니다. 프롬프트의 품질은 AI가 정보를 얼마나 효과적으로 검색하고 통합하는지에 직접적인 영향을 미칩니다.
맥락 인지형 AI에서의 프롬프트 엔지니어링
- 가이드형 검색 구조화된 프롬프트를 사용하여 관련된 세부 정보만 추출하기.
- 예시: “최신 기업 재무 보고서만 검색하세요.”
- 맥락 확장: 후속 프롬프트를 사용하여 쿼리를 정교화하기.
- 예시: “검색된 데이터에서 핵심 요점을 요약하세요.”
컴퓨터 비전과 NLP에서의 맥락
실용 구현
우리는 다음을 사용하여 검색 기반 AI 시스템을 구현할 것입니다 20 Newsgroups 데이터셋컴퓨터 과학, 정치, 스포츠를 포함한 20개 주제에 걸쳐 약 20,000개의 문서를 포함하고 있습니다. 우리의 목표는 Elasticsearch를 사용해 이 데이터셋을 효율적으로 색인하고 검색하며, Weights & Biases로 시스템 모니터링을 강화하는 것입니다.
1. 환경 설정
필요한 라이브러리와 도구
- 문서 색인과 조회를 위한 Elasticsearch.
- 텍스트 처리를 위한 자연어 처리(NLP) 라이브러리(spaCy, NLTK, 또는 Hugging Face Transformers).
- 검색 성능을 추적하고 시각화하기 위한 Weights & Biases.
pip install elasticsearch nltk wandb
2. 데이터셋 불러오기
우리는 …를 임포트합니다 sklearn.datasets scikit-learn 라이브러리의 모듈로, 20 Newsgroups 데이터셋을 포함한 다양한 데이터셋에 편리하게 접근할 수 있도록 제공합니다.
우리는 20 Newsgroups 데이터셋을 사용하여 불러옵니다 fetch_20newsgroups 함수. 그 subset='all' 매개변수는 전체 데이터셋을 불러오도록 보장하며, remove=('headers', 'footers', 'quotes') 문서에서 머리말, 꼬리말, 인용된 텍스트를 모두 제거하고 본문만 남깁니다.
The fetch_20newsgroups 함수는 데이터셋 객체를 반환합니다 newsgroups_data 여러 속성을 포함하여 data, 각 문서의 텍스트 내용을 담은 목록입니다.
import sklearn.datasets# Load the 20 Newsgroups datasetnewsgroups_data = sklearn.datasets.fetch_20newsgroups(subset='all', remove=('headers', 'footers', 'quotes'))
3. 색인을 위한 딕셔너리 목록 만들기
Elasticsearch에서 색인을 준비하기 위해, 각 문서를 나타내는 딕셔너리로 구성된 목록을 만듭니다. 각 딕셔너리는 두 개의 키를 가집니다: title 그리고 content. The title value는 문서를 식별하는 간단한 문자열입니다(예: "Document 1", "Document 2" 등). 반면, the content value는 문서의 실제 텍스트 내용이며, 다음에서 가져옵니다 newsgroups_data.data.
# Create a list of dictionaries for indexingdocuments = [{'title': f'Document {i}', 'content': newsgroups_data.data[i]} for i in range(len(newsgroups_data.data))]
이 딕셔너리 목록을 만들면 Elasticsearch가 쉽게 색인하고 검색할 수 있는 형식으로 데이터를 구조화하게 됩니다. 각 딕셔너리는 하나의 문서를 나타내며, 제목과 본문 필드는 Elasticsearch 인덱스의 해당 필드에 매핑됩니다.
이 단계를 마치면 20 Newsgroups 데이터셋이 로드되고 Elasticsearch에 색인할 수 있도록 구조화됩니다. 다음 단계에서는 Elasticsearch 인덱스를 생성하고 문서들을 색인하겠습니다.
4. Elasticsearch 설치 및 시작
!pip install Elasticsearch -q# download elasticsearch!wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.1-linux-x86_64.tar.gz -q!tar -xzf elasticsearch-7.9.1-linux-x86_64.tar.gz!chown -R daemon:daemon elasticsearch-7.9.1
5. OS 서버 시작
먼저, 외부 프로그램을 실행하고 운영 체제와 상호작용하기 위해 필요한 모듈을 임포트합니다. 그런 다음, 의 Popen 함수를 사용합니다. subprocess Elasticsearch 서버를 시작하기 위한 모듈입니다. Elasticsearch 실행 파일의 경로를 인자로 제공합니다 (elasticsearch-7.9.1/bin/elasticsearch). 추가 옵션도 지정합니다:
- stdout=PIPE 및 stderr=STDOUT Elasticsearch의 출력과 오류 메시지를 Python 스크립트로 리디렉션합니다.
- preexec_fn=lambda: os.setuid(1) 보안상의 이유로 Elasticsearch가 루트가 아닌 사용자로 실행되도록 보장합니다.
- Elasticsearch 서버를 시작한 후, 우리는 !curl -X GET "localhost:9200/" HTTP GET 요청을 보내기 위한 명령어 http://localhost:9200/, Elasticsearch 서버가 요청을 수신하는 기본 주소와 포트입니다.
이 curl 이 명령어는 Elasticsearch 서버가 정상적으로 실행 중이며 응답하는지 테스트하는 데 사용됩니다. 서버가 실행 중이고 접근 가능하다면, Elasticsearch 클러스터에 대한 정보가 포함된 JSON 응답이 표시됩니다.
# start serverimport osfrom subprocess import Popen, PIPE, STDOUTes_server = Popen(['elasticsearch-7.9.1/bin/elasticsearch'],stdout=PIPE, stderr=STDOUT,preexec_fn=lambda: os.setuid(1))# wait a bit then test!curl -X GET "localhost:9200/"
6. Elasticsearch에 연결하기
# client-side!pip install elasticsearch==7.9.1import elasticsearchfrom elasticsearch import Elasticsearch# Connect to Elasticsearchfrom datetime import datetimees = Elasticsearch([{'host': 'localhost' , 'port': 9200, "scheme": "http"}])es.ping()
7. 인덱스 매핑 정의 및 인덱스 생성
매핑을 정의하고 20 Newsgroups 데이터셋의 문서들을 인덱싱합니다.
# Define the index mappingindex_name = "newsgroups_index"mapping = {"properties": {"title": {"type": "text"},"content": {"type": "text"}}}
8. 인덱스 생성
문서 제목과 내용을 담은 딕셔너리 목록을 생성하며, 이는 Elasticsearch로 인덱싱될 것입니다.
# Create the indexes.indices.create(index=index_name, ignore=400)es.indices.put_mapping(index=index_name, body=mapping)# Index the documentsfor doc in documents:es.index(index=index_name, body=doc)
9. 필요한 NLTK 리소스 다운로드
문서를 인덱싱하기 전에, 검색 품질과 관련성을 높이기 위해 데이터 전처리와 정제 과정을 수행하는 것이 중요합니다. 일반적으로 토크나이즈, 불용어 제거, 그리고 스테밍/표제어 추출과 같은 작업이 포함됩니다.
nltk.download('punkt')nltk.download('stopwords')import nltkfrom nltk.corpus import stopwordsfrom nltk.stem import PorterStemmer
10. 불용어와 스테머 초기화
# Initialize stopwords and stemmerstop_words = set(stopwords.words('english'))stemmer = PorterStemmer()
11. 데이터 전처리
# Preprocess the datapreprocessed_documents = []for document in newsgroups_data.data:# Tokenize the documenttokens = nltk.word_tokenize(document.lower())
12. 불용어 제거
# Remove stopwords and stem the tokensfiltered_tokens = [stemmer.stem(token) for token in tokens if token not in stop_words]
13. 토큰 결합
# Join the tokens back into a single stringpreprocessed_text = ' '.join(filtered_tokens)preprocessed_documents.append(preprocessed_text)
14. 인덱싱을 위한 딕셔너리 목록 생성
# Create a list of dictionaries for indexingdocuments = [{'title': f'Document {i}', 'content': preprocessed_documents[i]} for i in range(len(preprocessed_documents))]
15. 인덱스 질의하기
Elasticsearch에 연결하고 질의할 인덱스를 지정합니다 (newsgroups_index). 단어 “comput”를 포함하는 문서를 찾는 기본 질의를 정의합니다(데이터를 전처리했기 때문에 “computer”의 스테밍 형태를 사용합니다).
from elasticsearch import Elasticsearch# Connect to Elasticsearches = Elasticsearch()index_name = "newsgroups_index"# Basic queryquery = {"query": {"match": {"content": "comput"}}}
16. 질의 검색 실행
검색 질의를 실행합니다 es.search(index=index_name, body=query) 그리고 결과 수를 출력합니다. Elasticsearch의 Query DSL을 사용해 더 복잡한 질의를 정의합니다. 이 질의는 제목이 "Document"이고 "scienc"(“science”의 스테밍 형태)라는 단어를 포함하는 문서를 검색합니다. 복잡한 질의를 실행한 뒤 결과 수를 출력합니다.
results = es.search(index=index_name, body=query)print(f"Number of results: {len(results['hits']['hits'])}")# More complex query using Elasticsearch's Query DSLquery = {"query": {"bool": {"must": [{"match": {"title": "Document"}},{"match": {"content": "computer science"}}]}}}results = es.search(index=index_name, body=query)print(f"Number of results: {len(results['hits']['hits'])}")
17. 시스템 모니터링을 위한 Weights & Biases 사용
!pip install wandbimport wandb# Initialize Weights & Biaseswandb.init(project="newsgroups-retrieval-system")# Log system metricsfor i in range(100):query = {"query": {"match": {"content": "comput"}}}metrics = {"query_time": results["took"],"num_results": len(results["hits"]["hits"])}wandb.log(metrics)# Visualize system performancewandb.finish()

성능을 시각화하기 위해 지표를 로깅한 후, 스텝 수가 증가할수록 질의 시간이 0에 수렴하는 것을 관찰할 수 있습니다.
결론
인컨텍스트 리트리벌은 모델이 관련 정보를 동적으로 접근하고 통합할 수 있게 함으로써 AI를 변화시키고 있습니다. 이를 통해 적응성, 일관성, 개인화가 향상됩니다. 이러한 기법은 전통적인 검색 방식보다 큰 이점을 제공하여, 다양한 작업과 환경 전반에서 AI 시스템을 더욱 효과적으로 만듭니다.
AI가 계속 발전함에 따라 인컨텍스트 리트리벌은 자연어 처리, 의사결정 지원 시스템, 실시간 정보 검색에서 점점 더 중요한 역할을 하게 될 것입니다. 이 글에서 소개한 방법과 코드를 실험해 보면서 이 강력한 접근 방식의 잠재력을 탐구하고, 더 지능적이며 문맥을 이해하는 AI 솔루션을 구축할 수 있습니다.
Add a comment