Spaces:
Runtime error
Runtime error
# Getting Started | |
In this tutorial, we will learn about: | |
- what a prompt template is, and why it is needed, | |
- how to create a prompt template, | |
- how to pass few shot examples to a prompt template, | |
- how to select examples for a prompt template. | |
## What is a prompt template? | |
A prompt template refers to a reproducible way to generate a prompt. It contains a text string ("the template"), that can can take in a set of parameters from the end user and generate a prompt. | |
The prompt template may contain: | |
- instructions to the language model, | |
- a set of few shot examples to help the language model generate a better response, | |
- a question to the language model. | |
The following code snippet contains an example of a prompt template: | |
```python | |
from langchain import PromptTemplate | |
template = """ | |
I want you to act as a naming consultant for new companies. | |
Here are some examples of good company names: | |
- search engine, Google | |
- social media, Facebook | |
- video sharing, YouTube | |
The name should be short, catchy and easy to remember. | |
What is a good name for a company that makes {product}? | |
""" | |
prompt = PromptTemplate( | |
input_variables=["product"], | |
template=template, | |
) | |
``` | |
## Create a prompt template | |
You can create simple hardcoded prompts using the `PromptTemplate` class. Prompt templates can take any number of input variables, and can be formatted to generate a prompt. | |
```python | |
from langchain import PromptTemplate | |
# An example prompt with no input variables | |
no_input_prompt = PromptTemplate(input_variables=[], template="Tell me a joke.") | |
no_input_prompt.format() | |
# -> "Tell me a joke." | |
# An example prompt with one input variable | |
one_input_prompt = PromptTemplate(input_variables=["adjective"], template="Tell me a {adjective} joke.") | |
one_input_prompt.format(adjective="funny") | |
# -> "Tell me a funny joke." | |
# An example prompt with multiple input variables | |
multiple_input_prompt = PromptTemplate( | |
input_variables=["adjective", "content"], | |
template="Tell me a {adjective} joke about {content}." | |
) | |
multiple_input_prompt.format(adjective="funny", content="chickens") | |
# -> "Tell me a funny joke about chickens." | |
``` | |
You can create custom prompt templates that format the prompt in any way you want. For more information, see [Custom Prompt Templates](examples/custom_prompt_template.ipynb). | |
<!-- TODO(shreya): Add link to Jinja --> | |
:::{note} | |
Currently, the template should be formatted as a Python f-string. We also support Jinja2 templates (see [Using Jinja templates](examples/custom_prompt_template.ipynb)). In the future, we will support more templating languages such as Mako. | |
::: | |
## Load a prompt template from LangChainHub | |
LangChainHub contains a collection of prompts which can be loaded directly via LangChain. | |
```python | |
from langchain.prompts import load_prompt | |
prompt = load_prompt("lc://prompts/conversation/prompt.json") | |
prompt.format(history="", input="What is 1 + 1?") | |
``` | |
You can read more about LangChainHub and the prompts available with it [here](https://github.com/hwchase17/langchain-hub). | |
## Pass few shot examples to a prompt template | |
Few shot examples are a set of examples that can be used to help the language model generate a better response. | |
To generate a prompt with few shot examples, you can use the `FewShotPromptTemplate`. This class takes in a `PromptTemplate` and a list of few shot examples. It then formats the prompt template with the few shot examples. | |
In this example, we'll create a prompt to generate word antonyms. | |
```python | |
from langchain import PromptTemplate, FewShotPromptTemplate | |
# First, create the list of few shot examples. | |
examples = [ | |
{"word": "happy", "antonym": "sad"}, | |
{"word": "tall", "antonym": "short"}, | |
] | |
# Next, we specify the template to format the examples we have provided. | |
# We use the `PromptTemplate` class for this. | |
example_formatter_template = """ | |
Word: {word} | |
Antonym: {antonym}\n | |
""" | |
example_prompt = PromptTemplate( | |
input_variables=["word", "antonym"], | |
template=example_formatter_template, | |
) | |
# Finally, we create the `FewShotPromptTemplate` object. | |
few_shot_prompt = FewShotPromptTemplate( | |
# These are the examples we want to insert into the prompt. | |
examples=examples, | |
# This is how we want to format the examples when we insert them into the prompt. | |
example_prompt=example_prompt, | |
# The prefix is some text that goes before the examples in the prompt. | |
# Usually, this consists of intructions. | |
prefix="Give the antonym of every input", | |
# The suffix is some text that goes after the examples in the prompt. | |
# Usually, this is where the user input will go | |
suffix="Word: {input}\nAntonym:", | |
# The input variables are the variables that the overall prompt expects. | |
input_variables=["input"], | |
# The example_separator is the string we will use to join the prefix, examples, and suffix together with. | |
example_separator="\n\n", | |
) | |
# We can now generate a prompt using the `format` method. | |
print(few_shot_prompt.format(input="big")) | |
# -> Give the antonym of every input | |
# -> | |
# -> Word: happy | |
# -> Antonym: sad | |
# -> | |
# -> Word: tall | |
# -> Antonym: short | |
# -> | |
# -> Word: big | |
# -> Antonym: | |
``` | |
## Select examples for a prompt template | |
If you have a large number of examples, you can use the `ExampleSelector` to select a subset of examples that will be most informative for the Language Model. This will help you generate a prompt that is more likely to generate a good response. | |
Below, we'll use the `LengthBasedExampleSelector`, which selects examples based on the length of the input. This is useful when you are worried about constructing a prompt that will go over the length of the context window. For longer inputs, it will select fewer examples to include, while for shorter inputs it will select more. | |
We'll continue with the example from the previous section, but this time we'll use the `LengthBasedExampleSelector` to select the examples. | |
```python | |
from langchain.prompts.example_selector import LengthBasedExampleSelector | |
# These are a lot of examples of a pretend task of creating antonyms. | |
examples = [ | |
{"word": "happy", "antonym": "sad"}, | |
{"word": "tall", "antonym": "short"}, | |
{"word": "energetic", "antonym": "lethargic"}, | |
{"word": "sunny", "antonym": "gloomy"}, | |
{"word": "windy", "antonym": "calm"}, | |
] | |
# We'll use the `LengthBasedExampleSelector` to select the examples. | |
example_selector = LengthBasedExampleSelector( | |
# These are the examples is has available to choose from. | |
examples=examples, | |
# This is the PromptTemplate being used to format the examples. | |
example_prompt=example_prompt, | |
# This is the maximum length that the formatted examples should be. | |
# Length is measured by the get_text_length function below. | |
max_length=25, | |
) | |
# We can now use the `example_selector` to create a `FewShotPromptTemplate`. | |
dynamic_prompt = FewShotPromptTemplate( | |
# We provide an ExampleSelector instead of examples. | |
example_selector=example_selector, | |
example_prompt=example_prompt, | |
prefix="Give the antonym of every input", | |
suffix="Word: {input}\nAntonym:", | |
input_variables=["input"], | |
example_separator="\n\n", | |
) | |
# We can now generate a prompt using the `format` method. | |
print(dynamic_prompt.format(input="big")) | |
# -> Give the antonym of every input | |
# -> | |
# -> Word: happy | |
# -> Antonym: sad | |
# -> | |
# -> Word: tall | |
# -> Antonym: short | |
# -> | |
# -> Word: energetic | |
# -> Antonym: lethargic | |
# -> | |
# -> Word: sunny | |
# -> Antonym: gloomy | |
# -> | |
# -> Word: windy | |
# -> Antonym: calm | |
# -> | |
# -> Word: big | |
# -> Antonym: | |
``` | |
In contrast, if we provide a very long input, the `LengthBasedExampleSelector` will select fewer examples to include in the prompt. | |
```python | |
long_string = "big and huge and massive and large and gigantic and tall and much much much much much bigger than everything else" | |
print(dynamic_prompt.format(input=long_string)) | |
# -> Give the antonym of every input | |
# -> Word: happy | |
# -> Antonym: sad | |
# -> | |
# -> Word: big and huge and massive and large and gigantic and tall and much much much much much bigger than everything else | |
# -> Antonym: | |
``` | |
<!-- TODO(shreya): Add correct link here. --> | |
LangChain comes with a few example selectors that you can use. For more details on how to use them, see [Example Selectors](./examples/example_selectors.ipynb). | |
You can create custom example selectors that select examples based on any criteria you want. For more details on how to do this, see [Creating a custom example selector](examples/custom_example_selector.ipynb). | |