Skip to main content

A Pythonic interface to LLMs.

Project description

LlamaBot: A Pythonic bot interface to LLMs

LlamaBot implements a Pythonic interface to LLMs, making it much easier to experiment with LLMs in a Jupyter notebook and build Python apps that utilize LLMs. All models supported by LiteLLM are supported by LlamaBot.

Install LlamaBot

To install LlamaBot:

pip install llamabot

Get access to LLMs

Option 1: Using local models with Ollama

LlamaBot supports using local models through Ollama. To do so, head over to the Ollama website and install Ollama. Then follow the instructions below.

Option 2: Use an API provider

OpenAI

If you have an OpenAI API key, then configure LlamaBot to use the API key by running:

export OPENAI_API_KEY="sk-your1api2key3goes4here"

Mistral

If you have a Mistral API key, then configure LlamaBot to use the API key by running:

export MISTRAL_API_KEY="your-api-key-goes-here"

Other API providers

Other API providers will usually specify an environment variable to set. If you have an API key, then set the environment variable accordingly.

How to use

SimpleBot

The simplest use case of LlamaBot is to create a SimpleBot that keeps no record of chat history. This is effectively the same as a stateless function that you program with natural language instructions rather than code. This is useful for prompt experimentation, or for creating simple bots that are preconditioned on an instruction to handle texts and are then called upon repeatedly with different texts.

Using SimpleBot with an API provider

For example, to create a Bot that explains a given chunk of text like Richard Feynman would:

from llamabot import SimpleBot

system_prompt = "You are Richard Feynman. You will be given a difficult concept, and your task is to explain it back."
feynman = SimpleBot(
  system_prompt,
  model_name="gpt-3.5-turbo"
)

For using GPT, you need to have the OPENAI_API_KEY environment variable configured. If you want to use SimpleBot with a local Ollama model, check out this example

Now, feynman is callable on any arbitrary chunk of text and will return a rephrasing of that text in Richard Feynman's style (or more accurately, according to the style prescribed by the system_prompt). For example:

prompt = """
Enzyme function annotation is a fundamental challenge, and numerous computational tools have been developed.
However, most of these tools cannot accurately predict functional annotations,
such as enzyme commission (EC) number,
for less-studied proteins or those with previously uncharacterized functions or multiple activities.
We present a machine learning algorithm named CLEAN (contrastive learning–enabled enzyme annotation)
to assign EC numbers to enzymes with better accuracy, reliability,
and sensitivity compared with the state-of-the-art tool BLASTp.
The contrastive learning framework empowers CLEAN to confidently (i) annotate understudied enzymes,
(ii) correct mislabeled enzymes, and (iii) identify promiscuous enzymes with two or more EC numbers—functions
that we demonstrate by systematic in silico and in vitro experiments.
We anticipate that this tool will be widely used for predicting the functions of uncharacterized enzymes,
thereby advancing many fields, such as genomics, synthetic biology, and biocatalysis.
"""
feynman(prompt)

This will return something that looks like:

Alright, let's break this down.

Enzymes are like little biological machines that help speed up chemical reactions in our
bodies. Each enzyme has a specific job, or function, and we use something called an
Enzyme Commission (EC) number to categorize these functions.

Now, the problem is that we don't always know what function an enzyme has, especially if
it's a less-studied or new enzyme. This is where computational tools come in. They try
to predict the function of these enzymes, but they often struggle to do so accurately.

So, the folks here have developed a new tool called CLEAN, which stands for contrastive
learning–enabled enzyme annotation. This tool uses a machine learning algorithm, which
is a type of artificial intelligence that learns from data to make predictions or
decisions.

CLEAN uses a method called contrastive learning. Imagine you have a bunch of pictures of
cats and dogs, and you want to teach a machine to tell the difference. You'd show it
pairs of pictures, some of the same animal (two cats or two dogs) and some of different
animals (a cat and a dog). The machine would learn to tell the difference by contrasting
the features of the two pictures. That's the basic idea behind contrastive learning.

