해결된 질문
작성
·
21
0
from langchain_core.prompts import ChatPromptTemplate
from pydantic import BaseModel, Field
from typing import Literal
class Route(BaseModel):
target: Literal["income_tax", "llm", "real_estate_tax"] = Field(
description="The target for the query to answer"
)
router_system_prompt = """
You are an expert at routing a user's question to 'income_tax', 'llm', or 'real_estate_tax'.
'income_tax' contains information about income tax up to December 2024.
'real_estate_tax' contains information about real estate tax up to December 2024.
if you think the question is not related to either 'income_tax' or 'real_estate_tax';
you can route it to 'llm'."""
router_prompt = ChatPromptTemplate.from_messages(
[("system", router_system_prompt), ("user", "{query}")]
)
structured_router_llm = small_llm.with_structured_output(Route)
def router(state: AgentState) -> Literal["income_tax", "real_estate_tax", "llm"]:
"""
주어진 state에서 쿼리를 기반으로 적절한 경로를 결정합니다.
Args:
state (AgentState): 현재 에이전트의 state를 나타내는 객체입니다.
Returns:
Literal['income_tax', 'real_estate_tax', 'llm']: 쿼리에 따라 선택된 경로를 반환합니다.
"""
query = state["query"]
router_chain = router_prompt | structured_router_llm
route = router_chain.invoke({"query": query})
return route.target
안녕하세요 강병진 강사님:) 혹시 위 코드에서 router_prompt없이 Route class의 Field에만 프롬프트 지침을 넣어도 문제가 없을까요? 테스트 결과는 잘 나왔습니다.
아래는 수정 코드입니다.
class Route(BaseModel):
target: Literal["real_estate_tax", "llm", "income_tax"] = Field(description = """
당신은 사용자의 질문을 보고 적절한 라우터를 연결해주는 전문가입니다.
부동산에 관련된 질문은 real_estate_tax라우터를, 소득세에 관한 질문은 income_tax라우터를, 그 외의 질문은 llm라우터로 연결해주세요.
""")
def router(state: AgentState):
query = "역삼역 떡볶이 맛집을 알려주세요 "
router_llm = llm.with_structured_output(Route)
response = router_llm.invoke(query)
return response.target
print(router({}))
>> 'llm'
답변 2
1
0
안녕하세요, 인프런 AI 인턴입니다.
wogusto13님께서 질문하신 부분에 대해 답변드리겠습니다. 처음 작성하신 코드에서 router_prompt
지침은 ChatPromptTemplate
을 사용하여 시스템 메시지와 사용자 메시지를 구성하며, 원하는 대로 라우팅을 수행하기 위한 추가적인 맥락을 제공합니다. 이를 통해 LLM이 더 정확하고 신뢰성 있는 출력값을 제공할 수 있습니다.
수정하신 코드에서는 Route
클래스의 Field
에 지침을 넣어도 동작은 하지만, 이 접근 방식은 사용자와 시스템 메시지를 명시적으로 구분하지 않기 때문에 복잡한 컨텍스트를 처리할 때 문제가 발생할 수 있습니다. 또한, 이렇게 하면 모델이 가지는 맥락이 제한될 수 있으므로 예기치 못한 결과를 초래할 수 있습니다.
즉, Route
클래스에 지침을 넣는 것은 간단한 상황에서는 작동하지만, 복잡한 맥락을 다룰 때는 여전히 router_prompt
를 사용하는 것이 더 안정적이라고 할 수 있습니다.
이전 유사한 질문을 참고하시면 도움이 될 것 같습니다: human-in-the-loop질문드립니다
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
답변 감사합니다!