# 목적
사용자의 질의를 풍성하게 하기위하여 Rewrite를 수행한다
Rewrite 된 내용을 기반으로 일반 대화인지, 내부 retreiver 를 활용할지, 웹에서 검색할지를 llm 이 판단한다
이때 판단하기위하여 baseModel을 활용한다
baseModel 은 본래 파이썬에서 클래스나 API 개발시 데이터 모델링에 사용되는 라이브러리로 타입을 정형화하여 타입 검사를 수행함
이를 활용하여 llm 의 with_structured_output 과 같이 활용하면 원하는 답변을 얻을 수 있음
# 구성도
Retriever 활용 로그
https://smith.langchain.com/public/3652730b-7b3a-4c62-9e2a-41f883356fe8/r
LangSmith
smith.langchain.com
일상 대화 활용 로그
https://smith.langchain.com/public/5aab4319-476b-4c13-8edb-6a3225c66ccf/r
LangSmith
smith.langchain.com
웹 검색 활용 로그
https://smith.langchain.com/public/34d0ed2d-3034-4ed4-8615-020019e3a716/r
LangSmith
smith.langchain.com
# 핵심
# 예시 코드
from pydantic import BaseModel, Field
from typing import Any, Literal, Union
class RouteModel(BaseModel):
"""
model is possible one of choice about 'generate', 'web_search','vectorstore'
"""
datasource : Literal['generate','web_search','vectorstore'] = Field(
...,
description = 'Given a user "query" or "question", you choose to route web_search or a vectorstore or generate'
)
llm = get_gemini()
structure_rotuer = llm.with_structured_output(RouteQuery)
prompt = get_routing_pt()
chain = prompt | structure_rotuer
question = '안녕?'
==> generate
사용자가 " 안녕?" 이라는 질의를 할경우 generate 로 라우팅하도록 답변하는 역할을 수행한다
또한 프롬프트에서 어떤 상황에 어떤 routing을 선택할지 자세히 설명하면 설명할수록 성능이 향상된다.
agent 를 사용하여 tool 을 사용하게도 가능하지만 이런식으로 개발자의 의도를 담아 설계도 가능하다
# 앞으로..
State 설계가 생각보다 어렵다..
아직도 디버깅이 어색함
좀 더 개발을 하면서 디버깅 수행 능력을 향상시킬 필요가있음..