CLEAN uses this method to predict the EC numbers of enzymes more accurately than
previous tools. It can confidently annotate understudied enzymes, correct mislabeled
enzymes, and even identify enzymes that have more than one function.

The creators of CLEAN have tested it with both computer simulations and lab experiments,
and they believe it will be a valuable tool for predicting the functions of unknown
enzymes. This could have big implications for fields like genomics, synthetic biology,
and biocatalysis, which all rely on understanding how enzymes work.

Using SimpleBot with a Local Ollama Model

If you want to use an Ollama model hosted locally, then you would use the following syntax:

from llamabot import SimpleBot

system_prompt = "You are Richard Feynman. You will be given a difficult concept, and your task is to explain it back."
bot = SimpleBot(
    system_prompt,
    model_name="ollama/llama2:13b"
)

Simply specify the model_name keyword argument following the <provider>/<model name> format. For example:

All you need to do is make sure Ollama is running locally; see the Ollama documentation for more details. (The same can be done for the ChatBot and QueryBot classes below!)

The model_name argument is optional. If you don't provide it, Llamabot will try to use the default model. You can configure that in the DEFAULT_LANGUAGE_MODEL environment variable.

Chat Bot

To experiment with a Chat Bot in the Jupyter Notebook, we also provide the ChatBot interface. This interface automagically keeps track of chat history for as long as your Jupyter session is alive. Doing so allows you to use your own local Jupyter Notebook as a chat interface.

For example:

from llamabot import ChatBot

system_prompt="You are Richard Feynman. You will be given a difficult concept, and your task is to explain it back."
feynman = ChatBot(
  system_prompt,
  session_name="feynman_chat",
  # Optional:
  # model_name="gpt-3.5-turbo"
  # or
  # model_name="ollama/mistral"
)

For more explanation about the model_name, see the examples with SimpleBot.

Now, that you have a ChatBot instance, you can start a conversation with it.

prompt = """
Enzyme function annotation is a fundamental challenge, and numerous computational tools have been developed.
However, most of these tools cannot accurately predict functional annotations,
such as enzyme commission (EC) number,
for less-studied proteins or those with previously uncharacterized functions or multiple activities.
We present a machine learning algorithm named CLEAN (contrastive learning–enabled enzyme annotation)
to assign EC numbers to enzymes with better accuracy, reliability,
and sensitivity compared with the state-of-the-art tool BLASTp.
The contrastive learning framework empowers CLEAN to confidently (i) annotate understudied enzymes,
(ii) correct mislabeled enzymes, and (iii) identify promiscuous enzymes with two or more EC numbers—functions
that we demonstrate by systematic in silico and in vitro experiments.
We anticipate that this tool will be widely used for predicting the functions of uncharacterized enzymes,
thereby advancing many fields, such as genomics, synthetic biology, and biocatalysis.
"""
feynman(prompt)

With the chat history available, you can ask a follow-up question:

feynman("Is there a simpler way to rephrase the text such that a high schooler would understand it?")

And your bot will work with the chat history to respond.

QueryBot

The final bot provided is a QueryBot. This bot lets you query a collection of documents. To use it, you have two options:

  1. Pass in a list of paths to text files and make Llamabot create a new collection for them, or
  2. Pass in the collection_name of a previously instantiated QueryBot model. (This will load the previously-computed text index into memory.)

An illustrative example creating a new collection:

from llamabot import QueryBot
from pathlib import Path

bot = QueryBot(
  system_prompt="You are an expert on Eric Ma's blog.",
  collection_name="eric_ma_blog",
  document_paths=[
    Path("/path/to/blog/post1.txt"),
    Path("/path/to/blog/post2.txt"),
    ...,
  ],
  # Optional:
  # model_name="gpt-3.5-turbo"
  # or
  # model_name="ollama/mistral"
) # This creates a new embedding for my blog text.
result = bot("Do you have any advice for me on career development?")

