Integrando a API do ChatGPT com o Google Firebase Firestore
Published: 2023-04-06 16:05:00


Como comentado no meu [post anterior](https://dev.to/raphox/tentando-nao-ficar-pobre-antes-de-ficar-rico-criando-uma-startup-de-servicos-de-inteligencia-artificial-1mag), eu desenvolvi uma arquitetura de serviços para tentar economizar um pouco na hora de consumir a API da OpenAI e o modelo [gpt-3.5-turbo](https://platform.openai.com/docs/guides/chat).

![Arquitetura final descrita no [post anterior](https://dev.to/raphox/tentando-nao-ficar-pobre-antes-de-ficar-rico-criando-uma-startup-de-servicos-de-inteligencia-artificial-1mag).](https://cdn-images-1.medium.com/max/2000/0*aCp-zoKjt2LKnXka.png)

Agora vou mostrar um pouco do código que inseri no [Firebase functions](https://firebase.google.com/products/functions) que é chamado toda vez uma nova perguntar é inserida no Firestore.
{% gist https://gist.github.com/raphox/864c9f9330675b2a2deaaad8f0534e06.js %}
Essa função irá enviar os dados da pergunta cadastrada pelo usuário, para um serviço no [Render.com](https://render.com/) onde a API do modelo do ChatGPT será consumida.

![Estrutura de perguntas no Firestore.](https://cdn-images-1.medium.com/max/2000/1*h2p7UmotFpeZjiBOnUspeQ.png)

Vale relembrar o motivo de eu não ter feito tudo do lado do Firebase Cloud Function:
>  O [Cloud Function](https://cloud.google.com/functions/docs/concepts/functions-and-firebase?hl=pt-br) cobra de acordo com o tempo de execução da sua função, além do número de invocações e dos recursos provisionados. Como a API do [ChatGPT](https://platform.openai.com/docs/guides/chat) pode demorar para responder, dependendo da complexidade da sua consulta, você pode acabar pagando muito pelo tempo que a sua função fica aguardando a resposta da API.

Ao fim do processo, a pergunta terá sua resposta atualizada no Firestore com base nos dados recibidos da API do ChatGPT.
{% gist https://gist.github.com/raphox/5819b4b892c66286aff253531ed8d9c9.js %}
Podemos destacar alguns trechos importantes do código anterior:

* **Linhas 13 e 14:** São métodos customizados que fazem a comunicação com o Pinecone e a API da OpenAI. Sugiro buscar mais informações em [https://python.langchain.com/en/latest/use_cases/question_answering.html](https://python.langchain.com/en/latest/use_cases/question_answering.html)

* **Linha 60:** Nas linhas anteriores, o código é responsável por buscar na base de dados de perguntas já realizadas pelos usuários e encontrar a pergunta mais parecida. Com base na pergunta mais parecida já feita anteriormente, a linha 60 é responsável por verificar se a similaridade é tão próxima (95%) que a resposta da pergunta anterior pode ser utilizada para responder a nova pergunta. Como comentei no meu post anterior, esse comparativo não se daria muito bem para diferenciar perguntas como: Quanto custa 1kg do seu produto?’ e ‘Quanto custa 1g do seu produto?’.

* **Linha 71:** Essa parte do código foi responsável por sanar meu problema com o delay da API da OpenAI. Alguns podem estar se perguntando o porquê de eu não ter utilizado algo relacionado a filas de processamento em background. Mas como comentei no [post anterior](https://dev.to/raphox/tentando-nao-ficar-pobre-antes-de-ficar-rico-criando-uma-startup-de-servicos-de-inteligencia-artificial-1mag), meu objetivo por agora é buscar alternativas mais baratas. Contratar um banco Redis e um worker em periodo integral, não está nos meu planos por agora. Mas, mudar isso, com certeza está em um dos meu planos futuros.

### Documentações que podem lhe ajudar no desenvolvimento:

* [Para começar com o Cloud Firestore](https://firebase.google.com/docs/firestore/quickstart)

* [Comece agora: escrever, testar e implantar as primeiras funções](https://firebase.google.com/docs/functions/get-started)

### Referências:

 1. [https://flask-httpauth.readthedocs.io/en/latest/](https://flask-httpauth.readthedocs.io/en/latest/)

 2. [https://zoltan-varadi.medium.com/flask-api-how-to-return-response-but-continue-execution-828da40881e7](https://zoltan-varadi.medium.com/flask-api-how-to-return-response-but-continue-execution-828da40881e7)