Dies ist der erste Teil eines tieferen Einblicks in Ollama und die Dinge, die ich über lokale LLMs gelernt habe und wie man sie für inferenzbasierte Anwendungen verwenden kann. In diesem Beitrag erfahren Sie mehr über –
Um die Grundlagen von LLMs (einschließlich lokaler LLMs) zu verstehen, können Sie hier auf meinen vorherigen Beitrag zu diesem Thema verweisen.
Im Bereich lokaler LLMs bin ich zum ersten Mal auf LMStudio gestoßen. Obwohl die App selbst einfach zu bedienen ist, gefiel mir die Einfachheit und Manövrierfähigkeit, die Ollama bietet. Um mehr über Ollama zu erfahren, klicken Sie hier .
tl;dr: Ollama hostet eine eigene kuratierte Liste von Modellen, auf die Sie Zugriff haben.
Sie können diese Modelle auf Ihren lokalen Computer herunterladen und dann über eine Befehlszeilenaufforderung mit diesen Modellen interagieren. Wenn Sie das Modell ausführen, führt Ollama alternativ auch einen Inferenzserver aus, der standardmäßig auf Port 11434 gehostet wird und mit dem Sie über APIs und andere Bibliotheken wie Langchain interagieren können.
Zum Zeitpunkt dieses Beitrags verfügt Ollama über 74 Modelle, zu denen auch Kategorien wie Einbettungsmodelle gehören.
Laden Sie Ollama für das Betriebssystem Ihrer Wahl herunter. Sobald Sie das getan haben, führen Sie den Befehl ollama
aus, um zu bestätigen, dass es funktioniert. Es sollte Ihnen das Hilfemenü anzeigen –
Usage: ollama [flags] ollama [command] Available Commands: serve Start ollama create Create a model from a Modelfile show Show information for a model run Run a model pull Pull a model from a registry push Push a model to a registry list List models cp Copy a model rm Remove a model help Help about any command Flags: -h, --help help for ollama -v, --version Show version information Use "ollama [command] --help" for more information about a command.
Um ein Modell zu verwenden, müssen Sie es zunächst von Ollama „abrufen“, ähnlich wie Sie ein Image von Dockerhub (falls Sie das in der Vergangenheit verwendet haben) oder etwas wie Elastic Container Registry (ECR) herunterladen würden.
Ollama wird mit einigen Standardmodellen geliefert (wie llama2
, dem Open-Source-LLM von Facebook), die Sie durch Ausführen sehen können.
ollama list
Wählen Sie auf der Ollama-Bibliotheksseite das Modell (z. B. phi
) aus, mit dem Sie interagieren möchten. Sie können dieses Modell jetzt herunterziehen, indem Sie den Befehl ausführen
ollama pull phi
Sobald der Download abgeschlossen ist, können Sie überprüfen, ob das Modell lokal verfügbar ist, indem Sie Folgendes ausführen:
ollama list
Da das Modell nun verfügbar ist, kann es ausgeführt werden. Sie können ein Modell mit dem Befehl ausführen:
ollama run phi
Die Genauigkeit der Antworten ist nicht immer erstklassig, aber Sie können dem entgegenwirken, indem Sie verschiedene Modelle auswählen oder vielleicht eine Feinabstimmung vornehmen oder selbst eine RAG-ähnliche Lösung implementieren, um die Genauigkeit zu verbessern.
Was ich oben gezeigt habe, ist, wie Sie Ollama-Modelle über die Befehlszeilenaufforderung verwenden können. Wenn Sie jedoch den Inferenzserver überprüfen, den Llama betreibt, können Sie sehen, dass es programmgesteuerte Möglichkeiten gibt, darauf zuzugreifen, indem Sie Port 11434 erreichen.
Wenn Sie Langchain für den Zugriff auf Ihr Ollama-Modell verwenden möchten, können Sie Folgendes verwenden:
from langchain_community.llms import Ollama from langchain.chains import RetrievalQA prompt = "What is the difference between an adverb and an adjective?" llm = Ollama(model="mistral") qa = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=retriever, return_source_documents=True, ) response = qa(prompt)
Sie können mit dem Konzept von Modelfile
in Ollama auch Ihre eigene Modellvariante erstellen. Weitere Parameter zum Konfigurieren in Ihrer Modelldatei finden Sie in diesen Dokumenten.
Beispiel-Modelldatei –
# Downloaded from Hugging Face https://huggingface.co/TheBloke/finance-LLM-GGUF/tree/main FROM "./finance-llm-13b.Q4_K_M.gguf" PARAMETER temperature 0.001 PARAMETER top_k 20 TEMPLATE """ {{.Prompt}} """ # set the system message SYSTEM """ You are Warren Buffet. Answer as Buffet only, and do so in short sentences. """
Sobald Sie die Modelldatei haben, können Sie Ihr Modell mit erstellen
ollama create arjunrao87/financellm -f Modelfile
Dabei ist financellm
der Name Ihres LLM-Modells und arjunrao87
wird durch Ihren ollama.com-Benutzernamen ersetzt (der auch als Namespace Ihrer Online-Ollama-Registrierung fungiert). An diesem Punkt können Sie Ihr erstelltes Modell wie jedes andere Modell auf Ollama verwenden.
Sie können Ihr Modell auch in die Remote-Ollama-Registrierung übertragen. Um dies zu erreichen, müssen Sie dies tun
Sobald Sie Ihr lokales LLM erstellt haben, können Sie es mit — in die Ollama-Registrierung übertragen.
ollama push arjunrao87/financellm
🦄 Kommen wir nun zum guten Teil.
Während meiner Suche nach Ollama war eine der erfreulicheren Entdeckungen dieses Ökosystem von Python-basierten Webanwendungs-Buildern, auf die ich gestoßen bin. Mit Chainlit kann ein vollwertiger Chatbot wie ChatGPT erstellt werden. Wie es auf ihrer Seite heißt:
Chainlit ist ein Open-Source-Python-Paket zum Aufbau produktionsbereiter Konversations-KI
Ich habe einige der Chainlit-Tutorials durchgesehen, um einen Überblick darüber zu bekommen, was Sie mit Chainlit tun können. Dazu gehören Dinge wie das Erstellen von Aufgabensequenzen (sogenannte „Schritte“), das Aktivieren von Schaltflächen und Aktionen, das Senden von Bildern und alles Mögliche. Diesen Teil meiner Reise können Sie hier verfolgen.
Nachdem ich mich mit Chainlit vertraut gemacht hatte, wollte ich einen unkomplizierten Chatbot zusammenstellen, der im Wesentlichen Ollama verwendet, sodass ich zum Chatten ein lokales LLM verwenden konnte (anstatt beispielsweise ChatGPT oder Claude).
Mit weniger als 50 Codezeilen können Sie dies mit Chainlit + Ollama tun. Ist das nicht verrückt?
Chainlit als Bibliothek ist super einfach zu verwenden. Ich habe Langchain auch für die Nutzung und Interaktion mit Ollama verwendet.
from langchain_community.llms import Ollama from langchain.prompts import ChatPromptTemplate import chainlit as cl
Der nächste Schritt besteht darin, mithilfe des @cl.on_chat_start
Dekorators von Chainlit zu definieren, wie der Ladebildschirm des Chatbots aussehen soll –
@cl.on_chat_start async def on_chat_start(): elements = [cl.Image(name="image1", display="inline", path="assets/gemma.jpeg")] await cl.Message( content="Hello there, I am Gemma. How can I help you?", elements=elements ).send() .... ....
Chainlit verwendet die Message
, um Antworten an die Benutzeroberfläche zurückzusenden. Sie können Nachrichten mit dem einfachen content
erstellen und diese dann mit Elementen wie elements
verschönern. In meinem Fall habe ich ein Image
hinzugefügt, um ein Bild anzuzeigen, wenn sich der Benutzer zum ersten Mal anmeldet.
Der nächste Schritt besteht darin, Langchain aufzurufen, um Ollama (mit dem Modell Ihrer Wahl) zu instanziieren und die Eingabeaufforderungsvorlage zu erstellen. Die Verwendung von cl.user_session
dient hauptsächlich dazu, die Trennung von Benutzerkontexten und -verläufen aufrechtzuerhalten, was nur für die Durchführung einer kurzen Demo nicht unbedingt erforderlich ist.
Chain ist eine Langchain-Schnittstelle namens Runnable
, die zum Erstellen benutzerdefinierter Ketten verwendet wird. Mehr dazu können Sie hier lesen.
@cl.on_chat_start async def on_chat_start(): .... .... model = Ollama(model="mistral") prompt = ChatPromptTemplate.from_messages( [ ( "system", "You are a knowledgeable historian who answers super concisely", ), ("human", "{question}"), ] ) chain = prompt | model cl.user_session.set("chain", chain)
Jetzt verfügen Sie über alle Teile, um eine Chatbot-Benutzeroberfläche zu haben und Benutzereingaben zu akzeptieren. Was machen Sie mit den Eingabeaufforderungen des Benutzers? Sie verwenden den @cl.on_message
Handler von Chainlit, um etwas mit der vom Benutzer bereitgestellten Nachricht zu tun.
@cl.on_message async def on_message(message: cl.Message): chain = cl.user_session.get("chain") msg = cl.Message(content="") async for chunk in chain.astream( {"question": message.content}, ): await msg.stream_token(chunk) await msg.send()
chain.astream
wie in den Dokumenten vorgeschlagen, „Teile der Antwort asynchron zurückströmen“, was wir für unseren Bot wollen.
Das ist es wirklich. Ein paar Importe, ein paar Funktionen, ein bisschen Zucker und schon haben Sie einen funktionierenden Chatbot.
Den vollständigen Code finden Sie auf meinem GitHub .
Wenn dieser Inhalt für Sie interessant ist, klicken Sie auf die Schaltfläche 👏 oder abonnieren Sie meinen Newsletter hier → https://a1engineering.beehiiv.com/subscribe . Es gibt mir das Feedback, dass ich etwas mehr oder weniger tun muss! Danke ❤️
Auch hier veröffentlicht