This post is also available in english.
No coração do Polo Norte, a equipe de duendes de Papai Noel enfrentava um desafio logístico formidável: como lidar com milhões de cartas de crianças de todo o mundo. Com um olhar determinado, Papai Noel decidiu que era hora de incorporar inteligência artificial na operação natalina.
Sentando-se em seu computador, equipado com o mais recente em tecnologia de IA, Papai Noel começou a trabalhar em um script Python no Jupyter Notebook. O objetivo era simples, mas ambicioso: utilizar o poder da IA Generativa e LLMs para interpretar cartas manuscritas e extrair os dados necessários, inserindo-os de forma organizada no Elasticsearch.
!pip install python-dotenv elasticsearch langchain openai
O primeiro passo foi configurar as variáveis de ambiente as quais seriam utilizadas como credenciais para acesso a api do OpenAI e do Elasticsearch.
import os
from dotenv import load_dotenv
# Substitua 'path/to/your/.env' pelo caminho correto até o seu arquivo .env no Google Drive
env_path = '/content/drive/MyDrive/@Blogs/04-Advent-2023/env_advent'
load_dotenv(env_path)
# OpenAI API Key
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
OPENAI_API_URL = "https://api.openai.com/v1/chat/completions"
# Elastic cloud credentials
es_cloud_id = os.getenv('cloud_id')
es_user = os.getenv('cloud_user')
es_pass = os.getenv('cloud_pass')
A seguir, com uma imagem digitalizada de uma carta de Natal, Papai Noel escreveu um script para extrair o texto usando o "gpt-4-vision-preview". Essa etapa crucial transformou a escrita manual em texto digital. O "GPT-4-vision-preview" é uma versão experimental do modelo de linguagem GPT-4 da OpenAI, ampliada para incluir a capacidade de processamento e análise de imagens.
from PIL import Image
import requests
import numpy as np
from langchain.chat_models import ChatOpenAI
from langchain.schema.messages import HumanMessage, SystemMessage
image_path = 'https://i.imgur.com/fj7yYMx.png'
chat = ChatOpenAI(model="gpt-4-vision-preview", max_tokens=512)
result = chat.invoke(
[
HumanMessage(
content=[
{"type": "text", "text": "Qual é a imagem? Por favor, forneça uma introdução detalhada em portugues."},
{
"type": "image_url",
"image_url": {
"url": image_path,
"detail": "auto",
},
},
]
)
]
)
print(result.content)
Em seguida, o LangChain entrou em ação, analisando o texto e identificando elementos-chave como o nome da criança e a lista de desejos.
from langchain.prompts import PromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.schema import StrOutputParser
chain = ChatOpenAI(model="gpt-3.5-turbo", max_tokens=1024)
prompt = PromptTemplate.from_template(
"""
Extract the list and child's name from the text below and return the data in JSON format using the following name:
- "child_name", "wishlist".
{santalist}
"""
)
runnable = prompt | chain | StrOutputParser()
letter = result.content
wishlist = runnable.invoke({"santalist": letter})
print(wishlist)
{
"child_name": "Maria",
"wishlist": [
"Barbie Dreamhouse Adventures",
"My Little Pony"
]
}
O Papai Noel decidiu enriquecer um pouco a base de dados, e pediu ainda, que a IA estime o peso desses presentes. Assim ele pode gerar uma lista no Kibana com os presentes das crianças divididas em cada sacola e que couberem dentro do espaço de um trenó, que organização!!
chain = ChatOpenAI(model="gpt-3.5-turbo", max_tokens=1024)
prompt = PromptTemplate.from_template(
"""
{santalist_json}
From the JSON above, include a new attribute in the JSON called 'weight',
which will calculate the total estimated weight of each item in the list in kilograms.
You will first need to estimate the weight of each item individually.
After that, sum these values to obtain the total weight.
Extract only the numerical value.
"""
)
runnable = prompt | chain | StrOutputParser()
new_wishlist = runnable.invoke({"santalist_json": wishlist})
print(new_wishlist)
{
"wishlist": [
"Barbie Dreamhouse Adventures",
"My Little Pony"
],
"child_name": "Maria",
"weight": 2.5
}
Agora, com os dados estruturados, era hora de movê-los para o Elasticsearch.
from elasticsearch import Elasticsearch
import json
es = Elasticsearch(cloud_id=es_cloud_id,
basic_auth=(es_user, es_pass)
)
es.info() # should return cluster info
# Parse the JSON string
json_string = new_wishlist
data = json.loads(json_string)
# Index name
index_name = "santa_claus_list"
# Index the document
response = es.index(index=index_name, document=data)
# Print the response from Elasticsearch
print(response)
Usando o Dev Console , uma ferramenta integrada ao Kibana, Papai Noel e os duendes poderiam então facilmente buscar e analisar os dados. Isso permitia uma visão clara das tendências de presentes deste ano, as localizações mais frequentes das cartas, e até mesmo identificar aquelas cartas que expressavam desejos particulares ou urgentes e claro, o peso dos presentes. Como nessa query usando ES|QL.
POST /_query?format=txt
{
"query": """
FROM santa_claus_list
| STATS sum_toy = SUM(weight) BY child_name
| LIMIT 100
"""
}
# result
sum_toy | child_name
---------------+---------------
30.5 |Caua
1.5 |Mike
3.0 |Theo
2.5 |Isabella
40.0 |William
30.0 |Olivia
Graças a esta solução inovadora, Papai Noel não só conseguiu atender aos pedidos de forma mais eficiente, mas também ganhou insights valiosos sobre as alegrias e esperanças das crianças ao redor do mundo, tudo graças ao poder da IA, LangChain, e Elasticsearch. Este Natal prometia ser o mais mágico e bem organizado de todos!
Se você quer acompanhar e executar o código enquanto lê, acesse o arquivo de código Python rodando em um Jupyter Notebook (Google Collab).
Feliz Natal a Todos e que venha 2024!!!!