Sistema de Perguntas e Respostas para Políticas Internas
Em grandes corporações, o setor de recursos humanos frequentemente lida com consultas repetitivas sobre regras administrativas, como cálculos de licenças ou procedimentos de horas extras. A busca manual em documentos extensos é ineficiente e suscetível a erros de interpretação. O Langchain-Chatchat oferece uma solução automatizada baseada em inteligência artificial, permitindo respostas precisas e seguras diretamente a partir dos arquivos internos da empresa.
Este sistema utiliza uma arquitetura de Geração Aumentada por Recuperação (RAG), que combina recuperação de informações com modelos de linguagem grandes (LLMs). Diferentemente de chatbots genéricos, ele opera localmente, garantindo que dados sensíveis permaneçam dentro da rede corporativa, eliminando riscos de vazamento associados a serviços em nuvem pública.
O processo envolve quatro etapas técnicas principais:
- Carga e Pré-processamento de Documentos: O sistema aceita formatos como TXT, PDF, Word e Markdown, extraindo texto não estruturado e realizando limpeza automática para remoção de cabeçalhos e padronização de formatos.
- Segmentação e Codificação Semântica: Documentos longos são divididos em blocos de texto coerentes. Por exemplo, usando um divisor de caracteres recursivo com tamanho de 600 caracteres e sobreposição de 100, garantindo continuidade contextual. Em seguida, modelos de embeddings otimizados para português, como o "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2", convertem os blocos em vetores numéricos.
- Armazenamento Vetorial e Indexação: Os vetores são armazenados em bancos de dados como ChromaDB ou FAISS, construindo índices de vizinhos mais próximos aproximados (ANN) para busca eficiente.
- Inferência e Geração de Respostas: Consultas do usuário são codificadas em vetores, e os blocos mais relevantes (por exemplo, os 3 principais) são recuperados. Esses são inseridos como contexto em um LLM local, como Qwen ou Baichuan, para gerar respostas naturais com referências às fontes originais.
Exemplo de implementação em Python, demonstrando uma configuração alternativa:
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQAWithSourcesChain
from langchain_community.llms import Ollama
# Carregar documento de política
loader = TextLoader("normas/politica_ferias.txt")
documentos_brutos = loader.load()
# Divisão em blocos com parâmetros ajustados
divisor = RecursiveCharacterTextSplitter(chunk_size=700, chunk_overlap=120)
blocos = divisor.split_documents(documentos_brutos)
# Usar modelo de embeddings multilíngue
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
# Construir banco vetorial com ChromaDB
banco_vetores = Chroma.from_documents(blocos, embeddings)
# Inicializar LLM via Ollama (serviço local)
llm = Ollama(model="qwen:7b", temperature=0.05)
# Cadeia de perguntas com fontes
cadeia_qa = RetrievalQAWithSourcesChain.from_chain_type(
llm=llm,
chain_type="map_reduce",
retriever=banco_vetores.as_retriever(search_kwargs={"k": 2}),
return_source_documents=True
)
# Executar consulta
pergunta = "Qual é o procedimento para solicitar licença não remunerada?"
resultado = cadeia_qa({"question": pergunta})
print("Resposta:", resultado["answer"])
print("Fonte:", resultado["sources"])
Este código pode ser implantado em servidores internos usando ferramentas como Ollama para hospedar LLMs localmente, garantindo operação totalmente offline.
Detalhes de engenharia aprimoram a robustez do sistema:
- Escolha do Modelo de Embeddings: Modelos multilíngues como o MiniLM são preferidos por sua eficiência em contextos corporativos multilíngues, com taxa de precisão superior em termos técnicos específicos.
- Otimização de Segmentação: O tamanho dos blocos deve equilibrar precisão e contexto; recomenda-se testar entre 400 e 800 caracteres, ajustando com base na estrutura do documento.
- Prompts Personalizados para Mitigar Erros: Template de prompt pode forçar o modelo a citar fontes explicitamente:
from langchain.prompts import PromptTemplate
template_prompt = """
Baseado estritamente no contexto fornecido, responda à pergunta. Se não houver informação suficiente, indique 'Dados insuficientes'.
Contexto: {context}
Pergunta: {question}
Inclua a referência do documento na resposta.
"""
prompt_customizado = PromptTemplate(template=template_prompt, input_variables=["context", "question"])
cadeia_com_prompt = RetrievalQAWithSourcesChain.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=banco_vetores.as_retriever(),
chain_type_kwargs={"prompt": prompt_customizado}
)
Arquitetura típica de implantação inclui camadas modulares:
- Interface de usuário (frontend web ou plugin para aplicativos de mensagens).
- Serviço central Langchain-Chatchat com módulos para parsing de documentos, geração de embeddings e gerenciamento do banco vetorial.
- Sistema back end para upload de arquivos, controle de permissões baseado em LDAP e registro de logs para auditoria.
Comparado com fine-tuning de modelos, a abordagem RAG oferece vantagens significativas em ambientes corporativos: custos reduzidos (sem necessidade de treinamento), atualização rápida dos conhecimentos (apenas re-indexando documentos), e maior transparência nas respostas devido à recuperação direta de fontes.
Técnicas complementares incluem caching de respostas para perguntas frequetes, avaliação periódica da taxa de recuperação usando conjuntos de teste, e integração com ferramentas de visualização como Strealmit para facilitar o uso por não-técnicos.