Son aktivite 3 days ago

Script RAG en ~45 lineas: extrae contexto de un grafo SQLite con sqlite-utils y lo emite como JSONL para un LLM

Revizyon eb9e8203f880b1fd6d1dfadce0a1dc30c476d437

rag-demo.py Ham
1#!/usr/bin/env python3
2"""
3rag-demo.py — Conecta tu grafo de conocimiento en SQLite con un LLM.
4
5Extrae nodos y sus relaciones del grafo y los emite como JSONL, listo
6para encadenar con `llm` o con cualquier cliente que lea por stdin.
7
8Uso:
9 ./rag-demo.py | llm "resume las herramientas del proyecto"
10 ./rag-demo.py --tipo tool --limite 50
11"""
12import argparse
13import json
14
15from sqlite_utils import Database
16
17DB = "demo.db"
18
19
20def extraer(db, tipo, limite):
21 """Devuelve las filas del grafo como un iterador de diccionarios."""
22 sql = """
23 select n.key, n.label, n.type, e.kind as relacion
24 from nodes n
25 left join edges e on n.key = e.source
26 where (:tipo is null or n.type = :tipo)
27 order by n.type, n.label
28 limit :limite
29 """
30 return db.query(sql, {"tipo": tipo, "limite": limite})
31
32
33def main():
34 parser = argparse.ArgumentParser(description="Contexto del grafo para un LLM")
35 parser.add_argument("--tipo", help="Filtra por tipo de nodo (tool, concept, file...)")
36 parser.add_argument("--limite", type=int, default=30, help="Número de nodos a extraer")
37 args = parser.parse_args()
38
39 db = Database(DB)
40 for fila in extraer(db, args.tipo, args.limite):
41 print(json.dumps(fila, ensure_ascii=False))
42
43
44if __name__ == "__main__":
45 main()
46