File size: 4,411 Bytes
f596e58
 
 
 
 
cebc517
485a836
cebc517
485a836
 
 
 
cebc517
f596e58
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cebc517
 
 
c2392fe
 
 
 
cebc517
 
 
 
f596e58
7877562
 
cebc517
 
 
 
 
 
7877562
 
cebc517
485a836
 
 
 
 
cebc517
 
 
 
f596e58
 
cebc517
 
 
 
 
 
 
485a836
cebc517
 
 
c2392fe
 
 
485a836
cebc517
7877562
485a836
cebc517
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
from models import *
from langchain.prompts.few_shot import FewShotPromptTemplate
from langchain.prompts.prompt import PromptTemplate


def fetch_prompt(prompt_name):
    """Fetches a static prompt."""
    return prompts[prompt_name]
def format_prompt(prompt_name, **kwargs):
    """Fetches a template prompt and populates it."""
    return fetch_prompt(prompt_name).format(**kwargs)


class Task:
    def __init__(self, prompt: str, response_format: Type[BaseModel], few_shot_examples: List[dict] = None):
        self.prompt = prompt
        self.response_format = response_format
        self.few_shot_examples = few_shot_examples

    def full_prompt(self, **kwargs):
        prompt = self.prompt.format(**kwargs)

        format_instructions = self.get_format_instructions()
        if self.few_shot_examples:
            few_shot = self.get_few_shot()

    def get_format_instructions(self):
        schema = self.get_input_schema()
        format_instructions = FORMAT_INSTRUCTIONS.format(schema=schema)

        return format_instructions

    def get_input_schema(self):
        schema = self.response_format.model_json_schema()

        reduced_schema = schema
        if "title" in reduced_schema:
            del reduced_schema["title"]
        if "type" in reduced_schema:
            del reduced_schema["type"]

        schema_str = json.dumps(reduced_schema, indent=4)

        return schema_str

    def get_few_shot(self, max_examples=3):
        if len(self.few_shot_examples) <= max_examples:
            examples = self.few_shot_examples
        else:
            examples = random.sample(self.few_shot_examples, max_examples)

        few_shot = "\n\n".join([self.format_example(ex) for ex in examples])

        return few_shot

    def format_example(self, example):
        ex_prompt = self.prompt.format(**example['inputs'])
        ex_response = example['response']

        return f"Prompt: {ex_prompt}\nResponse: {ex_response}"



_game_rules = '''\
GAME RULES: You are playing a social deduction game where every player pretends the be the same animal. 
During the round players go around the room and make an "I"-statement as if they were the animal. 
All players know what animal they are pretending to be, except one who is known as the Chameleon. 
The Chameleon and must blend in by providing details about the animal using context from other players. 
The other players must be careful not to give away too much information with their responses so that Chameleon cannot guess the animal. 
After all players have spoken, they vote on who they think the Chameleon is. \
'''

_herd_animal = """\
You are a {animal}, keep this a secret at all costs. 
In as few words as possible describe of yourself starting with "I". Your description should be vague but true, \
since if the Chameleon can guess animal you are, you will LOSE. Do not repeat responses from other players.\
"""

_chameleon_animal = """\
You are the Chameleon, keep this a secret at all costs. 
You don't know what animal the other players are, your goal is to deduce it using the context they provide.
Starting with "I" describe yourself in 10 words or less as if you are the same animal as the other players. 
If no one else has said anything try to say something generic that could be true of any animals. 
If the other players realize you are the Chameleon you will LOSE.\
"""

_all_responses = """\
Below are the responses from all the other players. 
{player_responses}
"""

_chameleon_guess_decision = """\
You now have the opportunity to guess what animal the other players are pretending to be.
If you guess correctly you will WIN, if you guess incorrectly you will LOSE.
If you believe you know what animal the other players are pretending to be make choose to GUESS, otherwise choose to PASS.
Your response should be one of ("GUESS", "PASS")
Your Response: 
"""

_chameleon_guess_animal = """\
What animal do you think the other players are pretending to be?
"""

_vote_prompt = """\
Now it is time to vote. Choose from the players above who you think the Chameleon is.
"""

prompts = {
    "game_rules": _game_rules,
    "herd_animal":   _herd_animal,
    "chameleon_animal": _chameleon_animal,
    "chameleon_guess_decision": _all_responses + _chameleon_guess_decision,
    "chameleon_guess_animal": _chameleon_guess_animal,
    "response": "Your response:",
    "vote": _all_responses + _vote_prompt
}