# Prompt from ... # from dataclasses import dataclass from jinja2 import Template from parsita import * self_ask_prompt = """ Question: Who lived longer, Muhammad Ali or Alan Turing? Are follow up questions needed here: Yes. Follow up: How old was Muhammad Ali when he died? Intermediate answer: Muhammad Ali was 74 years old when he died. Follow up: How old was Alan Turing when he died? Intermediate answer: Alan Turing was 41 years old when he died. So the final answer is: Muhammad Ali Question: When was the founder of craigslist born? Are follow up questions needed here: Yes. Follow up: Who was the founder of craigslist? Intermediate answer: Craigslist was founded by Craig Newmark. Follow up: When was Craig Newmark born? Intermediate answer: Craig Newmark was born on December 6, 1952. So the final answer is: December 6, 1952 Question: Who was the maternal grandfather of George Washington? Are follow up questions needed here: Yes. Follow up: Who was the mother of George Washington? Intermediate answer: The mother of George Washington was Mary Ball Washington. Follow up: Who was the father of Mary Ball Washington? Intermediate answer: The father of Mary Ball Washington was Joseph Ball. So the final answer is: Joseph Ball Question: Are both the directors of Jaws and Casino Royale from the same country? Are follow up questions needed here: Yes. Follow up: Who is the director of Jaws? Intermediate answer: The director of Jaws is Steven Spielberg. Follow up: Where is Steven Spielberg from? Intermediate answer: The United States. Follow up: Who is the director of Casino Royale? Intermediate answer: The director of Casino Royale is Martin Campbell. Follow up: Where is Martin Campbell from? Intermediate answer: New Zealand. So the final answer is: No Question: {{input}} Are followup questions needed here: {% if agent_scratchpad %}Yes{%else%}No{% endif %}. """ @dataclass class Intermediate: val: str @dataclass class Final: val: str class SelfAskParser(TextParsers): follow = (lit("Follow up:") >> reg(r".*")) > Intermediate finish = (lit("So the final answer is: ") >> reg(r".*")) > Final response = follow | finish self_ask = Prompt( Template(self_ask_prompt).render, parse(SelfAskParser.response), stop="\nIntermediate answer:", ) def selfask(inp: str, openai: Backend, google: Backend): echo, result = self_ask.echo_run(openai, input=inp, agent_scratchpad=True) for i in range(3): out = Prompt(result.val).run(google) echo = echo + "\nIntermediate answer:" + out echo, result = Prompt( echo, parse(SelfAskParser.response), stop="\nIntermediate answer:" ).echo_run(openai) if isinstance(result, Final): break return result.val if __name__ == "__main__": print( selfask( "What is the zip code of the city where George Washington was born?", OpenAI("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"), Google("593a073fa4c730efe918e592a538b36e80841bc8f8dd4070c1566920f75ba140"), ) )