Explore o novo chatbot do Developer Center! O MongoDB AI chatbot pode ser acessado na parte superior da sua navegação para responder a todas as suas perguntas sobre o MongoDB .

Junte-se a nós no Amazon Web Services re:Invent 2024! Saiba como usar o MongoDB para casos de uso de AI .
Desenvolvedor do MongoDB
Central de desenvolvedor do MongoDBchevron-right
Produtoschevron-right
Atlaschevron-right

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
IAPythonAtlas
APLICATIVO COMPLETO
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Artigo
star-empty
star-empty
star-empty
star-empty
star-empty
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.

Introdução

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.
Demonstração do OCR

Principais tecnologias

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)

Fluxo de trabalho do aplicativo

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)

Criando o aplicativo

Caso ainda não tenha feito isso, registre-se no MongoDB Atlas e crie um cluster.
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.

Configuração do ambiente

Vamos executar as etapas básicas para executar nosso aplicativo.

1. Clone o repositório e instale os pacotes necessários

1git clone https://github.com/Pash10g/allcr-ai.git
2cd allcr-app
3pip install -r requirements.txt

2. Configure suas variáveis de ambiente no terminal

1OPENAI_API_KEY=your_openai_api_key
2MONGODB_ATLAS_URI=your_mongodb_atlas_uri

Executando o aplicativo

Para executar o aplicativo Streamlit, use o seguinte comando:
1streamlit run app.py
Abra seu navegador da web e Go para http://localhost:8501 para acessar o aplicativo.

3. Conexão do MongoDB

O aplicativo inicializa uma instância de collection global para usar:
1# MongoDB connection
2client = MongoClient(os.environ.get("MONGODB_ATLAS_URI"))
3db = client['ocr_db']
4collection = db['ocr_documents']

Autenticação de usuários

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.
1def 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.")

4. Capturando imagens

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.

5. Extraindo texto de imagens

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
2def 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

6. Armazenando dados no MongoDB

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.
1def 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
6def 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 })

7. Pesquisa e exibição de documentos

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.
1def 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
31def 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.

8. Aplicar tarefas de AI em documentos capturados

O aplicativo também permite adicionar tarefas adicionais de AI a cada documento. Veja como você pode estender a funcionalidade:

Pipeline de tarefas de IA

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.
1def 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
19def 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."

Juntando tudo

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.
OCR inicial
Tarefa de AI no código do documento

Experimente você mesmo

Este código de projeto pode ser encontrado no seguinte repositório GitHub que você mesmo pode implantar seguindo o arquivo README.md.

Conclusão

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.
Iniciar a conversa

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Artigo
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Artigo

Análise de consultas, parte 2: ajustando o sistema


Jan 17, 2024 | 10 min read
Tutorial

Automação do cluster do Atlas usando triggers agendados


Jun 25, 2024 | 11 min read
Tutorial

Utilizar Globbing e Proveniência de Coleção no Data Federation


Jun 28, 2023 | 5 min read
Tutorial

Transmissão de dados do MongoDB para o BigQuery usando conectores Confluent


Jul 11, 2023 | 4 min read
Sumário