RAG: Retrieval

De wikijoan
La revisió el 14:43, 16 oct 2026 per Joan (discussió | contribucions) (→‎Retrieval)
(dif) ← Versió més antiga | Versió actual (dif) | Versió més nova → (dif)
Salta a la navegació Salta a la cerca

Contingut

Retrieval

Ja hem fet la ingesta al QDrant, on tenim els vectoris i els chunks com a payloads (amb els seus textos i totes les metadades d'informació que hem acumulat). I ara ja podem fer-li preguntes al QDrant, que ens retornarà els chunks més rellevants.

El següent pas serà construir un context a partir d'aquestes respostes, i ajuntar-ho amb un prompt per llençar una consulta a un LLM. Però això serà més endavant.

Anem ara a fer unes consultes bàsiques i uns scripts bàsics de retrieval.

prompt:

Fes-me una comanda curl per recuperar els punts que continguin la paraula 'Dylan'

Per buscar una paraula exacta dins del text no cal fer servir embeddings. N’hi ha prou amb un filtre sobre el camp text del payload, amb l’endpoint scroll:

curl -X POST "http://localhost:6333/collections/josep_pla/points/scroll" \
  -H "Content-Type: application/json" \
  -d '{
    "filter": {
      "must": [
        { "key": "text", "match": { "text": "Dylan" } }
      ]
    },
    "limit": 100,
    "with_payload": true,
    "with_vector": false
  }'

