3
respostas

[Bug] Aula 05 - Implementando e integrando Functions com chatbot

Estou tentando validar os cupons promocionais de acordo com os listadados no arquivo de políticas.txt, e o retorno da OpenAI está sendo válidos para todos os cupons digitados.

app.py

model, parser, client = initial_parameters()
app = Flask(__name__)
app.secret_key = 'allspark'
assistant = get_json()
thread_id = assistant['thread_id']
vector_store_id = assistant['vector_store_id']
assistant_id = assistant['assistant_id']

STATUS_COMPLETED = "completed" 
STATUS_REQUIRES_ACTION = "requires_action" 

def bot(prompt):
    maximo_tentativas = 1
    repeticao = 0
    while True:
        try:
            personality = prompt_system_personas[selecionar_persona(prompt)]
            client.beta.threads.messages.create(
                            thread_id=thread_id, 
                            role = "user",
                            content =  f"""
                            {prompt_system_persona_selection_update}:

                            # Persona
                            {personality}
                            """,
                        )
            client.beta.threads.messages.create(
                thread_id=thread_id, 
                role = "user",
                content = prompt,
                # file_ids=file_ids
            )
            run = client.beta.threads.runs.create(
                thread_id=thread_id,
                assistant_id=assistant_id
            )
            while run.status !=STATUS_COMPLETED:
                run = client.beta.threads.runs.retrieve(
                    thread_id=thread_id,
                    run_id=run.id
            )
                print(f"Status: {run.status}")
                if run.status == STATUS_REQUIRES_ACTION:
                    tools_acionadas = run.required_action.submit_tool_outputs.tool_calls
                    respostas_tools_acionadas = [] 
                    for uma_tool in tools_acionadas:
                        nome_funcao = uma_tool.function.name
                        funcao_escolhida = minhas_funcoes[nome_funcao]
                        argumentos = json.loads(uma_tool.function.arguments)
                        print(argumentos)
                        resposta_funcao = funcao_escolhida(argumentos)

                        respostas_tools_acionadas.append({
                                "tool_call_id": uma_tool.id,
                                "output": resposta_funcao
                            })
                    
                    run = client.beta.threads.runs.submit_tool_outputs(
                            thread_id = thread_id,
                            run_id = run.id,
                            tool_outputs=respostas_tools_acionadas
                        )  
            historical = list(client.beta.threads.messages.list(thread_id=thread_id).data)
            response = historical[0]
            return response
        except Exception as erro:
                repeticao += 1
                if repeticao >= maximo_tentativas:
                        return "Erro no GPT: %s" % erro
                print('Erro de comunicação com OpenAI:', erro)
                sleep(1)
            

@app.route("/chat", methods=["POST"])
def chat():
    prompt = request.json["msg"]
    response = bot(prompt)
    texto_resposta = response.content[0].text.value
    return texto_resposta

@app.route("/")
def home():
    return render_template("index.html")

if __name__ == "__main__":
    app.run(debug = True)

tools.py

model, _, client = initial_parameters()

my_tools = [
    {"type": "file_search"},
    {
      "type": "function",
            "function": {
            "name": "validate_promo_code",
            "description": "Valide um código promocional com base nas diretrizes de Descontos e Promoções da empresa",
            "parameters": {
                "type": "object",
                "properties": {
                    "codigo": {
                        "type": "string",
                        "description": "O código promocional, no formato, TECHXX. Por exemplo: TECH10",
                    },
                    "validade": {
                        "type": "string",
                        "description": f"A validade do cupom, caso seja válido e esteja associado as políticas. No formato DD/MM/YYYY.",
                    },
                },
                "required": ["codigo", "validade"],
            }
        }
    }
    
]

def validate_promo_code(argumentos):
    print('Entrou na função')
    code = argumentos.get("codigo")
    expiration_date = argumentos.get("validade")

    return f"""
        
        # Formato de Resposta
        
        {code} com validade: {expiration_date}. 
        Ainda, diga se é válido ou não para o usuário.

        """

