Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

[Projeto] Minha implementação

# 1. INSTALAÇÃO DAS BIBLIOTECAS

!pip install -q -U langchain langchain-google-genai langchain-community langchain-text-splitters pypdf chromadb

# 2. CONFIGURAÇÃO DA API KEY DO GEMINI

from google.colab import userdata

GOOGLE_API_KEY = userdata.get("GEMINI_API_KEY")

print("Chave da API do Gemini configurada com sucesso.")

# 3. IMPORTAÇÃO DO DOCUMENTO PDF

from langchain_community.document_loaders import PyPDFLoader

pdf_path = "/content/sample_data/manual_empresa_novatech.pdf"

loader = PyPDFLoader(pdf_path)
documents = loader.load()

print(f"Documento carregado com sucesso.")
print(f"Quantidade de páginas: {len(documents)}")

# 4. DIVISÃO DO PDF EM CHUNKS

from langchain_text_splitters import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200,
    length_function=len,
    add_start_index=True
)

chunks = text_splitter.split_documents(documents)

print(f"\nQuantidade de páginas: {len(documents)}")
print(f"Quantidade de chunks gerados: {len(chunks)}")

print("\n--- Primeiro chunk ---")
print(chunks[0].page_content)

print("\n--- Metadados do primeiro chunk ---")
print(chunks[0].metadata)

# 5. CRIAÇÃO DOS EMBEDDINGS E DO BANCO VETORIAL

from langchain_google_genai import GoogleGenerativeAIEmbeddings
from langchain_community.vectorstores import Chroma

embeddings = GoogleGenerativeAIEmbeddings(
    model="models/gemini-embedding-001",
    google_api_key=GOOGLE_API_KEY
)

vector_store = Chroma.from_documents(
    documents=chunks,
    embedding=embeddings
)

print(f"\nBanco vetorial criado com sucesso.")
print(f"Quantidade de chunks indexados: {len(chunks)}")

# 6. TESTE DA BUSCA SEMÂNTICA
query = "O que a NovaTech recomenda para garantir a segurança da informação?"

resultados = vector_store.similarity_search(
    query,
    k=3
)

print(f"\nPergunta: {query}")
print(f"Quantidade de documentos recuperados: {len(resultados)}")

for i, doc in enumerate(resultados, 1):
    print(f"\n--- Documento recuperado {i} ---")
    print(doc.page_content)
    print(f"Página: {doc.metadata.get('page', 'N/A')}")

# 7. CONFIGURAÇÃO DO MODELO GEMINI

from langchain_google_genai import ChatGoogleGenerativeAI
llm = ChatGoogleGenerativeAI(
    model="gemini-2.5-flash",
    google_api_key=GOOGLE_API_KEY,
    temperature=0
)

print("\nModelo Gemini configurado com sucesso.")

# 8. COMPARAÇÃO: GEMINI TRADICIONAL X GEMINI COM RAG

query = "O que a NovaTech recomenda para garantir a segurança da informação?"


# 8.1 Resposta tradicional
resposta_tradicional = llm.invoke(query)

print("\n==============================================")
print(" RESPOSTA DO GEMINI SEM RAG")
print("==============================================")

print(resposta_tradicional.content)

# 8.2 Recuperação dos documentos relevantes

documentos_relevantes = vector_store.similarity_search(
    query,
    k=3
)

contexto = "\n\n".join(
    doc.page_content
    for doc in documentos_relevantes
)

# 8.3 Criação do prompt aumentado

prompt_rag = f"""
Você é um assistente que responde perguntas com base
exclusivamente nas informações fornecidas no contexto.

Se a informação solicitada não estiver presente no contexto,
informe que não foi possível encontrar a resposta no documento.

CONTEXTO:
{contexto}

PERGUNTA:
{query}

Responda em português de forma clara e objetiva.
"""

# 8.4 Resposta utilizando RAG

resposta_rag = llm.invoke(prompt_rag)

print("\n==============================================")
print(" RESPOSTA DO GEMINI COM RAG")
print("==============================================")

print(resposta_rag.content)

# 9. EXIBIÇÃO DAS FONTES RECUPERADAS

print("\n==============================================")
print(" FONTES RECUPERADAS PELO RAG")
print("==============================================")

for i, doc in enumerate(documentos_relevantes, 1):

    print(f"\nFonte {i}")
    print(f"Página: {doc.metadata.get('page', 'N/A')}")
    print(f"Conteúdo: {doc.page_content[:300]}...")
1 resposta

Boa noite, Paulo! Tranquilo?

Gostei demais da sua solução, continue assim!

Mandou muito bem explorando a configuração do Gemini com API Key, apresentou com clareza o fluxo de criação de embeddings e banco vetorial com Chroma e ainda destacou a comparação entre o uso tradicional e o uso do RAG para respostas mais contextualizadas. Esse exercício mostra domínio técnico, organização e preocupação em validar resultados com fontes recuperadas.

Se quiser aprofundar ainda mais, algumas boas práticas são:

  • Explorar outros bancos vetoriais: como FAISS, Pinecone ou Weaviate, para cenários maiores e distribuídos.
  • Monitorar relevância das respostas: usar métricas como precisão e recall para validar a qualidade do RAG.
  • Avaliar diferentes parâmetros de chunking: testar tamanhos e sobreposições para melhorar a precisão da busca semântica.

Continue postando as suas soluções! Além de ganhar pontos de XP na plataforma, você pode ajudar outros estudantes no fórum.

Ah, uma pergunta: você considera mais relevante otimizar primeiro o consumo de tokens para reduzir custos ou ampliar a robustez do banco vetorial para garantir maior precisão nas respostas?

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!