질문 라우팅을 위한 LLM Router Chain

GoGoComputer·2024년 11월 7일
0

LangChain Basics

목록 보기
25/40
post-thumbnail

안녕하세요! 오늘은 LangChain의 LM Router Chain을 사용하여 입력된 질문을 적절한 언어 모델 체인으로 라우팅하는 방법에 대해 자세히 알아보겠습니다. 이 과정에서 코드 예제와 함께 단계별로 설명드릴 것이며, 마지막에는 전체 실행 가능한 코드를 제공해 드리겠습니다. 이 코드는 .env 파일에서 OPENAI_API_KEY를 불러오도록 구성되어 있습니다.

LLM Router Chain이란?

LLM Router Chain은 입력된 텍스트를 분석하여 가장 적절한 언어 모델 체인(LLM Chain)으로 라우팅해주는 기능을 제공합니다. 즉, 사용자의 입력에 따라 여러 개의 LLM Chain 중 하나를 선택하여 그에 맞는 응답을 생성합니다. 이는 복잡한 대화 흐름이나 다양한 사용자 요구사항을 처리할 때 매우 유용합니다.

사용 사례

예를 들어, 물리학에 대한 질문을 처리하는 시스템을 구축하고자 합니다. 이때 질문의 난이도나 내용에 따라 초보자용 설명이나 전문가용 설명을 제공하고 싶습니다. LM Router Chain을 사용하면 입력된 질문이 초보자용인지 전문가용인지 판단하여 적절한 체인으로 라우팅할 수 있습니다.


LLM Router Chain은 LangChain의 중요한 기능 중 하나로, 사용자가 입력한 텍스트를 기반으로 적합한 언어 모델 체인(LLM Chain)으로 자동 라우팅해 주는 역할을 합니다. 여러 종류의 언어 모델 체인을 동시에 운영할 때, 사용자가 무엇을 원하는지, 어떤 정보를 얻고자 하는지를 판단해 가장 알맞은 LLM Chain을 선택하여 자연스러운 응답을 제공합니다. 이 기능은 특히 복잡한 대화 흐름을 효율적으로 관리하는 데 유용합니다.

LLM Router Chain의 주요 구성 요소와 동작 방식

  1. Router Chain:

    • Router Chain은 사용자의 입력을 받아 분석하고, 이를 바탕으로 최적의 LLM Chain을 선택하는 역할을 합니다. 예를 들어, 사용자가 수학 계산을 요청하면 수학 모델 체인으로 라우팅하고, 문서 요약을 요청하면 요약 모델 체인으로 라우팅하는 방식입니다.
    • Router Chain 자체도 하나의 LLM Chain으로 작동하며, 이때 사용자 입력의 특성을 분석하여 특정 LLM Chain을 선택하는 것이 핵심입니다.
  2. Custom Router:

    • 필요에 따라 사용자가 원하는 기준에 맞춰 맞춤형 Router를 설계할 수 있습니다. 이를 통해 더 세부적인 라우팅 조건을 추가하거나, 특정 상황에 맞춰 모델을 연결할 수 있습니다.
    • 예를 들어, 영어 질문에는 영어 전용 모델로 라우팅하고, 한국어 질문에는 한국어 전용 모델로 라우팅하는 방식입니다.
  3. Contextual and Sequential Decision Making:

    • Router Chain은 기본적으로 입력된 텍스트의 의미와 의도를 분석합니다. 이때 텍스트의 컨텍스트나 특정 키워드도 고려될 수 있습니다. 상황에 따라 사용자의 의도에 맞는 체인을 정확히 선택할 수 있도록 Sequential Router Chain 같은 더 복잡한 의사결정 구조를 사용할 수도 있습니다.

LLM Router Chain이 유용한 사례

  1. 다국어 지원:

    • 여러 언어로 된 질문이 들어올 때, 각 언어에 특화된 모델 체인으로 라우팅하여 다국어 대화를 지원할 수 있습니다.
  2. 다양한 작업 처리:

    • 예를 들어, 문서 요약, 질의 응답, 데이터 분석 등의 요청이 동시에 들어올 수 있는 환경에서는, 작업 유형에 따라 다른 모델 체인을 선택하여 응답을 처리할 수 있습니다.
  3. 유연한 대화 흐름 관리:

    • 복잡한 대화 시스템에서 사용자가 다양한 요구사항을 제시할 때, 이를 적절히 라우팅해 주는 LLM Router Chain은 대화 흐름의 자연스러움을 유지하고, 정확한 응답을 보장하는 데 중요한 역할을 합니다.

LLM Router Chain 구현 예시

Router Chain을 설정할 때 기본적으로 조건을 정의하고, 해당 조건에 따라 사용할 체인을 설정하게 됩니다. 간단한 예시는 다음과 같습니다.

from langchain.chains import LLMRouterChain, LLMChain
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI

