Autoalojamiento de un LLM OpenSource para DiscourseAI

El plugin Discourse AI tiene muchas funcionalidades que requieren que un LLM esté habilitado, como, por ejemplo, Resumen, Asistente de IA, Búsqueda por IA, Bot de IA. Aunque puedes usar una API de terceros, como Configurar claves de API para OpenAI o Configurar claves de API para Anthropic, construimos Discourse AI desde el primer día para no estar atados a esas.

Ejecutando con HuggingFace TGI

HuggingFace proporciona una increíble imagen de contenedor que puede ponerte en funcionamiento rápidamente.

Por ejemplo:

mkdir -p /opt/tgi-cache
docker run --rm --gpus all --shm-size 1g -p 8080:80 \
  -v /opt/tgi-cache:/data \
  ghcr.io/huggingface/text-generation-inference:latest \
  --model-id mistralai/Mistral-7B-Instruct-v0.2

Debería ponerte en funcionamiento con una instancia local de Mistral 7B Instruct en localhost en el puerto 8080, que se puede probar con

curl http://localhost:8080/ \
    -X POST \
    -H 'Content-Type: application/json' \
    -d '{"inputs":"<s>[INST] What is your favourite condiment? [/INST] Well, I'm quite partial to a good squeeze of fresh lemon juice. It adds just the right amount of zesty flavour to whatever I'm cooking up in the kitchen!</s>[INST] Do you have mayonnaise recipes? [/INST]","parameters":{"max_new_tokens":500, "temperature":0.5,"top_p": 0.9}}'

Ejecutando con vLLM

Otra opción para autoalojar LLMs que Discourse AI soporta es vLLM, que es un proyecto muy popular, licenciado bajo la Licencia Apache.

Así es como puedes empezar con un modelo:

mkdir -p /opt/vllm-cache
docker run --gpus all \
  -v /opt/vllm-cache:/root/.cache/huggingface \
  -e "MODEL=mistralai/Mistral-7B-Instruct-v0.2" \
  -p 8080:8000 --ipc=host vllm/vllm-openai:latest

Lo cual puedes probar con

curl -X POST http://localhost:8080/v1/completions \
-H "Content-Type: application/json" \
-d '{
"model": "mistralai/Mistral-7B-Instruct-v0.2",
"prompt": "<s> [INST] What was the latest released hero for Dota 2? [/INST] The latest released hero for Dota 2 was", "max_tokens": 200}'

Ejecutando con Ollama

Ollama es otra opción popular para ejecutar modelos de código abierto localmente. Simplifica la gestión de modelos y proporciona una API compatible con OpenAI.

ollama pull mistral
ollama serve

Esto inicia un servidor local en http://localhost:11434 al que Discourse AI puede conectarse usando el proveedor Ollama.

Ponerlo disponible para tu instancia de Discourse

La mayoría de las veces lo ejecutarás en un servidor dedicado debido al requisito de GPU. Cuando lo hagas, recomiendo ejecutar un proxy inverso, haciendo terminación TLS y asegurando el endpoint para que solo pueda ser conectado por tu instancia de Discourse.

Configurando Discourse AI

