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