Il s'agit de la première partie d'une plongée plus approfondie dans Ollama et dans les choses que j'ai apprises sur les LLM locaux et sur la façon dont vous pouvez les utiliser pour des applications basées sur l'inférence. Dans cet article, vous découvrirez —
Pour comprendre les bases des LLM (y compris les Local LLM), vous pouvez vous référer à mon précédent article sur ce sujet ici .
Dans l'espace des LLM locaux, je suis d'abord tombé sur LMStudio. Bien que l'application elle-même soit facile à utiliser, j'ai aimé la simplicité et la maniabilité offertes par Ollama. Pour en savoir plus sur Ollama, vous pouvez aller ici .
tl;dr : Ollama héberge sa propre liste de modèles auxquels vous avez accès.
Vous pouvez télécharger ces modèles sur votre ordinateur local, puis interagir avec ces modèles via une invite de ligne de commande. Alternativement, lorsque vous exécutez le modèle, Ollama exécute également un serveur d'inférence hébergé sur le port 11434 (par défaut) avec lequel vous pouvez interagir via des API et d'autres bibliothèques comme Langchain.
À partir de cet article, Ollama compte 74 modèles, qui incluent également des catégories telles que les modèles d'intégration.
Téléchargez Ollama pour le système d'exploitation de votre choix. Une fois cela fait, vous exécutez la commande ollama
pour confirmer qu'elle fonctionne. Il devrait vous montrer le menu d'aide -
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.
Pour utiliser n'importe quel modèle, vous devez d'abord les « extraire » d'Ollama, un peu comme vous le feriez pour extraire une image de Dockerhub (si vous l'avez utilisé dans le passé) ou quelque chose comme Elastic Container Registry (ECR).
Ollama est livré avec certains modèles par défaut (comme llama2
qui est le LLM open source de Facebook) que vous pouvez voir en exécutant.
ollama list
Sélectionnez le modèle (disons phi
) avec lequel vous souhaitez interagir sur la page de la bibliothèque Ollama . Vous pouvez maintenant dérouler ce modèle en exécutant la commande
ollama pull phi
Une fois le téléchargement terminé, vous pouvez vérifier si le modèle est disponible localement en exécutant —
ollama list
Maintenant que le modèle est disponible, il est prêt à être utilisé. Vous pouvez exécuter un modèle à l'aide de la commande —
ollama run phi
La précision des réponses n'est pas toujours excellente, mais vous pouvez y remédier en sélectionnant différents modèles ou peut-être en effectuant des réglages précis ou en mettant en œuvre vous-même une solution de type RAG pour améliorer la précision.
Ce que j'ai démontré ci-dessus, c'est comment utiliser les modèles Ollama à l'aide de l'invite de ligne de commande. Cependant, si vous vérifiez le serveur d'inférence que Llama exécute, vous pouvez voir qu'il existe des moyens programmatiques d'y accéder en accédant au port 11434.
Si vous souhaitez utiliser Langchain pour accéder à votre modèle Ollama, vous pouvez utiliser quelque chose comme :
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)
Vous pouvez également créer votre propre variante de modèle en utilisant le concept de Modelfile
dans Ollama. Pour plus de paramètres à configurer dans votre Modelfile, vous pouvez consulter ces documents.
Exemple de fichier modèle :
# 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. """
Une fois que vous avez le Modelfile, vous pouvez créer votre modèle en utilisant
ollama create arjunrao87/financellm -f Modelfile
où financellm
est le nom de votre modèle LLM et arjunrao87
serait remplacé par votre nom d'utilisateur ollama.com (qui fait également office d'espace de noms de votre registre ollama en ligne). À ce stade, vous pouvez utiliser votre modèle créé comme n'importe quel autre modèle sur Ollama.
Vous pouvez également choisir de transférer votre modèle vers le registre ollama distant. Pour que cela se produise, vous devez
Une fois que vous avez créé votre LLM local, vous pouvez le transférer vers le registre ollama en utilisant :
ollama push arjunrao87/financellm
🦄 Maintenant, passons à la bonne partie.
Au cours de ma quête pour utiliser Ollama, l'une des découvertes les plus agréables a été cet écosystème de créateurs d'applications Web basés sur Python que j'ai rencontré. Chainlit peut être utilisé pour créer un chatbot à part entière comme ChatGPT. Comme le dit leur page,
Chainlit est un package Python open source pour créer une IA conversationnelle prête pour la production
J'ai parcouru quelques didacticiels Chainlit pour avoir une idée de ce que vous pouvez faire avec Chainlit, ce qui inclut des choses comme la création de séquences de tâches (appelées « étapes »), l'activation de boutons et d'actions, l'envoi d'images et toutes sortes de choses. Vous pouvez suivre cette partie de mon parcours ici .
Une fois que j'ai maîtrisé Chainlit, j'ai voulu créer un chatbot simple qui utilisait essentiellement Ollama afin que je puisse utiliser un LLM local pour discuter (au lieu de, par exemple, ChatGPT ou Claude).
Avec moins de 50 lignes de code, vous pouvez le faire en utilisant Chainlit + Ollama. N'est-ce pas fou ?
Chainlit en tant que bibliothèque est très simple à utiliser. J'ai également utilisé Langchain pour utiliser et interagir avec Ollama.
from langchain_community.llms import Ollama from langchain.prompts import ChatPromptTemplate import chainlit as cl
L'étape suivante consiste à définir l'apparence de l'écran de chargement du chatbot, en utilisant le décorateur @cl.on_chat_start
de chainlit —
@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() .... ....
L'interface Message
est ce que Chainlit utilise pour renvoyer les réponses à l'interface utilisateur. Vous pouvez créer des messages avec la simple clé content
, puis vous pouvez l'embellir avec des éléments tels que elements
auxquels, dans mon cas, j'ai ajouté une Image
pour afficher une image lorsque l'utilisateur se connecte pour la première fois.
L'étape suivante consiste à invoquer Langchain pour instancier Ollama (avec le modèle de votre choix) et à construire le modèle d'invite. L'utilisation de cl.user_session
consiste principalement à maintenir la séparation des contextes et des historiques utilisateur, ce qui n'est pas strictement nécessaire pour exécuter une démo rapide.
Chain est une interface Langchain appelée Runnable
qui est utilisée pour créer des chaînes personnalisées. Vous pouvez en savoir plus à ce sujet ici .
@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)
Vous disposez désormais de tous les éléments pour disposer d’une interface utilisateur de chatbot et accepter les entrées des utilisateurs. Que faites-vous des invites fournies par l’utilisateur ? Vous utiliserez le gestionnaire @cl.on_message
de Chainlit pour faire quelque chose avec le message fourni par l'utilisateur.
@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
comme le suggère la documentation, « diffusez des morceaux de la réponse asynchrone », ce que nous voulons pour notre bot.
C'est vraiment ça. Quelques importations, quelques fonctions, un peu de sucre et vous avez un chatbot fonctionnel.
Pour le code complet, vous pouvez voir mon GitHub .
Si ce contenu vous intéresse, appuyez sur ce bouton 👏 ou abonnez-vous à ma newsletter ici → https://a1engineering.beehiiv.com/subscribe . Cela me donne le feedback dont j’ai besoin pour faire plus ou moins quelque chose ! Merci ❤️
Également publié ici