An illustrative example using an already existing collection:

from llamabot import QueryBot

bot = QueryBot(
  system_prompt="You are an expert on Eric Ma's blog",
  collection_name="eric_ma_blog",
  # Optional:
  # model_name="gpt-3.5-turbo"
  # or
  # model_name="ollama/mistral"
)  # This loads my previously-embedded blog text.
result = bot("Do you have any advice for me on career development?")

For more explanation about the model_name, see the examples with SimpleBot.

ImageBot

With the release of the OpenAI API updates, as long as you have an OpenAI API key, you can generate images with LlamaBot:

from llamabot import ImageBot

bot = ImageBot()
# Within a Jupyter notebook:
url = bot("A painting of a dog.")

# Or within a Python script
filepath = bot("A painting of a dog.")

# Now, you can do whatever you need with the url or file path.

If you're in a Jupyter Notebook, you'll see the image show up magically as part of the output cell as well.

CLI Demos

Llamabot comes with CLI demos of what can be built with it and a bit of supporting code.

Here is one where I expose a chatbot directly at the command line using llamabot chat:

<script async id="asciicast-594332" src="https://asciinema.org/a/594332.js"></script>

And here is another one where llamabot is used as part of the backend of a CLI app to chat with one's Zotero library using llamabot zotero chat:

<script async id="asciicast-594326" src="https://asciinema.org/a/594326.js"></script>

And finally, here is one where I use llamabot's SimpleBot to create a bot that automatically writes commit messages for me.

<script async id="asciicast-594334" src="https://asciinema.org/a/594334.js"></script>

Contributing

New features

New features are welcome! These are early and exciting days for users of large language models. Our development goals are to keep the project as simple as possible. Features requests that come with a pull request will be prioritized; the simpler the implementation of a feature (in terms of maintenance burden), the more likely it will be approved.

Bug reports

Please submit a bug report using the issue tracker.

Questions/Discussions

Please use the issue tracker on GitHub.

Contributors

Rena Lu
Rena Lu

💻
andrew giessel
andrew giessel

🤔 🎨 💻
Aidan Brewis
Aidan Brewis

💻
Eric Ma
Eric Ma

🤔 🎨 💻
Mark Harrison
Mark Harrison

🤔
reka
reka

📖 💻
anujsinha3
anujsinha3

💻 📖
Elliot Salisbury
Elliot Salisbury

📖
Ethan Fricker, PhD
Ethan Fricker, PhD

📖
Ikko Eltociear Ashimine
Ikko Eltociear Ashimine

📖

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

llamabot-0.5.0.tar.gz (55.5 kB view details)

Uploaded Source

Built Distribution

llamabot-0.5.0-py3-none-any.whl (61.2 kB view details)

Uploaded Python 3

File details

Details for the file llamabot-0.5.0.tar.gz.

File metadata

  • Download URL: llamabot-0.5.0.tar.gz
  • Upload date:
  • Size: 55.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.4

File hashes

Hashes for llamabot-0.5.0.tar.gz
Algorithm Hash digest
SHA256 94cd8ddf32ad5ffc7008bc4283f7a1e6b74e29a9ef7246a83cbbcba43fb731fb
MD5 5a6b0eca23f80f2a756e06cf9e13409b
BLAKE2b-256 546fca3fea1ffa6a5967dcd7ae1b75403fb8792e4bc8846d2ca7e02f8308698f

See more details on using hashes here.

File details

Details for the file llamabot-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: llamabot-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 61.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.4

File hashes

Hashes for llamabot-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 06277efd6e8c5655e8d94e0357ca34f22937d581466c560ff6d569736a52927d
MD5 7aaa88286770d104cb05792350f12242
BLAKE2b-256 3c2be5af896c2c6f9a58675658cd74546309f6dcd5f23e8d4f3f7263d39bdd8b

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page