2022-11-20 04:32:45 +00:00
|
|
|
"""Test loading functionality."""
|
|
|
|
|
|
|
|
import os
|
|
|
|
from contextlib import contextmanager
|
|
|
|
from pathlib import Path
|
|
|
|
from typing import Iterator
|
|
|
|
|
|
|
|
from langchain.prompts.few_shot import FewShotPromptTemplate
|
|
|
|
from langchain.prompts.loading import load_prompt
|
|
|
|
from langchain.prompts.prompt import PromptTemplate
|
|
|
|
|
|
|
|
|
|
|
|
@contextmanager
|
|
|
|
def change_directory() -> Iterator:
|
|
|
|
"""Change the working directory to the right folder."""
|
|
|
|
origin = Path().absolute()
|
|
|
|
try:
|
Docs refactor (#480)
Big docs refactor! Motivation is to make it easier for people to find
resources they are looking for. To accomplish this, there are now three
main sections:
- Getting Started: steps for getting started, walking through most core
functionality
- Modules: these are different modules of functionality that langchain
provides. Each part here has a "getting started", "how to", "key
concepts" and "reference" section (except in a few select cases where it
didnt easily fit).
- Use Cases: this is to separate use cases (like summarization, question
answering, evaluation, etc) from the modules, and provide a different
entry point to the code base.
There is also a full reference section, as well as extra resources
(glossary, gallery, etc)
Co-authored-by: Shreya Rajpal <ShreyaR@users.noreply.github.com>
2023-01-02 16:24:09 +00:00
|
|
|
os.chdir("docs/modules/prompts/examples")
|
2022-11-20 04:32:45 +00:00
|
|
|
yield
|
|
|
|
finally:
|
|
|
|
os.chdir(origin)
|
|
|
|
|
|
|
|
|
|
|
|
def test_loading_from_YAML() -> None:
|
|
|
|
"""Test loading from yaml file."""
|
|
|
|
with change_directory():
|
|
|
|
prompt = load_prompt("simple_prompt.yaml")
|
|
|
|
expected_prompt = PromptTemplate(
|
|
|
|
input_variables=["adjective", "content"],
|
|
|
|
template="Tell me a {adjective} joke about {content}.",
|
|
|
|
)
|
|
|
|
assert prompt == expected_prompt
|
|
|
|
|
|
|
|
|
|
|
|
def test_loading_from_JSON() -> None:
|
|
|
|
"""Test loading from json file."""
|
|
|
|
with change_directory():
|
|
|
|
prompt = load_prompt("simple_prompt.json")
|
|
|
|
expected_prompt = PromptTemplate(
|
|
|
|
input_variables=["adjective", "content"],
|
|
|
|
template="Tell me a {adjective} joke about {content}.",
|
|
|
|
)
|
|
|
|
assert prompt == expected_prompt
|
|
|
|
|
|
|
|
|
2022-11-27 17:10:35 +00:00
|
|
|
def test_saving_loading_round_trip(tmp_path: Path) -> None:
|
|
|
|
"""Test equality when saving and loading a prompt."""
|
|
|
|
simple_prompt = PromptTemplate(
|
|
|
|
input_variables=["adjective", "content"],
|
|
|
|
template="Tell me a {adjective} joke about {content}.",
|
|
|
|
)
|
|
|
|
simple_prompt.save(file_path=tmp_path / "prompt.yaml")
|
|
|
|
loaded_prompt = load_prompt(tmp_path / "prompt.yaml")
|
|
|
|
assert loaded_prompt == simple_prompt
|
|
|
|
|
|
|
|
few_shot_prompt = FewShotPromptTemplate(
|
|
|
|
input_variables=["adjective"],
|
|
|
|
prefix="Write antonyms for the following words.",
|
|
|
|
example_prompt=PromptTemplate(
|
|
|
|
input_variables=["input", "output"],
|
|
|
|
template="Input: {input}\nOutput: {output}",
|
|
|
|
),
|
|
|
|
examples=[
|
|
|
|
{"input": "happy", "output": "sad"},
|
|
|
|
{"input": "tall", "output": "short"},
|
|
|
|
],
|
|
|
|
suffix="Input: {adjective}\nOutput:",
|
|
|
|
)
|
|
|
|
few_shot_prompt.save(file_path=tmp_path / "few_shot.yaml")
|
|
|
|
loaded_prompt = load_prompt(tmp_path / "few_shot.yaml")
|
|
|
|
assert loaded_prompt == few_shot_prompt
|
|
|
|
|
|
|
|
|
2022-11-20 04:32:45 +00:00
|
|
|
def test_loading_with_template_as_file() -> None:
|
|
|
|
"""Test loading when the template is a file."""
|
|
|
|
with change_directory():
|
|
|
|
prompt = load_prompt("simple_prompt_with_template_file.json")
|
|
|
|
expected_prompt = PromptTemplate(
|
|
|
|
input_variables=["adjective", "content"],
|
|
|
|
template="Tell me a {adjective} joke about {content}.",
|
|
|
|
)
|
|
|
|
assert prompt == expected_prompt
|
|
|
|
|
|
|
|
|
|
|
|
def test_loading_few_shot_prompt_from_yaml() -> None:
|
|
|
|
"""Test loading few shot prompt from yaml."""
|
|
|
|
with change_directory():
|
|
|
|
prompt = load_prompt("few_shot_prompt.yaml")
|
|
|
|
expected_prompt = FewShotPromptTemplate(
|
|
|
|
input_variables=["adjective"],
|
|
|
|
prefix="Write antonyms for the following words.",
|
|
|
|
example_prompt=PromptTemplate(
|
|
|
|
input_variables=["input", "output"],
|
|
|
|
template="Input: {input}\nOutput: {output}",
|
|
|
|
),
|
|
|
|
examples=[
|
|
|
|
{"input": "happy", "output": "sad"},
|
|
|
|
{"input": "tall", "output": "short"},
|
|
|
|
],
|
|
|
|
suffix="Input: {adjective}\nOutput:",
|
|
|
|
)
|
|
|
|
assert prompt == expected_prompt
|
|
|
|
|
|
|
|
|
|
|
|
def test_loading_few_shot_prompt_from_json() -> None:
|
|
|
|
"""Test loading few shot prompt from json."""
|
|
|
|
with change_directory():
|
|
|
|
prompt = load_prompt("few_shot_prompt.json")
|
|
|
|
expected_prompt = FewShotPromptTemplate(
|
|
|
|
input_variables=["adjective"],
|
|
|
|
prefix="Write antonyms for the following words.",
|
|
|
|
example_prompt=PromptTemplate(
|
|
|
|
input_variables=["input", "output"],
|
|
|
|
template="Input: {input}\nOutput: {output}",
|
|
|
|
),
|
|
|
|
examples=[
|
|
|
|
{"input": "happy", "output": "sad"},
|
|
|
|
{"input": "tall", "output": "short"},
|
|
|
|
],
|
|
|
|
suffix="Input: {adjective}\nOutput:",
|
|
|
|
)
|
|
|
|
assert prompt == expected_prompt
|
|
|
|
|
|
|
|
|
|
|
|
def test_loading_few_shot_prompt_when_examples_in_config() -> None:
|
|
|
|
"""Test loading few shot prompt when the examples are in the config."""
|
|
|
|
with change_directory():
|
|
|
|
prompt = load_prompt("few_shot_prompt_examples_in.json")
|
|
|
|
expected_prompt = FewShotPromptTemplate(
|
|
|
|
input_variables=["adjective"],
|
|
|
|
prefix="Write antonyms for the following words.",
|
|
|
|
example_prompt=PromptTemplate(
|
|
|
|
input_variables=["input", "output"],
|
|
|
|
template="Input: {input}\nOutput: {output}",
|
|
|
|
),
|
|
|
|
examples=[
|
|
|
|
{"input": "happy", "output": "sad"},
|
|
|
|
{"input": "tall", "output": "short"},
|
|
|
|
],
|
|
|
|
suffix="Input: {adjective}\nOutput:",
|
|
|
|
)
|
|
|
|
assert prompt == expected_prompt
|
|
|
|
|
|
|
|
|
|
|
|
def test_loading_few_shot_prompt_example_prompt() -> None:
|
|
|
|
"""Test loading few shot when the example prompt is in its own file."""
|
|
|
|
with change_directory():
|
|
|
|
prompt = load_prompt("few_shot_prompt_example_prompt.json")
|
|
|
|
expected_prompt = FewShotPromptTemplate(
|
|
|
|
input_variables=["adjective"],
|
|
|
|
prefix="Write antonyms for the following words.",
|
|
|
|
example_prompt=PromptTemplate(
|
|
|
|
input_variables=["input", "output"],
|
|
|
|
template="Input: {input}\nOutput: {output}",
|
|
|
|
),
|
|
|
|
examples=[
|
|
|
|
{"input": "happy", "output": "sad"},
|
|
|
|
{"input": "tall", "output": "short"},
|
|
|
|
],
|
|
|
|
suffix="Input: {adjective}\nOutput:",
|
|
|
|
)
|
|
|
|
assert prompt == expected_prompt
|