오늘은 LangChain 라이브러리를 사용하여 어떻게 여러 개의 체인을 연결하여 더 복잡한 기능을 구현하는지 알아보겠습니다. 이전에 하나의 연결 개체(LLMChain)를 사용하는 방법을 배웠으니, 이제 이를 확장하여 순차적으로 여러 개의 체인을 연결해 보겠습니다.
순차적 체인은 여러 개의 체인을 순서대로 연결하여 입력을 처리하고 최종 출력을 생성하는 방식입니다. 각 체인은 고유한 언어 모델 호출과 프롬프트를 가질 수 있으며, 이전 체인의 출력을 다음 체인의 입력으로 사용합니다.
순차적 체인(Sequential Chain)에 대해 더 자세히 설명하겠습니다.
순차적 체인은 여러 개의 작업이나 프로세스를 순서대로 연결하여 실행하는 방식입니다. 각 작업은 이전 작업의 결과를 받아서 새로운 작업을 수행하고, 이렇게 생성된 출력이 다시 다음 작업의 입력으로 이어집니다. 이를 통해 복잡한 작업을 작은 단계로 나누어 단계별로 처리할 수 있으며, 작업 간의 데이터 흐름을 제어할 수 있습니다.
단계별로 처리: 순차적 체인을 사용하면 작업을 단계별로 처리할 수 있습니다. 복잡한 작업을 각 단계로 나누어 점진적으로 처리하게 되어 더 큰 문제를 효과적으로 해결할 수 있습니다.
의존성 관리: 각 체인의 출력이 다음 체인의 입력이 되어 이전 단계의 결과에 따라 다음 단계의 처리가 달라질 수 있습니다. 이를 통해 작업 간의 의존성을 관리할 수 있습니다.
디버깅과 유지보수 용이: 복잡한 작업을 작은 단계로 분할하여 각 단계의 출력을 확인할 수 있어 디버깅이 용이하고, 각 단계의 수정이 쉽게 이루어집니다.
예를 들어, 문서 기반의 질문 답변 시스템을 구축한다고 가정할 때, 다음과 같은 순차적 체인을 만들 수 있습니다.
각 체인은 순서대로 실행되며, 앞 단계의 결과가 다음 단계의 입력으로 전달됩니다. 이를 통해 하나의 복잡한 작업이 자연스럽게 단계별로 처리되며, 최종적으로 원하는 답변을 생성하게 됩니다.
LangChain을 사용하여 다양한 언어 모델을 연결하고 싶다면, 먼저 입력 텍스트를 분석하고, 번역 체인, 요약 체인, 응답 생성 체인을 순차적으로 연결하여 처리할 수 있습니다.
이제 실제로 코드를 작성하여 주어진 주제로부터 블로그 포스트를 생성하는 순차적 체인을 만들어 보겠습니다.
OpenAI API 키 설정: .env
파일에 OpenAI API 키를 저장합니다.
OPENAI_API_KEY=your-api-key
여기서 your-api-key
를 실제 API 키로 대체하세요.
필요한 라이브러리 설치:
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)
from dotenv import load_dotenv
load_dotenv()
.env
파일에 저장된 환경 변수를 로드합니다. 이 파일에는 OpenAI API 키가 저장되어 있습니다.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)
"데이터 사이언스"
를 입력하였습니다.첫 번째 체인 실행:
"데이터 사이언스"
두 번째 체인 실행:
최종 결과 출력:
첫 번째 체인 출력 (개요):
두 번째 체인 출력 (블로그 포스트):
블로그 포스트 전문이 출력됩니다. 여기에는 각 개요 항목에 대한 상세한 내용이 포함됩니다.
ChatOpenAI
클래스의 인스턴스를 생성할 때 temperature
, max_tokens
등의 매개변수를 조정하여 생성되는 텍스트의 다양성과 길이를 조절할 수 있습니다.llm = ChatOpenAI(temperature=0.7, max_tokens=500)
.env
파일이나 환경 변수를 통해 관리하세요.이렇게 LangChain의 간단한 순차적 체인을 활용하여 주어진 주제로부터 블로그 포스트를 자동으로 생성하는 방법을 알아보았습니다. 이 방법을 응용하면 다양한 자동화 작업이나 콘텐츠 생성에 활용할 수 있습니다.
다음 단계로는 SequentialChain
을 사용하여 입력과 출력 키를 명시적으로 지정하고, 더 복잡한 체인을 구성하는 방법을 배워볼 수 있습니다. 이를 통해 더욱 유연하고 강력한 체인 구성이 가능합니다.
여기까지입니다! 이 강의가 도움이 되었길 바라며, 즐거운 코딩 시간 되세요!