[RAG] 단계별 프롬프트(Chain Prompting) 기법
최근 생성형 AI 개발에서 중요한 패러다임으로 자리 잡은 RAG(Retrieval-Augmented Generation)는 외부 지식을 활용해 AI의 응답 품질을 높이는 기술이다. 하지만 검색된 대량의 정보를 효과적으로 처리하기 위해서는 더 정교한 프롬프트 전략이 필요하다. 이 글에서는 RAG 시스템의 성능을 한 단계 끌어올릴 수 있는 ‘단계별 프롬프트’ 기법에 대해 알아보자.
RAG의 기본 개념
RAG는 “Retrieval-Augmented Generation”의 약자로, ‘검색 증강 생성’이라고 번역할 수 있다. 기본 작동 원리는 다음과 같다:
- 검색(Retrieval): 사용자 질문과 관련된 정보를 외부 데이터베이스에서 검색
- 증강(Augmented): 검색한 정보를 AI 모델에 제공
- 생성(Generation): 검색 결과를 바탕으로 AI가 답변 생성
이 방식은 AI 모델이 학습하지 않은 최신 정보나 특정 도메인 지식을 활용할 수 있게 해준다.
단계별 프롬프트의 필요성
RAG 시스템에서 한 번에 너무 많은 정보를 AI에게 제공하면 여러 문제가 발생한다:
- 토큰 제한: 대부분의 AI 모델은 한 번에 처리할 수 있는 텍스트 길이(토큰)에 제한이 있음
- 정보 과부하: 너무 많은 정보가 주어지면 모델이 중요한 부분을 놓칠 수 있음
- 컨텍스트 혼란: 다양한 주제의 정보가 섞여 있으면 모델이 혼란스러워할 수 있음
이런 문제를 해결하기 위해 단계별 프롬프트(Chain Prompting, 또는 Multi-stage Prompting) 기법이 등장했다.
단계별 프롬프트의 종류
1. 필터링 체인 (Filtering Chain)
가장 기본적인 형태의 체인 프롬프팅이다.
1단계: "다음 문서들 중에서 '클라우드 컴퓨팅 보안'과 관련된 내용만 선별해줘."
2단계: "선별된 문서들을 바탕으로 클라우드 환경에서의 데이터 암호화 방법을 설명해줘."
2. 요약 체인 (Summarization Chain)
많은 문서를 먼저 요약한 후 활용하는 방식이다.
1단계: "다음 5개의 연구 논문 초록을 각각 3문장으로 요약해줘."
2단계: "요약된 내용을 바탕으로 이 연구 분야의 최신 트렌드를 분석해줘.
3. 질문 분해 체인 (Question Decomposition Chain)
복잡한 질문을 작은 하위 질문으로 나누어 처리하는 방식이다.
원질문: "코로나19가 글로벌 공급망과 원격 근무 환경에 미친 영향을 비교 분석해줘."
1단계: "이 질문을 해결하기 위해 필요한 하위 질문들을 나열해봐."
(
AI 응답:
"1. 코로나19가 글로벌 공급망에 미친 영향은?
2. 코로나19로 인한 원격 근무 확산 현황은?
3. 두 영역에서 공통점과 차이점은?"
)
2단계: "첫 번째 하위 질문에 대한 답변을 해봐."
3단계: "두 번째 하위 질문에 대한 답변을 해봐."
4단계: "지금까지의 답변을 종합해서 원래 질문에 대한 최종 분석을 제공해줘."
4. 전문가 체인 (Expert Chain)
각 단계에서 다른 ‘역할’이나 ‘전문성’을 가진 AI를 활용하는 방식이다.
1단계(데이터 과학자 역할): "이 데이터셋에서 주요 통계적 패턴을 분석해줘."
2단계(비즈니스 애널리스트 역할): "분석된 패턴을 바탕으로 비즈니스 관점에서의 시사점을 도출해줘."
3단계(마케팅 전문가 역할): "도출된 시사점을 활용한 마케팅 전략을 제안해줘."
실제 구현 예시 (Python 코드)
단계별 프롬프트를 실제로 구현하는 간단한 예시를 살펴보자:
import openai
# 검색 결과로 가정한 문서들
retrieved_docs = [
"문서1: 클라우드 컴퓨팅은 인터넷을 통해 컴퓨팅 리소스를 제공하는 서비스입니다.",
"문서2: 데이터 암호화는 정보를 보호하기 위한 필수 보안 조치입니다.",
"문서3: 클라우드 환경에서는 AES-256과 같은 강력한 암호화 알고리즘을 사용합니다.",
"문서4: 기계학습 모델은 대량의 데이터를 학습하여 패턴을 찾아냅니다.",
"문서5: 클라우드 서비스 제공업체는 다양한 보안 인증을 취득합니다."
]
# 1단계: 관련 문서 필터링
filtering_prompt = f"""
다음 문서들 중에서 '클라우드 보안'과 관련된 내용만 선별하여 번호로 알려주세요:
{retrieved_docs}
"""
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": filtering_prompt}]
)
filtered_docs_indices = response.choices[0].message.content
print("1단계 결과:", filtered_docs_indices)
# 인덱스 파싱 (간단한 예시)
relevant_indices = [2, 3, 5]# 실제로는 AI 응답에서 파싱
relevant_docs = [retrieved_docs[i-1] for i in relevant_indices]
# 2단계: 필터링된 문서로 질문에 답변
answering_prompt = f"""
다음 문서들을 바탕으로 '클라우드 환경에서의 데이터 암호화 방법'에 대해 설명해주세요:
{relevant_docs}
"""
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": answering_prompt}]
)
final_answer = response.choices[0].message.content
print("최종 답변:", final_answer)
오픈소스 프레임워크에서의 구현
LangChain의 Sequential Chain
LangChain 프레임워크는 단계별 프롬프트를 쉽게 구현할 수 있는 Sequential Chain을 제공한다:
from langchain.chains import SimpleSequentialChain, LLMChain
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
# 1단계 체인: 질문 분석
first_prompt = PromptTemplate(
input_variables=["query"],
template="사용자 질문: {query}\n\n이 질문에 답하기 위해 필요한 정보는 무엇인가요?"
)
first_chain = LLMChain(llm=OpenAI(), prompt=first_prompt)
# 2단계 체인: 정보 검색 전략
second_prompt = PromptTemplate(
input_variables=["first_chain_output"],
template="필요한 정보: {first_chain_output}\n\n이 정보를 얻기 위한 가장 효과적인 검색 쿼리는 무엇인가요?"
)
second_chain = LLMChain(llm=OpenAI(), prompt=second_prompt)
# 체인 연결
overall_chain = SimpleSequentialChain(chains=[first_chain, second_chain])
# 실행
result = overall_chain.run("인공지능이 일자리에 미치는 영향은?")
print(result)
Microsoft의 Autogen
Microsoft Research의 Autogen은 다중 에이전트 협업을 통한 단계별 문제 해결 프레임워크다:
from autogen import AssistantAgent, UserProxyAgent
# 전문가 에이전트 설정
researcher = AssistantAgent(
name="researcher",
system_message="당신은 연구 분석 전문가입니다. 데이터를 분석하고 통찰력을 제공합니다."
)
writer = AssistantAgent(
name="writer",
system_message="당신은 전문 작가입니다. 연구 결과를 이해하기 쉽게 설명합니다."
)
user_proxy = UserProxyAgent(
name="user_proxy",
human_input_mode="TERMINATE"
)
# 단계별 협업 실행
user_proxy.initiate_chat(
researcher,
message="최근 머신러닝 기술 트렌드를 분석해주세요."
)
# 연구 결과를 작가에게 전달
research_result = researcher.last_message()
user_proxy.initiate_chat(
writer,
message=f"다음 연구 결과를 일반인도 이해할 수 있게 다시 작성해주세요: {research_result}"
)
주의사항 및 한계
단계별 프롬프트 적용 시 고려해야 할 주의사항:
- 지연 시간 증가: 여러 단계를 거치므로 전체 응답 시간이 길어질 수 있음
- 오류 전파: 초기 단계의 오류가 이후 단계로 전파될 가능성
- 비용 증가: 여러 API 호출이 필요해 비용이 증가할 수 있음
- 복잡성: 시스템 설계와 유지보수가 더 복잡해짐
결론
단계별 프롬프트는 RAG 시스템의 정확성과 효율성을 크게 향상시킬 수 있는 강력한 기법이며 복잡한 질문을 처리하거나 대량의 정보를 분석할 때 특히 유용하다.
최근 다양한 산업 분야에서 실제 적용 사례가 증가하고 있으며 LangChain이나 Autogen과 같은 프레임워크를 통해 구현이 더욱 용이해지고 있다.
RAG 시스템을 구축할 때 단순히 정보를 검색하고 답변을 생성하는 기본 패턴에서 벗어나 단계별 프롬프트 기법을 활용하면 더 정교하고 정확한 AI 시스템을 개발할 수 있다.