OpenAI의 내장 검색 기능 출시로 RAG에 여전히 벡터 데이터베이스가 필요할까?
OpenAI는 DevDay에서 GPT-4 Turbo 모델, 새로운 Assistants API, 그리고 다양한 개선 사항을 공개하며 다시 한번 수많은 출시 소식으로 헤드라인을 장식했습니다. Assistants API는 개발자가 특정 요구 사항을 충족하는 맞춤형 AI 애플리케이션을 제작하도록 돕는 강력한 도구로 부상했습니다. 또한 추가 지식, 더 긴 프롬프트 길이, 다양한 작업을 위한 도구를 활용할 수 있게 해줍니다.
OpenAI Assistants에는 통합 검색 기능이 포함되어 있지만 완벽하지는 않습니다 — 데이터 규모에 대한 제한과 사용자 지정 기능의 부족을 생각해 보세요. 바로 이 지점에서 맞춤형 검색기가 도움을 주기 위해 등장합니다. OpenAI의 함수 호출 기능을 활용하면 개발자는 사용자 지정 검색기를 원활하게 통합하여 추가 지식의 규모를 확장하고 다양한 사용 사례에 더 잘 맞출 수 있습니다. 이 블로그 게시물에서는 OpenAI의 내장 검색 기능의 제약을 살펴보고 Milvus 벡터 데이터베이스를 사용하여 사용자 지정 검색기를 만드는 방법을 안내합니다.
Assistants에서 OpenAI 검색 기능의 한계와 사용자 지정 검색 솔루션의 역할
OpenAI의 내장 Retrieval 기능은 모델 고유의 지식을 뛰어넘는 도약을 의미하며, 사용자가 독점 제품 정보나 사용자가 제공한 문서와 같은 추가 데이터로 이를 보강할 수 있게 합니다. 그러나 이는 주목할 만한 한계에 직면해 있습니다.
확장성 제약
OpenAI Retrieval은 방대한 문서 저장소에는 부족할 수 있는 파일 및 총 저장소 제약을 부과합니다:
assistant당 최대 20개 파일
파일당 512MB 한도
테스트 중 발견된 파일당 200만 토큰의 숨겨진 제한
조직당 총 크기 100GB 미만 제한
방대한 데이터 저장소를 보유한 조직에는 이러한 제한이 과제가 됩니다. 저장 한도에 부딪히지 않고 원활하게 확장되는 확장 가능한 솔루션이 필수적입니다. Milvus 또는 Zilliz Cloud(관리형 Milvus)와 같은 벡터 데이터베이스로 구동되는 사용자 지정 검색기를 통합하면 OpenAI의 내장 Retrieval에 내재된 파일 제한을 우회할 수 있는 해결책을 제공합니다.
사용자 지정 부족
OpenAI의 Retrieval은 편리한 즉시 사용 가능한 솔루션을 제공하지만, 특히 지연 시간과 검색 알고리즘 사용자 지정과 관련하여 모든 애플리케이션의 특정 요구 사항에 일관되게 부합할 수는 없습니다. 타사 벡터 데이터베이스를 활용하면 개발자는 검색 프로세스를 최적화하고 구성할 수 있는 유연성을 얻어, 프로덕션 요구 사항을 충족하고 전반적인 효율성을 향상할 수 있습니다.
멀티테넌시 부족
Retrieval은 OpenAI Assistants의 내장 기능으로, 개별 사용자 사용만 지원합니다. 하지만 공유 문서와 사용자의 개인 정보를 모두 활용해 수백만 명의 사용자에게 서비스를 제공하려는 개발자라면 내장 검색 기능은 도움이 되지 않습니다. 공유 문서를 각 사용자의 Assistant에 복제하면 저장 비용이 증가하는 반면, 모든 사용자가 동일한 Assistant를 공유하게 하면 사용자별 개인 문서를 지원하는 데 어려움이 생깁니다.
다음 그래프는 OpenAI Assistants에 문서를 저장하는 비용이 비싸다는 것을 보여줍니다(월 GB당 $6; 참고로 AWS S3는 $0.023을 청구함). 따라서 OpenAI에 중복 문서를 저장하는 것은 엄청나게 낭비적입니다.
Assistants API Pricing from https://openai.com/pricing
방대한 데이터셋을 보유한 조직에는 특정 운영 요구 사항에 부합하는 확장 가능하고 효율적이며 비용 효율적인 검색기가 필수적입니다. 다행히 OpenAI의 유연한 함수 호출 기능을 통해 개발자는 사용자 지정 검색기를 OpenAI Assistants와 원활하게 통합할 수 있습니다. 이 솔루션은 기업이 고유한 요구 사항에 맞는 확장성과 유연성을 유지하면서 OpenAI가 제공하는 최고의 AI 기능을 활용할 수 있도록 보장합니다.
맞춤형 OpenAI 검색을 위한 Milvus 활용
Milvus는 수십억 개의 벡터를 밀리초 내에 저장하고 검색할 수 있는 오픈 소스 벡터 데이터베이스입니다. 또한 사용자의 빠르게 증가하는 비즈니스 요구 사항을 충족할 수 있도록 뛰어난 확장성을 제공합니다. 빠른 확장성과 초저지연을 갖춘 Milvus 벡터 데이터베이스는 OpenAI 어시스턴트를 위한 고도로 확장 가능하고 더 효율적인 검색기를 구축하는 데 있어 최고의 선택지 중 하나입니다.
맞춤형 OpenAI 검색기가 작동하는 방식
OpenAI function calling과 Milvus 벡터 데이터베이스로 맞춤형 검색기 구축하기
단계별 가이드를 따라 맞춤형 검색기를 구축하고 OpenAI와 통합해 보겠습니다.
- 환경을 설정합니다.
pip install openai==1.2.0
pip install langchain==0.0.333
pip install pymilvus
export OPENAI_API_KEY=xxxx # Enter your OpenAI API key here
- 벡터 데이터베이스로 맞춤형 검색기를 구축합니다. 이 가이드에서는 벡터 데이터베이스로 Milvus를, 래퍼로 LangChain을 사용합니다.
from langchain.vectorstores import Milvus
from langchain.embeddings import OpenAIEmbeddings
# Prepare retriever
vector_db = Milvus(
embedding_function=OpenAIEmbeddings(),
connection_args = {'host': 'localhost', 'port': '19530'}
)
retriever = vector_db.as_retriever(search_kwargs={'k': 5}) # change top_k here
- 추가 문서를 Milvus에 수집합니다. 문서는 벡터 데이터베이스에 수집되기 전에 파싱되고, 청크로 나뉘며, 임베딩으로 변환됩니다. 개발자는 검색 품질을 향상하기 위해 각 단계를 맞춤 설정할 수 있습니다.
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# Parsing and chunking the document.
filepath = 'path/to/your/file'
doc_data = TextLoader(filepath).load_and_split(
RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
)
# Embedding and insert chunks into the vector database.
vector_db.add_texts([doc.page_content for doc in doc_data])
이제 개인 또는 독점 데이터를 기반으로 의미론적 검색을 수행할 수 있는 맞춤형 검색기를 성공적으로 구축했습니다. 다음으로, 콘텐츠 생성을 가능하게 하려면 이 검색기를 OpenAI Assistants와 통합해야 합니다.
- OpenAI의 Function Calling 기능으로 Assistant를 생성합니다. Assistant는 쿼리에 응답할 때
CustomRetriever라는 함수 도구를 사용하도록 지시받습니다.
import os
from openai import OpenAI
# Setup OpenAI client.
client = OpenAI(api_key=os.getenv('OPENAI_API_KEY'))
# Create an Assistant.
my_assistant = client.beta.assistants.create(
name='Chat with a custom retriever',
instructions='You will search for relevant information via retriever and answer questions based on retrieved information.',
tools=[
{
'type': 'function',
'function': {
'name': 'CustomRetriever',
'description': 'Retrieve relevant information from provided documents.',
'parameters': {
'type': 'object',
'properties': {'query': {'type': 'string', 'description': 'The user query'}},
'required': ['query']
},
}
}
],
model='gpt-4-1106-preview', # Switch OpenAI model here
)
- Assistant는 쿼리 응답 작업을 비동기적으로 수행합니다.
Run은 Thread 중 Assistant의 호출입니다. run 작업 중에 Assistant는 함수가CustomRetriever를 호출해야 하는지 여부를 결정하고 함수 호출 결과를 기다립니다.
QUERY = 'ENTER YOUR QUESTION HERE'
# Create a thread.
my_thread = client.beta.threads.create(
messages=[
{
'role': 'user',
'content': QUERY,
}
]
)
# Invoke a run of my_assistant on my_thread.
my_run = client.beta.threads.runs.create(
thread_id=my_thread.id,
assistant_id=my_assistant.id
)
# Wait until my_thread halts.
while True:
my_run = client.beta.threads.runs.retrieve(thread_id=thread.id, run_id=my_run.id)
if my_run.status != 'queued':
break
- 이제 Assistant가 함수 호출 결과를 기다리고 있습니다. 쿼리에 대한 벡터 검색을 수행하고 결과를 제출하세요.
# Conduct vector search and parse results when OpenAI Run ready for the next action
if my_run.status == 'requires_action':
tool_outputs = []
for tool_call in my_run.required_action.submit_tool_outputs.tool_calls:
if tool_call.function.name == 'Custom Retriever':
search_res = retriever.get_relevant_documents(QUERY)
tool_outputs.append({
'tool_call_id': tool_call.id,
'output': ('\n\n').join([res.page_content for res in search_res])
})
# Send retrieval results to your Run service
client.beta.threads.runs.submit_tool_outputs(
thread_id=my_thread.id,
run_id=my_run.id,
tool_outputs=tool_outputs
)
- OpenAI와의 전체 대화를 추출하고 파싱하세요.
messages = client.beta.threads.messages.list(
thread_id=my_thread.id
)
for m in messages:
print(f'{m.role}: {m.content[0].text.value}\n')
완료되었습니다! Milvus 기반의 커스텀 retriever를 활용하여 제공된 지식에 대해 OpenAI Assistant와 성공적으로 대화했습니다.
결론
OpenAI Assistants의 내장 retrieval 도구는 인상적이지만, 스토리지 제약, 확장성 문제, 다양한 사용자 요구에 대한 커스터마이징 부족과 같은 한계에 직면해 있습니다. 이 도구는 개별 사용자만을 대상으로 하므로, 수백만 명의 사용자와 공유 및 비공개 문서를 모두 보유한 애플리케이션에는 어려움을 야기합니다.
Milvus 또는 Zilliz Cloud(Milvus의 완전 관리형 버전)와 같은 강력한 벡터 데이터베이스를 사용해 커스텀 retriever를 구축하면 위의 문제를 극복하는 데 도움이 됩니다. 이 접근 방식은 OpenAI Assistant API 통합을 통해 향상된 유연성과 파일 관리 제어를 제공합니다.
다음 게시물에서는 OpenAI Retrieval과 커스텀 retriever의 성능, 비용, 기능을 비교할 예정입니다. 또한 벤치마크 결과를 공개하고 retrieval 품질을 향상하기 위한 최적의 솔루션을 찾는 개발자들에게 유용한 인사이트를 제공하겠습니다. 기대해 주세요!
계속 읽기
Stop Building AI Data Infra for the Wrong Stage
Learn how AI data infrastructure should evolve from prototype to enterprise scale, and when Vector Lakebase becomes the right architecture for AI apps.

Why Context Engineering Is Becoming the Full Stack of AI Agents
Discover how context engineering unifies prompts, RAG, and tools to build smarter, production-ready AI agents powered by Milvus.

VidTok: Rethinking Video Processing with Compact Tokenization
VidTok tokenizes videos to reduce redundancy while preserving spatial and temporal details for efficient processing.



