[RAG] 단계별 프롬프트(Chain Prompting) 기법

최근 생성형 AI 개발에서 중요한 패러다임으로 자리 잡은 RAG(Retrieval-Augmented Generation)는 외부 지식을 활용해 AI의 응답 품질을 높이는 기술이다. 하지만 검색된 대량의 정보를 효과적으로 처리하기 위해서는 더 정교한 프롬프트 전략이 필요하다. 이 글에서는 RAG 시스템의 성능을 한 단계 끌어올릴 수 있는 ‘단계별 프롬프트’ 기법에 대해 알아보자.

RAG의 기본 개념

RAG는 “Retrieval-Augmented Generation”의 약자로, ‘검색 증강 생성’이라고 번역할 수 있다. 기본 작동 원리는 다음과 같다:

  1. 검색(Retrieval): 사용자 질문과 관련된 정보를 외부 데이터베이스에서 검색
  2. 증강(Augmented): 검색한 정보를 AI 모델에 제공
  3. 생성(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}"
)

주의사항 및 한계

단계별 프롬프트 적용 시 고려해야 할 주의사항:

  1. 지연 시간 증가: 여러 단계를 거치므로 전체 응답 시간이 길어질 수 있음
  2. 오류 전파: 초기 단계의 오류가 이후 단계로 전파될 가능성
  3. 비용 증가: 여러 API 호출이 필요해 비용이 증가할 수 있음
  4. 복잡성: 시스템 설계와 유지보수가 더 복잡해짐

결론

단계별 프롬프트는 RAG 시스템의 정확성과 효율성을 크게 향상시킬 수 있는 강력한 기법이며 복잡한 질문을 처리하거나 대량의 정보를 분석할 때 특히 유용하다.

최근 다양한 산업 분야에서 실제 적용 사례가 증가하고 있으며 LangChain이나 Autogen과 같은 프레임워크를 통해 구현이 더욱 용이해지고 있다.

RAG 시스템을 구축할 때 단순히 정보를 검색하고 답변을 생성하는 기본 패턴에서 벗어나 단계별 프롬프트 기법을 활용하면 더 정교하고 정확한 AI 시스템을 개발할 수 있다.