Un buscador propio para el modelo, sin cuentas en intermediarios
Un modelo de lenguaje conoce el mundo hasta el día en que terminó su entrenamiento. Para responder preguntas sobre cosas de hoy, tiene que saber buscar. Construimos para ello un buscador propio en la misma máquina — y de paso medimos cuánto trabajo hace falta para que los resultados lleguen en tu idioma.
Cómo busca el modelo en realidad
En contra de lo que parece, el modelo no tiene acceso a internet. Funciona de otra manera y conviene entenderlo, porque afecta a la privacidad de toda la solución.
El modelo recibe al arrancar la información de que existen dos herramientas: una devuelve una lista de resultados de búsqueda, la otra descarga el contenido de una página indicada. Cuando considera que la pregunta requiere datos frescos, no ejecuta nada por sí mismo — escribe una petición: «lanza una búsqueda con la frase X». El programa del lado del usuario ejecuta esa petición, consulta nuestro buscador y pega los resultados de vuelta en la conversación. El modelo los lee como texto normal y formula la respuesta.
Todo el tráfico pasa, por tanto, por nuestra máquina. Ningún proveedor de modelos ve ni la pregunta ni lo que se hizo con la respuesta.
Qué hay debajo
La capa de búsqueda es SearXNG — un metabuscador de código abierto que ejecutamos en casa. Consulta una fuente externa (en nuestro caso, la API oficial del buscador Brave, con clave) y devuelve una lista unificada de resultados. El proveedor externo ve la consulta, pero no ve quién pregunta, ni para qué, ni qué pasó antes en la conversación. Aquí no hay cuenta de usuario, ni historial, ni perfilado.
Una trampa de configuración que merece la pena anotar, porque nos costó algo de tiempo: elegimos el motor que usa la API oficial, no el que lee automáticamente la página de resultados. Esa segunda vía suele ser la predeterminada en instalaciones parecidas y recibe un bloqueo tras una decena larga de consultas.
Los resultados en tu idioma exigen dos ajustes, no uno
Por defecto, una instalación así responde con resultados en inglés, incluso a una consulta en otro idioma. Lo medimos con una frase técnica en nuestro polaco nativo, contando los resultados en polaco entre los veinte primeros:
| Ajuste de idioma | Resultados en polaco de 20 |
|---|---|
| ninguno / «todos» | 0 |
| solo el código («pl») | 10 |
| el locale completo («pl-PL») | 17 |
La diferencia entre «pl» y «pl-PL» no es cosmética: son siete resultados de veinte — y lo mismo se aplica a tu locale, por ejemplo «es-ES». Además hay que configurar dos capas: el valor por defecto del servidor y los parámetros que se pasan al propio motor. Cambiar solo una no basta, porque la otra la sobrescribe el cliente.
El modelo puede sobrescribirlo en una consulta concreta — y lo hace con sensatez, pasando al inglés cuando busca documentación técnica.
El resultado por defecto era demasiado pobre — mejoramos el motor
La versión estándar del motor guarda de cada resultado únicamente una descripción corta — dos frases, a menudo cortadas a mitad de la frase clave. Mientras tanto, el proveedor devuelve de paso fragmentos adicionales del contenido de la página, que nadie pedía y que simplemente se tiraban.
Sustituimos ese fragmento por una versión propia que une esos fragmentos y los adjunta al resultado. El efecto: unas 4,7 veces más texto por resultado. El modelo recibe contenido real en lugar de un avance, así que responde más a menudo a la primera, sin descargar páginas enteras.
El segundo cambio es menor, pero resuelve un problema frecuente: delante de cada resultado pegamos la fecha de publicación. Sin ella, el modelo no tiene forma de distinguir un tutorial de hace cinco años de uno de este año, y confundía con regularidad las versiones del software.
Cuándo el modelo baja a más profundidad
En la instrucción de sistema tenemos una regla: si los fragmentos están cortados, se contradicen o no contienen el dato concreto que se busca — descarga la página entera. Eso resuelve las situaciones en las que la lista de resultados aparenta ser la respuesta, pero no la contiene.
Un detalle que merece imitarse: describimos la regla por el papel de la herramienta, no por su nombre («acepta una dirección, devuelve el contenido»). Cada programa llama a esa herramienta de una manera, y una instrucción que se apoya en el nombre deja de funcionar al cambiar de cliente.
Cuánto contexto cuesta esto
Los datos frescos no son gratis — ocupan sitio en la memoria de la conversación:
- una búsqueda con fragmentos completos: unos 4 000 tokens,
- descargar una página entera: incluso más de diez mil.
Con un contexto de 262 000 tokens es una situación cómoda: una docena larga de búsquedas en una conversación no se nota. En una máquina con contexto pequeño, justo aquí se acabaría la fiesta — y este es uno de los motivos por los que mereció la pena pelear por la capacidad de contexto.
Qué aporta en la práctica
Tres cosas, por orden de importancia para el usuario doméstico:
Actualidad. El modelo deja de inventar ante preguntas sobre cosas nuevas, porque tiene cómo comprobarlas.
Privacidad. Las consultas no construyen un perfil publicitario ni un historial asociado a una cuenta. De casa sale solo la frase de búsqueda, sin el contexto de la conversación.
Independencia. El buscador es intercambiable — la fuente se puede cambiar sin tocar los modelos y sin esperar a que el proveedor cambie de opinión sobre la tarifa o las condiciones.
Configuración propia, en la misma máquina que los modelos. Las mediciones del idioma de los resultados se hicieron en nuestra instancia.