Connect with us

프롬프트 엔지니어링

DSPy로 LLM 최적화하기: AI 시스템 구축, 최적화 및 평가를 위한 단계별 가이드

mm
DSPy is a framework for algorithmically optimizing LM prompts and weights

대규모 언어 모델(LLM)의 능력이 계속 확장됨에 따라, 그 잠재력을 활용하는 강력한 AI 시스템을 개발하는 것은 점점 더 복잡해지고 있습니다. 기존의 접근 방식은 종종 복잡한 프롬프트 기술, 미세 조정을 위한 데이터 생성, 도메인별 제약 조건 준수를 보장하기 위한 수동 지침을 포함합니다. 그러나 이 과정은 지루하고 오류가 발생하기 쉬우며, 인간의 개입에 크게 의존할 수 있습니다.

DSPy가 등장했습니다. 이는 LLM으로 구동되는 AI 시스템 개발을 간소화하도록 설계된 혁신적인 프레임워크입니다. DSPy는 LM 프롬프트와 가중치를 최적화하는 체계적인 접근 방식을 도입하여 개발자가 최소한의 수동 작업으로 정교한 애플리케이션을 구축할 수 있게 합니다.

이 포괄적인 가이드에서 우리는 DSPy의 핵심 원칙, 모듈식 아키텍처, 그리고 제공하는 강력한 기능들을 살펴볼 것입니다. 또한 DSPy가 LLM을 사용한 AI 시스템 개발 방식을 어떻게 변화시킬 수 있는지 보여주는 실용적인 예제들에 깊이 들어가 보겠습니다.

DSPy란 무엇이며, 왜 필요한가?

DSPy는 프로그램의 흐름(모듈)을 각 단계의 매개변수(LM 프롬프트와 가중치)로부터 분리하는 프레임워크입니다. 이러한 분리는 LM 프롬프트와 가중치의 체계적인 최적화를 가능하게 하여, 더 높은 신뢰성, 예측 가능성 및 도메인별 제약 조건 준수를 바탕으로 복잡한 AI 시스템을 구축할 수 있게 합니다.

전통적으로 LLM을 사용한 AI 시스템 개발은 문제를 단계별로 분해하고, 각 단계에 대한 복잡한 프롬프트를 제작하며, 미세 조정을 위한 합성 예제를 생성하고, LM이 특정 제약 조건을 준수하도록 수동으로 안내하는 힘든 과정을 포함했습니다. 이 접근 방식은 시간이 많이 소요될 뿐만 아니라, 파이프라인, LM 또는 데이터에 대한 사소한 변경조차도 프롬프트와 미세 조정 단계의 광범위한 재작업을 필요로 할 수 있기 때문에 오류에 취약했습니다.

DSPy는 이러한 문제들을 새로운 패러다임인 옵티마이저를 도입하여 해결합니다. 이러한 LM 기반 알고리즘은 귀하가 최대화하고자 하는 메트릭이 주어졌을 때, LM 호출의 프롬프트와 가중치를 조정할 수 있습니다. 최적화 과정을 자동화함으로써, DSPy는 개발자가 최소한의 수동 개입으로 강력한 AI 시스템을 구축하고, LM 출력의 신뢰성과 예측 가능성을 향상시킬 수 있도록 합니다.

DSPy의 모듈식 아키텍처

DSPy의 핵심에는 복잡한 AI 시스템의 구성을 용이하게 하는 모듈식 아키텍처가 있습니다. 이 프레임워크는 dspy.ChainOfThoughtdspy.ReAct와 같은 다양한 프롬프트 기술을 추상화하는 내장 모듈 세트를 제공합니다. 이러한 모듈은 결합되고 더 큰 프로그램으로 구성될 수 있어, 개발자가 특정 요구 사항에 맞춘 복잡한 파이프라인을 구축할 수 있습니다.

각 모듈은 지침, 소수 예제 및 LM 가중치를 포함한 학습 가능한 매개변수를 캡슐화합니다. 모듈이 호출되면 DSPy의 옵티마이저가 원하는 메트릭을 최대화하도록 이러한 매개변수를 미세 조정할 수 있어, LM의 출력이 지정된 제약 조건과 요구 사항을 준수하도록 보장합니다.

