Olá!
Nessa aula, nós podemos ver que as cadeias utilizadas foram feitas no seguinte formato:
chain_1 = prompt_model_cidade | model | parser_destine
chain_2 = prompt_model_restaurante | model | parser_restaurante
chain_3 = prompt_cultural | model | StrOutputParser()
main_chain = (chain_1 | chain_2 | chain_3)
Porém, é importante notar que o formato de saída de cada LLM varia de acordo com o modelo.
O que quero dizer aqui é que se chain_1 me retorna um objeto com formato diferente, é preciso filtrar essa informação antes de passar para a próxima cadeia.
Trazendo um exemplo prático, temos:
Em aula, vemos o modelo gpt-3.5-turbo sendo usado, e vemos também que seu retorno para a primeira cadeia é algo parecido com:
{
"cidade": "Rio de Janeiro",
"restaurantes": "1. Aprazível \n2. Miam Miam"
}
}
Todavia, usando um modelo diferente via LM Studio, temos outro resultado:
- Modelo: google/gemma-3-1b
- Retorno:
{
"properties": {
"cidade": {
"default": "Praia do Sol",
"title": "Praia do Sol",
"type": "string"
},
"restaurantes": {
"default": "Restaurantes populares em Praia do Sol",
"title": "Restaurantes",
"type": "string"
}
}
}
Com isso, o código quebraria, pois a segunda cadeia não receberia a propriedade "cidade" vindo do resultado da primeira cadeia.
Sendo assim, uma possível solução seria retirar esse valor e retorná-lo para a próxima cadeia. Uma maneira que encontrei de fazer isso a partir do retorno do modelo usado no exemplo foi usando uma RunnableLambda e acoplando-a à cadeia principal.
Segue o exemplo:
chain_1 = prompt_model_cidade | model | parser_destine
chain_2 = prompt_model_restaurante | model | parser_restaurante
chain_3 = prompt_cultural | model | StrOutputParser()
extract_cidade = RunnableLambda(
lambda payload: {"cidade": payload["properties"]["cidade"]["default"]}
)
main_chain = (chain_1 | extract_cidade | chain_2 | extract_cidade | chain_3)
Outra maneira possível seria adicionar extract_cidade no início de cada outra cadeia que precisa desse atributo.
Acredito que a forma que o código é escrito deve ser de acordo com o modelo usado, e esse fator é algo a ser levado em consideração em projetos maiores.
Espero ter ajudado!