Servidores Linux

Chatbot de base de conocimiento IA privada con AnythingLLM y Ollama (RAG) en su propio servidor

8 pasos 18 min de lectura 15 vistas 0
Contenido

Un chatbot genérico no conoce sus productos, precios, procedimientos ni documentos internos, y pegarlos en un servicio de IA público a menudo no es aceptable. Con la generación aumentada por recuperación (RAG), el asistente busca primero en sus propios documentos y responde a partir de lo que encuentra, citando las fuentes. Esta guía configura AnythingLLM con un modelo local servido por Ollama en su propio servidor: instalación, conexión de los modelos de lenguaje y de embeddings, carga de documentos en espacios de trabajo, configuración para que las respuestas se ciñan a sus documentos, alta de usuarios y publicación por HTTPS. Para planificar un despliegue mayor (región, base de datos vectorial, protección de datos), consulte cómo crear una base de conocimiento privada de soporte con IA en un servidor dedicado.

Esta guía parte de cómo ejecutar un LLM local con Ollama. Siga primero esa guía, incluidas sus reglas de firewall: la API de Ollama no tiene autenticación y el puerto 11434 nunca debe ser accesible desde internet.

Paso 1: Preparar los modelos

RAG utiliza dos modelos: un modelo de embeddings, que convierte los fragmentos de los documentos y las preguntas en vectores para la búsqueda, y un modelo de chat, que redacta la respuesta. Ambos se ejecutan en Ollama.

ollama pull nomic-embed-text      # embedding model (small and fast on CPU)
ollama pull qwen2.5:7b            # chat model; good with Chinese and English
ollama list

# AnythingLLM runs in a container, so Ollama must accept connections from Docker
# (OLLAMA_HOST=0.0.0.0 plus the firewall rules from the Ollama guide). Check:
curl -s http://172.17.0.1:11434/api/tags | head -c 300; echo

Un servidor con 8 o más núcleos y 16 GB de RAM ejecuta esta combinación con holgura para un equipo pequeño. Generar los embeddings de los documentos ocupa la CPU durante un rato cuando sube muchos archivos; las respuestas usan el modelo de chat.

Paso 2: Iniciar AnythingLLM

AnythingLLM se ejecuta en Docker (consulte nuestra guía de instalación de Docker).

export STORAGE_LOCATION=/opt/anythingllm
mkdir -p $STORAGE_LOCATION && touch "$STORAGE_LOCATION/.env"
chown -R 1000:1000 $STORAGE_LOCATION      # the container runs as user ID 1000

docker run -d --name anythingllm --restart always \
  -p 127.0.0.1:3002:3001 \
  --cap-add SYS_ADMIN \
  --add-host=host.docker.internal:host-gateway \
  -v ${STORAGE_LOCATION}:/app/server/storage \
  -v ${STORAGE_LOCATION}/.env:/app/server/.env \
  -e STORAGE_DIR="/app/server/storage" \
  mintplexlabs/anythingllm

docker logs -f anythingllm      # wait until the server reports it is listening

La interfaz web escucha en el puerto 3001 dentro del contenedor; se asigna a 127.0.0.1:3002 en el host para que solo sea accesible a través del proxy HTTPS del paso 3.

Paso 3: Publicarlo por HTTPS

Apunte un subdominio como kb.example.com al servidor, obtenga un certificado (consulte SSL gratuito con Certbot o acme.sh) y configure el proxy hacia el contenedor:

server {
    listen 443 ssl;
    http2 on;
    server_name kb.example.com;

    ssl_certificate     /etc/letsencrypt/live/kb.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/kb.example.com/privkey.pem;
    client_max_body_size 100m;          # document uploads

    location / {
        proxy_pass         http://127.0.0.1:3002;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection "upgrade";
        proxy_set_header   Host $host;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_read_timeout 600s;
    }
}

Paso 4: Conectar los modelos

