Skip to main content

Adaptive Shots - Few-shots prompting using Contextual Combinatorial Bandit optimizations

build status Python codecov PyPI License Downloads

gokhanmeteerturk/adaptive-shots

Github Repo | Documentation (in progress)

Overview

Adaptive Shots is a Python package that turns your prompts into few-shots prompts on the fly.

It automatically selects the most relevant prompt&answer pairs from the database based on what worked well before. Adaptive-shots package uses reinforcement learning algorithm UCB1-Tuned and learns from user feedback to improve its selections over time by using the numerical feedback as a reward.

This package implements UCB1-Tuned, but with a contextual cosine similarity of prompts to dynamically select and rank the most relevant and well performing old prompts for a given prompt text.

Initially designed for my Intelligent Tutoring System (ITS) project, the package is generalizable for any scenario requiring adaptive, reinforcement-learning-based prompt management.

Key Features

  • Sentence transformers for generating vector representations.
    Defaults to all-MiniLM-L6-v2 (384 dimensional dense vector space) but can be configured easily.
  • SQLite Vector Search with sqlite-vec. (Cosine distance is used)
  • Exploration vs Exploitation.

Flow

## Installation
pip install adaptive-shots

Quick Start

Core feature, few-shots prompt generation, looks like this:

shot_list = db.get_best_shots(
  prompt='Who is the author of Twelfth Night?',
  domain='geography',limit=2
)

You can then use the returned list for message generation:

shot_list.to_messages()
// Output:
[
  {"role": "user", "content": "Who wrote Hamlet?"},
  {"role": "assistant", "content": "William Shakespeare"},
  {"role": "user", "content": "Who wrote Oedipus Rex?"},
  {"role": "assistant", "content": "Sophocles"}
]

Example

from adaptive_shots import initialize_adaptive_shot_db
from openai import OpenAI

# Initialize database and OpenAI client
db = initialize_adaptive_shot_db('./shots.db')
client = OpenAI()

# Register initial prompts
db.register_prompt(
    prompt='What is the capital of France?',
    answer='Paris',
    rating=9.5,
    domain='geography'
)

# Generate few-shots prompt
user_query = 'What is the capital of Germany?'
few_shots_prompt, shot_list = db.create_few_shots_prompt(
    prompt=user_query,
    domain='geography',
    limit=1
)

print(few_shots_prompt)
# This will print the following:
"""
Prompt: What is the capital of France?
Answer: Paris

Prompt: What is the capital of Germany?
Answer:
"""
# You can give this directly to your LLM, or
# alternatively, use to_messages for chat completions like this:
response = client.chat.completions.create(
    model='gpt-4',
    messages=[
      *shot_list.to_messages(),
      {"role": "user", "content": user_query},
    ]
)
answer = response.choices[0].message.content

# Register feedback so all used shots get rewarded:
db.register_prompt(
    prompt=user_query,
    answer=answer,
    rating=9.0, # ideally you should receive this from the user
    domain='geography',
    used_shots=shot_list
)

API Reference

AdaptiveShotDatabase

register_prompt(prompt: str, answer: str, rating: float, domain: str, used_shots: Optional[ShotPromptsList] = None) -> None

Registers a new prompt-answer pair and updates the ratings of used shots.

create_few_shots_prompt(prompt: str, domain: str, limit: int = 3) -> Tuple[str, ShotPromptsList]

Generates a few-shot prompt using the best-performing relevant examples.

create_one_shot_prompt(prompt: str, domain: str) -> Tuple[str, Optional[ShotPromptsList]]

Generates a one-shot prompt using the single best-matching example.

get_best_shots(prompt: str, domain: str, c: float = 2.0, limit: int = 3) -> ShotPromptsList

Retrieves the optimal set of shots using the UCB algorithm.

License

This work is licensed under the GNU 3 - see the LICENSE file for details.

Citation

If you use this package in your research, please cite:

@software{erturk2024adaptive,
  author       = {Ertürk, Gökhan Mete},
  title        = {Adaptive-Shots: A Contextual Combinatorial Bandit Approach to Few-Shot Prompt Selection},
  year         = {2024},
  url          = {https://github.com/gokhanmeteerturk/adaptive-shots}
}

Metadata

Release files for adaptive-shots 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for adaptive-shots 0.1.0
File Size Uploaded
adaptive_shots-0.1.0.tar.gz 22.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for adaptive-shots 0.1.0
File Interpreter ABI Platform
adaptive_shots-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 46.2 kB

Release files / adaptive_shots-0.1.0.tar.gz

Download URL adaptive_shots-0.1.0.tar.gz
Size 22.9 kB
Tags Source
SHA-256 checksum
How to use checksums
fe9330471c2902ec1990a5ed7d91aa7ed1afe910cef1aca1198d65aefd26cf07
BLAKE2b-256 checksum
How to use checksums
148d9d6616f65c7ebc07a84b26f6056f40a5c984ffb29cf2d22d0f9f475bc925
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.0.1 CPython/3.12.6

Release files / adaptive_shots-0.1.0-py3-none-any.whl

Download URL adaptive_shots-0.1.0-py3-none-any.whl
Size 23.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1ff3fca4f1040230c9518bde9b5e63201f295d02b8b3f2dec59db75283c21ba7
BLAKE2b-256 checksum
How to use checksums
812c770b4fb263186e974045141c51ef91eaf543cc997e8be0e29fc199311a34
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.0.1 CPython/3.12.6

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page