diff --git a/react/react1.py b/react/react1.py new file mode 100644 index 0000000..cbd0943 --- /dev/null +++ b/react/react1.py @@ -0,0 +1,107 @@ +# This code is Apache 2 licensed: +# https://www.apache.org/licenses/LICENSE-2.0 + +from dotenv import load_dotenv +load_dotenv() + +from openai import OpenAI +import re +import httpx + +class ChatBot: + def __init__(self, system=""): + self.client = OpenAI() + self.system = system + self.messages = [] + if self.system: + self.messages.append({"role": "system", "content": system}) + + def __call__(self, message): + self.messages.append({"role": "user", "content": message}) + result = self.execute() + self.messages.append({"role": "assistant", "content": result}) + return result + + def execute(self): + completion = self.client.chat.completions.create(model="gpt-3.5-turbo", messages=self.messages) + # Uncomment this to print out token usage each time, e.g. + # {"completion_tokens": 86, "prompt_tokens": 26, "total_tokens": 112} + # print(completion.usage) + return completion.choices[0].message.content + +prompt = """ +You run in a loop of Thought, Action, PAUSE, Observation. +At the end of the loop you output an Answer +Use Thought to describe your thoughts about the question you have been asked. +Use Action to run one of the actions available to you - then return PAUSE. +Observation will be the result of running those actions. + +Your available actions are: + +calculate: +e.g. calculate: 4 * 7 / 3 +Runs a calculation and returns the number - uses Python so be sure to use floating point syntax if necessary + +wikipedia: +e.g. wikipedia: LLM +Returns a summary from searching Wikipedia + +Example session: + +Question: What is the capital of Hebei? +Thought: I should look up Hebei on Wikipedia +Action: wikipedia: Hebei +PAUSE + +You will be called again with this: + +Observation: Hebei is a province in China. The capital is Shijiazhuang. + +You then output: + +Answer: The capital of Hebei is Shijiazhuang +""".strip() + + +action_re = re.compile('^Action: (\w+): (.*)$') + +def query(question, max_turns=5): + i = 0 + bot = ChatBot(prompt) + next_prompt = question + while i < max_turns: + i += 1 + result = bot(next_prompt) + print(result) + actions = [action_re.match(a) for a in result.split('\n') if action_re.match(a)] + if actions: + # There is an action to run + action, action_input = actions[0].groups() + if action not in known_actions: + raise Exception("Unknown action: {}: {}".format(action, action_input)) + print(" -- running {} {}".format(action, action_input)) + observation = known_actions[action](action_input) + print("Observation:", observation) + next_prompt = "Observation: {}".format(observation) + else: + return + + +def wikipedia(q): + return httpx.get("https://en.wikipedia.org/w/api.php", params={ + "action": "query", + "list": "search", + "srsearch": q, + "format": "json" + }).json()["query"]["search"][0]["snippet"] + + +def calculate(what): + return eval(what) + +known_actions = { + "wikipedia": wikipedia, + "calculate": calculate, +} + +query("What is the captical of Hebei") \ No newline at end of file