Este tutorial demonstra como configurar o modelo Qwen2.5-7B-Instruct localmente para extrair e analisar conteúdo de documentos PDF em contextos de pesquisa científica, criando um sistema automatizado de perguntas e respostas.
- Justificativa para o Modelo Qwen2.5-7B-Instruct
O Qwen2.5-7B-Instruct é um modelo de linguagem com 7 bilhões de parâmetros, otimizado para instruções. Suas craacterísticas incluem:
- Suporte avançado a chinês e inglês: essencial para literatura científica multilíngue.
- Contexto estendido de 128K tokens: permite processar documentos longos integralmente.
- Habilidade em código e raciocínio: interpreta fórmulas, pseudocódigo e tabelas com precisão.
- Baixo custo de implantação: após quantização, ocupa espaço reduzido (≈4GB) e opera em GPUs comuns.
- Configuração do Ambiente e Ferramentas
2.1 Requisitos Mínimos
- Sistema operacional: Linux (Ubuntu 20.04+) ou Windows com WSL2.
- Memória RAM: ≥16GB.
- GPU: NVIDIA com ≥8GB de VRAM (ex.: RTX 3060).
- Python: versão 3.8 a 3.11.
2.2 Componentes Principais
Utilizaremos dois frameworks-chave:
-
Ollama: gerencia modelos locais, incluindo Qwen2.5-7B, e oferece uma API simples para chamadas.
-
LangChain: orquestra fluxos de trabalho com LLMs, integrando extração de PDF, divisão de texto e geração de respostas.
-
Passo a Passo de Implantação
3.1 Instalação do Ollama e Download do Modelo
No terminal Linux/macOS:
curl -fsSL https://ollama.com/install.sh | sh
Em seguida, obtenha a versão quantizada do modelo:
ollama pull qwen2.5:7b-instruct
Verifique com um teste rápido:
ollama run qwen2.5:7b-instruct
3.2 Criação do Ambiente Python
mkdir ai_research_reader && cd ai_research_reader
python -m venv env
source env/bin/activate # Linux/macOS
pip install --upgrade pip
3.3 Instalação das Dependências
pip install langchain langchain-community pypdf ollama chromadb
3.4 Script de Análise de PDF
Crie o arquivo research_doc_qa.py:
import os
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.llms import Ollama
from langchain.chains import RetrievalQA
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import OllamaEmbeddings
class ResearchDocAnalyzer:
def __init__(self, model_id="qwen2.5:7b-instruct"):
self.llm_engine = Ollama(model=model_id, temperature=0.1)
self.embedding_fn = OllamaEmbeddings(model=model_id)
self.splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
self.vector_db = None
def ingest_pdf(self, file_path):
if not os.path.exists(file_path):
print("Arquivo não encontrado.")
return False
loader = PyPDFLoader(file_path)
raw_docs = loader.load()
text_segments = self.splitter.split_documents(raw_docs)
self.vector_db = Chroma.from_documents(
documents=text_segments,
embedding=self.embedding_fn,
persist_directory="./db_vectors"
)
return True
def query_document(self, question):
if self.vector_db is None:
return "Carregue um PDF primeiro."
retriever = self.vector_db.as_retriever(search_kwargs={"k": 3})
qa_chain = RetrievalQA.from_chain_type(
llm=self.llm_engine,
chain_type="stuff",
retriever=retriever
)
return qa_chain.run(question)
def interactive_session(self):
print("Sistema pronto. Digite 'sair' para encerrar.")
while True:
input_q = input("\nPergunta: ").strip()
if input_q.lower() in ['sair', 'exit']:
break
response = self.query_document(input_q)
print(f"\nResposta: {response}")
if __name__ == "__main__":
analyzer = ResearchDocAnalyzer()
if analyzer.ingest_pdf("documento_cientifico.pdf"):
analyzer.interactive_session()
- Exemplos de Consultas e Boas Práticas
Para resultados ótimos:
- Perguntas específicas: em vez de "resuma o artigo", pergunte "quais foram as contribuições principais do estudo em relação à detecção de anomalias?"
- Foco em seções: "na metodologia, qual critério de avaliação foi adotado?"
- Análise comparativa: "compare os dois métodos propostos na seção 4 e indique limitações."
- Solução de Problemas e Otimizações
5.1 Problemas Comuns
- Erro de conexão com Ollama: certifique-se de que o serviço está em execução (comando
ollama serve). - Processamento lento: reduza
chunk_sizepara 500 ou use uma GPU mais potente. - Respostas vagas: aumente o valor de
kpara 5 no retriever ou verifique a qualidade do PDF (PDFs digitalizados requerem OCR).
5.2 Melhorias Avançadas
- Parser alternativo: substitua
PyPDFLoaderporpdfplumberpara melhor extração de tabelas. - Suporte a OCR: integre
pytesseractpara processar imagens em PDFs escaneados. - Interface web: use
Gradiopara criar uma UI de upload e cnosulta interativa.