[reinvent 2024] Amazon OpenSearch Service로 생성적 AI 기반 검색 구축 [반복]
Summary
Amazon OpenSearch Service를 활용하여 생성적 AI 기반 검색 및 챗봇 애플리케이션을 만드는 여정을 시작하세요. 이 코드 토크에서는 코드 작성 및 배포부터 OpenSearch Service의 기본 구현, 데이터 인덱싱, 벡터 검색 쿼리 실행, 완전 기능을 갖춘 생성적 AI 검색 애플리케이션 구축까지 단계별로 진행되는 과정을 다룹니다. 이 세션에 참여하여 OpenSearch Service를 사용한 AI 기반 프로젝트에 적용하는 데 필요한 실용적인 경험과 지식을 얻어보세요.
리인벤트 2024 테크 블로그의 더 많은 글이 보고 싶다면?
Overview
들어가며
이번 세션은 AWS Bedrock과 OpenSearch를 중심으로 진행되었습니다. Search 기술의 이론적인 개념을 바탕으로 Generative AI 시대에 어떻게 발전되었는지를 설명해주고, 세션 후반부에서는 OpenSearch와 Bedrock을 연계한 코드 예제를 살펴보며, 대규모 데이터를 효과적으로 검색하고 관리하는 방법을 심층적으로 탐구했습니다.
Agenda는 Search Method에 대한 이론을 정리한 후에 Coding(Code Talk) 을 통해 실제로 코드에 대한 간단한 설명을 해주는 시간을 가지고 QnA를 받는 순서로 진행되었습니다.
코드 기반의 RAG Pipeline을 사용하지만, GenAI Powered Search 방식이라는 용어도 생소하고, Agent를 사용한 RAG도 익숙하지 않아서 세션에서 배울 수 있겠다는 기대와 함께 참여하게 되었습니다.
Searching Method
세션에서는 검색 기술의 발전 과정에 대해서 먼저 설명해주었습니다.
- Keyword Search
- 텍스트를 Token으로 쪼갠 후에 인덱스에 저장하는 방법입니다.
- 검색 쿼리와 비교해 빈도와 문서 내 중요도에 따라 결과를 정렬합니다.
- Synonyms(동의어) 활용 및 고전적인 텍스트 검색 알고리즘에 의존합니다.
- Semantic Search
- 텍스트의 의미를 기반으로 합니다.
- 임베딩 모델을 통해 문서를 벡터화하여 유사도를 검색합니다.
- Vector Search
- 임베딩 모델을 통해 문서를 벡터화하여 데이터 간 벡터거리를 계산합니다.
- Hybrid Search
- Keyword search와 vector search를 결합하여 관련성 높은 결과를 생성합니다.
- AI agent-powered Search
- 대화형 검색 방식입니다.
- 이전 문맥을 기억하고 후속 질문에 더 나은 답변을 제공합니다.
GenAI Powered Search Pipeline
앞의 Search Method에 간단하게 작성을 했듯이 대화형 검색을 의미하는 Search 였습니다. 해당 Search 방식의 파이프라인은 다음과 같습니다.
파이프라인에 대해서 설명드리자면, 아래의 순서로 진행됩니다.
- 사용자 쿼리 (User Query)
- 사용자는 자연어로 질문 또는 요청을 입력합니다.
예: “지난달 우리 회사에서 가장 많이 팔린 제품은 무엇인가요?”
- 사용자는 자연어로 질문 또는 요청을 입력합니다.
- 검색 (Search)
- Knowledge Base를 활용해 사용자 쿼리에 적합한 문서를 검색합니다.
- Knowledge Base는 사전에 색인화된 구조적 및 비구조적 데이터로 구성됩니다
- OpenSearch와 같은 검색 엔진을 활용해 쿼리를 처리하며, 검색 방식은 선택합니다.
- 결과적으로 가장 관련성 높은 문서를 반환합니다.
- 관련 문서 추출 (Relevant Document)
- 검색 엔진(OpenSearch)이 반환한 문서를 기준으로 표준 랭킹 알고리즘을 적용합니다.
- 사용자 질문과 가장 관련이 높은 문서를 우선순위로 정렬하고
- 불필요한 문서를 필터링해 최적화된 데이터만 남깁니다.
예: “지난달 판매 데이터”와 관련된 보고서 및 데이터를 반환.
- LLM을 통한 컨텍스트 기반 처리 (Context Processing with LLM)
- 관련 문서가 LLM에 입력되어 추가 처리가 됩니다.
- 문서의 내용을 분석하고, 질문의 맥락에 따라 필요한 정보를 추출하여 응답 형식으로 재구성합니다.
- Bedrock과 같은 LLM을 활용하여 문서 요약, 핵심 정보 추출, 답변 생성을 합니다.
- 최종 응답 생성 (Generate Final Answer)
- LLM이 처리한 데이터를 바탕으로 최종 응답을 생성하여 자연어 형식으로 사용자에게 결과를 전달합니다.
예: “지난달 우리 회사에서 가장 많이 팔린 제품은 A이며, 총 10,000개가 판매되었습니다.”
- LLM이 처리한 데이터를 바탕으로 최종 응답을 생성하여 자연어 형식으로 사용자에게 결과를 전달합니다.
Code Talk
코드에 대한 간단한 설명과 함께 플로우를 설명드립니다.
Cloudformation Stack을 통해 데이터 유입
→ OS Client를 맺고, 데이터를 기반으로 Index 생성
→ Query : Does this work with xbox?
→ Keyword Search (전부 동일한 경우만 True)
→ Semantic Search (실제 단어가 안쓰여도 의미가 유사하면 True)
1번의 과정에서는 고전적인 Search 방법에 대해 확인할 수 있습니다.
RAG Pipeline의 아키텍처는 아래와 같습니다.
이 과정에서 수행된 코드 Talk는 다음과 같습니다.
→ 로드된 데이터를 Text Splitter로 텍스트 분할
→ OS에 문서 인덱싱 후 OpenSearchVectorSearch 객체 생성
→ Vector 검색을 위한 Retriever 설정
→ RetrievalQA 체인 생성 및 쿼리
→ 사용자 쿼리에 대한 응답 생성
Standard RAG로 Search하는 방식은 실시간 정보, 외부 정보가 들어왔을 때 한계가 있습니다.
따라서 AI Agent-Powered Search는 에이전트 모델을 활용하여 이러한 한계를 극복합니다.
→ Chain-of-Thought (사고 과정을 통해 문제를 분해하고, 필요하면 외부 리소스 검색)
→ 외부 도구 사용(검색 엔진, API etc)
→ 결과 생성
대화형 체인은 “Chain-of-Thought “의 함수에서 Cache를 잡아서 문맥의 흐름을 이해할 수 있습니다.
해당 부분에 중요한 부분만 정리해보면 아래와 같습니다.
- Create_new_memory_with_session (대화 메모리 생성)
- ConversationBufferMemory (대화 기록 + 문맥 유지)
- Create_xml_agent (Agent 생성)
- AgentExecutor (Agent 실행)
결론
이번 세션에서는 AI Agent-Powered Search와 RAG 모델을 활용한 검색 시스템 구축에 대해 다뤘습니다. 먼저, OpenSearch와 같은 검색 도구를 이용한 고전적인 검색 방식을 살펴보았고, 그 이후에는 Standard RAG를 사용하여 검색 결과를 생성하고, 벡터 검색을 기반으로 더 정확한 답변을 도출하는 방법을 학습했습니다. 마지막으로, AI Agent-Powered Search를 통해 실시간 정보와 외부 도구를 활용하는 방식으로, 지식 베이스 외의 정보를 어떻게 활용할 수 있는지 살펴보았습니다.
AI Agent-Powered Search를 통해 실시간 정보를 검색하고 처리하는 방식이 매우 인상적이었습니다. 이 기술을 활용하면 단순히 정보를 찾는 것을 넘어, 동적인 응답을 생성할 수 있다는 것을 알았습니다. 기존 프로젝트에서 잘 사용해보지 못했던 Agent 이용 방법을 배울 수 있는 유익한 시간이었습니다.