Capturando e armazenando óptica do mundo real com o MongoDB Atlas, o GPT-4 da OpenAI e o PyMongo
Pavel Duchovny7 min read • Published Sep 04, 2024 • Updated Sep 04, 2024
APLICATIVO COMPLETO
Avalie esse Artigo
Toda vez que a OpenAI publica notícias sobre um novo modelo de AI GPT, eu me emocionei. Eu estava criando demos com APIs OpenAI GPT do 2021 (principalmente quando foram lançadas pela primeira vez). Relemitindo meu primeiro artigo, não posso acreditar no grande feito do GPT-4o com suas capacidades de mídia "Omni ". Ele permite que os usuários sejam flexíveis e gratuitos, com entradas de texto, imagem e áudio trabalhando junto com um endpoint API para que qualquer tarefa inteligente possa ser executada.
O MongoDB é conhecido por sua capacidade de armazenar fluxos de dados flexíveis e estruturas JSON há anos, aproveitada por milhões de usuários. Portanto, não é de se abalar que misturar o MongoDB Atlas e o Atlas Vector Search com GPT-4o em textos e imagens, capturados por um simples aplicativo da web, seja tão poderoso e surpreendente.
Neste artigo, exploramos uma maneira inovadora de capturar e armazenar dados do mundo real usando MongoDB, GPT-4o e o driver PyMongo em um aplicativo Streamlit. Analisaremos o desenvolvimento de um aplicativo que transforma imagens capturadas em documentos JSON pesquisáveis, usando os poderosos recursos GPT-4o da OpenAI para OCR. Este projeto é uma excelente demonstração de como integrar várias tecnologias para resolver problemas práticos de maneira simplificada e eficiente.
Objetos do mundo real, como receitas, documentos, plantas e veículos, geralmente contêm informações valiosas que podem ser digitalizadas para facilitar o acesso e a análise. Ao combinar os recursos do MongoDB, Streamlit e OpenAI, podemos criar um aplicativo que captura imagens, extrai texto e armazena as informações em um banco de MongoDB database. Essa abordagem permite o armazenamento, a recuperação e a pesquisa eficientes dos dados digitalizados.
MongoDB Atlas: Um banco de dados flexível, escalável e orientado a documentos, ideal para armazenar documentos semelhantes a JSON
PyMongo: o robusto driver Python do MongoDB, servindo como ponto de acesso para queries operacionais e vetoriais
OpenAI GPT-4o: Um novo modelo de linguagem de última geração capaz de compreender entradas de vários canais de mídia (texto, imagens e áudio) e gerar textos ou imagens semelhantes aos humanos, que usaremos aqui para reconhecimento óptico de caracteres (OCR)
Autenticação do usuário: garante que apenas usuários autorizados possam acessar o aplicativo
Captura de imagem: usa a câmera do dispositivo para capturar imagens de objetos do mundo real
Extração de texto: Utiliza o GPT-4da OpenAI para transcrever as imagens capturadas em dados JSON estruturados
Armazenamento de dados: armazena os dados JSON extraídos no MongoDB pararecuperação e pesquisa eficientes
Recuperação de dados: Permite que os usuários pesquisem e visualizem os documentos armazenados e suas imagens correspondentes
Tarefa de AI de pipeline em documentos capturados: usa a geração aumentada por recuperação (RAG) para obter um prompt de um usuário e permite operar no conteúdo existente para criar um novo conteúdo gerado (por exemplo, traduzir uma postagem capturada para quatro outros idiomas, criar uma postagem do LinkedIn a partir de um anúncio de resumo do produto)
Depois de criar seu cluster com acesso IP adicionado ao seu host, obtenha sua connection string e copie-a para uso posterior.
O Atlas permite que você crie índices de texto completo do Atlas Search junto com índices vetoriais do Atlas Search para permitir capacidades de pesquisa robustas e ricas em seus documentos armazenados.
A pesquisa de texto completo permite aproveitar as agregações e pesquisar dinamicamente seus documentos com base em palavras-chave e lógica difusa em qualquer conjunto de atributos em qualquer nível.
Siga nosso tutorial para criar um índice com a sintaxe necessária para esse aplicativo. Aplique-o a uma collection no banco de dados ocr_db e à collection
ocr_documents
, com o nome de índice “search:1 { 2 "mappings": { 3 "dynamic": true, 4 "fields": { 5 "api_key": { 6 "type": "string" 7 }, 8 "ocr": { 9 "dynamic": true, 10 "type": "document" 11 } 12 } 13 } 14 }
Os vetores são matrizes baseadas em float criadas por provedores de AI, como o OpenAI neste caso, que representam as entradas codificadas como um vetor numérico. O índice vetorial ajuda a pesquisar a similaridade baseada semântica de uma query/string/mídia codificada, com os vetores armazenados representando o conteúdo codificado nos documentos do banco de dados.
Para criá-lo, use o índice a seguir, com a sintaxe necessária para esse aplicativo no banco de dados ocr_db e na collection ocr_documents, nome de índice “vector_index”:
1 { 2 "fields": [ 3 { 4 "numDimensions": 1536, 5 "path": "embedding", 6 "similarity": "cosine", 7 "type": "vector" 8 }, 9 { 10 "path": "api_key", 11 "type": "filter" 12 } 13 ] 14 }
Depois de ter a collection e os índices prontos, é possível construir os artefatos do aplicativo.
Vamos executar as etapas básicas para executar nosso aplicativo.
1 git clone https://github.com/Pash10g/allcr-ai.git 2 cd allcr-app 3 pip install -r requirements.txt
1 OPENAI_API_KEY=your_openai_api_key 2 MONGODB_ATLAS_URI=your_mongodb_atlas_uri
Para executar o aplicativo Streamlit, use o seguinte comando:
1 streamlit run app.py
O aplicativo inicializa uma instância de collection global para usar:
1 # MongoDB connection 2 client = MongoClient(os.environ.get("MONGODB_ATLAS_URI")) 3 db = client['ocr_db'] 4 collection = db['ocr_documents']
O aplicativo começa solicitando ao usuário que insira um código de API. Isso garante que apenas usuários autorizados possam acessar as funcionalidades do aplicativo. O código da API é verificado em relação às chaves permitidas armazenadas no banco de dados.
1 def auth_form(): 2 3 4 st.write("Please enter the API code to access the application.") 5 api_code = st.text_input("API Code", type="password") 6 if st.button("Submit"): 7 st.toast("Authenticating...", icon="⚠️") 8 db_api_key=auth_collection.find_one({"api_key":api_code}) 9 if db_api_key: 10 st.session_state.authenticated = True 11 st.session_state.api_code = api_code 12 st.success("Authentication successful.") 13 st.rerun() # Re-run the script to remove the auth form 14 else: 15 st.error("Authentication failed. Please try again.")
Uma vez autenticados, os usuários podem capturar imagens usando a câmera do dispositivo. O aplicativo suporta imagens de vários objetos do mundo real, como receitas, documentos, bichos, veículos e produtos.
As imagens capturadas são enviadas para o GPT-4o da OpenAI para OCR. O modelo processa as imagens e extrai texto relevante que é então estruturado em um formato JSON. Este JSON document inclui campos como "nome" e "tipo", garantindo que os dados estejam bem organizados e prontos para armazenamento.
1 # Function to transform image to text using OpenAI 2 def transform_image_to_text(image, format): 3 img_byte_arr = io.BytesIO() 4 image.save(img_byte_arr, format=format) 5 img_byte_arr = img_byte_arr.getvalue() 6 encoded_image = base64.b64encode(img_byte_arr).decode('utf-8') 7 8 response = openai.chat.completions.create( 9 model="gpt-4o", 10 messages=[{ 11 "role": "system", 12 "content": "You are an ocr to json expert looking to transcribe an image. If the type is 'other' please specify the type of object and clasiffy as you see fit." 13 }, 14 { 15 "role": "user", 16 "content": [ 17 { 18 "type": "text", 19 "text": f"Please trunscribe this {transcribed_object} into a json only output for MongoDB store, calture all data as a single document. Always have a 'name', 'summary' (for embedding ) and 'type' top field (type is a subdocument with user and 'ai_classified') as well as other fields as you see fit." 20 }, 21 { 22 "type": "image_url", 23 "image_url": { 24 "url": f"data:image/jpeg;base64,{encoded_image}" 25 } 26 } 27 ] 28 } 29 ] 30 ) 31 extracted_text = response.choices[0].message.content 32 return extracted_text
Os dados JSON estruturados são armazenados em um banco de dados MongoDB. A natureza orientada a documentos do MongoDB o torna uma ótima opção para esse tipo de aplicativo, permitindo o armazenamento e a recuperação flexíveis e eficientes de dados. Ele usa a incorporação OpenAI para incorporar campos e nomes resumidos para pesquisa semântica.
1 def clean_document(document): 2 cleaned_document = document.strip().strip("```json").strip("```").strip() 3 return json.loads(cleaned_document) 4 5 # Function to save image and text to MongoDB 6 def save_image_to_mongodb(image, description): 7 img_byte_arr = io.BytesIO() 8 image.save(img_byte_arr, format=image.format) 9 img_byte_arr = img_byte_arr.getvalue() 10 encoded_image = base64.b64encode(img_byte_arr).decode('utf-8') 11 12 # Remove the ```json and ``` parts 13 14 15 # Parse the cleaned JSON string into a Python dictionary 16 document = clean_document(description) 17 18 response = openai.embeddings.create( 19 input=json.dumps({ 20 'name' : document['name'], 21 'summary' : document['summary'] 22 }), 23 model="text-embedding-3-small" 24 ) 25 26 gen_embeddings=response.data[0].embedding 27 28 collection.insert_one({ 29 'image': encoded_image, 30 'api_key': st.session_state.api_code, 31 'embedding' : gen_embeddings, 32 'ocr': document, 33 'ai_tasks': [] 34 })
Os usuários podem pesquisar documentos armazenados usando palavras-chave. O aplicativo recupera documentos correspondentes do MongoDB e os exibe, junto com suas imagens correspondentes. Isso facilita a navegação e a localização de informações específicas.
1 def search_aggregation(search_query): 2 docs = list(collection.aggregate([ 3 { 4 '$search': { 5 'index': 'search', 6 'compound': { 7 'should': [ 8 { 9 'text': { 10 'query': search_query, 11 'path': { 12 'wildcard': '*' 13 } 14 } 15 } 16 ], 17 'filter': [ 18 { 19 'queryString': { 20 'defaultPath': 'api_key', 21 'query': st.session_state.api_code 22 } 23 } 24 ] 25 } 26 } 27 } 28 ])) 29 return docs 30 31 def vector_search_aggregation(search_query, limit): 32 query_resp = openai.embeddings.create( 33 input=search_query, 34 model="text-embedding-3-small" 35 ) 36 query_vec = query_resp.data[0].embedding 37 docs = list(collection.aggregate([ 38 { 39 '$vectorSearch': { 40 'index': 'vector_index', 41 'queryVector': query_vec, 42 'path': 'embedding', 43 'numCandidates' : 20, 44 'limit' : limit, 45 'filter': { 46 'api_key': st.session_state.api_code 47 } 48 }}, 49 { '$project' : {'embedding' : 0} } 50 ])) 51 return docs
Além disso, com o uso de um botão de alternância da interface do usuário, podemos alternar para a pesquisa vetorial semântica ou para a pesquisa contextual de texto livre.
Em ambas as pesquisas, o código executa filtragem extra para retornar apenas documentos com a chave de API marcada pelo usuário.
O aplicativo também permite adicionar tarefas adicionais de AI a cada documento. Veja como você pode estender a funcionalidade:
Você pode criar e salvar tarefas de IA em cada documento usando as seguintes funções. Essas funções permitem definir tarefas para a AI executar em documentos JSON armazenados e salvar os resultados de volta no MongoDB. A flexibilidade do MongoDB nos permite adicionar o conteúdo e apresentá-lo para registro e reutilização futura.
1 def get_ai_task(ocr,prompt): 2 ## Use existing document as context and perform another GPT task 3 ocr_text = json.dumps(ocr) 4 response = openai.chat.completions.create( 5 model="gpt-4o", 6 messages=[{ 7 "role": "system", 8 "content": "You are a task assistant looking to create a task for the AI to perform on the JSON object. Please return plain output which is only copy paste with no explanation." 9 }, 10 { 11 "role": "user", 12 "content": f"Please perform the following task {prompt} on the following JSON object {ocr_text}. Make sure that the output is stright forward to copy paste." 13 } 14 ] 15 ) 16 17 return response.choices[0].message.content 18 19 def save_ai_task(task_id, task_result, prompt): 20 21 collection.update_one( 22 {"_id": ObjectId(task_id)}, 23 {"$push" : {"ai_tasks" : {'prompt' : prompt, 'result' : task_result}}} 24 ) 25 26 return "Task saved successfully."
Para ilustrar as capacidades dos fluxos de trabalho descritos, produzi as seguintes imagens onde digitalio uma receita de gin de um livro. O conteúdo está sendo capturado como um documento JSON e agora posso fazer uma pesquisa no Atlas por meio de pesquisas vetoriais ou de texto, bem como produzir uma tarefa como "gerar uma bebida nãoalcoólica" semelhante à receita original.
Este código de projeto pode ser encontrado no seguinte repositório GitHub que você mesmo pode implantar seguindo o arquivo README.md.
Este aplicativo demonstra o poder e a flexibilidade da integração do MongoDB Atlas, Streamlit e GPT-4o da OpenAI para capturar, processar e armazenar dados do mundo real. Ao aproveitar essas tecnologias, podemos criar soluções robustas que transformam informações físicas em documentos virtuais pesquisáveis, melhorando a acessibilidade e a usabilidade.
A combinação do armazenamento escalável do MongoDB Atlas, do driver PyMongo, da interface amigável do Streamlit e dos recursos avançados de OCR do OpenAI oferecem uma solução abrangente para gerenciar e utilizar dados do mundo real de forma eficaz.
Se tiver alguma dúvida ou sugestão, fique à vontade para entrar em contato ou contribuir com o projeto. Experimente oMongoDB Atlas hoje e participa de nossos fóruns para maior interação. Boa codificação!
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.