# 다양한 언어 모델 체인 정의
summary_chain = LLMChain(llm=OpenAI(), prompt=PromptTemplate("summarize: {input_text}"))
math_chain = LLMChain(llm=OpenAI(), prompt=PromptTemplate("calculate: {input_text}"))

# Router Chain 구성
router_chain = LLMRouterChain(
    router=RouterFunction(),  # 조건을 설정하여 적절한 체인 선택
    chains={"summary": summary_chain, "math": math_chain}
)

# 입력에 따라 최적의 체인 선택
result = router_chain.run("Please summarize this text.")
print(result)

이처럼 LLM Router Chain은 다양한 상황에 맞는 LLM Chain을 선택할 수 있는 유연한 구조를 제공하여, 다양한 사용자 요구사항을 하나의 시스템에서 효율적으로 처리할 수 있습니다.


단계별 설명

1. 필요한 라이브러리 설치 및 불러오기

먼저, 필요한 라이브러리를 설치하고 불러옵니다.

!pip install langchain openai python-dotenv
import os
from dotenv import load_dotenv
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate, PromptTemplate
from langchain.chains import LLMChain
from langchain.chains.router import MultiPromptChain
from langchain.chains.router.llm_router import LLMRouterChain, RouterOutputParser
from langchain.chains.router.multi_prompt_prompt import MULTI_PROMPT_ROUTER_TEMPLATE

2. OpenAI API 키 설정

.env 파일에서 OPENAI_API_KEY를 불러옵니다.

load_dotenv()
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')

3. 템플릿 정의

초보자와 전문가용 답변을 위한 프롬프트 템플릿을 정의합니다.

beginner_template = '''당신은 복잡한 물리학 개념을 이해하기 쉽게 설명하는 물리학 선생님입니다.
사전 지식이 없다고 가정하고 설명하세요.
질문:
{input}'''

expert_template = '''당신은 물리학 박사 수준의 이해를 가진 청중에게 물리학 개념을 설명하는 세계적인 물리학 교수입니다.
질문:
{input}'''

empty_template = '질문이 비어 있습니다. 질문을 입력해주세요.'

4. 프롬프트 정보 설정

각 템플릿에 대한 이름과 설명을 포함한 프롬프트 정보를 설정합니다.

prompt_infos = [
    {'name': 'empty', 'description': '빈 질문에 응답합니다.', 'prompt_template': empty_template},
    {'name': 'advanced physics', 'description': '고급 물리학 질문에 답변합니다.', 'prompt_template': expert_template},
    {'name': 'beginner physics', 'description': '초보자 물리학 질문에 답변합니다.', 'prompt_template': beginner_template},
]

5. LLM 체인 생성

각 프롬프트 템플릿에 대해 LLM 체인을 생성하고, 이를 destination_chains 사전에 저장합니다.

llm = ChatOpenAI(temperature=0)

destination_chains = {}
for p_info in prompt_infos:
    name = p_info["name"]
    prompt_template = p_info["prompt_template"]
    prompt = ChatPromptTemplate.from_template(template=prompt_template)
    chain = LLMChain(llm=llm, prompt=prompt)
    destination_chains[name] = chain

6. 기본 체인 설정

입력에 맞는 체인이 없을 때 사용될 기본 체인을 설정합니다.

default_prompt = ChatPromptTemplate.from_template("{input}")
default_chain = LLMChain(llm=llm, prompt=default_prompt)

7. 라우터 템플릿 생성

멀티 프롬프트 라우터 템플릿을 불러오고, 목적지 목록을 생성하여 템플릿에 삽입합니다.

destinations = [f"{p['name']}: {p['description']}" for p in prompt_infos]
destinations_str = "\n".join(destinations)

router_template = MULTI_PROMPT_ROUTER_TEMPLATE.format(
    destinations=destinations_str
)

8. 라우터 프롬프트 설정

라우터 프롬프트를 생성하고, 출력 파서를 설정합니다.

router_prompt = PromptTemplate(
    template=router_template,
    input_variables=["input"],
    output_parser=RouterOutputParser(),
)

9. 라우터 체인 생성

라우터 체인을 생성하여 입력된 질문을 분석하고 적절한 체인으로 라우팅합니다.

router_chain = LLMRouterChain.from_llm(llm, router_prompt)

10. 멀티 프롬프트 체인 생성

라우터 체인, 목적지 체인, 기본 체인을 사용하여 멀티 프롬프트 체인을 생성합니다.

chain = MultiPromptChain(
    router_chain=router_chain,
    destination_chains=destination_chains,
    default_chain=default_chain,
    verbose=True
)

11. 체인 실행 및 테스트

체인을 실행하여 실제로 질문을 입력하고 결과를 확인합니다.

response = chain.run("자석은 어떻게 작동하나요?")
print(response)
response = chain.run("파인만 다이어그램은 어떻게 작동하나요?")
print(response)

12. 전체 코드 제공

위의 모든 단계를 포함한 전체 코드는 다음과 같습니다.