{"result":{"points":[{"id":"0e9f2797-80c6-5016-8d8b-40fcc4006fa8","payload":{"text":"I és un tio que no renuncia mai a fer les coses que vol fer.\n\n—JC: Que això dius: bé, clar... Doncs no. Ni tan sols hi estic tan a favor, eh? Jo estic molt a favor de fer renúncies també, saps?\n\n—MP: Ostres, jo és que hi trobo una cosa tan magnètica, en aquesta gent que no cedeix ni un mil·límetre...\n\n—JC: A tu et funciona molt, aquesta gent.\n\n—MP: Ostres, si em funciona! Fins i tot encara que potser s'estiguin equivocant i estiguin fent alguna cosa que els fa molta il·lusió, que els sembla el pas més important de la seva vida, però que tu des de fora veus clarament que és un error. Però és seu, és la seva cosa. I llavors, si rectifiquen, encara té molt més mèrit.\n\n—JC: Sí, i l'autocontrol és molt avorrit.\n\n—MP: És horrible. Bob Dylan és un senyor que no té gens d'autocontrol. Arriba allà, i el documental t'explica tot de testimonis de com van viure l'arribada de Dylan. Hi ha poetes, hi ha la Joan Baez, que diu, en plan: «Clar, jo no havia vist mai ningú així». Ho diu amb aquests ulls de senyora completament enamorada, que és el que va estar...\n\n—JC: Però perquè desprèn... sexe, no?","doc_id":"club_tandem.txt","filename":"club_tandem.txt","format":"txt","author":"Juliana Canet, Marina Porras","title":"EL JO: El quadern gris, de Josep Pla","year":2025,"description":"Club Tàndem (T1xC4): La Juliana Canet i la Marina Porras conversen sobre El quadern gris de Josep Pla, els dietaris i la construcció del jo.","url":"https://www.youtube.com/watch?v=VeteJXJlVtE","chunk_index":31,"n_chunks":64,"char_start":26825,"char_end":27924,"section":"BOB DYLAN: CREAR-SE A UN MATEIX","n_chars":1099,"n_words":209}},...

Fes-me un petit script python per recuperar els chunks més rellevants que responen a la pregunta 'Quines relacions podem establir entre Josep Pla i Bob Dylan?'

script consulta_josep_pla.py:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
consulta_josep_pla.py

Recupera els chunks més rellevants de la col·lecció per a una pregunta.

Ús:
    python consulta_josep_pla.py
    python consulta_josep_pla.py "Una altra pregunta" --top 8
"""

# ---------------------------------------------------------------------------
# CONFIGURACIÓ
# ---------------------------------------------------------------------------
COLLECTION_NAME = "josep_pla"

QDRANT_URL = "http://localhost:6333"
QDRANT_API_KEY = None

EMBEDDING_MODEL = "BAAI/bge-m3"  # el MATEIX model que a la ingesta
QUERY_PREFIX = ""                # "query: " si fas servir multilingual-e5-large

PREGUNTA_PER_DEFECTE = "Quines relacions podem establir entre Josep Pla i Bob Dylan?"
TOP_K = 5
# ---------------------------------------------------------------------------

import argparse

from qdrant_client import QdrantClient
from sentence_transformers import SentenceTransformer


def main():
    parser = argparse.ArgumentParser(description="Consulta semàntica a Qdrant.")
    parser.add_argument("pregunta", nargs="?", default=PREGUNTA_PER_DEFECTE)
    parser.add_argument("--top", type=int, default=TOP_K, help="Nombre de chunks")
    args = parser.parse_args()

    model = SentenceTransformer(EMBEDDING_MODEL)
    vector = model.encode(QUERY_PREFIX + args.pregunta, normalize_embeddings=True)

    client = QdrantClient(url=QDRANT_URL, api_key=QDRANT_API_KEY)
    resultats = client.query_points(
        collection_name=COLLECTION_NAME,
        query=vector.tolist(),
        limit=args.top,
        with_payload=True,
    ).points

    print(f"\nPregunta: {args.pregunta}\n")
    if not resultats:
        print("Cap resultat.")
        return

    for i, punt in enumerate(resultats, start=1):
        p = punt.payload or {}
        print("=" * 80)
        print(f"#{i}  score={punt.score:.4f}")
        print(f"Font:    {p.get('title', '?')}  ({p.get('doc_id', '?')})")
        if p.get("section"):
            print(f"Secció:  {p['section']}")
        print(f"Chunk:   {p.get('chunk_index', '?')}/{p.get('n_chunks', '?')}")
        if p.get("url"):
            print(f"URL:     {p['url']}")
        print("-" * 80)
        print(p.get("text", ""))
    print("=" * 80)


if __name__ == "__main__":
    main()

Resposta:

Pregunta: Comparativa amb Bob Dylan

$ python consulta_josep_pla.py "comparativa amb Bob Dylan"
Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.
Loading weights: 100%|███████████████████████████████████████████████████████████████████████████████████████| 391/391 [00:00<00:00, 36107.64it/s]

Pregunta: comparativa amb Bob Dylan

================================================================================
#1  score=0.5663
Font:    EL JO: El quadern gris, de Josep Pla  (club_tandem.txt)
Secció:  BOB DYLAN: CREAR-SE A UN MATEIX
Chunk:   29/64
URL:     https://www.youtube.com/watch?v=VeteJXJlVtE
--------------------------------------------------------------------------------
Però té una màgia, una presència, una cosa que, quan el veus, dius: «Però tu...».

—JC: Jo tenia molt el prejudici del cowboy: la bota, el barret, el country aquest...

—MP: Però si és mil coses alhora, Bob Dylan! Ha estat totes les coses.

—JC: Jo no sé per què tinc tant aquesta idea. Jo hi veig sorra...

—MP: Que va, eh?

—JC: Hi veig sorra, desert, aquells cactus allà al mig...

—MP: Doncs canviaràs d'opinió quan vegis No Direction Home, que és un documental de Scorsese que dura com 220 minuts. Una brutalitat. Martin Scorsese es va fixar en la figura de Bob Dylan. I com que Bob Dylan és un senyor que ja és molt gran però que ha anat fent moltes coses tota la seva vida, i va començar des de molt jove, ha estat moltes persones alhora. I és el joc aquest de canviar d'identitat i de transformar-se completament, contínuament. Scorsese va dir: «D'acord, jo em fixaré en la creació d'aquest mite». És a dir, quan va aparèixer Bob Dylan: qui és Bob Dylan. I es va fixar en el període de l'any 61 al 65, que és l'arribada de Bob Dylan a Nova York, amb 20 anys.

—JC: D'acord. Guitarra i barret de cowboy, o no?
================================================================================
#2  score=0.5575
Font:    EL JO: El quadern gris, de Josep Pla  (club_tandem.txt)
Secció:  BOB DYLAN: CREAR-SE A UN MATEIX
Chunk:   30/64
URL:     https://www.youtube.com/watch?v=VeteJXJlVtE
--------------------------------------------------------------------------------
I es va fixar en el període de l'any 61 al 65, que és l'arribada de Bob Dylan a Nova York, amb 20 anys.

—JC: D'acord. Guitarra i barret de cowboy, o no?

—MP: Guitarra. El barret de cowboy t'ho estàs inventant. No he vist mai Bob Dylan amb barret de cowboy.

—JC: Doncs jo, la meva imatge de Bob Dylan... Potser és efecte Mandela.

—MP: Tio, totalment. Tu saps que el ninotet del Monopoly no porta aquell monocle?

—JC: De debò?

—MP: Hi ha gent molt confosa amb això.

—JC: I jo soc la primera. Potser és efecte Mandela, però per a mi Bob Dylan, si hagués de ser un objecte, és un barret de cowboy.

—MP: Doncs és tot el contrari. Arriba amb la guitarra a uns locals molt [...] de Nova York, en un moment en què l'escena s'estava transformant, i és un tio que es queda a les nits mirant què fa la gent sobre l'escenari. I llavors diu: «Jo ho he de replicar d'alguna manera. Com em puc posar jo aquí al mig?». I és un tio que no renuncia mai a fer les coses que vol fer.

—JC: Que això dius: bé, clar... Doncs no. Ni tan sols hi estic tan a favor, eh? Jo estic molt a favor de fer renúncies també, saps?

Un altre exemple:

$ python consulta_josep_pla.py "cadaqués"
Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.
Loading weights: 100%|███████████████████████████████████████████████████████████████████████████████████████| 391/391 [00:00<00:00, 52137.11it/s]

Pregunta: cadaqués

================================================================================
#1  score=0.5657
Font:    Josep Pla a la península del Cap de Creus: la creació d'un cronòtop  (Pla_CapCreus.pdf)
Secció:  LLUÍS QUINTANA TRIAS
Chunk:   38/46
--------------------------------------------------------------------------------
acollidor, en mig d'un món ‘pétreo, amargo, duro'. Aquest món és també l'època en què

l'està llegint el lector (al cap i a la fi, les guies són llibres destinats a un lector

contemporani), és a dir la post-guerra. Però per als lectors d'aquells anys, Cadaqués era

lluny, literalment inaccessible (dificultats de comunicació, necessitat de passaport per la

presència dels maquis...): en el temps desolat de la postguerra, com en l'espai desolat

del Cap de Creus, Cadaqués resultava, en definitiva, una illa. Aquesta idea ve

reafirmada també per la curiosa perspectiva que ofereix l'arribada al poble per la

carretera de Roses: la geografia, un cop més, dóna suport a la tesi; l'espai confirma el

temps. No és una idea nova de l'any 1947; ja ho destacava el 1927 (‘Cadaqués' La Nau

10/XI/1927):

Fa vint-i-cinc anys la carretera era gairebé inabordable. (…) Encara avui,

malgrat els autos i les carreteres, se sent a Cadaqués una sensació d'allunyament

i de solitud. La població viu de cara al mar amb una indiferència absoluta per la

terra que té al darrera.

Ho va repetir set anys després al Viatge (sense modificar, però, els ‘25 anys') i ho
================================================================================
...

creat per Joan Quintana Compte, octubre 2026