본문 바로가기

AI Algorithms (AI 기술과 알고리즘)

LLM 애플리케이션을 위한 새로운 프레임워크, DSPy 완전 정복

LLM 애플리케이션을 위한 새로운 프레임워크, DSPy 완전 정복

LLM 애플리케이션을 위한 새로운 프레임워크, DSPy 완전 정복

최근 생성형 AI의 급속한 발전과 함께, 다양한 LLM(Large Language Model) 기반 애플리케이션이 쏟아지고 있습니다. 하지만 대부분의 애플리케이션은 프롬프트 엔지니어링과 휴리스틱적인 파이프라인에 지나치게 의존하고 있으며, 이는 유지보수와 확장성 측면에서 큰 한계를 야기합니다.

이러한 문제를 해결하기 위한 혁신적인 접근법이 등장했습니다. 바로 DSPy입니다. 이번 포스팅에서는 DSPy의 개념과 구조, 그리고 실제 LLM 애플리케이션에 어떻게 적용할 수 있는지를 소개하고, 저희 조직의 도입 배경과 함께 살펴보겠습니다.


DSPy란 무엇인가?

**DSPy(Declarative Structured Programming for Python)**는 LLM 기반 애플리케이션을 더 구조적이고 최적화 가능한 방식으로 구축하기 위한 오픈소스 프레임워크입니다. 이는 스탠포드 대학교의 Percy Liang 교수 연구팀이 개발하였으며, 전통적인 소프트웨어 개발에서의 모듈화, 선언형 패턴, 파이프라인 최적화 개념을 LLM 환경에 도입했습니다.

핵심 목표는 “좋은 결과”를 내기 위한 최적의 구성요소들을 자동으로 학습하고 결정하는 것입니다.


기존 방식의 한계

기존 LLM 기반 시스템은 주로 다음과 같은 문제점을 안고 있습니다:

  • 프롬프트 최적화 반복: 개발자가 수동으로 프롬프트를 조정
  • 추론 정확도 편차: LLM 응답의 일관성 부족
  • 재사용성과 유지보수성 낮음: 모델이나 프롬프트 변경 시 전체 코드 수정 필요

DSPy의 작동 방식

DSPy는 세 가지 주요 구성 요소로 이루어져 있습니다.

1. Signatures (시그니처)

함수나 작업에 대한 명세를 정의합니다. 예: 입력과 출력의 자연어 형식을 명확히 표현.

class MySignature(dspy.Signature):
    """질문에 대한 간단한 대답"""
    question = dspy.InputField()
    answer = dspy.OutputField()

2. Modules (모듈)

이 시그니처를 기반으로 실행되는 컴포넌트입니다. 내부적으로는 LLM이나 검색 시스템과 연결됩니다. 예를 들어 dspy.Predict를 통해 GPT 또는 Claude를 사용할 수 있습니다.

3. Teleprompters (텔레프롬프터)

DSPy의 핵심 개념으로, 시그니처 기반으로 모듈을 자동 생성 및 학습시키는 역할을 합니다. 예를 들어, LLM으로부터 높은 정확도의 응답을 유도하기 위해 프로그램 수준에서 최적의 프롬프트를 학습합니다.


실제 적용 예시

복잡한 질문 답변 시스템에 적용된 검색 강화 생성(RAG)

DSPy는 답변을 생성하기 전에 관련 정보를 검색하는 기능을 통해 강력한 QA 시스템을 구축할 수 있도록 지원합니다.

import dspy
# Configure the language model
dspy.configure(lm=dspy.LM('openai/gpt-4o-mini'))

# Define a retrieval function (e.g., search Wikipedia)
def search_wikipedia(query: str) -> list[str]:
    results = dspy.ColBERTv2(url='http://20.102.90.50:2017/wiki17_abstracts')(query, k=3)
    return [x['text'] for x in results]

# Define the RAG module
class RAG(dspy.Module):
    def __init__(self):
        super().__init__()
        self.retrieve = dspy.Retrieve(k=3)
        self.generate = dspy.ChainOfThought("question, context -> answer")

    def forward(self, question):
        context = self.retrieve(question)
        return self.generate(question=question, context=context)

# Instantiate the RAG module
rag = RAG()

# Example usage
question = "What is the capital of France?"
answer = rag(question)
print(answer)

텍스트 요약

DSPy는 입력 길이와 스타일에 따라 적응하는 모듈을 정의함으로써 동적 텍스트 요약 기능을 제공합니다.

import dspy

# Configure the language model
dspy.configure(lm=dspy.LM('openai/gpt-4o-mini'))

# Define the summarization module
class Summarizer(dspy.Module):
    def __init__(self):
        super().__init__()
        self.summarize = dspy.ChainOfThought("document -> summary")

    def forward(self, document):
        return self.summarize(document=document)

# Instantiate the summarizer
summarizer = Summarizer()

# Example usage
document = "DSPy is a framework for programming language models..."
summary = summarizer(document)
print(summary)

도구 통합 기능을 갖춘 LLM 에이전트

DSPy는 외부 도구와 상호작용하여 작업을 수행할 수 있는 추론 능력을 갖춘 AI 에이전트를 구축하는 것을 지원합니다.

import dspy

# Configure the language model
dspy.configure(lm=dspy.LM('openai/gpt-4o-mini'))

# Define a custom tool (e.g., a calculator)
def calculator(expression: str) -> float:
    return eval(expression)

# Define the agent module
class Agent(dspy.Module):
    def __init__(self):
        super().__init__()
        self.react = dspy.ReAct("question -> answer", tools=[calculator])

    def forward(self, question):
        return self.react(question=question)

# Instantiate the agent
agent = Agent()

# Example usage
question = "What is 2 plus 2?"
answer = agent(question)
print(answer)

우리 조직의 도입 배경

현재 저희는 LLM 기반 자동화 시스템을 구축하고 있으며, 프롬프트의 정확성과 시스템 유연성을 동시에 달성하는 데 어려움을 겪고 있습니다. 이에 따라 DSPy를 다음과 같은 목적으로 도입을 추진 중입니다:

  • 도메인 특화 태스크에 맞는 프롬프트 자동 최적화
  • 비개발자도 재사용 가능한 LLM 컴포넌트 제공
  • 고객사별 FAQ 생성, 문서 요약, 자연어 질의 대응 자동화

결론: DSPy는 “LLM 시스템의 TensorFlow”가 될 수 있을까?

DSPy는 마치 전통적인 딥러닝 세계에서 TensorFlow나 PyTorch가 해냈던 역할을 LLM 애플리케이션의 구조화와 최적화 측면에서 수행하려는 시도입니다. 현재는 초기 단계이지만, 사용자 정의 태스크에 대해 자동 최적화를 지원한다는 점에서 향후 확장 가능성이 무궁무진합니다.

DSPy는 LLM 중심의 시스템을 운영하고 있는 기업들에게 매우 유용한 툴이 될 수 있으며, AI 모델 성능보다 더 중요한 ‘프롬프트 설계와 운영 구조’를 선언형 방식으로 통합하고자 하는 조직에게 꼭 추천하고 싶은 오픈소스입니다.


참고자료


 

여러분의 생각은 어떠신가요?
LLM 운영 환경에서 여러분이 겪는 가장 큰 어려움은 무엇인가요? 댓글로 공유해주세요!
이 포스팅이 유익했다면 지인과 공유해 주세요!