Boa tarde!
Com ajuda de IA consegui implementar no colab o primeiro projeto do Agente de Futebol utilizando IA gratuita, porém a resposta não é nada humanizada, ou seja, não cumpre com a proposta do RAG.
Caso alguém tenha alguma melhoria para que o código funcione de forma que a resposta seja coerente, por favor, compartilhe?
Exemplo de saída:
Pergunta: O que caracteriza a posição de impedimento no futebol?
Resposta do Agente:
Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer.
Após isto é exibido os trechos, que suprimi, para responder a pergunta.
segue código:
!pip install -U \
langchain==0.1.20 \
langchain-community==0.0.38 \
chromadb \
sentence-transformers \
pypdf
# Importações básicas
# loader de documentos PDF
from langchain_community.document_loaders import PyPDFLoader
# Divisão de texto em blocos
from langchain_text_splitters import RecursiveCharacterTextSplitter
# Embeddings
from langchain_community.embeddings import HuggingFaceEmbeddings
# Banco vetorial
from langchain_community.vectorstores import Chroma
# Cadeia RAG
from langchain.chains import RetrievalQA
from langchain_community.llms import HuggingFacePipeline
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM, pipeline
# Caminho do PDF
CAMINHO_PDF = "regras_futebol.pdf"
# carrega o PDF
loader = PyPDFLoader(CAMINHO_PDF)
documents = loader.load()
# quantidade de páginas carregadas
len(documents)
from google.colab import drive
drive.mount('/content/drive')
Preparação dos Documentos
Os documentos precisam ser divididos em pequenos blocos para facilitar a recuperação de contexto
# Divide os documentos em chuncks menores
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=100
)
chunks = text_splitter.split_documents(documents)
len(chunks)
# Inicializa embeddings
embeddings = HuggingFaceEmbeddings(
model_name="sentence-transformers/all-MiniLM-L6-v2"
)
# Cria o banco vetorial
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_regras_futebol"
)
vectorstore.persist()
Recuperação de Contexto (Retriever)
O retriever busca os trechos mais relevantes para cada pergunta do usuário.
# cria o retriever
retriever = vectorstore.as_retriever(
search_type="similarity",
search_kwargs={"k": 3}
)
Integração com o LLM (RAG)
O contexto recuperado será injetado no prompt enviado ao modelo de linguagem
# Inicializa o modelo de linguagem
# Carrega o tokenizer e o modelo explicitamente para garantir o tipo correto (Seq2Seq)
tokenizer = AutoTokenizer.from_pretrained("google/flan-t5-base")
model = AutoModelForSeq2SeqLM.from_pretrained("google/flan-t5-base")
# Cria o pipeline da transformers com o modelo e tokenizer corretos
llm_pipeline = pipeline(
task="text-generation",
model=model,
tokenizer=tokenizer,
max_new_tokens=256,
do_sample=False
)
# Passa o pipeline diretamente para o HuggingFacePipeline do LangChain
llm = HuggingFacePipeline(pipeline=llm_pipeline )
from langchain.chains import RetrievalQA
# Cria a cadeia RAG
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
return_source_documents=True
)
Testes e Validação
Agora podemos testar perguntas reais e validar se as respostas estão baseadas nos documentos.
# Pergunta de teste
pergunta = "O que caracteriza a posição de impedimento no futebol?"
# Executa a pergunta no agente RAG
resposta = qa_chain(pergunta)
print("Pergunta:")
print(pergunta)
print("\nResposta do Agente:")
print(resposta["result"])
print("\nTrechos utilizados como contexto:\n")
for i, doc in enumerate(resposta["source_documents"], start=1):
print(f"--- Trecho {i} ---")
print(f"Fonte: {doc.metadata.get('source', 'Documento desconhecido')}")
print(f"Página: {doc.metadata.get('page', 'N/A')}\n")
print("Conteúdo:")
print(doc.page_content)
print("\n")