Skip to content

Commit

Permalink
react (#202)
Browse files Browse the repository at this point in the history
  • Loading branch information
gyliu513 authored Sep 11, 2024
1 parent 6c38f2c commit ae71164
Showing 1 changed file with 107 additions and 0 deletions.
107 changes: 107 additions & 0 deletions react/react1.py
Original file line number Diff line number Diff line change
@@ -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")

0 comments on commit ae71164

Please sign in to comment.