Após a realização do Ajuste de Instruções (SFT) em Modelos de Linguagem de Grande Escala (LLMs), embora estes consigam lidar com tarefas de perguntas e respostas abertas, ainda enfrentam desafios como atualização do conhecimento em atraso e solidez factual limitada em domínios especializados, como o I Ching. Para mitigar isto, este artigo descreve a implementação de um sistema de perguntas e respostas com conhecimento aprimorado utilizando o LightRAG (Retrieval-Augmented Generation leve). Este sistema integra um modelo refinado (como o Qwen-32B) para elevar a qualidade da inferência e suporta a extração e visualização automática de grafos de conhecimento. ### Stack Tecnológica e Componentes Principais
| Tecnologia | Função |
|---|---|
| Flask | Fornece serviço de interface REST |
| LightRAG | Implementa o RAG leve para aprimoramento por recuperação |
| OpenAI SDK | Invoca o modelo Qwen (versão refinada) |
| NumPy | Operações com vetores, processamento de embeddings |
| asyncio | Gerenciamento de tarefas assíncronas |
| Modelo de Embedding | BAAI/bge-m3 para busca semântica |
| Template de Inferência Customizado | Utilizado para gerar respostas estruturadas com raciocínio |
Visão Geral da Estrutura do Projeto
- Seção de Inicialização
- Configuração do diretório de trabalho e variáveis de ambiente
- Definição da variável global
rag
- Configuração do LightRAG
- Definição da dimensão dos vetores, limite máximo de tokens e configuração das funções de embedding e LLM
- Funções Principais
invocar_modelo_llm: encapsula a interface de inferência do grande modelofuncao_embedding: encapsula a chamada para vetorização (BAAI/bge-m3)obter_prompt_contextual: realiza a recuperação híbrida via LightRAG e retorna um prompt com contextostream_qwen_32b: gera respostas em modo de fluxo (streaming), incorporando inferência e rótulos do grafoobter_subgrafo: invoca o LightRAG para extrair um subgrafo de conhecimento relevante
- Endpoints de API
/qwen14b: perguntas e respostas básicas (sem grafo)/qwen32b: perguntas e respostas aprimoradas com integração do grafo/qwen32b_sft: uso direto do modelo refinado (sem recuperação)/obterGrafo: endpoint para extração do grafo de conhecimento
Detalhamento das Funcionalidades Principais
1. Inicialização do LightRAG
def configurar_lightrag():
global rag
rag = LightRAG(
working_dir=DIRETORIO_TRABALHO,
llm_model_func=invocar_modelo_llm,
embedding_func=EmbeddingFunc(
embedding_dim=1024,
max_token_size=8192,
func=funcao_embedding,
),
)
- Diretório de Trabalho: todo o cache e índices são armazenados em
DIRETORIO_TRABALHO. invocar_modelo_llm: interface encapsulada para chamar o LLM (com suporte a cache).funcao_embedding: função subjacente para vetorização de consultas (chamada assíncrona).
2. Geração de Resposta com Contexto usando LLM
async def obter_prompt_contextual(pergunta):
resultado_recuperado = await rag.aquery(pergunta, param=QueryParam(mode="hybrid"))
return [pergunta, resultado_recuperado]
- O LightRAG recupera o conteúdo mais relevante relacionado à pergunta e o utiliza como
system_prompt, formando o contexto completo junto com a pergunta do usuário.
3. Geração de Resposta Aprimorada: Qwen-32B + Rótulos de Inferência + Grafo
mensagens.append({
"role": "user",
"content": f"{prompt_recuperado[1]}\nAqui está informação do grafo de conhecimento relacionada à sua pergunta. Por favor, combine seu próprio conhecimento com as informações úteis do texto para formular uma resposta..."
})
- O papel do
system_prompté definido como "Especialista em estudos do I Ching". - A respotsa do modelo utiliza a tag
<inferencia>para o processo de raciocínio. - A resposta final é delimitada pela tag
<resposta>. - O modelo é instruído a não citar diretamente expressões como "no texto" ou "na tabela", tornando a resposta mais natural.
4. Extração do Grafo de Conhecimento (Endpoint /obterGrafo)
@app.route('/obterGrafo', methods=['POST'])
def obter_grafo():
resultado = asyncio.run(rag.get_subgraph(dados_requisicao["pergunta"]))
return json.dumps(resultado, ensure_ascii=False)
- Invoca o método
LightRAG.get_subgraph()para gerar um grafo de entidades e relacionamentos a partir do índice de conhecimento, que pode ser utilizado pelo front end para visualização.
Fluxo de Chamada Simplificado
Usuário faz a pergunta
↓
POST /qwen32b
↓
obter_prompt_contextual(pergunta) - Recuperação assíncrona com aprimoramento
↓
rag.aquery(pergunta, mode=hybrid)
↓
Gera o prompt contextualizado → Enviado ao modelo Qwen-32B
↓
Resposta do modelo (com inferência e informações do grafo) retornada via streaming
Destaques do Projeto
- LLM (Qwen) implantado localmente
- Após o refinamento (SFT), é possível controlar com precisão o tom e a estrutura do conteúdo gerado.
- Mecanismo de Augmented Generation por Recuperação (RAG)
- O uso do
LightRAGno modo "hybrid" combina busca semântica com BM25 para melhores resultados.
- O uso do
- Geração de Grafo de Conhecimento
- Extração automática de subgrafos de conhecimento, fornecendo suporte para visualização ou raciocínio adicional.
- Saída em Streaming
- Utiliza o formato SSE (Server-Sent Events), compatível com a atualização em tempo real no frontend, melhorando a experiência do usuário.
Considerações Finais
Este artigo demonstrou a construção de um sistema de perguntas e respostas especializado, projetado para o domínio do I Ching, integrando um grande modelo de linguagem (Qwen) com o framework LightRAG. O sistema desenvolvido é capaz de realizar recuperação de conhecimento aprimorada (RAG), gerar respostas com estrutura de raciocínio (inferência/resposta) e extrair grafos de conhecimento relevantes, oferecendo um potencial significativo de aplicação em plataformas digitais de estudo e divulgação do I Ching.