1 Punkte von GN⁺ 2024-02-09 | 1 Kommentare | Auf WhatsApp teilen
  • Ollama integriert eine erste Kompatibilität zur OpenAI-Chat Completions API, sodass sich Tools und Anwendungen für OpenAI unverändert an lokale Modelle anbinden lassen
  • Nach der Installation können Modelle wie llama2 oder mistral heruntergeladen werden; Aufrufe sind möglich, wenn das OpenAI-Anfrageformat beibehalten und nur der Host geändert wird
  • Die OpenAI-Bibliotheken für Python und JavaScript funktionieren mit base_url/baseURL, die auf http://localhost:11434/v1 gesetzt werden, sowie einem erforderlichen, aber ungenutzten api_key-Wert
  • Es werden Beispiele bereitgestellt, um Streaming-Chat-Apps mit dem Vercel AI SDK und das Multi-Agenten-Framework Autogen von Microsoft an Ollama anzubinden
  • Der aktuelle Support befindet sich in einer frühen experimentellen Phase; Embeddings API, Function Calling, Vision-Support und Verbesserungen bei Logprobs sind für die Zukunft vorgesehen

Ollama im OpenAI-API-Format aufrufen

  • Ollama bietet einen mit der OpenAI-Chat Completions API kompatiblen Endpunkt, sodass lokale Modelle in bestehenden OpenAI-basierten Tools genutzt werden können
  • Zum Start Ollama installieren und ein Modell wie Llama 2 oder Mistral herunterladen
ollama pull llama2
  • Bei cURL bleibt das OpenAI-Anfrageformat unverändert, nur der Host wird auf http://localhost:11434 geändert
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!"
}
]
}'
  • In der OpenAI-Python-Bibliothek wird base_url auf den lokalen Ollama-Endpunkt gesetzt
    • api_key='ollama' ist erforderlich, wird aber nicht verwendet
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)
  • In der OpenAI-JavaScript-Bibliothek wird baseURL auf http://localhost:11434/v1 gesetzt
    • apiKey: 'ollama' ist ebenfalls erforderlich, wird aber nicht verwendet
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)

Beispielintegrationen und weitere Pläne

  • Das Vercel AI SDK ist eine Open-Source-Bibliothek zum Erstellen interaktiver Streaming-Anwendungen; das Next.js-OpenAI-Beispiel lässt sich auf Ollama umstellen
npx create-next-app --example https://github.com/vercel/ai/tree/main/examples/next-openai example
cd example
  • In app/api/chat/route.ts wird die OpenAI-Client-Konfiguration auf den lokalen Ollama-Endpunkt umgestellt
const openai = new OpenAI({
baseURL: 'http://localhost:11434/v1',
apiKey: 'ollama',
});
  • Die Chat-Completions-Anfrage verwendet das Modell llama2 und stream: true
const response = await openai.chat.completions.create({
model: 'llama2',
stream: true,
messages,
});
npm run dev
  • Autogen ist Microsofts Open-Source-Framework für Multi-Agenten-Anwendungen; im Beispiel wird Code Llama verwendet
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.")
  • Das Beispiel wird mit python example.py ausgeführt und lässt den Assistenten Code zum Zeichnen des Diagramms schreiben
python example.py
  • Die OpenAI-API-Unterstützung befindet sich in einer frühen experimentellen Phase
    • Für künftige Verbesserungen werden Embeddings API, Function Calling, Vision-Support und Logprobs geprüft
    • GitHub-Issues können eingereicht werden; weitere Informationen stehen in der OpenAI-Kompatibilitäts-Dokumentation

