3️⃣DSPy with LangChain

DSPy: Compiling chains from LangChain

DSPy의 가장 강력한 기능 중 하나는 옵티마이저입니다. DSPy 옵티마이저는 모든 LM 시스템에서 프롬프트(또는 LM 가중치)를 조정하여 모든 목표를 극대화할 수 있습니다.

옵티마이저는 LM 시스템의 품질을 개선하고 코드를 새로운 LM 또는 새로운 데이터에 맞게 조정할 수 있습니다. 이는 (i) 수동 프롬프트 엔지니어링, (ii) 합성 데이터 생성을 위한 복잡한 파이프라인 설계, (iii) 미세 조정을 위한 복잡한 파이프라인 설계와 같은 번거로운 작업 대신 구조와 모듈성을 도입하기 위한 것입니다.

# Install the dependencies if needed.
%pip install -U dspy-ai
%pip install -U openai jinja2
%pip install -U langchain langchain-community langchain-openai langchain-core

일반적으로 우리는 DSPy 모듈과 함께 DSPy 옵티마이저를 사용합니다. 하지만 여기서는 해리슨 체이스arrow-up-right와 협력하여 DSPy가 LangChain 라이브러리로 구축된 체인도 최적화할 수 있도록 했습니다.

이 짧은 튜토리얼은 이 개념 증명 기능이 어떻게 작동하는지 보여줍니다. 아직은 DSPy나 LangChain의 모든 기능을 제공하지는 못하지만, 수요가 많을 경우 확장할 예정입니다.

이를 완전한 통합으로 전환하면 모든 사용자에게 혜택이 돌아갈 것입니다. LangChain 사용자는 모든 DSPy 옵티마이저로 모든 체인을 최적화할 수 있게 됩니다. DSPy 사용자는 스트리밍과 추적, 그리고 기타 풍부한 프로덕션 대상 기능을 지원하는 LCEL로 모든 DSPy 프로그램을 '내보내기' 할 수 있게 될 것입니다.

1.Setting Up

First, let's import dspy and configure the default language model and retrieval model in it.

import dspy

from dspy.evaluate.evaluate import Evaluate
from dspy.teleprompt import BootstrapFewShotWithRandomSearch

colbertv2 = dspy.ColBERTv2(url='http://20.102.90.50:2017/wiki17_abstracts')

dspy.configure(rm=colbertv2)

Next, let's import langchain and the DSPy modules for interacting with LangChain runnables, namely, LangChainPredict and LangChainModule.

2. Defining a chain as a LangChain expression

예를 들어 다음 작업을 처리해 보겠습니다.

Task: 유익한 트윗을 생성하기 위한 RAG 시스템을 구축합니다.

  • Input: 사실에 입각한 question(상당히 복잡할 수 있음).

  • Output: 검색된 정보에서 질문에 대한 정확한 답변을 제공하는 매력적인 tweet.

이를 설명하기 위해 LangChain의 표현 언어(LCEL)를 사용하겠습니다. 여기서는 어떤 프롬프트도 가능하며, 최종 프롬프트는 DSPy로 최적화할 것입니다.

이를 고려하여 핵심만 간추려 보겠습니다: **주어진 {context}에서 {question}에 대한 답을 트윗으로 작성하세요.

3. Converting the chain into a DSPy module

우리의 목표는 이 프롬프트를 최적화하여 더 나은 트윗 생성기를 만드는 것입니다. DSPy 최적화 도구가 도움이 될 수 있지만 DSPy 모듈에서만 작동합니다!

이러한 이유로 DSPy에 두 개의 새로운 모듈을 만들었습니다: 'LangChainPredict'와 'LangChainModule'입니다.

4. Trying the module

이 작업에서 LangChainModule은 얼마나 잘할 수 있을까요? 글쎄요, 다음 질문에 대한 트윗을 생성하도록 요청할 수 있습니다.

아, 그렇군요! (기술적으로 완벽하지는 않습니다. 도시가 아닌 지역을 요청했습니다. 아래에서 더 잘할 수 있습니다.)

질문과 답변을 수동으로 검사하는 것은 시스템을 파악하는 데 매우 중요합니다. 그러나 훌륭한 시스템 디자이너는 항상 자신의 작업을 반복적으로 벤치마크하여 진행 상황을 정량화합니다!

