Esta é a primeira parte de um mergulho mais profundo em Ollama e nas coisas que aprendi sobre LLMs locais e como você pode usá-los para aplicativos baseados em inferência. Nesta postagem, você aprenderá sobre -
Para entender os fundamentos dos LLMs (incluindo LLMs locais), você pode consultar minha postagem anterior sobre este tópico aqui .
No espaço dos LLMs locais, encontrei pela primeira vez o LMStudio. Embora o aplicativo em si seja fácil de usar, gostei da simplicidade e manobrabilidade que Ollama oferece. Para saber mais sobre Ollama você pode acessar aqui .
dr: Ollama hospeda sua própria lista selecionada de modelos aos quais você tem acesso.
Você pode baixar esses modelos para sua máquina local e interagir com eles por meio de um prompt de linha de comando. Alternativamente, quando você executa o modelo, Ollama também executa um servidor de inferência hospedado na porta 11434 (por padrão) com o qual você pode interagir por meio de APIs e outras bibliotecas como Langchain.
Neste post, Ollama conta com 74 modelos, que também incluem categorias como modelos de incorporação.
Baixe o Ollama para o sistema operacional de sua escolha. Depois de fazer isso, execute o comando ollama
para confirmar que está funcionando. Deve mostrar o menu de ajuda –
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.
Para usar qualquer modelo, primeiro você precisa “retirá-los” do Ollama, da mesma forma que extrairia uma imagem do Dockerhub (se você já usou isso no passado) ou algo como Elastic Container Registry (ECR).
Ollama vem com alguns modelos padrão (como llama2
que é o LLM de código aberto do Facebook) que você pode ver executando.
ollama list
Selecione o modelo (digamos phi
) com o qual você gostaria de interagir na página da biblioteca Ollama . Agora você pode baixar este modelo executando o comando
ollama pull phi
Assim que o download for concluído, você pode verificar se o modelo está disponível localmente executando —
ollama list
Agora que o modelo está disponível, ele está pronto para ser executado. Você pode executar um modelo usando o comando —
ollama run phi
A precisão das respostas nem sempre é excelente, mas você pode resolver isso selecionando modelos diferentes ou talvez fazendo alguns ajustes ou implementando uma solução semelhante ao RAG por conta própria para melhorar a precisão.
O que demonstrei acima é como você pode usar modelos Ollama usando o prompt da linha de comando. No entanto, se você verificar o servidor de inferência que o Llama está executando, poderá ver que existem maneiras programáticas de acessá-lo, acessando a porta 11434.
Se você quiser usar Langchain para acessar seu modelo Ollama, você pode usar algo como –
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)
Você também pode criar sua própria variante de modelo usando o conceito de Modelfile
no Ollama. Para obter mais parâmetros para configurar em seu Modelfile, você pode consultar estes documentos.
Exemplo de arquivo de modelo -
# 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. """
Depois de ter o Modelfile, você pode criar seu modelo usando
ollama create arjunrao87/financellm -f Modelfile
onde financellm
é o nome do seu modelo LLM e arjunrao87
seria substituído pelo seu nome de usuário ollama.com (que também atua como o namespace do seu registro ollama online). Neste ponto, você pode usar o modelo criado como qualquer outro modelo no Ollama.
Você também pode optar por enviar seu modelo para o registro remoto do ollama. Para que isso aconteça, você precisa
Depois de criar seu llm local, você pode enviá-lo para o registro ollama usando -
ollama push arjunrao87/financellm
🦄 Agora, vamos para a parte boa.
Durante minha busca para usar o Ollama, uma das descobertas mais agradáveis foi esse ecossistema de construtores de aplicativos web baseados em Python que encontrei. Chainlit pode ser usado para construir um chatbot completo como o ChatGPT. Como diz a página deles,
Chainlit é um pacote Python de código aberto para construir IA conversacional pronta para produção
Percorri alguns dos tutoriais do Chainlit para entender o que você pode fazer com o Chainlit, que inclui coisas como criar sequências de tarefas (chamadas de “etapas”), ativar botões e ações, enviar imagens e todo tipo de coisas. Você pode acompanhar esta parte da minha jornada aqui .
Depois que peguei o jeito do Chainlit, quis montar um chatbot simples que basicamente usasse Ollama para que eu pudesse usar um LLM local para conversar (em vez de, digamos, ChatGPT ou Claude).
Com menos de 50 linhas de código, você pode fazer isso usando Chainlit + Ollama. Isso não é loucura?
Chainlit como biblioteca é super simples de usar. Também usei Langchain para usar e interagir com Ollama.
from langchain_community.llms import Ollama from langchain.prompts import ChatPromptTemplate import chainlit as cl
O próximo passo é definir como você deseja que seja a tela de carregamento do chatbot, usando o decorador @cl.on_chat_start
do 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() .... ....
A interface Message
é o que Chainlit usa para enviar respostas de volta à IU. Você pode construir mensagens com a chave content
simples e, em seguida, embelezá-las com coisas como elements
que, no meu caso, adicionei uma Image
para mostrar uma imagem quando o usuário fizer login pela primeira vez.
A próxima etapa é invocar Langchain para instanciar o Ollama (com o modelo de sua escolha) e construir o modelo de prompt. O uso de cl.user_session
é principalmente para manter a separação dos contextos e históricos do usuário, o que não é estritamente necessário apenas para fins de execução de uma demonstração rápida.
Chain é uma interface Langchain chamada Runnable
que é usada para criar cadeias personalizadas. Você pode ler mais sobre isso aqui .
@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)
Agora, você tem todas as peças para ter uma IU do chatbot e aceitar entradas do usuário. O que você faz com as solicitações fornecidas pelo usuário? Você usará o manipulador @cl.on_message
do Chainlit para fazer algo com a mensagem fornecida pelo usuário.
@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
como os documentos sugerem “transmitir partes da resposta assíncrona”, que é o que queremos para nosso bot.
É realmente isso. Algumas importações, algumas funções, um pouco de açúcar e você tem um chatbot funcional.
Para o código completo, você pode ver meu GitHub .
Se este conteúdo for interessante para você, clique no botão 👏 ou assine minha newsletter aqui → https://a1engineering.beehiiv.com/subscribe . Isso me dá o feedback de que preciso fazer mais ou menos alguma coisa! Obrigado ❤️
Também publicado aqui