1 Kommentare

 
GN⁺ 2024-02-09
Meinungen auf Hacker News
  • Es ist erstaunlich, wie schnell sich die Nutzbarkeit von lokalem LLM-Hosting in den letzten Monaten verbessert hat. Noch vor ein paar Stunden habe ich darüber geredet, wie einfach https://github.com/Mozilla-Ocho/llamafile ist[1], und jetzt frage ich mich schon, was man verwenden sollte
    [1] Buchstäblich vor ein paar Stunden: https://euri.ca/blog/2024-llm-self-hosting-is-easy-now/

    • Ich denke, inzwischen ist es für Unternehmen einfacher geworden, einen einfachen Inferenzserver mit RAG-Unterstützung selbst zu hosten. Man kauft einen Mac Mini oder Mac Studio, führt ollama serve aus, startet ollama web-ui in Docker, fügt über das Web-UI ein Coding-Assistant-Modell aus OllamaHub hinzu und lädt die Dokumentation hoch
      So hat man ohne Code ein selbst gehostetes LLM, das Dokumente als Kontext nutzt, um Antworten zu geben. Bei uns ist deepseek coder 33b auf einem Mac Studio mit 64 GB RAM schnell genug und macht auf Basis unserer internen Coding-Dokumentation ziemlich brauchbare Vorschläge
    • Persönlich würde ich Ollama empfehlen. Die Modellverwaltung ist ähnlich gut wie bei Docker gelöst, und die API wird breiter unterstützt
      Man kann auch mehrere Modelle in einer einzelnen Modelldatei mischen; das ist eine Funktion, mit der derzeit experimentiert wird. Man muss sich nicht zwingend auf Ollamas Modellbibliothek verlassen, sondern kann auch selbst erstellte Modelle verwenden. Unterstützung für neue Modelle kommt über llama.cpp-Bindings hinzu
    • Das Entwicklungstempo in diesem Bereich ist wirklich erstaunlich. Mir gefiel, wie einfach sich llamafile starten ließ, aber mir fehlte eine ausreichend funktionsreiche Chat-Oberfläche, also habe ich darauf aufbauend https://recurse.chat/ gebaut
      Für manche Aufgaben brauche ich zwar noch GPT-4, aber im Alltag hat es einen erheblichen Teil meiner ChatGPT-Nutzung ersetzt, und besonders gut finde ich, dass man den gesamten Chatverlauf von ChatGPT importieren kann. Ich bin auch neugierig, was Leute mit lokaler AI machen wollen
    • Ich nutze Ollama und Mixtral-7B auf einem MBP für lokale Entwicklung und bin sehr zufrieden
    • Ich habe immer nur llamacpp -m -p verwendet und nutze Mixtral 8x7b + CodeLlama 70b auf dem MacBook problemlos als Alltagswerkzeug. Mich würde interessieren, ob die Alternativen zu Llama.cpp entscheidende Funktionen haben, und ich möchte keine spannende neue Entwicklung verpassen
  • Ich bin BWL-Professor und habe eine Anleitung erstellt, um meine Studierenden Ollama und web-ui auf Google Cloud ausprobieren zu lassen[1]. Mit Spot-Instanzen kann man das für 18 Cent pro Stunde betreiben
    [1] https://docs.google.com/document/d/1OpZl4P3d0WKH9XtErUZib5_2...

    • Mit dieser Einrichtung können Studierende sich Adminrechte sichern und die Instanz übernehmen. Das ist sehr unsicher. Ich empfehle dringend, in git-bash SSH-Schlüssel zu verwenden. Das ist technisch auch nicht schwieriger als die Dinge, die bereits erklärt wurden
    • Auch in Google Colab kann man vieles kostenlos laufen lassen. KoboldCPP hat auf der Website gut vorbereitete Ausführungsumgebungen, und man kann auch andere Modelle laden
  • Ich kenne einige Leute, denen es insgeheim unangenehm ist, dass OpenAI-API-Kompatibilität zum Community-Standard wird. Abgesehen von Merkwürdigkeiten wie data.choices.text.response oder der unnötig defensiven Verschachtelung des Schemas habe ich daran nicht wirklich etwas auszusetzen
    Mich interessiert, welche Schmerzpunkte es gibt, wenn eine API zum Standard wird, und ob jemand alternative Standards ausprobiert hat, die man in Betracht ziehen sollte

    • Es braucht Dokumentation
      Dass es sich als Community-Standard etabliert, ist in Ordnung, aber es sollte eine sehr solide Spezifikation dafür geben, was die Community mit OpenAI-API-kompatibel meint. Insbesondere sollte dieser Standard stabil bleiben, selbst wenn OpenAI heute Morgen eine neue Funktion veröffentlicht hat
      Was ich möchte, ist eine robuste API-Spezifikation inklusive Fehlerbedingungen, eine Testsuite, mit der sich prüfen lässt, ob eine neue Implementierung der Spezifikation entspricht, und einen Namen. Wenn Software zum Beispiel mit OpenAI-API-Spec v3 kompatibel ist, möchte ich wissen, was das bedeutet. Einfach nur „OpenAI-API-kompatibel“ wie heute reicht als Information nicht aus. Man weiß nicht, welcher Teil der API gemeint ist oder auf welchen Stand der API sie sich bezieht
    • Ehrlich gesagt haben wir intern viel darüber diskutiert, bevor wir das hinzugefügt haben. Es fühlt sich seltsam an, an die API eines anderen gebunden zu sein, sodass deren API beeinflussen kann, welche Funktionen wir in unser Projekt aufnehmen sollten oder nicht
      Wenn wir Ollama coole, neue und andere Funktionen hinzufügen, aber es kein Gegenstück in der OpenAI API gibt, weiß ich nicht, ob die Leute sie überhaupt nutzen können
    • Deshalb ist es gut, dass es als Option angeboten wird. Es reduziert Reibung und verringert die Abhängigkeit vom Burggraben von OpenAI
    • Meiner Meinung nach ist ein unvollständiger Standard immer besser als gar kein Standard
    • Einen Webserver zu bauen, der llama.cpp-Funktionen direkt über Bindings in der gewünschten Sprache aufruft, ist sehr einfach, daher ist das nicht besonders wichtig. Wenn man mehr Kontrolle braucht, ist nur etwas zusätzliche Arbeit nötig, und man braucht nicht zwingend solche Plug-and-play-Tools
  • Bei der Arbeit bauen wir eine bessere Version als Copilot und unterstützen auch einen Ansatz, bei dem Nutzer ihr eigenes LLM mitbringen. Vor Kurzem haben wir ein OpenAI-kompatibles Backend hinzugefügt: Man gibt einfach den OpenAI-kompatiblen API-Endpunkt und das Modell an, als das es behandelt werden soll, und dann können wir Prompts, Stop-Sequenzen, maximale Token usw. entsprechend der Semantik dieses Modells formatieren
    Genau so etwas brauchten wir zum Testen in der lokalen Entwicklungsumgebung. Wenn Ollama das unterstützt, wird das Testen der vielen LLMs, die wir unterstützen müssen, erheblich einfacher. Wenn man sieht, dass auch verschiedene Tools wie OpenLLM dieselbe API implementieren, scheint sich alles auf OpenAI-API-Kompatibilität zuzubewegen

  • Es fühlt sich derzeit wirklich gut an, ein AI-Startup aufzubauen
    Anfangs hatten wir mit Token-Limits zu kämpfen, aber das wurde gelöst; das Problem konsistenter JSON-Ausgaben wurde gelöst; die Rate-Limits und Performance-Probleme großer Drittanbieter-Modelle wurden gelöst; und auch der Wunsch, Open-Source-Modelle für kleine bis mittelkomplexe Aufgaben selbst zu hosten, um Kosten zu senken, wurde gelöst
    Bei jedem größeren Fortschritt bei LLMs fühlt es sich so an, als würde das Produkt automatisch günstiger, zuverlässiger und besser skalierbar. Natürlich muss man Schutzmechanismen aufbauen und sich auf Differenzierung bei allem konzentrieren, was „nicht AI“ ist

    • Ich frage mich, was genau damit gemeint ist, dass Token-Limits gelöst wurden. Geht es darum, dass die Kontextgrenzen der neueren Versionen viel größer geworden sind, allerdings zu deutlich höheren Kosten?
  • Wenn man sagt, es sei mit OpenAI kompatibel, erwartet man auch Function Calling oder Tool Calling, daher kann das meiner Meinung nach etwas missverständlich sein
    Dass es Rollen und eine Inhaltsstruktur gibt, ist gut, aber das war ursprünglich ziemlich einfach zu implementieren. Sobald man zu Agents übergeht, braucht man die Ausführung echter Aktionen. In das Agent-Hosting-System, das ich gestartet habe, habe ich eine Scripting-Engine eingebaut, und deshalb dachte ich, dass man nach dem Klären von Sicherheit und Berechtigungen den Agent vielleicht einfach Code ausführen lassen sollte. Tatsächlich habe ich so angefangen
    Deshalb bin ich nicht sicher, ob Function/Tool Calling wirklich nötig ist. Wenn aber viele Leute Tool Calling standardisieren, muss ich es eventuell in mein Framework aufnehmen, selbst wenn es beliebige Script-Ausführung gibt

    • In der Dokumentation wird klar benannt, welche Funktionen ausgeschlossen sind: https://github.com/ollama/ollama/blob/main/docs/openai.md
      Function Calling/Tool-Auswahl wird auf Anwendungsebene behandelt und hat derzeit kein Standardformat. Auch die verbreiteten Varianten sind im Grunde eher ineffiziente, maßgeschneiderte System-Prompts: https://github.com/langchain-ai/langchain/blob/master/libs/l...
    • Gemini Pro hat mich angezogen, weil es Function/Tool Calling unterstützt, aber in der Praxis funktioniert es miserabel. Gemini Ultra habe ich noch nicht ausprobiert, und es ist unklar, ob es per API verfügbar ist
      Jedenfalls kann es besser sein, keine Unterstützung anzubieten, die nicht funktioniert
    • Für jemanden, der die OpenAI API genutzt hat, ist diese Entscheidung natürlich nachvollziehbar
  • Zur Info: Ollamas Linux-Installationsskript funktioniert auf die „Standard“-Art, wie sie bei heutigen Tools üblich ist:
    curl https://ollama.ai/install.sh | sh
    Allerdings verlangte dieses Skript beim letzten Mal, als ich nachgesehen habe, per sudo Root-Rechte. Wenn man das Tool verwenden möchte, sollte man das Skript herunterladen und prüfen oder es an die eigenen Bedürfnisse anpassen

    • Es gibt eine Anleitung zur manuellen Installation[0]. Danach scheint es einen SystemD-Service einzurichten, der beim Start automatisch ausgeführt wird. Wenn man es nur kurz ausprobieren will, hat es bei mir gereicht, [1] herunterzuladen, ausführbar zu machen (chmod +x ollama-linux-amd64) und auszuführen. Root-Rechte waren nicht nötig
      [0] https://github.com/ollama/ollama/blob/main/docs/linux.md#man...
      [1] https://ollama.ai/download/ollama-linux-amd64
    • Das ollama-Binary landet in /usr/bin, was nicht zwingend nötig ist, aber praktisch. Ich habe nicht geprüft, was sonst noch Root-Zugriff erfordert
    • Heutzutage gibt es Paketmanager
  • Eine Kompatibilitätsschicht könnte man auch in einer Bibliothek bauen. Zum Beispiel kann LangChains llm() mit verschiedenen LLM-Backends arbeiten. Ich frage mich, welche Variante bevorzugt wird

    • Ich würde es lieber in der Bibliothek haben, aber derzeit gibt es ziemlich viele Probleme. Das größte ist, dass sich das Ökosystem so schnell bewegt, dass Library-Wrapper nicht hinterherkommen
      Ein weiteres Problem ist: Wenn sich die Welt auf schlechte Bibliotheken wie LangChain standardisiert, sterben Nachzügler wegen der Wartungskosten uneinheitlicher Backends, und man bleibt lange daran gebunden. Deshalb wirkt eine einheitliche API derzeit aus Bequemlichkeit wie die bessere Wahl
    • Dann müsste jede Bibliothek jedes LLM unterstützen. Ich sehe darin dasselbe Problem wie bei Object Storage, wo am Ende fast alle eine S3-kompatible API unterstützen
      Eine Standard-API zu haben, ist gut, auch wenn sie nicht perfekt ist. Gleichzeitig ist es in Ordnung, eine zweite API wie Backblazes B2 zu haben, mit der sich das volle Potenzial ausschöpfen lässt. Es gibt keine Einheitslösung, die für alle Modelle passt, und wenn Modelle unterschiedliche Fähigkeiten haben, sollte man meiner Meinung nach beide Optionen anbieten
    • Bevor OpenAI die App herausgebracht hat, habe ich in meinem eigenen System LangChain verwendet. Es war eine sehr einfache SMS-Schnittstelle zu einem LLM, und ich arbeitete lieber mit LangChains Abstraktion als direkt gegen die GPT-4 API
  • Ich baue ein Projekt, mit dem man in Python leicht zwischen Open-Source-Modellen (über HF, VLLM) und kommerziellen Modellen (OpenAI, Google, Anthropic, Together) wechseln kann: https://github.com/datadreamer-dev/DataDreamer
    Wenn man es direkt in Python ohne HTTP API verwenden möchte, ist das ein etwas einfacherer Weg

  • Ich frage mich, wofür Ollama verwendet wird. Warum nicht einfach llama.cpp direkt verwenden?

    • Es ist so etwas wie Docker/Paketmanager für LLMs. Mit einer standardisierten und einfachen CLI kann man Modelle leicht installieren, neue Modelle finden und aktualisieren. Auch automatische Updates sind unkompliziert
    • Ich habe dieselbe Frage. Ollama scheint viel beworben zu werden und gut anzukommen, aber ich frage mich, welchen konkreten Vorteil es heute gegenüber der direkten Nutzung von llama.cpp hat, das inzwischen auch einen eingebauten OpenAI-kompatiblen Server bietet