DSPy로 최적화하기

DSPy는 AI 시스템의 성능과 신뢰성을 향상시키도록 설계된 다양한 강력한 옵티마이저를 소개합니다. 이러한 옵티마이저는 LM 기반 알고리즘을 활용하여 LM 호출의 프롬프트와 가중치를 조정하고, 도메인별 제약 조건을 준수하면서 지정된 메트릭을 최대화합니다.

DSPy에서 사용 가능한 주요 옵티마이저는 다음과 같습니다:

  1. BootstrapFewShot: 이 옵티마이저는 시그니처를 확장하여 모델에 전송되는 프롬프트 내에 최적화된 예제를 자동으로 생성하고 포함시켜 소수 학습을 구현합니다.
  2. BootstrapFewShotWithRandomSearch: 생성된 데모에 대해 무작위 탐색을 사용하여 BootstrapFewShot을 여러 번 적용하고, 최적화 과정에서 최고의 프로그램을 선택합니다.
  3. MIPRO: 각 단계에서 지침과 소수 예제를 생성하며, 지침 생성은 데이터 인식 및 데모 인식 방식입니다. 이는 베이지안 최적화를 사용하여 모듈 전반에 걸쳐 생성 지침과 데모의 공간을 효과적으로 탐색합니다.
  4. BootstrapFinetune: 프롬프트 기반 DSPy 프로그램을 더 작은 LM의 가중치 업데이트로 증류하여, 향상된 효율성을 위해 기본 LLM을 미세 조정할 수 있게 합니다.

이러한 옵티마이저를 활용함으로써, 개발자는 도메인별 제약 조건과 요구 사항을 준수하면서 고품질 출력을 보장하도록 AI 시스템을 체계적으로 최적화할 수 있습니다.

DSPy 시작하기

DSPy의 힘을 설명하기 위해, 질문-응답을 위한 검색 증강 생성(RAG) 시스템을 구축하는 실용적인 예제를 살펴보겠습니다.

단계 1: 언어 모델 및 검색 모델 설정

첫 번째 단계는 DSPy 내에서 언어 모델(LM)과 검색 모델(RM)을 구성하는 것입니다. DSPy를 설치하려면 실행하세요:

 pip install dspy-ai 

DSPy는 여러 LM 및 RM API와 로컬 모델 호스팅을 지원하므로, 선호하는 모델을 쉽게 통합할 수 있습니다.

 import dspy # LM과 RM 구성 turbo = dspy.OpenAI(model='gpt-3.5-turbo') colbertv2_wiki17_abstracts = dspy.ColBERTv2(url='http://20.102.90.50:2017/wiki17_abstracts') dspy.settings.configure(lm=turbo, rm=colbertv2_wiki17_abstracts) 

단계 2: 데이터셋 로드

다음으로, 일반적으로 다중 홉 방식으로 답변되는 복잡한 질문-답변 쌍 모음을 포함하는 HotPotQA 데이터셋을 로드하겠습니다.

 from dspy.datasets import HotPotQA # 데이터셋 로드 dataset = HotPotQA(train_seed=1, train_size=20, eval_seed=2023, dev_size=50, test_size=0) # 입력으로 'question' 필드 지정 trainset = [x.with_inputs('question') for x in dataset.train] devset = [x.with_inputs('question') for x in dataset.dev] 

단계 3: 시그니처 구축

DSPy는 시그니처를 사용하여 모듈의 동작을 정의합니다. 이 예제에서는 답변 생성 작업에 대한 시그니처를 정의하고, 입력 필드(컨텍스트 및 질문)와 출력 필드(답변)를 지정하겠습니다.

 class GenerateAnswer(dspy.Signature): """짧은 사실형 답변으로 질문에 답하세요.""" context = dspy.InputField(desc="관련 사실을 포함할 수 있음") question = dspy.InputField() answer = dspy.OutputField(desc="보통 1에서 5단어 사이") 

단계 4: 파이프라인 구축

