1 points par GN⁺ 2024-02-09 | 1 commentaires | Partager sur WhatsApp
  • Ollama intègre une compatibilité initiale avec l’API Chat Completions d’OpenAI, ce qui permet de connecter tels quels des outils et applications conçus pour OpenAI à des modèles locaux
  • Après l’installation, il suffit de télécharger un modèle comme llama2 ou mistral, puis de conserver le format de requête OpenAI en ne changeant que l’hôte pour pouvoir l’appeler
  • Les bibliothèques OpenAI Python et JavaScript fonctionnent en définissant base_url/baseURL et en fournissant une valeur api_key obligatoire mais non utilisée
  • Des exemples montrent comment connecter à Ollama une application de chat en streaming avec le Vercel AI SDK et le framework multi-agents Autogen de Microsoft
  • La prise en charge actuelle est au stade de support expérimental initial ; l’API Embeddings, l’appel de fonctions, la prise en charge de la vision et l’amélioration des Logprobs seront étudiés ultérieurement

Appeler Ollama au format de l’API OpenAI

  • Ollama fournit un endpoint compatible avec l’API Chat Completions d’OpenAI, ce qui permet d’utiliser des modèles locaux dans des outils existants basés sur OpenAI
  • Pour commencer, installez Ollama et téléchargez un modèle comme Llama 2 ou Mistral
ollama pull llama2
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!"
}
]
}'
  • Avec la bibliothèque OpenAI Python, définissez base_url sur l’endpoint local d’Ollama
    • api_key='ollama' est obligatoire mais n’est pas utilisée
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)
  • Avec la bibliothèque OpenAI JavaScript, définissez baseURL sur http://localhost:11434/v1
    • apiKey: 'ollama' est également obligatoire mais n’est pas utilisée
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)

Exemples d’intégration et feuille de route

  • Vercel AI SDK est une bibliothèque open source permettant de créer des applications conversationnelles en streaming, et l’exemple Next.js pour OpenAI peut être adapté pour utiliser Ollama
npx create-next-app --example https://github.com/vercel/ai/tree/main/examples/next-openai example
cd example
  • Dans app/api/chat/route.ts, remplacez la configuration du client OpenAI par l’endpoint local d’Ollama
const openai = new OpenAI({
baseURL: 'http://localhost:11434/v1',
apiKey: 'ollama',
});
  • La requête de complétion de chat utilise le modèle llama2 avec stream: true
const response = await openai.chat.completions.create({
model: 'llama2',
stream: true,
messages,
});
  • Lancez l’application avec npm run dev, puis ouvrez http://localhost:3000 dans le navigateur pour vérifier le résultat
npm run dev
  • Autogen est un framework open source de Microsoft pour les applications multi-agents, et l’exemple utilise 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.")
  • L’exemple s’exécute avec python example.py et demande à l’assistant d’écrire le code qui trace le graphique
python example.py
  • La prise en charge de l’API OpenAI est au stade de support expérimental initial
    • Les éléments envisagés pour de futures améliorations sont l’API Embeddings, l’appel de fonctions, la prise en charge de la vision et les Logprobs
    • Les issues GitHub sont acceptées, et plus d’informations sont disponibles dans la documentation sur la compatibilité OpenAI

