Skip to main content

OpenSearch와 OpenAI를 활용한 RAG 기반 Q&A 시스템 구축

카카오클라우드 Advanced Managed Search와 OpenAI API를 활용하여 RAG 기반 Q&A 시스템을 구축하는 방법을 설명합니다.

기본 정보

시나리오 소개

이 튜토리얼에서는 사내 문서, FAQ, 기술 가이드와 같은 비정형 텍스트 데이터를 OpenSearch에 저장하고, OpenAI LLM과 결합하여 자연어 질의응답(Q&A) 시스템을 구성합니다.

OpenSearch는 대규모 문서를 빠르게 검색하는 역할을 담당하고, OpenAI는 검색된 문서를 바탕으로 사용자의 질문에 맞는 답변을 생성합니다.

주요 내용은 다음과 같습니다.

  • 문서를 벡터(Embedding)로 변환하여 OpenSearch에 저장
  • 질문을 벡터로 변환하여 의미 기반 검색 수행
  • 검색 결과를 LLM에 전달하여 문맥 기반 답변 생성
  • LLM 단독 사용 대비 정확성과 최신성 향상

시작하기 전에

본 튜토리얼은 OpenSearch와 OpenAI를 활용한 벡터 검색 구현 튜토리얼을 완료했다는 가정하에 진행됩니다.

시작하기

Step 1. Q&A에 사용할 문서 데이터 준비

예를 들어 서울, 부산, 인천의 인구 수를 다음과 같은 형식으로 저장했다고 가정합니다.

POST _bulk
{ "index": { "_index": "korea_population", "_id": "1" } }
{ "text": "1950년부터 2023년까지 서울 광역권 인구 규모와 증가율에 대한 차트 및 표입니다. 또한 2035년까지의 유엔 인구 전망치도 포함되어 있습니다.\n2023년 서울 광역권 현재 인구는 25,925,000명이며, 2022년 대비 0.32% 증가했습니다.\n2022년 서울 광역권 인구는 25,842,000명이며, 2021년 대비 0.21% 증가했습니다.\n2021년 서울 광역권 인구는 25,788,000명이며, 2020년 대비 0.05% 증가했습니다.\n2020년 서울 광역권 인구는 25,775,000명이며, 2019년 대비 0.1% 감소했습니다." }
{ "index": { "_index": "korea_population", "_id": "2" } }
{ "text": "1950년부터 2023년까지 부산 광역권 인구 규모와 증가율에 대한 차트 및 표입니다.\n2023년 부산 광역권 현재 인구는 3,345,000명이며, 2022년 대비 0.15% 감소했습니다.\n2022년 부산 광역권 인구는 3,350,000명이며, 2021년 대비 0.30% 감소했습니다.\n2021년 부산 광역권 인구는 3,360,000명이며, 2020년 대비 0.45% 감소했습니다.\n2020년 부산 광역권 인구는 3,375,000명이며, 2019년 대비 0.50% 감소했습니다." }
{ "index": { "_index": "korea_population", "_id": "3" } }
{ "text": "1950년부터 2023년까지 인천 광역권 인구 규모와 증가율에 대한 차트 및 표입니다.\n2023년 인천 광역권 현재 인구는 3,015,000명이며, 2022년 대비 0.85% 증가했습니다.\n2022년 인천 광역권 인구는 2,990,000명이며, 2021년 대비 0.90% 증가했습니다.\n2021년 인천 광역권 인구는 2,963,000명이며, 2020년 대비 1.10% 증가했습니다.\n2020년 인천 광역권 인구는 2,931,000명이며, 2019년 대비 1.20% 증가했습니다." }

각 문서는 자동으로 임베딩이 생성되어 벡터 인덱스에 저장됩니다.

Step 2. OpenSearch에서 ML Connector 생성

GPT-4o 모델을 사용한 ML Connector를 생성합니다.