Las conexiones LLM ahora se configuran a través de la UI de administración en lugar de la configuración del sitio. Navega a /admin/plugins/discourse-ai/ai-llms y añade un nuevo LLM:

  1. Haz clic en Nuevo para añadir un modelo
  2. Selecciona un Proveedor — elige vLLM, Hugging Face, u Ollama dependiendo de tu servidor de inferencia
  3. Introduce la URL de tu endpoint de inferencia (ej. http://tu-servidor:8080)
  4. Introduce una clave de API si tu endpoint la requiere
  5. Rellena el nombre del modelo, el tokenizador, los tokens máximos de prompt y otros detalles del modelo

Una vez que tu LLM esté añadido, establécelo como predeterminado a través de la configuración del sitio ai_default_llm_model, o asígnalo a funcionalidades específicas a través de su configuración de agente en /admin/plugins/discourse-ai/ai-features.

17 Me gusta

Para cualquiera que busque este tema con/para:
#Llava-Api-keys

Yo también uso vLLM. También recomendaría el modelo openchat v3.5 0106, que es un modelo de 7B parámetros que funciona muy bien.

De hecho, lo estoy ejecutando en 4 bits cuantizados para que funcione más rápido.

Estoy asignando esta tarea a un pasante. ¿Hay alguna recomendación de alguien sobre qué servicio específico contratar? Esto es para una prueba. El pasante actualmente tiene una prueba configurada con OpenAI. Funciona bien. Están interesados en probar HuggingFace TGI, pero parece que necesito darles un servidor dedicado con GPU. ¿Cuáles son las especificaciones mínimas para una prueba?

¿Hay enlaces que pueda dar al pasante?

Aún no he analizado este proyecto en profundidad. Solo anticipo que el pasante necesitará algunos recursos y estoy tratando de hacer algunas recomendaciones razonables sobre servicios para que el pasante investigue.

Hola, al exponer con un certificado autofirmado el contenedor vllm en una caja de GPU on-prem, no encontré una buena manera de agregar la CA raíz al contenedor de discourse para que pueda acceder de forma segura a este servicio on-prem a través de https.

por ejemplo:

./launcher enter app
curl -L https://vllm.infra.example.com/v1/models
curl: (60) problema de certificado SSL: no se puede obtener el certificado del emisor local
Más detalles aquí: https://curl.se/docs/sslcerts.html

curl no pudo verificar la legitimidad del servidor y, por lo tanto, no pudo
establecer una conexión segura con él. Para obtener más información sobre esta situación y
cómo solucionarlo, visite la página web mencionada anteriormente.

¿Hay alguna buena manera de agregar un certificado de CA raíz autofirmado en el contenedor de discourse que sobreviva a las actualizaciones de la imagen del contenedor?

Hasta donde sé, agregarlo en el app.yml

run:
  - exec: wget ... && update-ca-certificates

solo funcionaría bien durante la compilación/recompilación de la aplicación.

Cualquier pista es bienvenida.

14 publicaciones se dividieron en un nuevo tema: Hacer que discourse ai funcione con ollama localmente

¿Habría alguna manera de añadir una cabecera HTTP personalizada a las solicitudes de Discourse AI? Tenemos un servidor equipado con GPU que utilizamos para una variedad de propósitos, tiene una API compatible con OpenAI, pero por seguridad la hemos puesto detrás de un portal de gestión de API (API Management gateway), el cual requiere una cabecera HTTP personalizada (algo como SubscriptionKey) y proporcionamos nuestra clave de autenticación aquí.

Tenga en cuenta que esta clave de autenticación es para pasar el APIM y es diferente de la clave API que se proporcionaría para un servicio como la API de OpenAI.

Sería genial si hubiera una forma de añadir cabeceras personalizadas en la configuración de cada LLM en la página de configuración admin/plugins/discourse-ai/ai-llms. ¿Quizás una opción ‘Personalizada’ en el menú desplegable ‘Proveedor’, con opciones adicionales para casos de uso como este?

1 me gusta

La respuesta rápida es un complemento para agregar esa cabecera. Una solución alternativa podría ser un servidor proxy local al que se accedería desde Discourse y que agregaría la cabecera y enviaría los datos de vuelta a Discourse. Una fuente no confiable sugiere que podrías lograr que NGINX hiciera eso por ti con algo como

server {
    listen 80;
    
    location / {
        proxy_pass https://api.example.com;
        proxy_set_header SubscriptionKey xyz;
        proxy_set_header Host $host;
    }
}

Podría haber una forma ingeniosa de agregar eso a la configuración de nginx de Discourse en alguna ruta secreta (que también solo escuchara a tu servidor).

1 me gusta

Hola,

No consigo encontrar estas configuraciones:

¿Alguna sugerencia para probar la función de traducción con IA utilizando un backend de Ollama?

Crea un nuevo LLM en /admin/plugins/discourse-ai/ai-llms/new?llmTemplate=none, selecciona OpenAI como proveedor ya que Ollama tiene OpenAI compatibility - Ollama.

1 me gusta

¡Gracias! También noté que la URL solo funciona cuando el plugin de IA está activado :person_facepalming:

Para el proveedor recién añadido, ¿alguna sugerencia sobre qué elegir/configurar para los siguientes ajustes obligatorios?

  1. Tokenizador
  2. Ventana de contexto

Para el modelo, estaba pensando en usar stablelm2:1.6b o translategemma:4b, pero aún no lo sé.
En el README de este último hay una descripción de un prompt de entrada. Me pregunto cuál es la consulta que la función de traducción de IA envía a Ollama. c.f. /admin/plugins/discourse-ai/ai-agents/-28/edit

:sweat_smile:

El más cercano al modelo que elijas. Para Gemma, puedes elegir el de Gemini.

Aquí configuras el contexto máximo de tu implementación.

Por favor, no lo hagas. Ese modelo es muy, muy, muy, muy, muy antiguo. Es la peor opción que puedes tomar.

Ese modelo es de una generación anterior y tiene requisitos de prompt muy estrictos que no son compatibles con Discourse. Esperamos un LLM de uso general más estándar.

En esos tamaños, recomiendo usar Qwen 3.5 o Gemma 4.

3 Me gusta

Gracias de nuevo. He configurado los ajustes, descargado el modelo, ajustado el agente y activado la función de traducción con IA. Ahora a ver qué sale.

Otra pregunta. Antes estábamos usando el plugin de traducción con una instancia de LibreTranslate amablemente proporcionada. ¿No es posible conectar la función de traducción de Discourse AI a ese endpoint de LibreTranslate? Al final, eso sería mucho más fácil que tener que alojar una instancia de Ollama en un servidor sin capacidades reales de LLM.

¿Por qué no siguen usándolo? Ya no lo actualizamos, pero seguirá funcionando tal como está.

La traducción de Discourse AI opera con un conjunto de restricciones completamente diferente al del plugin Translator original, por lo que lo construimos desde cero para abordar este nuevo entorno, donde las traducciones basadas en LLM son mejores y más baratas que lo que era posible antes con las API de traducción ML.

1 me gusta