From 0c6fbe80b0f14cea5ff5963a8bbf89ec7db22138 Mon Sep 17 00:00:00 2001 From: Kye Date: Sat, 7 Oct 2023 00:12:27 -0400 Subject: [PATCH] basic example of meta prompter Former-commit-id: e2d6a4240225f7227aac0dea0414d826817d3f70 --- swarms/agents/meta_prompter.py | 143 +++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 swarms/agents/meta_prompter.py diff --git a/swarms/agents/meta_prompter.py b/swarms/agents/meta_prompter.py new file mode 100644 index 00000000..1a03f628 --- /dev/null +++ b/swarms/agents/meta_prompter.py @@ -0,0 +1,143 @@ +from langchain.chains import LLMChain +from langchain.prompts import PromptTemplate +from langchain.memory import ConversationBufferWindowMemory + +class MetaPrompterAgent: + """ + Meta Prompting Agent + The Meta Prompting Agent has 1 purpose: to create better prompts for an agent. + + The meta prompting agent would be used in this flow: + user task -> MetaPrompterAgent -> Agent + + Args: + llm (BaseLanguageModel): Language Model + max_iters (int, optional): Maximum number of iterations. Defaults to 3. + max_meta_iters (int, optional): Maximum number of meta iterations. Defaults to 5. + failed_phrase (str, optional): Phrase to indicate failure. Defaults to "task failed". + success_phrase (str, optional): Phrase to indicate success. Defaults to "task succeeded". + instructions (str, optional): Instructions to be used in the meta prompt. Defaults to "None". + template (str, optional): Template to be used in the meta prompt. Defaults to None. + memory (ConversationBufferWindowMemory, optional): Memory to be used in the meta prompt. Defaults to None. + meta_template (str, optional): Template to be used in the meta prompt. Defaults to None. + human_input (bool, optional): Whether to use human input. Defaults to False. + + Returns: + str: Response from the agent + + Usage: + -------------- + agent = MetaPrompterAgent(llm=OpenAI, instructions="Please tell me the weather in New York") + agent.run("What is the weather in New York?") + """ + def __init__( + self, + llm, + max_iters: int = 3, + max_meta_iters: int = 5, + failed_phrase: str = "task failed", + success_phrase: str = "task succeeded", + instructions: str = "None", + template: str = None, + memory = None, + meta_template: str = None, + human_input: bool = False, + ): + self.llm = llm + self.max_iters = max_iters + self.max_meta_iters = max_meta_iters + self.failed_phrase = failed_phrase + self.success_phrase = success_phrase + self.instructions = instructions + self.template = template + self.memory = memory + self.meta_template = meta_template + self.human_input = human_input + + if memory is None: + memory = ConversationBufferWindowMemory() + memory.ai_prefix = "Assistant:" + + self.template = f""" + Instructions: {self.instructions} + {{{memory.memory_key}}} + Human: {{human_input}} + Assistant: + """ + + prompt = PromptTemplate( + input_variables=["history", "human_input"], template=template + ) + + self.chain = LLMChain( + llm=self.llm(), + prompt=prompt, + verbose=True, + memory=ConversationBufferWindowMemory(), + ) + + def get_chat_history(self, chain_memory): + """Get Chat History from the memory""" + memory_key = chain_memory.memory_key + chat_history = chain_memory.load_memory_variables(memory_key)[memory_key] + return chat_history + + def get_new_instructions(self, meta_output): + """Get New Instructions from the meta_output""" + delimiter = "Instructions: " + new_instructions = meta_output[meta_output.find(delimiter) + len(delimiter):] + return new_instructions + + def run(self, task: str): + """ + Run the MetaPrompterAgent + + Args: + task (str): The task to be completed + + Returns: + str: The response from the agent + """ + key_phrases = [ + self.success_phrase, + self.failed_phrase + ] + + for i in range(self.max_meta_iters): + print(f"[Epsisode: {i+1}/{self.max_meta_iters}]") + + chain = self.chain( + memory=None + ) + + output = chain.predict(human_input=task) + + for j in range(self.max_iters): + print(f"(Step {j+1}/{self.max_iters})") + print(f"Assistant: {output}") + print(f"Human: ") + + + + if self.human_input: + human_input = input() + + if any( + phrase in human_input.lower() for phrase in key_phrases + ): + break + + output = chain.predict(human_input.lower) + + if self.success_phrase in human_input.lower(): + print(f"You succeed! Thanks for using!") + return + + meta_chain = self.initialize_meta_chain() + meta_output = meta_chain.predict(chat_history=self.get_chat_history(chain.memory)) + print(f"Feedback: {meta_output}") + self.instructions = self.get_new_instructions(meta_output) + print(f"New Instruction: {self.instructions}") + print("\n" + "#" * 80 + "\n") + +