LangChain으로 배우는 순차적 체인

GoGoComputer·2024년 11월 7일
0

LangChain Basics

목록 보기
23/40
post-thumbnail

오늘은 LangChain 라이브러리를 사용하여 어떻게 여러 개의 체인을 연결하여 더 복잡한 기능을 구현하는지 알아보겠습니다. 이전에 하나의 연결 개체(LLMChain)를 사용하는 방법을 배웠으니, 이제 이를 확장하여 순차적으로 여러 개의 체인을 연결해 보겠습니다.


순차적 체인이란 무엇인가요?

순차적 체인은 여러 개의 체인을 순서대로 연결하여 입력을 처리하고 최종 출력을 생성하는 방식입니다. 각 체인은 고유한 언어 모델 호출과 프롬프트를 가질 수 있으며, 이전 체인의 출력을 다음 체인의 입력으로 사용합니다.

왜 순차적 체인을 사용하나요?

  • 전문화된 작업 수행: 각 체인은 특정 작업에 최적화된 프롬프트와 모델 설정을 가질 수 있습니다.
  • 유연성 향상: 하나의 거대한 모델 호출에 모든 것을 담지 않고, 작업을 단계별로 나누어 처리할 수 있습니다.
  • 디버깅 및 유지보수 용이: 각 단계별로 입력과 출력을 확인할 수 있어 디버깅이 쉽습니다.

순차적 체인(Sequential Chain)에 대해 더 자세히 설명하겠습니다.

순차적 체인은 여러 개의 작업이나 프로세스를 순서대로 연결하여 실행하는 방식입니다. 각 작업은 이전 작업의 결과를 받아서 새로운 작업을 수행하고, 이렇게 생성된 출력이 다시 다음 작업의 입력으로 이어집니다. 이를 통해 복잡한 작업을 작은 단계로 나누어 단계별로 처리할 수 있으며, 작업 간의 데이터 흐름을 제어할 수 있습니다.

순차적 체인의 주요 특징

  1. 단계별로 처리: 순차적 체인을 사용하면 작업을 단계별로 처리할 수 있습니다. 복잡한 작업을 각 단계로 나누어 점진적으로 처리하게 되어 더 큰 문제를 효과적으로 해결할 수 있습니다.

  2. 의존성 관리: 각 체인의 출력이 다음 체인의 입력이 되어 이전 단계의 결과에 따라 다음 단계의 처리가 달라질 수 있습니다. 이를 통해 작업 간의 의존성을 관리할 수 있습니다.

  3. 디버깅과 유지보수 용이: 복잡한 작업을 작은 단계로 분할하여 각 단계의 출력을 확인할 수 있어 디버깅이 용이하고, 각 단계의 수정이 쉽게 이루어집니다.

순차적 체인의 예시

예를 들어, 문서 기반의 질문 답변 시스템을 구축한다고 가정할 때, 다음과 같은 순차적 체인을 만들 수 있습니다.

  1. 데이터 검색 체인: 데이터베이스나 문서에서 관련 자료를 검색합니다.
  2. 텍스트 전처리 체인: 검색된 자료에서 노이즈를 제거하고, 필요한 정보를 추출합니다.
  3. 요약 체인: 필요한 자료를 요약하여 핵심 내용을 추출합니다.
  4. 답변 생성 체인: 요약된 자료를 바탕으로 질문에 답변을 생성합니다.

각 체인은 순서대로 실행되며, 앞 단계의 결과가 다음 단계의 입력으로 전달됩니다. 이를 통해 하나의 복잡한 작업이 자연스럽게 단계별로 처리되며, 최종적으로 원하는 답변을 생성하게 됩니다.

장점

  • 유연성: 각 체인을 독립적으로 수정하고 관리할 수 있어 작업 확장 및 조정이 쉽습니다.
  • 재사용성: 여러 작업에서 동일한 체인을 재사용할 수 있으며, 체인을 조합하여 다양한 기능을 구현할 수 있습니다.
  • 복잡한 작업을 단순화: 복잡한 문제를 단계별로 나누어 처리하므로 효율적이며 직관적입니다.

사용 예

LangChain을 사용하여 다양한 언어 모델을 연결하고 싶다면, 먼저 입력 텍스트를 분석하고, 번역 체인, 요약 체인, 응답 생성 체인을 순차적으로 연결하여 처리할 수 있습니다.


실습: 블로그 포스트 생성하기

이제 실제로 코드를 작성하여 주어진 주제로부터 블로그 포스트를 생성하는 순차적 체인을 만들어 보겠습니다.

사전 준비

  1. OpenAI API 키 설정: .env 파일에 OpenAI API 키를 저장합니다.

    OPENAI_API_KEY=your-api-key

    여기서 your-api-key를 실제 API 키로 대체하세요.

  2. 필요한 라이브러리 설치:

    pip install langchain openai python-dotenv

전체 코드

from dotenv import load_dotenv
load_dotenv()

from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.chains import SimpleSequentialChain, LLMChain

# 큰 언어 모델 인스턴스 생성
llm = ChatOpenAI()

# 첫 번째 체인: 블로그 포스트의 개요 생성
template1 = "주제에 대해 간단한 블로그 포스트 개요를 bullet point로 작성해줘: {topic}"
first_prompt = ChatPromptTemplate.from_template(template1)
chain_one = LLMChain(llm=llm, prompt=first_prompt)

# 두 번째 체인: 개요를 바탕으로 블로그 포스트 작성
template2 = "다음 개요를 사용하여 블로그 포스트를 작성해줘:\n\n{outline}"
second_prompt = ChatPromptTemplate.from_template(template2)
chain_two = LLMChain(llm=llm, prompt=second_prompt)

