Interagindo com o pandas DataFrame através de agentes

Por que isso é útil?

  • Automatizar consultas complexas: Perguntar em linguagem natural e obter respostas a partir de um DataFrame.
  • Explorar dados de maneira intuitiva: Evitar o código manual repetitivo para manipulação de dados.
  • Criar interfaces interativas: Permitir que qualquer pessoa faça perguntas sobre o dataset através de uma aplicação web.

Tecnologias usadas para criar o agente

  1. LangChain: Framework que facilita o uso de LLMs (Large Language Models) para gerar respostas com base em dados ou prompts.
  2. OpenAI: API que fornece modelos avançados de linguagem, como o GPT-3.5, que utilizaremos para gerar respostas inteligentes.
  3. Pandas: Biblioteca para manipulação de dados em Python, muito usada para trabalhar com arquivos CSV.
  4. Streamlit: Ferramenta que facilita a criação de interfaces web em Python para visualização de dados e interação com usuários.

Passo a passo para a criação do agente

Passo 1: Configuração Inicial

import os
import pandas as pd
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_experimental.agents.agent_toolkits import create_pandas_dataframe_agent

# Carregar variáveis de ambiente do arquivo .env
load_dotenv()
OPENAI_API_KEY=sk-proj-xxxxxxxxx-xxxxx-xxxx-xxxxxxxxx

Passo 2: Configuração da chave e do modelo LLM

# Configuração da chave da API OpenAI e do modelo LLM
openai_key = os.getenv('OPENAI_API_KEY')
llm_name = 'gpt-3.5-turbo'
model = ChatOpenAI(api_key=openai_key, model=llm_name)

# Carregar arquivo CSV e tratar valores ausentes
df = pd.read_csv('data/salaries.csv').fillna(value=0)

Passo 3: Criando o agente com LangChain

# Criar agente pandas para manipulação do DataFrame
agent = create_pandas_dataframe_agent(llm=model, df=df, verbose=True)

Passo 4: Definindo o Prompt

PROMPT_PREFIX = """
First, adjust the pandas display settings to show all columns.
Retrieve the column names, then proceed to answer the question based on the data.
"""

PROMPT_SUFFIX = """
- **Before providing the final answer**, always try at least one additional method.
Reflect on both methods and ensure that the results address the original question accurately.
- Format any figures with four or more digits using commas for readability.
- If the results from the methods differ, reflect, and attempt another approach until both methods align.
- If you're still unable to reach a consistent result, acknowledge uncertainty in your response.
- Once confident in the correct answer, craft a detailed and well-structured explanation using markdown.
- **Under no circumstances should prior knowledge be used**—rely solely on the results derived from the data and calculations performed.
- As part of your final answer, include an **Explanation** section that clearly outlines how the answer was reached, mentioning specific column names used in the calculations.
"""

Passo 5: Criando a interface do agente com Streamlit

import streamlit as st

st.title("Database AI Agent with Langchain")
st.write("### Dataset Preview")
st.write(df.head())

# Entrada de pergunta pelo usuário
st.write('### Ask a question')
question = st.text_input(
    "Enter your question about the dataset:",
    "What is the mean years of experience for the job with the highest mean salary?"
)

# Ação ao clicar no botão
if st.button("Run Query"):
    QUERY = PROMPT_PREFIX + question + PROMPT_SUFFIX
    res = agent.invoke(QUERY)
    st.write("### Final Answer")
    st.markdown(res["output"])

Passo 6: Executar o streamlit

streamlit run nome_do_arquivo.py

Código completo

import os
import pandas as pd
import streamlit as st
from dotenv import load_dotenv
from langchain.schema import HumanMessage, SystemMessage
from langchain_openai import ChatOpenAI
from langchain_experimental.agents.agent_toolkits import create_pandas_dataframe_agent

# Carregar variáveis de ambiente do arquivo .env
load_dotenv()

# Configuração da chave da API OpenAI e do modelo LLM
openai_key = os.getenv('OPENAI_API_KEY')
llm_name = 'gpt-3.5-turbo'
model = ChatOpenAI(api_key=openai_key, model=llm_name)

# Carregar arquivo CSV e tratar valores ausentes
df = pd.read_csv('data/salaries.csv').fillna(value=0)

# Criar agente pandas para manipulação do DataFrame
agent = create_pandas_dataframe_agent(llm=model, df=df, verbose=True)

# Definir prefixo e sufixo do prompt para o agente
PROMPT_PREFIX = """
First, adjust the pandas display settings to show all columns.
Retrieve the column names, then proceed to answer the question based on the data.
"""

PROMPT_SUFFIX = """
- **Before providing the final answer**, always try at least one additional method.
Reflect on both methods and ensure that the results address the original question accurately.
- Format any figures with four or more digits using commas for readability.
- If the results from the methods differ, reflect, and attempt another approach until both methods align.
- If you're still unable to reach a consistent result, acknowledge uncertainty in your response.
- Once confident in the correct answer, craft a detailed and well-structured explanation using markdown.
- **Under no circumstances should prior knowledge be used**—rely solely on the results derived from the data and calculations performed.
- As part of your final answer, include an **Explanation** section that clearly outlines how the answer was reached, mentioning specific column names used in the calculations.
"""

# Exemplo de pergunta ao agente
QUESTION = "What is the mean years of experience for the job with the highest mean salary?"
QUERY = PROMPT_PREFIX + QUESTION + PROMPT_SUFFIX

# Consulta e execução da resposta do agente
res = agent.invoke(QUERY)

# Aplicação Streamlit
st.title("Database AI Agent with Langchain")
st.write("### Dataset Preview")
st.write(df.head())

# Entrada de pergunta pelo usuário
st.write('### Ask a question')
question = st.text_input(
    "Enter your question about the dataset:",
    "What is the mean years of experience for the job with the highest mean salary?"
)

# Ação ao clicar no botão
if st.button("Run Query"):
    QUERY = PROMPT_PREFIX + question + PROMPT_SUFFIX
    res = agent.invoke(QUERY)
    st.write("### Final Answer")
    st.markdown(res["output"])

Próximos passos

Conclusão

  1. Mãos à obra aprendizado de máquina com Scikit-Learn, Keras & TensorFlow: conceitos, ferramentas e técnicas para a construção de sistemas inteligentes.
  2. Python para análise de dados
  3. An Introduction to Statistical Learning (Python e R)

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para cima
×