1 puntos por GN⁺ 2024-02-09 | 1 comentarios | Compartir por WhatsApp
  • Ollama ahora incorpora compatibilidad inicial con la Chat Completions API de OpenAI, lo que permite conectar herramientas y aplicaciones hechas para OpenAI directamente a modelos locales
  • Tras la instalación, se pueden descargar modelos como llama2 o mistral y llamarlos manteniendo el formato de solicitud de OpenAI, cambiando solo el host
  • Las librerías de OpenAI para Python y JavaScript funcionan indicando base_url/baseURL y usando un valor de api_key que es obligatorio, pero no se utiliza
  • Se ofrecen ejemplos para conectar a Ollama una app de chat con streaming del Vercel AI SDK y el framework multiagente Autogen de Microsoft
  • El soporte actual está en una fase de soporte inicial experimental; la Embeddings API, function calling, soporte de visión y mejoras en Logprobs quedan para evaluación futura

Llamar a Ollama con el formato de la API de OpenAI

  • Ollama ofrece un endpoint compatible con la Chat Completions API de OpenAI, lo que permite usar modelos locales desde herramientas existentes basadas en OpenAI
  • Para comenzar, instala Ollama y descarga un modelo como Llama 2 o Mistral
ollama pull llama2
  • En cURL, se mantiene el formato de solicitud de OpenAI tal cual y solo se cambia el host a http://localhost:11434
curl http://localhost:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "llama2",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "Hello!"
}
]
}'
  • La librería de OpenAI para Python configura base_url con el endpoint local de Ollama
    • api_key='ollama' es obligatorio, pero no se utiliza
from openai import OpenAI
client = OpenAI(
base_url = 'http://localhost:11434/v1',
api_key='ollama',
)
response = client.chat.completions.create(
model="llama2",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the world series in 2020?"},
{"role": "assistant", "content": "The LA Dodgers won in 2020."},
{"role": "user", "content": "Where was it played?"}
]
)
print(response.choices[0].message.content)
  • La librería de OpenAI para JavaScript configura baseURL como http://localhost:11434/v1
    • apiKey: 'ollama' también es obligatorio, pero no se utiliza
import OpenAI from 'openai'
const openai = new OpenAI({
baseURL: 'http://localhost:11434/v1',
apiKey: 'ollama',
})
const completion = await openai.chat.completions.create({
model: 'llama2',
messages: [{ role: 'user', content: 'Why is the sky blue?' }],
})
console.log(completion.choices[0].message.content)

Integraciones de ejemplo y planes futuros

  • El Vercel AI SDK es una librería de código abierto para crear aplicaciones interactivas con streaming, y se puede adaptar el ejemplo de OpenAI para Next.js para usarlo con Ollama
npx create-next-app --example https://github.com/vercel/ai/tree/main/examples/next-openai example
cd example
  • En app/api/chat/route.ts, se cambia la configuración del cliente de OpenAI para apuntar al endpoint local de Ollama
const openai = new OpenAI({
baseURL: 'http://localhost:11434/v1',
apiKey: 'ollama',
});
  • La solicitud de chat completions usa el modelo llama2 y stream: true
const response = await openai.chat.completions.create({
model: 'llama2',
stream: true,
messages,
});
npm run dev
  • Autogen es un framework de código abierto de Microsoft para aplicaciones multiagente, y el ejemplo usa Code Llama
ollama pull codellama
pip install pyautogen
from autogen import AssistantAgent, UserProxyAgent
config_list = [
{
"model": "codellama",
"base_url": "http://localhost:11434/v1";,
"api_key": "ollama",
}
]
assistant = AssistantAgent("assistant", llm_config={"config_list": config_list})
user_proxy = UserProxyAgent("user_proxy", code_execution_config={"work_dir": "coding", "use_docker": False})
user_proxy.initiate_chat(assistant, message="Plot a chart of NVDA and TESLA stock price change YTD.")
  • El ejemplo se ejecuta con python example.py y hace que el asistente escriba el código para dibujar el gráfico