이를 위해서는 최대화하고자 하는 메트릭과 시스템에 대한 (작은) 데이터 세트라는 두 가지가 필요합니다.

좋은 트윗에 대한 사전 정의된 지표가 있나요? 100,000개의 트윗에 일일이 라벨을 붙여야 하나요? 아마 아닐 겁니다. 하지만 프로덕션에서 데이터를 얻기 전까지는 합리적인 작업을 쉽게 할 수 있습니다!

5. Evaluating the module

시작하기 위해 간단한 지표를 정의하고 QA 데이터 세트에서 여러 질문을 빌려와 여기에서 튜닝에 사용하겠습니다.

**무엇이 좋은 트윗을 만들까요? **모르겠지만 반복 개발의 정신에 따라 간단하게 시작해 보겠습니다!

좋은 트윗은 (1) 사실에 근거해야 하고, (2) 실제 출처에 기반해야 하며, (3) 사람들의 관심을 끌 수 있어야 한다는 세 가지 속성을 갖춰야 한다고 정의할 수 있습니다.

이것이 올바른 지표인가요, 아니면 가장 대표적인 질문인가요? 반드시 그렇지는 않습니다. 하지만 체계적으로 반복할 수 있는 방법으로 시작할 수 있습니다!

**참고: 데이터 세트에는 실제로 트윗이 포함되어 있지 않다는 점에 유의하세요! 질문과 답변만 있습니다. 괜찮습니다. 저희 메트릭이 트윗 형식의 결과물을 평가할 수 있도록 처리할 것입니다.

이제 LangChain LCEL 객체에서 변환된 체인의 최적화되지 않은 "제로 샷" 버전을 평가해 보겠습니다.

zeroshot_chain 은 150 개 질문 중에 **43%의 정확도가 나왔다

위의 표는 몇 가지 예를 보여줍니다. 예를 들어:

  • Question: 록 밴드 주크 카튼과 서른 세컨즈 투 마스의 앨범을 프로듀싱한 프로듀서는 누구인가요?

  • Tweet: 제인스 애딕션, 벨벳 리볼버 등의 밴드와 함께 작업한 브라이언 버츄는 주크 카르텔과 서른 세컨즈 투 마스의 앨범을 제작하며... [중략]

  • Metric: 1.0 (A tweet that is correct, faithful, and engaging!*)

각주: * 적어도 저희 메트릭에 따르면, 이는 DSPy 프로그램일 뿐이므로 원한다면 그것도 최적화할 수 있습니다! 하지만 다른 노트북을 위한 주제입니다.

6. Optimizing the module

DSPy에는 많은 최적화 도구가 있지만 현재 사실상 기본값은 다음과 같습니다.BootstrapFewShotWithRandomSearch.

작동 원리가 궁금하다면: 이 옵티마이저는 trainset 질문에 대해 프로그램(이 경우 zeroshot_chain)을 실행하는 방식으로 작동합니다. 실행될 때마다 DSPy는 각 LM 호출의 입력과 출력을 기억합니다. 이를 트레이스라고 하며, 이 특정 옵티마이저는 "좋은" 트레이스(즉, 메트릭이 좋아하는 트레이스)를 계속 추적합니다. 그런 다음 이 최적화 도구는 이러한 추적을 자동화된 몇 가지 예시로 활용할 수 있는 좋은 방법을 찾으려고 노력합니다. 이 옵티마이저는 이러한 방법을 시도하여 valset의 평균 메트릭을 최대화하려고 노력할 것입니다. 예제를 자체 생성(부트스트랩)하는 방법에는 여러 가지가 있습니다. 선택을 최적화하는 방법도 여러 가지가 있습니다(여기서는 무작위 검색을 사용합니다). 그렇기 때문에 DSPy에는 여러 가지 다른 최적화 도구가 있습니다.

7. Evaluating the optimized chain

얼마나 좋을까요? 모든 최적화 실행이 마법처럼 보이지 않는 예제를 개선하는 것은 아니니 확인해 보세요!

먼저 위에서부터 질문을 해봅시다.

좋네요, 일화적으로 zeroshot_chain을 사용한 답변보다 조금 더 정확해 보입니다. 하지만 이제 제대로 된 평가를 해보겠습니다!

zeroshot_chain은 43%에서 시작하여 현재 52%를 달성했습니다. 이는 21%의 상대적인 개선입니다.

8. Inspecting the optimized chain in action

Last updated