전체 실행 가능한 코드

# 필요한 라이브러리 설치
# !pip install langchain openai python-dotenv

# 라이브러리 불러오기
import os
from dotenv import load_dotenv
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate, PromptTemplate
from langchain.chains import LLMChain
from langchain.chains.router import MultiPromptChain
from langchain.chains.router.llm_router import LLMRouterChain, RouterOutputParser
from langchain.chains.router.multi_prompt_prompt import MULTI_PROMPT_ROUTER_TEMPLATE

# OpenAI API 키 로드
load_dotenv()
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')

# 프롬프트 템플릿 정의
beginner_template = '''당신은 복잡한 물리학 개념을 이해하기 쉽게 설명하는 물리학 선생님입니다.
사전 지식이 없다고 가정하고 설명하세요.
질문:
{input}'''

expert_template = '''당신은 물리학 박사 수준의 이해를 가진 청중에게 물리학 개념을 설명하는 세계적인 물리학 교수입니다.
질문:
{input}'''

empty_template = '질문이 비어 있습니다. 질문을 입력해주세요.'

# 프롬프트 정보 설정
prompt_infos = [
    {'name': 'empty', 'description': '빈 질문에 응답합니다.', 'prompt_template': empty_template},
    {'name': 'advanced physics', 'description': '고급 물리학 질문에 답변합니다.', 'prompt_template': expert_template},
    {'name': 'beginner physics', 'description': '초보자 물리학 질문에 답변합니다.', 'prompt_template': beginner_template},
]

# LLM 체인 생성
llm = ChatOpenAI(temperature=0)

destination_chains = {}
for p_info in prompt_infos:
    name = p_info["name"]
    prompt_template = p_info["prompt_template"]
    prompt = ChatPromptTemplate.from_template(template=prompt_template)
    chain = LLMChain(llm=llm, prompt=prompt)
    destination_chains[name] = chain

# 기본 체인 설정
default_prompt = ChatPromptTemplate.from_template("{input}")
default_chain = LLMChain(llm=llm, prompt=default_prompt)

# 라우터 템플릿 생성
destinations = [f"{p['name']}: {p['description']}" for p in prompt_infos]
destinations_str = "\n".join(destinations)

router_template = MULTI_PROMPT_ROUTER_TEMPLATE.format(
    destinations=destinations_str
)

# 라우터 프롬프트 설정
router_prompt = PromptTemplate(
    template=router_template,
    input_variables=["input"],
    output_parser=RouterOutputParser(),
)

# 라우터 체인 생성
router_chain = LLMRouterChain.from_llm(llm, router_prompt)

# 멀티 프롬프트 체인 생성
chain = MultiPromptChain(
    router_chain=router_chain,
    destination_chains=destination_chains,
    default_chain=default_chain,
    verbose=True
)

# 체인 실행 및 결과 출력
response = chain.run("자석은 어떻게 작동하나요?")
print("응답:", response)

response = chain.run("파인만 다이어그램은 어떻게 작동하나요?")
print("응답:", response)

결과 확인

예시 1: 초보자용 질문

입력: "자석은 어떻게 작동하나요?"

응답:

자석은 특정한 물질로 만들어진 물체로서, 다른 물체를 끌어당기는 힘을 가지고 있어요. 이 힘은 '자기력'이라고 불리는데, 자석 내부의 작은 입자들이 정렬되어 있어서 발생해요. 쉽게 말해, 자석은 물체를 붙잡을 수 있는 특별한 힘을 가진 물체예요.

예시 2: 전문가용 질문

입력: "파인만 다이어그램은 어떻게 작동하나요?"

응답:

파인만 다이어그램은 양자전기역학(QED) 및 다른 양자장론에서 입자 간의 상호작용을 시각적으로 표현하는 도구입니다. 다이어그램의 선과 꼭짓점은 입자의 전파와 상호작용을 나타내며, 이를 통해 복잡한 수학적 계산을 직관적으로 이해하고 계산을 간소화할 수 있습니다.

마무리

이렇게 LM Router Chain을 사용하여 입력된 질문을 분석하고, 적절한 언어 모델 체인으로 라우팅하는 방법을 알아보았습니다. 이를 통해 사용자에게 맞춤형 응답을 제공할 수 있으며, 다양한 시나리오에 적용할 수 있습니다.

위의 전체 코드를 실행하면 실제로 입력된 질문에 따라 초보자 또는 전문가용 답변을 얻을 수 있습니다. 이 코드를 기반으로 자신의 프로젝트나 서비스에 맞게 확장해 보세요.


주의사항: 코드를 실행하기 전에 .env 파일에 OPENAI_API_KEY를 설정해야 합니다. 이 키는 OpenAI의 API를 사용하기 위한 인증 키이며, 개인 정보이므로 외부에 노출되지 않도록 주의하세요.

profile
IT를 좋아합니다.

0개의 댓글