# 순차적 체인 구성
full_chain = SimpleSequentialChain(
    chains=[chain_one, chain_two],
    verbose=True
)

# 체인 실행
result = full_chain.run("데이터 사이언스")
print(result)

코드 상세 설명

1. 환경 변수 로드

from dotenv import load_dotenv
load_dotenv()
  • 설명: .env 파일에 저장된 환경 변수를 로드합니다. 이 파일에는 OpenAI API 키가 저장되어 있습니다.

2. 라이브러리 임포트

from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.chains import SimpleSequentialChain, LLMChain
  • ChatOpenAI: OpenAI의 챗 모델을 사용하기 위한 클래스입니다.
  • ChatPromptTemplate: 프롬프트 템플릿을 생성하는 클래스입니다.
  • SimpleSequentialChain: 간단한 순차적 체인을 구성하는 클래스입니다.
  • LLMChain: LLM과 프롬프트로 구성된 단일 체인입니다.

3. 큰 언어 모델 인스턴스 생성

llm = ChatOpenAI()
  • 설명: OpenAI의 챗 모델 인스턴스를 생성합니다. 기본 설정을 사용하며, 필요에 따라 매개변수를 조정할 수 있습니다.

4. 첫 번째 체인 설정 (개요 생성)

template1 = "주제에 대해 간단한 블로그 포스트 개요를 bullet point로 작성해줘: {topic}"
first_prompt = ChatPromptTemplate.from_template(template1)
chain_one = LLMChain(llm=llm, prompt=first_prompt)
  • 프롬프트 템플릿 생성: 주어진 주제에 대한 블로그 포스트의 개요를 요청하는 프롬프트를 생성합니다.
  • LLMChain 생성: 위에서 생성한 프롬프트와 LLM을 사용하여 첫 번째 체인을 만듭니다.

5. 두 번째 체인 설정 (블로그 포스트 작성)

template2 = "다음 개요를 사용하여 블로그 포스트를 작성해줘:\n\n{outline}"
second_prompt = ChatPromptTemplate.from_template(template2)
chain_two = LLMChain(llm=llm, prompt=second_prompt)
  • 프롬프트 템플릿 생성: 첫 번째 체인에서 생성된 개요를 사용하여 블로그 포스트를 작성하도록 요청하는 프롬프트를 생성합니다.
  • LLMChain 생성: 두 번째 체인을 만듭니다.

6. 순차적 체인 구성

full_chain = SimpleSequentialChain(
    chains=[chain_one, chain_two],
    verbose=True
)
  • 설명: 두 개의 체인을 순서대로 실행하도록 순차적 체인을 구성합니다.
  • verbose=True: 각 체인의 입력과 출력을 콘솔에 출력하여 과정을 볼 수 있게 합니다.

7. 체인 실행

result = full_chain.run("데이터 사이언스")
print(result)
  • 설명: 전체 체인을 실행합니다. 주제로 "데이터 사이언스"를 입력하였습니다.
  • 결과 출력: 최종 생성된 블로그 포스트를 출력합니다.

실행 과정 설명

  1. 첫 번째 체인 실행:

    • 입력: "데이터 사이언스"
    • 출력: 데이터 사이언스에 대한 블로그 포스트 개요 (bullet point 형식)
  2. 두 번째 체인 실행:

    • 입력: 첫 번째 체인의 출력 (개요)
    • 출력: 개요를 기반으로 작성된 블로그 포스트
  3. 최종 결과 출력:

    • 완성된 블로그 포스트가 출력됩니다.

실행 결과 예시

첫 번째 체인 출력 (개요):

  • 데이터 사이언스란 무엇인가?
  • 데이터 사이언스의 중요성
  • 데이터 사이언스의 주요 구성 요소
  • 데이터 사이언스의 활용 분야
  • 데이터 사이언스를 배우는 방법
  • 결론

두 번째 체인 출력 (블로그 포스트):

블로그 포스트 전문이 출력됩니다. 여기에는 각 개요 항목에 대한 상세한 내용이 포함됩니다.


추가 팁 및 주의사항

  • 토큰 제한: OpenAI의 모델은 한 번에 처리할 수 있는 토큰 수에 제한이 있습니다. 너무 긴 입력이나 출력을 요구하면 오류가 발생할 수 있으니 주의하세요.
  • 모델 매개변수 조정: ChatOpenAI 클래스의 인스턴스를 생성할 때 temperature, max_tokens 등의 매개변수를 조정하여 생성되는 텍스트의 다양성과 길이를 조절할 수 있습니다.
    llm = ChatOpenAI(temperature=0.7, max_tokens=500)
  • 에러 처리: 코드 실행 중 에러가 발생하면 에러 메시지를 확인하고 해당 부분을 수정하세요. 예를 들어, API 키가 올바르게 설정되지 않았거나 라이브러리가 제대로 설치되지 않았을 수 있습니다.
  • 환경 변수 보안: API 키와 같은 중요한 정보는 코드에 직접 작성하지 않고 .env 파일이나 환경 변수를 통해 관리하세요.

마무리

이렇게 LangChain의 간단한 순차적 체인을 활용하여 주어진 주제로부터 블로그 포스트를 자동으로 생성하는 방법을 알아보았습니다. 이 방법을 응용하면 다양한 자동화 작업이나 콘텐츠 생성에 활용할 수 있습니다.

다음 단계로는 SequentialChain을 사용하여 입력과 출력 키를 명시적으로 지정하고, 더 복잡한 체인을 구성하는 방법을 배워볼 수 있습니다. 이를 통해 더욱 유연하고 강력한 체인 구성이 가능합니다.


여기까지입니다! 이 강의가 도움이 되었길 바라며, 즐거운 코딩 시간 되세요!

profile
IT를 좋아합니다.

0개의 댓글