1 commentaires

 
GN⁺ 2024-02-09
Avis sur Hacker News
  • La vitesse à laquelle l’ergonomie de l’hébergement local de LLM s’est améliorée ces derniers mois est étonnante. Il y a encore quelques heures, je parlais de la simplicité de https://github.com/Mozilla-Ocho/llamafile[1], et maintenant je me demande quoi utiliser
    [1] Littéralement il y a quelques heures : https://euri.ca/blog/2024-llm-self-hosting-is-easy-now/

    • Aujourd’hui, je pense qu’il est devenu plus facile pour une entreprise d’auto-héberger un serveur d’inférence basique avec prise en charge de RAG. Il suffit d’acheter un Mac Mini ou un Mac Studio, de lancer ollama serve, de démarrer ollama web-ui dans Docker, d’ajouter via l’interface web un modèle d’assistance au code depuis OllamaHub, puis de téléverser sa documentation
      Sans écrire de code, on obtient un LLM auto-hébergé qui répond en prenant les documents comme contexte. De notre côté, deepseek coder 33b est suffisamment rapide sur un Mac Studio avec 64 Go de RAM, et il donne d’assez bonnes suggestions à partir de notre documentation interne de code
    • Personnellement, je recommande Ollama. Sa gestion des modèles est bien pensée, un peu comme Docker, et l’API est aussi plus largement prise en charge
      On peut même combiner plusieurs modèles dans un seul fichier de modèle, une fonctionnalité sur laquelle je fais des essais en ce moment. Il n’est pas nécessaire de dépendre uniquement de la bibliothèque de modèles d’Ollama : on peut aussi utiliser ses propres modèles. La prise en charge de nouveaux modèles arrive via les bindings llama.cpp
    • Le rythme d’évolution dans ce domaine est vraiment impressionnant. J’aimais la facilité avec laquelle on peut lancer llamafile, mais l’absence d’une interface de chat suffisamment complète me gênait, alors j’ai construit https://recurse.chat/ par-dessus
      GPT-4 reste nécessaire pour certaines tâches, mais pour l’usage quotidien, cela a remplacé une bonne partie de mon utilisation de ChatGPT, et j’apprécie surtout de pouvoir importer tout l’historique des conversations ChatGPT. Je suis aussi curieux de savoir ce que les gens veulent faire avec l’IA locale
    • J’utilise Ollama et Mixtral-7B pour le développement local sur un MBP, et j’en suis très satisfait
    • Jusqu’ici, je n’ai toujours utilisé que llamacpp -m -p , et j’utilise au quotidien Mixtral 8x7b + CodeLlama 70b sur mon MacBook comme des outils courants. Je me demande s’il existe des fonctionnalités décisives dans les alternatives à Llama.cpp, et je ne veux pas passer à côté d’une nouvelle tendance intéressante
  • Je suis professeur en école de commerce, et j’ai rédigé un guide pour faire essayer Ollama et web-ui à mes étudiants en les exécutant sur Google Cloud[1]. Avec des instances spot, ça tourne pour 18 cents de l’heure
    [1] https://docs.google.com/document/d/1OpZl4P3d0WKH9XtErUZib5_2...

    • Avec cette configuration, des étudiants pourraient se faire prendre les droits administrateur et l’instance pourrait être compromise. C’est très peu sûr. Je recommande vivement de leur faire utiliser des clés SSH dans git-bash. Ce n’est pas plus difficile techniquement que ce qui est déjà indiqué
    • On peut aussi faire tourner beaucoup de choses gratuitement sur Google Colab. KoboldCPP propose sur son site un environnement d’exécution préconfiguré bien fait, et on peut aussi charger d’autres modèles
  • Je connais plusieurs personnes qui sont discrètement mal à l’aise avec le fait que la compatibilité avec l’API OpenAI devienne un standard communautaire. À part des bizarreries comme data.choices.text.response ou l’imbrication inutilement défensive du schéma, je n’ai pas vraiment de grief
    Je me demande quelles sont les douleurs dans le processus par lequel une API devient un standard, et si certains ont essayé des standards alternatifs envisageables

    • Il faut de la documentation
      Que cela devienne un standard communautaire, très bien, mais il faut une spécification très solide de ce que la communauté entend par compatibilité avec l’API OpenAI. En particulier, même si OpenAI a sorti une nouvelle fonctionnalité ce matin, ce standard doit rester stable
      Ce que je veux, c’est une spécification d’API robuste, y compris pour les conditions d’erreur, une suite de tests permettant de vérifier qu’une nouvelle implémentation respecte la spécification, et un nom. Par exemple, si un logiciel est compatible avec OpenAI-API-Spec v3, je veux savoir ce que cela signifie. Dire simplement « compatible avec l’API OpenAI », comme aujourd’hui, ne donne pas assez d’informations. On ne sait pas de quelle partie de l’API il s’agit, ni à quel état de l’API cela correspond
    • Franchement, nous en avons beaucoup discuté en interne avant d’ajouter ça. Il est étrange de se retrouver lié à l’API de quelqu’un d’autre, au point que cette API puisse déterminer quelles fonctionnalités nous devrions, ou ne devrions pas, intégrer à notre projet
      Même si nous ajoutons à Ollama des fonctionnalités nouvelles, intéressantes et différentes, je ne sais pas si les gens pourront les utiliser s’il n’existe pas d’équivalent dans l’API OpenAI
    • C’est donc une bonne chose que ce soit proposé comme option. Cela réduit les frictions et diminue la dépendance au moat d’OpenAI
    • À mon avis, un standard imparfait vaut toujours mieux que pas de standard du tout
    • Il est très facile de créer un serveur web qui appelle directement les fonctions llama.cpp avec les bindings du langage de son choix, donc ce n’est pas très important. Si l’on a besoin de davantage de contrôle, il suffit d’un peu plus de travail, et ce genre d’outil prêt à l’emploi n’est pas indispensable
  • Au travail, nous construisons une version meilleure que Copilot, et nous prenons aussi en charge une approche où l’utilisateur peut apporter son propre LLM. Récemment, nous ajoutons un backend compatible OpenAI : il suffit de fournir l’endpoint d’API compatible OpenAI et d’indiquer comme quel modèle il doit être traité, puis nous pouvons formater les prompts, les séquences d’arrêt, le nombre maximal de tokens, etc., selon la sémantique de ce modèle
    C’est exactement ce dont nous avions besoin pour tester dans un environnement de développement local. Si Ollama prend cela en charge, les tests sur les nombreux LLM que nous devons supporter deviennent beaucoup plus faciles. À voir OpenLLM et divers autres outils implémenter la même API, tout semble converger vers la compatibilité avec l’API OpenAI

  • Créer une startup IA en ce moment donne vraiment une bonne impression
    Au début, on a galéré avec les limites de tokens, mais c’est résolu ; le problème de sortie JSON cohérente aussi ; les limites de débit et les problèmes de performance des grands modèles tiers aussi ; et le fait de vouloir réduire les coûts en auto-hébergeant des modèles open source pour des tâches petites à moyennement complexes aussi
    À chaque avancée majeure des LLM, on a l’impression que le produit devient automatiquement moins cher, plus fiable et plus scalable. Bien sûr, il faut se concentrer sur la création de défensibilité et se différencier sur tout ce qui « n’est pas de l’IA »

    • Je me demande ce que signifie le fait que les limites de tokens soient résolues. Est-ce que ça veut dire que les limites de contexte des versions récentes sont beaucoup plus grandes, mais aussi beaucoup plus coûteuses ?
  • Dire que c’est compatible avec OpenAI peut être un peu trompeur, car on s’attend alors aussi aux appels de fonctions ou d’outils
    Avoir une structure avec rôles et contenu, c’est bien, mais à l’origine c’était assez simple à implémenter. Quand on passe aux agents, il faut exécuter de vraies actions. Dans le système d’hébergement d’agents que j’ai commencé, j’ai intégré un moteur de scripting ; je me suis donc demandé s’il ne fallait pas simplement permettre à l’agent d’exécuter du code, une fois la sécurité et les permissions cadrées. En fait, c’est comme ça que j’ai commencé
    Je ne suis donc pas sûr que les appels de fonctions/outils soient indispensables. Mais si beaucoup de gens standardisent les appels d’outils, il faudra peut-être les intégrer à mon framework même s’il dispose déjà de l’exécution de scripts arbitraires

    • La documentation indique clairement les fonctionnalités exclues : https://github.com/ollama/ollama/blob/main/docs/openai.md
      La sélection de fonctions/d’outils est gérée au niveau de l’application et il n’existe actuellement pas de format standard. Même les solutions largement utilisées ressemblent en pratique à des prompts système personnalisés et inefficaces : https://github.com/langchain-ai/langchain/blob/master/libs/l...
    • Le fait que Gemini Pro prenne en charge les appels de fonctions/outils m’a attiré, mais en pratique cela fonctionne très mal. Je n’ai pas encore essayé Gemini Ultra, et je ne sais pas non plus clairement si c’est disponible via API
      Quoi qu’il en soit, il vaut peut-être mieux ne pas proposer une prise en charge qui ne fonctionne pas
    • Pour quelqu’un qui a déjà utilisé l’API OpenAI, c’est un choix évident à comprendre
  • Pour info, le script d’installation Linux d’Ollama fonctionne selon la méthode « standard » courante avec les outils actuels :
    curl https://ollama.ai/install.sh | sh
    Cela dit, la dernière fois que j’ai vérifié, ce script demandait les droits root via sudo. Si vous voulez utiliser l’outil, mieux vaut télécharger le script, l’examiner ou l’adapter à vos besoins

    • Il existe des instructions d’installation manuelle[0]. D’après celles-ci, il semble configurer un service SystemD lancé automatiquement au démarrage. Si c’est juste pour tester, il m’a suffi de télécharger [1], de le rendre exécutable (chmod +x ollama-linux-amd64), puis de l’exécuter. Aucun droit root n’était nécessaire
      [0] https://github.com/ollama/ollama/blob/main/docs/linux.md#man...
      [1] https://ollama.ai/download/ollama-linux-amd64
    • Le binaire ollama est placé dans /usr/bin ; ce n’est pas strictement nécessaire, mais c’est pratique. Je n’ai pas vérifié ce qui, en dehors de cela, nécessite un accès root
    • De nos jours, il existe des gestionnaires de paquets
  • La couche de compatibilité peut aussi être créée dans une bibliothèque. Par exemple, llm() de LangChain peut fonctionner avec plusieurs backends LLM. Je me demande quelle approche vous préférez

    • Je préfère que ce soit dans la bibliothèque, mais pour l’instant il y a pas mal de problèmes. Le plus gros, c’est que l’écosystème évolue trop vite et que les wrappers de bibliothèques n’arrivent pas à suivre
      Un autre problème est que si le monde se standardise autour de bibliothèques médiocres comme LangChain, le coût de maintenance de backends non uniformes risque de tuer les nouveaux entrants et de les enfermer durablement. Donc, pour l’instant, une API uniforme semble être le meilleur choix par commodité
    • Avec cette approche, chaque bibliothèque doit prendre en charge chaque LLM. Je vois ça comme le problème du stockage objet, où presque tout le monde a fini par prendre en charge une API compatible S3
      Même imparfaite, une API standard est une bonne chose. En parallèle, il peut très bien exister une deuxième API, comme B2 de Backblaze, qui permet d’exploiter tout le potentiel. Il n’y a pas de solution unique qui convienne à tous les modèles ; si les modèles ont des capacités différentes, je pense qu’il vaut mieux proposer les deux options
    • Avant qu’OpenAI ne sorte son application, j’utilisais LangChain dans le système que j’avais construit. C’était une interface SMS très simple branchée sur un LLM, et je préférais travailler avec l’abstraction de LangChain plutôt que d’interagir directement avec l’API GPT-4
  • Je construis un projet qui permet de basculer facilement, en Python, entre des modèles open source (via HF, VLLM) et des modèles commerciaux (OpenAI, Google, Anthropic, Together) : https://github.com/datadreamer-dev/DataDreamer
    Si vous voulez l’utiliser directement depuis Python sans API HTTP, c’est une approche un peu plus simple

  • Je me demande quels sont les cas d’usage d’Ollama. Pourquoi ne pas utiliser directement llama.cpp ?

    • C’est comme Docker/un gestionnaire de paquets pour les LLM. On peut installer facilement, trouver de nouveaux modèles et les mettre à jour avec une CLI standardisée et simple. Les mises à jour automatiques se font aussi sans friction
    • Je me pose la même question. Ollama semble faire l’objet de beaucoup de promotion et recevoir de bons retours, mais je me demande quel avantage précis il offre aujourd’hui par rapport à l’utilisation directe de llama.cpp, qui dispose aussi d’un serveur intégré compatible OpenAI