Sistema de Perguntas e Respostas para Estudos do I Ching com Suporte a Grafo de Conhecimento

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 modelo
    • funcao_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 contexto
    • stream_qwen_32b: gera respostas em modo de fluxo (streaming), incorporando inferência e rótulos do grafo
    • obter_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

  1. LLM (Qwen) implantado localmente
    • Após o refinamento (SFT), é possível controlar com precisão o tom e a estrutura do conteúdo gerado.
  2. Mecanismo de Augmented Generation por Recuperação (RAG)
    • O uso do LightRAG no modo "hybrid" combina busca semântica com BM25 para melhores resultados.
  3. Geração de Grafo de Conhecimento
    • Extração automática de subgrafos de conhecimento, fornecendo suporte para visualização ou raciocínio adicional.
  4. 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.

Tags: LightRAG Qwen GrafosDeConhecimento RAG Flask

Publicado em 6-30 01:05