← Voltar a RAG — Arquitetura de Ingestion e Retrieval
🛠️ Tools e Fontes
RAG — Arquitetura de Ingestion e RetrievalApresentação
3. Tools e Fontes de Dados
O retrieval acede a três fontes: documentos (vector store), SQL (Postgres), graph (Neo4j).
2.1 DocStore — Documentos
Responsabilidade
- Ler chunks do Chroma
- Embeddar queries com sentence-transformers
- Devolver
[(doc_id, passage, score), ...]
API
store = DocStore()
chunks = store.retrieve(query="policy de despesas", top_k=5)
# [(doc_id, passage, score), ...]
count = store.count()
Dados
- Fonte:
data/generated/docs/*.md(ou symlink para adaptive-rag) - Indexação:
python scripts/ingest_docs.py - Coleção Chroma: "docs", espaço cosseno
2.2 SQLTool — Dados Estruturados
Responsabilidade
- Executar apenas queries SELECT
- Validar que não há INSERT/UPDATE/DELETE
- Devolver
List[dict](rows como dicts)
API
tool = SQLTool()
rows = tool.query("SELECT team_id, amount_usd FROM budgets WHERE quarter='Q1'")
# [{"team_id": "team_eng", "amount_usd": 450000}, ...]
available = tool.available() # Postgres acessível?
Validação
- Começa por
SELECT - Proibido: INSERT, UPDATE, DELETE, DROP, TRUNCATE, ALTER, CREATE
Schema para Text-to-SQL
O LLM recebe schema resumido (até 3000 chars) de schema.sql para gerar queries.
Tabelas NovaOps: teams, employees, services, projects, budgets, expenses, incidents, tickets, policies, document_references, etc.
Configuração
| Variável | Default |
|---|---|
| pg_host | localhost |
| pg_port | 5432 |
| pg_user | novaops |
| pg_password | novaops |
| pg_db | novaops |
2.3 Neo4jTool — Graph
Responsabilidade
- Executar apenas Cypher read-only (MATCH, OPTIONAL MATCH, RETURN)
- Validar que não há CREATE/MERGE/DELETE
- Devolver
List[dict](records)
API
tool = Neo4jTool()
rows = tool.query("MATCH (t:Team)-[:OWNS_SERVICE]->(s:Service) RETURN t.name, s.name")
# [{"t.name": "Engineering", "s.name": "Billing API"}, ...]
available = tool.available()
Validação
- Deve conter MATCH ou OPTIONAL MATCH
- Proibido: CREATE, MERGE, DELETE, DETACH, REMOVE, SET, DROP, LOAD CSV, CALL apoc, etc.
Schema para Text-to-Cypher
Labels e relações NovaOps descritas em prompt: Team, Employee, Service, Incident, OWNS_SERVICE, BELONGS_TO, etc.
Configuração
| Variável | Default |
|---|---|
| neo4j_uri | bolt://localhost:7687 |
| neo4j_user | neo4j |
| neo4j_password | novaops |
2.4 Quando Cada Tool é Usada
| Pipeline | DocStore | SQLTool | Neo4jTool |
|---|---|---|---|
| direct_answer | ❌ | ❌ | ❌ |
| simple_rag | ✅ | ❌ | ❌ |
| enriched_rag | ✅ | ❌ | ❌ |
| multi_backend_agent | ✅ (se use_docs) | ✅ (se use_sql) | ✅ (se use_graph) |
O planner (LLM) decide use_docs, use_sql, use_graph por query.
2.5 Integração no Multi-Backend
Planner → {"use_docs": true, "use_sql": true, "use_graph": false}
|
v
Tools (paralelo conceptual):
• use_docs → DocStore.retrieve(query, top_k)
• use_sql → LLM text-to-SQL → SQLTool.query(sql)
• use_graph → LLM text-to-Cypher → Neo4jTool.query(cypher)
|
v
Format context: docs_context, sql_context, graph_context
|
v
Synthesis LLM combina os três contextos
2.6 Teoria: Novas Fontes
Para adicionar APIs externas ou outras bases:
- Criar tool com
query(url, params)ou equivalente - Validar entradas (evitar SSRF, injection)
- Adicionar ao planner prompt: "use_api": bool
- Incluir schema/descrição da API no prompt
- Formatar saída para synthesis
Zona de prática
Sem perguntas. Clica em Editar para adicionar.