minhas_funcoes = {
    'validate_promo_code' : validate_promo_code,
}
3 respostas

Arquivo txt de politicas:

politicas.txt

## Políticas da Allspark E-commerce

1. **Política de Devolução:**    
   - A Allspark E-commerce oferece uma política de devolução de 30 dias para todos os produtos não utilizados e em perfeitas condições.
   - Os custos de envio de devolução são de responsabilidade do cliente, a menos que o produto tenha chegado com defeito ou danificado.
   - Os reembolsos serão processados após a inspeção do produto devolvido e podem ser emitidos na forma de crédito na loja ou reembolso no método de pagamento original, conforme preferência do cliente.

2. **Política de Privacidade:**  
   - Respeitamos sua privacidade e estamos comprometidos em proteger suas informações pessoais.
   - As informações coletadas durante o processo de compra, como nome, endereço e informações de pagamento, são utilizadas apenas para fins de processamento de pedidos e comunicação com os clientes.
   - Não compartilhamos suas informações com terceiros sem o seu consentimento.

3. **Segurança:**  
   - Utilizamos tecnologia de criptografia de dados (SSL) para garantir que todas as informações de pagamento sejam transmitidas com segurança.
   - Mantemos rigorosas medidas de segurança para proteger o banco de dados do cliente e evitar acessos não autorizados.

4. **Entrega e Prazo de Envio:**  
   - Informamos os prazos de entrega estimados no momento da compra.
   - Trabalhamos com transportadoras confiáveis para garantir a entrega segura e pontual.
   - Se houver atrasos inesperados na entrega, informamos imediatamente os clientes e buscamos soluções alternativas sempre que possível.

5. **Atendimento ao Cliente:**  
   - Nossa equipe de atendimento ao cliente está disponível por chat ao vivo e e-mail (allspark@empresa.com) para ajudar com perguntas, preocupações e assistência nas compras.
   - Estamos comprometidos em fornecer um atendimento rápido e eficaz para garantir a satisfação dos clientes.

6. **Descontos e Promoções:**  
   - Notebooks selecionados têm 10% de desconto com o cupom TECH10, válido até 30/11/2024.
   - Periféricos como mouses e teclados têm 15% de desconto com o cupom NOVO15, válido até 25/12/2024.

Print do chat validando de forma errada o cupom

Print do chat validando de forma errada o cupom

Olá, Kleryton, tudo bem?

Você pode verificar a lógica do assistente e identificar onde podem estar ocorrendo problemas na integração com a IA, teste essas sugestões com pontos para investigar no código:

  • Verificação dos Arquivos Carregados:

    • Confirme se os arquivos dados_ecomart.txt, políticas.txt e produtos_ecomart.txt (ou os equivalente caso tenha mudado o nome) foram carregados corretamente e se estão no mesmo diretório que o código.
    • Verifique se file_id_list realmente está obtendo os IDs dos arquivos após o cliente.files.create e se todos os IDs estão corretamente adicionados à lista.
  • Verificação do Objeto do Assistente:

    • No método criar_assistente, revise o parâmetro instructions para garantir que está orientando a IA a buscar nos arquivos o que precisa.
    • Confirme se file_ids está sendo passado corretamente e se o assistant_id e thread_id estão sendo gerados como esperado.
  • Testes Diretos com o Chatbot:

    • Teste o retorno do assistente ao fazer uma pergunta específica sobre um cupom válido. Isso ajuda a verificar se ele está acessando o arquivo de políticas corretamente para retornar a validade.
    • Utilize mensagens de exemplo como “O cupom TECH10 é válido?” ou "Qual a validade do cupom TECH10?" para ver se ele acessa corretamente o arquivo políticas.txt.

Espero ter ajudado!

Siga firme nos seus estudos e conte com o fórum sempre que precisar!

Abraços :)

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