1
resposta

Restringindo o Contexto

Olá! Aprendi que é uma boa prática, ao disponibilizar o serviço de um bot, que ele não seja absolutamente aberto a qualquer pergunta. O que quero dizer?

Se eu substituir a pergunta abaixo:

resposta = cadeia.invoke({"question": "Qual é a correlação entre os anos de experiencia do agente e o tempo de entrega?"})

por

resposta = cadeia.invoke({"question": "Qual a capital do brasil"})

Ele me responderá precisamente que é Brasília.

Fiz outras perguntas como qual o horário em Ruanda e ele também me respondeu adequadamente.

Ou seja, ele estava aberto a usar todo o motor do Gemini, sendo possível fugir totalmente do contexto dos dados do meu dataframe.

A priori, inclui a linha em negrito no prompt, para resolver a questão, inclui a linha em negrito no System Prompt:

system = f"""Você tem acesso a um dataframe pandas df.
Aqui está a saida de df.head().to_markdown():
'''
{df.head().to_markdown()}
'''
Dada uma pergunta do usuário, escreva o código Python para respondê-la.
**Você precisa ignorar expressamente as perguntas que não podem ser respondidas com APENAS com os dados do dataframe pandas df.**
Retorne SOMENTE o código Python válido e nada mais. \

Não presuma que você tem acesso a nenhuma biblioteca além das bibliotecas Python integradas e pandas.
"""

Mas ao fazê-lo, recebi o erro abaixo:

BadRequestError: Error code: 400 - {'error': {'message': "Failed to call a function. Please adjust your prompt. See 'failed_generation' for more details.", 'type': 'invalid_request_error', 'code': 'tool_use_failed', 'failed_generation': '{}'}}

Diante desse cenário, pergunto: Qual a melhor maneira de tratar a requisição ou o prompt, para garantir que o meu bot sempre se atenha ao contexto?

1 resposta

Oi, Jorge! Como vai?

Você está enfrentando um cenário comum: restringir o comportamento de um LLM para que ele responda apenas com base no DataFrame. Do jeito que você estruturou o System Prompt, a intenção está correta, mas a execução precisa de ajustes para evitar o erro BadRequestError e garantir a obediência ao contexto.

Trouxe um exemplo de como tratar isso corretamente com uma checagem explícita de contexto dentro de uma cadeia personalizada usando o LangChain:


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

template = """
Você é um assistente que responde **somente com base nos dados do dataframe**.

Aqui estão as primeiras linhas do DataFrame:

{df_head}

Se a pergunta **não puder ser respondida somente com os dados do DataFrame**, responda com:

**"Pergunta fora de contexto. Responda apenas com base nos dados disponíveis."**

Pergunta: {question}
"""

prompt = PromptTemplate(
    input_variables=["df_head", "question"],
    template=template
)

llm = OpenAI(temperature=0)

cadeia = LLMChain(llm=llm, prompt=prompt)

df_head = df.head().to_markdown()

resposta = cadeia.run({
    "df_head": df_head,
    "question": "Qual é a capital do Brasil?"
})

print(resposta)

O que esse código faz:

  • Usa um template com instruções claras.
  • Define uma resposta padrão se a pergunta sair do escopo.
  • Ajuda o modelo a seguir o contexto de forma mais segura sem quebrar.

Evite comandos como system = f"""...""" diretamente em chamadas como invoke() se a API que estiver usando não der suporte a system messages dessa forma (como no Gemini via LangChain). Prefira template explícito via PromptTemplate.

Espero ter ajudado. Conte com o apoio do Fórum na sua jornada. Fico à disposição.

Abraços e bons estudos!

  Caso este post tenha lhe ajudado, por favor, marcar como solucionado