python example.py
  • El soporte para la API de OpenAI está en una fase de soporte inicial experimental
    • Entre los puntos en evaluación para futuras mejoras están la Embeddings API, function calling, soporte de visión y Logprobs
    • Se pueden recibir issues en GitHub, y hay más información disponible en la documentación sobre compatibilidad con OpenAI

1 comentarios

 
GN⁺ 2024-02-09
Opiniones de Hacker News
  • Es sorprendente la velocidad con la que mejoró la usabilidad del hosting local de LLMs en los últimos meses. Hace apenas unas horas estaba hablando de lo fácil que es https://github.com/Mozilla-Ocho/llamafile[1], y ahora ya no sé qué debería usar
    [1] Literalmente hace unas horas: https://euri.ca/blog/2024-llm-self-hosting-is-easy-now/

    • Creo que ahora es más fácil para una empresa autoalojar un servidor de inferencia básico con soporte RAG. Compras una Mac Mini o una Mac Studio, ejecutas ollama serve, levantas ollama web-ui en Docker, agregas desde la UI web un modelo asistente de código de OllamaHub y subes la documentación
      Sin escribir código, tienes un LLM autoalojado que responde usando la documentación como contexto. En nuestro caso, deepseek coder 33b corre lo suficientemente rápido en una Mac Studio con 64 GB de RAM y da sugerencias bastante buenas basadas en nuestra documentación interna de código
    • Personalmente recomiendo Ollama. Su forma de gestionar modelos está bien resuelta, parecida a Docker, y la API tiene soporte más amplio
      También puedes mezclar varios modelos dentro de un solo archivo de modelo, una función con la que se está experimentando últimamente. No hace falta depender necesariamente de la biblioteca de modelos de Ollama; también puedes usar modelos creados por ti. El soporte para modelos nuevos llega a través de bindings de llama.cpp
    • El ritmo de avance en este campo es realmente sorprendente. Me gustó lo fácil que era levantar llamafile, pero me faltaba una interfaz de chat con suficientes funciones, así que construí https://recurse.chat/ encima de eso
      Todavía necesito GPT-4 para algunas tareas, pero en el uso diario ya reemplazó una parte considerable de mi uso de ChatGPT, y me gusta especialmente que pueda importar todo el historial de chats de ChatGPT. También me da curiosidad qué quiere hacer la gente con IA local
    • Estoy usando Ollama y Mixtral-7B para desarrollo local en una MBP y estoy muy satisfecho
    • Siempre he usado solo llamacpp -m -p , y en mi MacBook uso Mixtral 8x7b + CodeLlama 70b muy bien como herramientas cotidianas. Me pregunto si las alternativas a Llama.cpp tienen alguna función decisiva, y no quiero perderme ninguna nueva tendencia interesante
  • Soy profesor de administración de empresas y preparé una guía para que mis estudiantes prueben Ollama y web-ui ejecutándolos en Google Cloud[1]. Con instancias spot puede correr por 18 centavos por hora
    [1] https://docs.google.com/document/d/1OpZl4P3d0WKH9XtErUZib5_2...

    • Con esa configuración, los estudiantes podrían perder el control de los privilegios de administrador y que les secuestren la instancia. Es muy inseguro. Recomiendo firmemente que usen claves SSH en git-bash. No es más difícil técnicamente que lo que ya indicaste
    • También se pueden correr muchas cosas gratis en Google Colab. KoboldCPP tiene un entorno de ejecución prearmado muy bueno en su sitio web, y también permite cargar otros modelos
  • Conozco a varias personas que, en el fondo, se sienten incómodas con que la compatibilidad con la API de OpenAI se esté convirtiendo en un estándar de la comunidad. Quitando rarezas como data.choices.text.response o el anidamiento innecesariamente defensivo del esquema, no tengo muchas quejas
    Me da curiosidad qué dolores hay en el proceso de convertir esa API en un estándar, y si alguien ha intentado estándares alternativos que valga la pena considerar

    • Hace falta documentación
      Está bien que se consolide como estándar comunitario, pero debería existir una especificación muy sólida de qué quiere decir la comunidad con compatible con la API de OpenAI. En particular, ese estándar debería mantenerse estable aunque OpenAI haya lanzado una función nueva esta mañana
      Lo que quiero es una especificación de API robusta, incluyendo condiciones de error, un conjunto de pruebas para verificar si una nueva implementación sigue la especificación, y un nombre. Por ejemplo, quisiera saber qué significa que un software sea compatible con OpenAI-API-Spec v3. Tal como está ahora, decir simplemente “compatible con la API de OpenAI” no aporta suficiente información. No se sabe qué parte de la API ni de qué momento de la API se está tomando como referencia
    • Sinceramente, lo discutimos mucho internamente antes de agregar esto. Se siente raro quedar atados a la API de otro y que esa API pueda determinar qué funciones debemos o no debemos incorporar a nuestro proyecto
      Si agregamos a Ollama funciones nuevas, interesantes y distintas, pero no tienen equivalente en la API de OpenAI, no sé si la gente podrá usarlas
    • Por eso es bueno que se ofrezca como opción. Reduce la fricción y disminuye la dependencia del foso de OpenAI
    • Creo que un estándar imperfecto siempre es mejor que no tener ningún estándar
    • Crear un servidor web que llame directamente a funciones de llama.cpp con bindings en el lenguaje que quieras es muy fácil, así que no es tan importante. Si necesitas más control, solo requiere un poco más de trabajo, y no necesariamente hacen falta estas herramientas plug-and-play
  • En el trabajo estamos creando una versión mejor que Copilot, y también admitimos un enfoque en el que el usuario trae su propio LLM. Últimamente estamos agregando backends compatibles con OpenAI: si nos indicas el endpoint de API compatible con OpenAI y con qué modelo tratarlo, podemos formatear el prompt, las secuencias de parada, el máximo de tokens, etc., de acuerdo con la semántica de ese modelo
    Necesitaba exactamente algo así para probar en un entorno de desarrollo local. Si Ollama lo soporta, probar la gran cantidad de LLMs que debemos soportar se vuelve mucho más fácil. Viendo que varias herramientas como OpenLLM implementan la misma API, parece que todo está convergiendo hacia la compatibilidad con la API de OpenAI

  • Ahora mismo se siente muy bien estar construyendo una startup de IA
    Al principio sufrimos con los límites de tokens, pero eso se resolvió; también se resolvió el problema de obtener salidas JSON consistentes; también los límites de velocidad y problemas de rendimiento de los grandes modelos de terceros; y también el deseo de reducir costos alojando nosotros mismos modelos open source para tareas pequeñas y de complejidad media
    Con cada avance importante en los LLM, se siente como si el producto se volviera automáticamente más barato, más estable y más escalable. Claro que hay que enfocarse en construir defensas y diferenciarse en todo lo que “no es IA”

    • Me da curiosidad qué significa que se resolvieron los límites de tokens. ¿Te refieres a que los límites de contexto de las versiones recientes crecieron mucho, pero también se volvieron mucho más caros?
  • Creo que decir que es compatible con OpenAI puede prestarse un poco a malentendidos, porque hace esperar también llamadas a funciones o llamadas a herramientas
    Está bien que tenga estructura de roles y contenido, pero eso de por sí era bastante simple de implementar. Cuando vas hacia agentes, necesitas ejecutar acciones reales. En el sistema de hosting de agentes que empecé, metí un motor de scripting, y por eso pensé que, después de resolver seguridad y permisos, quizá había que dejar que el agente simplemente ejecutara código. De hecho, así empecé
    Por eso no estoy seguro de que las llamadas a funciones/herramientas sean estrictamente necesarias. Pero si mucha gente está estandarizando las llamadas a herramientas, quizá tenga que meterlo en mi framework aunque ya tenga ejecución de scripts arbitrarios

    • La documentación aclara explícitamente las funciones excluidas: https://github.com/ollama/ollama/blob/main/docs/openai.md
      La llamada a funciones/selección de herramientas se maneja a nivel de aplicación y actualmente no hay un formato estándar. Incluso las implementaciones más usadas son, en la práctica, algo más cercano a prompts de sistema personalizados e ineficientes: https://github.com/langchain-ai/langchain/blob/master/libs/l...
    • Me atrajo que Gemini Pro soportara llamadas a funciones/herramientas, pero en la práctica funciona pésimo. Todavía no probé Gemini Ultra y tampoco está claro si se puede usar por API
      En cualquier caso, quizá sea mejor no lanzar un soporte que no funciona
    • Para alguien que haya usado la API de OpenAI, es una elección totalmente comprensible
  • Como referencia, el script de instalación de Ollama en Linux funciona con el método “estándar” común en herramientas actuales:
    curl https://ollama.ai/install.sh | sh
    Pero la última vez que lo revisé, este script pedía permisos de root mediante sudo. Si quieres usar la herramienta, conviene descargar el script y revisarlo o modificarlo según tus necesidades

    • Hay instrucciones de instalación manual[0]. Por lo que se ve ahí, configura un servicio de SystemD que se ejecuta automáticamente al iniciar. Si solo quieres probarlo, bastó con descargar [1], hacerlo ejecutable (chmod +x ollama-linux-amd64) y ejecutarlo. No hicieron falta permisos de root
      [0] https://github.com/ollama/ollama/blob/main/docs/linux.md#man...
      [1] https://ollama.ai/download/ollama-linux-amd64
    • El binario ollama va en /usr/bin, lo cual no es estrictamente necesario, pero sí cómodo. No revisé qué más requiere acceso root
    • En estos tiempos existen los gestores de paquetes
  • La capa de compatibilidad también podría construirse dentro de una biblioteca. Por ejemplo, llm() de LangChain puede funcionar con varios backends de LLM. Me da curiosidad cuál prefieren

    • Prefiero que esté dentro de una biblioteca, pero ahora mismo tiene bastantes problemas. El mayor es que el ecosistema se mueve tan rápido que los wrappers de bibliotecas no alcanzan a seguirle el ritmo
      Otro problema es que si el mundo termina estandarizándose en bibliotecas pésimas como LangChain, el costo de mantenimiento de backends no uniformes matará a los jugadores que lleguen después y los dejará atados por mucho tiempo. Por eso, ahora una API uniforme parece la mejor opción por conveniencia
    • Si se hace así, cada biblioteca tiene que soportar cada LLM. Lo veo como el mismo problema del almacenamiento de objetos, donde al final casi todos terminaron soportando una API compatible con S3
      Aunque no sea perfecta, está bien tener una API estándar. Al mismo tiempo, también está bien tener una segunda API, como B2 de Backblaze, que permita aprovechar todo su potencial. No hay una forma única que encaje con todos los modelos, y si los modelos tienen capacidades distintas, creo que conviene ofrecer ambas opciones
    • Antes de que OpenAI sacara su app, usaba LangChain en un sistema que hice. Era una interfaz SMS muy simple conectada a un LLM, y prefería trabajar con la abstracción de LangChain antes que lidiar directamente con la API de GPT-4
  • Estoy creando un proyecto para poder intercambiar fácilmente modelos open source (HF, vía VLLM) y modelos comerciales (OpenAI, Google, Anthropic, Together) en Python: https://github.com/datadreamer-dev/DataDreamer
    Si quieres usarlo directamente desde Python sin una API HTTP, es una forma un poco más sencilla

  • Me da curiosidad cuál es el caso de uso de Ollama. ¿Por qué no usar llama.cpp directamente?

    • Es como Docker/un gestor de paquetes para LLM. Permite instalar fácilmente con una CLI estandarizada y simple, encontrar modelos nuevos y actualizarlos. Incluso las actualizaciones automáticas se hacen sin complicaciones
    • Tengo la misma duda. Ollama parece tener mucho marketing y buena recepción, pero hoy, comparado con usar directamente llama.cpp, que también trae un servidor integrado compatible con OpenAI, me pregunto exactamente qué ventaja ofrece