RAG 파이프라인을 DSPy 모듈로 구축하겠습니다. 이 모듈은 하위 모듈(dspy.Retrieve 및 dspy.ChainOfThought)을 선언하기 위한 초기화 메서드(__init__)와 이러한 모듈을 사용하여 질문에 답하는 제어 흐름을 설명하는 순방향 메서드(forward)로 구성됩니다.

 class RAG(dspy.Module): def __init__(self, num_passages=3): super().__init__() self.retrieve = dspy.Retrieve(k=num_passages) self.generate_answer = dspy.ChainOfThought(GenerateAnswer) def forward(self, question): context = self.retrieve(question).passages prediction = self.generate_answer(context=context, question=question) return dspy.Prediction(context=context, answer=prediction.answer) 

단계 5: 파이프라인 최적화

파이프라인이 정의되었으니, 이제 DSPy의 옵티마이저를 사용하여 최적화할 수 있습니다. 이 예제에서는 BootstrapFewShot 옵티마이저를 사용하겠습니다. 이 옵티마이저는 훈련 세트와 검증용 메트릭을 기반으로 모듈에 대한 효과적인 프롬프트를 생성하고 선택합니다.

 from dspy.teleprompt import BootstrapFewShot # 검증 메트릭 def validate_context_and_answer(example, pred, trace=None): answer_EM = dspy.evaluate.answer_exact_match(example, pred) answer_PM = dspy.evaluate.answer_passage_match(example, pred) return answer_EM and answer_PM # 옵티마이저 설정 teleprompter = BootstrapFewShot(metric=validate_context_and_answer) # 프로그램 컴파일 compiled_rag = teleprompter.compile(RAG(), trainset=trainset) 

단계 6: 파이프라인 평가

프로그램을 컴파일한 후에는 원하는 정확도와 신뢰성을 충족하는지 확인하기 위해 개발 세트에서 성능을 평가하는 것이 필수적입니다.

 from dspy.evaluate import Evaluate # 평가자 설정 evaluate = Evaluate(devset=devset, metric=validate_context_and_answer, num_threads=4, display_progress=True, display_table=0) # 컴파일된 RAG 프로그램 평가 evaluation_result = evaluate(compiled_rag) print(f"Evaluation Result: {evaluation_result}") 

단계 7: 모델 기록 검사

모델의 상호 작용에 대한 더 깊은 이해를 위해, 모델의 기록을 검사하여 가장 최근의 생성 내용을 검토할 수 있습니다.

 # 모델의 기록 검사 turbo.inspect_history(n=1) 

단계 8: 예측 수행

파이프라인이 최적화되고 평가되었으니, 이제 새로운 질문에 대해 예측을 수행하는 데 사용할 수 있습니다.

 # 예제 질문 question = "Which award did Gary Zukav's first book receive?" # 컴파일된 RAG 프로그램을 사용하여 예측 수행 prediction = compiled_rag(question) print(f"Question: {question}") print(f"Answer: {prediction.answer}") print(f"Retrieved Contexts: {prediction.context}") 

DSPy를 사용한 최소 작업 예제

이제 GSM8K 데이터셋과 OpenAI GPT-3.5-turbo 모델을 사용하여 DSPy 내에서 프롬프트 작업을 시뮬레이션하는 또 다른 최소 작업 예제를 살펴보겠습니다.

설정

먼저, 환경이 올바르게 구성되었는지 확인하세요:

 import dspy from dspy.datasets.gsm8k import GSM8K, gsm8k_metric # LM 설정 turbo = dspy.OpenAI(model='gpt-3.5-turbo-instruct', max_tokens=250) dspy.settings.configure(lm=turbo) # GSM8K 데이터셋에서 수학 문제 로드 gsm8k = GSM8K() gsm8k_trainset, gsm8k_devset = gsm8k.train[:10], gsm8k.dev[:10] print(gsm8k_trainset) 

gsm8k_trainsetgsm8k_devset 데이터셋에는 각 예제가 질문 및 답변 필드를 가진 예제 목록이 포함되어 있습니다.

모듈 정의

다음으로, 단계별 추론을 위한 ChainOfThought 모듈을 활용하는 사용자 정의 프로그램을 정의하세요: class CoT(dspy.Mod

I have spent the past five years immersing myself in the fascinating world of Machine Learning and Deep Learning. My passion and expertise have led me to contribute to over 50 diverse software engineering projects, with a particular focus on AI/ML. My ongoing curiosity has also drawn me toward Natural Language Processing, a field I am eager to explore further.