Local RAG Backend

Um backend RAG local alimentado por Docker Compose, suportando vários formatos de documentos para busca.

Documentação

local-RAG-backend

Este é o backend de um sistema RAG que roda inteiramente com docker compose em ambiente local. Você pode registrar vários documentos e pesquisá-los via servidor MCP.

Recursos

  • Suporte a uma ampla variedade de formatos de arquivo: Utiliza unstructured para suportar diversos formatos como PDF, Office, texto, imagens e outros.
  • Funcionalidade de busca MCP: Reutiliza a implementação de graphiti MCP Server para fornecer busca compatível com Model Context Protocol.
  • Recursos avançados de RAG: Utiliza graphiti para retornar resultados de busca vetorial + busca em grafo + busca em texto completo, reordenados por relevância relacional.
  • Acompanhamento de mudanças nas relações ao longo do tempo: Com o recurso de episódios de graphiti, é possível rastrear mudanças nas relações entre conceitos nos documentos registrados.
graph TB
    User[システム管理者]
    AIAgent[MCP Client]

    subgraph "local-RAG-backend"
        Ingest[ドキュメント登録<br/>unstructured]
        MCPServer[ナレッジ検索<br/>MCP Server]
        Graphiti[graphiti core]
        Neo4j[Neo4j]
    end

    LLM[LLMモデル<br/>OpenAI API互換]
    Ollama[Embeddingモデル<br/>OpenAI API互換]

    User -->|コマンド実行| Ingest
    AIAgent -->|MCP Tools呼び出し| MCPServer
    Ingest --> Graphiti
    MCPServer --> Graphiti
    Graphiti -->|ドキュメント登録| Neo4j
    Graphiti -->|検索クエリ実行| Neo4j
    Graphiti ---> LLM
    Graphiti ---> Ollama

Começando

1. Pré-requisitos

  • Ter acesso a uma API LLM compatível com OpenAPI
    • Modelos utilizados
      • Modelo de embedding para busca vetorial
      • Modelo LLM para busca em grafo
      • Modelo LLM leve para reordenação
    • É possível especificar URLs diferentes para o modelo de embedding e o modelo LLM
      • Exemplo:
        • Modelo de embedding: ローカルのOllama
        • Modelo LLM: OpenAI
          • Busca em grafo: o4-mini
          • Reordenação: gpt-4.1-nano
      • Observações:
        • Ao usar um modelo LLM local com Ollama, é necessário que a resposta com formato especificado seja retornada em poucos segundos.
        • O OpenRouter tende a gerar erros de limite de taxa, então recomendamos especificar diretamente a rota de destino.

2. Instalação

# 実行ディレクトリの作成
mkdir -p path/to/RAG/data/input/
cd path/to/RAG/

# ファイルのダウンロード
curl -Lo docker-compose.yml https://raw.githubusercontent.com/suwa-sh/local-RAG-backend/refs/heads/main/docker-compose.yml
curl -Lo .env https://raw.githubusercontent.com/suwa-sh/local-RAG-backend/refs/heads/main/.env.example

# 環境変数設定
vi .env

# 起動
docker compose up -d

3. Registro de documentos

# ドキュメントを配置
cp -r /path/to/documents/* path/to/RAG/data/imput/

# 一括登録実行
# ※エラー終了した場合も、同じコマンドで前回失敗したファイルから再開できます。
docker compose run --rm ingest

# ログ確認
tail ./data/logs/ingest-*.log

Formatos de arquivo suportados

CategoriaFormatos suportados
Textotxt, md, rst, org
Webhtml, xml
PDFpdf
Microsoft Officedoc, docx, ppt, pptx, xls, xlsx
OpenDocumentodt
Rich Textrtf
eBookepub
Dadoscsv, tsv
E-maileml, msg, p7s
Imagensbmp, heic, jpeg, jpg, png, tiff, tif

Estrutura de diretórios

data/input/        : 未処理ファイル
data/input_work/   : エピソード登録中(エピソードファイル保存済み)
data/input_done/   : 処理完了ファイル
data/input_chunks/ : エラー時再処理用チャンク分割ファイル

4. Busca de conhecimento

  • Conecte-se a partir de clientes MCP, como nó n8n / AI Agent ou Claude Desktop

    {
      "mcpServers": {
        "graphiti-memory": {
          "transport": "sse",
          "url": "http://localhost:8000/sse"
        }
      }
    }
    

Ferramentas MCP disponíveis

// RAG用検索
const result = await mcp.call_tool("search_for_rag", {
  query: "RAGシステムについて",
  group_ids: ["default"],
});

// 事実検索
const result = await mcp.call_tool("search_memory_facts", {
  query: "RAGシステムについて",
  group_ids: ["default"],
  max_facts: 10,
});

// ノード検索
const nodes = await mcp.call_tool("search_memory_nodes", {
  query: "システム",
  group_ids: ["default"],
  max_nodes: 5,
  // entity_types: ["Preference"], // 任意: エンティティ種別で絞り込み
});

// エピソード取得
const episodes = await mcp.call_tool("get_episodes", {
  group_ids: ["default"],
  max_episodes: 10,
});

// エピソード追加
const addResult = await mcp.call_tool("add_memory", {
  name: "新しい情報",
  episode_body: "ここに内容を記述",
  group_id: "default",
  source: "text",
});

Configuração

Consulte .env.example para a lista de variáveis de ambiente, descrições e valores padrão (as configurações são centralizadas neste arquivo).

# .env.example をコピーして編集
cp .env.example .env
vi .env

Problemas conhecidos

  • Visualização do processamento interno da busca de conhecimento (análise de logs é possível)