POST _plugins/_ml/connectors/_create
{
"name": "OpenAI GPT-4o",
"description": "Connector for OpenAI GPT-4o (Korean Demo)",
"version": "1.0",
"protocol": "http",
"parameters": {
"endpoint": "api.openai.com",
"model": "gpt-4o"
},
"credential": {
"openAI_key": "${OPEN_API_KEY}"
},
"actions": [
{
"action_type": "predict",
"method": "POST",
"url": "https://${parameters.endpoint}/v1/chat/completions",
"headers": {
"Authorization": "Bearer ${credential.openAI_key}"
},
"request_body": "{ \"model\": \"${parameters.model}\", \"messages\": ${parameters.messages} }"
}
]
}
환경변수설명
OPEN_API_KEY🖌OpenAI에서 발급한 API Key

Step 3. OpenSearch에 Model 배포

위에서 만든 Connector를 Model로 배포합니다.

POST /_plugins/_ml/models/_register?deploy=true
{
"name": "OpenAI GPT-4o model (Korean)",
"function_name": "remote",
"description": "OpenAI GPT-4o remote model for Korean RAG demo",
"connector_id": "${CONNECTOR_ID}"
}
환경변수설명
CONNECTOR_ID🖌위에서 생성한 CONNECTOR_ID

Step 4. Search Pipeline 생성

검색된 문서를 LLM에게 전달할 Search Pipeline을 구성합니다.

PUT /_search/pipeline/korean-population-search-pipeline
{
"response_processors": [
{
"retrieval_augmented_generation": {
"tag": "Population Demo Pipeline",
"description": "Population RAG Pipeline using OpenAI GPT-4o",
"model_id": "${MODEL_ID}",
"context_field_list": [
"text"
],
"system_prompt": "당신은 한국 도시 인구 데이터를 기반으로 정확하게 답변하는 AI입니다.",
"user_instructions": "주어진 데이터를 기반으로 100자 이내로 간결하게 답변하세요."
}
}
]
}
환경변수설명
MODEL_ID🖌위에서 생성한 MODEL_ID

Step 5. RAG 검색 수행

위 컨텍스트를 OpenAI GPT 모델에 전달하여 답변을 생성합니다.

GET /korea_population/_search?search_pipeline=korean-population-search-pipeline
{
"query": {
"match": {
"text": "인천 인구 2021년부터 2023년까지 얼마나 증가했나요?"
}
},
"size": 1,
"_source": [
"text"
],
"ext": {
"generative_qa_parameters": {
"llm_model": "gpt-4o",
"llm_question": "인천 인구 2021년부터 2023년까지 얼마나 증가했나요?",
"context_size": 5,
"timeout": 15
}
}
}

Step 6. 최종 Q&A 응답

LLM은 검색된 문서를 기반으로 다음과 같은 답변을 생성합니다.

{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": 2.024196,
"hits": [
{
"_index": "korea_qa_demo",
"_id": "3",
"_score": 2.024196,
"_source": {
"text": "1950년부터 2023년까지 인천 광역권 인구 규모와 증가율에 대한 차트 및 표입니다.
2023년 인천 광역권 현재 인구는 3,015,000명이며, 2022년 대비 0.85% 증가했습니다.
2022년 인천 광역권 인구는 2,990,000명이며, 2021년 대비 0.90% 증가했습니다.
2021년 인천 광역권 인구는 2,963,000명이며, 2020년 대비 1.10% 증가했습니다.
2020년 인천 광역권 인구는 2,931,000명이며, 2019년 대비 1.20% 증가했습니다."
}
}
]
},
"ext": {
"retrieval_augmented_generation": {
"answer": "52,000명 증가했습니다."
}
}
}
tip

Advanced Managed Search의 벡터 검색과 OpenAI LLM을 결합하면 고정된 키워드 검색을 넘어 의미 기반 AI 검색 시스템을 구축할 수 있습니다.

이를 통해 기존 검색 인프라를 AI 기반 지식 플랫폼으로 확장해 보세요.