Abra https://kb.example.com y complete la configuración inicial (más adelante puede cambiarlo todo en el menú de configuración Settings):

  • Proveedor de LLM: Ollama, URL base http://host.docker.internal:11434, modelo de chat qwen2.5:7b.
  • Proveedor de embeddings: Ollama con nomic-embed-text (o el embedder integrado de AnythingLLM).
  • Base de datos vectorial: LanceDB, la base integrada; no requiere configuración adicional.

Paso 5: Protegerlo con usuarios

Antes de subir nada, active el modo multiusuario en la configuración de seguridad y establezca la contraseña de administrador. Después, cree una cuenta para cada compañero con el rol Default (predeterminado), de modo que pueda chatear con los espacios de trabajo que usted le asigne, pero no pueda cambiar la configuración ni ver otros espacios de trabajo.

Paso 6: Crear espacios de trabajo y subir documentos

Un espacio de trabajo (workspace) es una base de conocimiento independiente con sus propios documentos y ajustes, por ejemplo "Catálogo de productos", "Procedimientos de soporte" o "Políticas de RR. HH.".

  1. Cree un espacio de trabajo y abra su cuadro de diálogo de carga.
  2. Suba archivos PDF, Word, de texto, Markdown o CSV, o importe una página web a partir de su URL.
  3. Mueva los archivos subidos al espacio de trabajo y elija Save and Embed (guardar y generar los embeddings). AnythingLLM los divide en fragmentos y almacena sus vectores.

Los documentos limpios y basados en texto dan los mejores resultados. Los PDF escaneados necesitan pasar antes por OCR; los documentos largos con encabezados claros son más fáciles de buscar que un único archivo enorme con todo.

Paso 7: Limitar las respuestas a sus documentos

En la configuración del espacio de trabajo:

  • Establezca el modo de chat en Query (consulta): el asistente solo responde cuando encuentra fragmentos relevantes y, si no los encuentra, indica que no tiene información en lugar de adivinar.
  • Escriba un prompt de sistema, por ejemplo: "Eres el asistente interno de ACME. Responde solo a partir de los documentos proporcionados, cita la fuente y contesta en el idioma de la pregunta."
  • Ajuste el número de fragmentos usados por respuesta y el umbral de similitud si las respuestas omiten datos relevantes o incluyen otros que no vienen al caso.

Cada respuesta muestra citas; haga clic en ellas para comprobar qué fragmento del documento se utilizó.

Paso 8: Mantener la base de conocimiento

Cuando cambie un documento, elimine la versión antigua del espacio de trabajo y suba la nueva, para que no se citen precios o procedimientos obsoletos. Haga copias de seguridad de /opt/anythingllm con regularidad; contiene los documentos, los vectores, los usuarios y el historial de chats. AnythingLLM también ofrece una API y un widget de chat integrable por si más adelante quiere usar un espacio de trabajo desde su propio sitio web o sus aplicaciones.

Preguntas frecuentes

¿El asistente da respuestas que no están en mis documentos?

Cambie el espacio de trabajo al modo Query, haga más estricto el prompt de sistema y revise las citas. Si nunca encuentra el fragmento correcto, divida el documento en archivos más pequeños con títulos claros o pruebe un modelo de chat más grande.

¿Las respuestas son lentas?

La mayor parte del tiempo se va en que el modelo de chat genere texto en la CPU. Use un modelo más pequeño para consultas rápidas, reduzca el número de fragmentos por respuesta y mantenga el modelo cargado (consulte los consejos de rendimiento de la guía de Ollama).

¿Puedo usar una API de IA en la nube en lugar de Ollama?

Sí, AnythingLLM admite muchos proveedores. Tenga en cuenta que, en ese caso, sus documentos y preguntas se envían a ese proveedor, y use solo los proveedores y regiones que permitan sus condiciones. Para material confidencial, la configuración local de esta guía mantiene todo en su servidor.

¿Sigue sin resolverlo después de seguir estos pasos? Abra un ticket de soporte y el equipo técnico de IMIDC, disponible 24/7, le ayudará. Incluya la IP del servidor, la versión del sistema operativo, la CPU y la RAM, la salida de docker logs anythingllm y el mensaje de error completo para que podamos localizar el problema más rápido.

¿Fue útil la respuesta?

Tutoriales relacionados