An agent will be built using ReAct (Reasoning + Action) prompt engineering technique with the help of 53.42 LangGraph.
A basic AI Agent
An agent class is defined below:
class Agent:
def __init__(self, system=""):
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 = client.chat.completions.create(
model="gpt-4o",
temperature=0,
messages=self.messages)
return completion.choices[0].message.content
Prompt
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: Django
Returns a summary from searching Wikipedia
simon_blog_search:
e.g. simon_blog_search: Django
Search Simon's blog for that term
Always look things up on Wikipedia if you have the opportunity to do so.
Example session:
Question: What is the capital of France?
Thought: I should look up France on Wikipedia
Action: wikipedia: France
PAUSE
You will be called again with this:
Observation: France is a country. The capital is Paris.
You then output:
Answer: The capital of France is Paris
""".strip()
Tools mentioned in the above prompt:
def calculate(what):
return eval(what)
def average_dog_weight(name):
if name in "Scottish Terrier":
return("Scottish Terriers average 20 lbs")
elif name in "Border Collie":
return("a Border Collies average weight is 37 lbs")
elif name in "Toy Poodle":
return("a toy poodles average weight is 7 lbs")
else:
return("An average dog weights 50 lbs")
known_actions = {
"calculate": calculate,
"average_dog_weight": average_dog_weight
}
Execution
abot = Agent(prompt)
result = abot("How much does a toy poodle weigh?")
print(result)
# Thought: I should look up the average weight of a toy poodle using the average_dog_weight action.
# Action: average_dog_weight: Toy Poodle
# PAUSE
result = average_dog_weight("Toy Poodle")
next_prompt = "Observation: {}".format(result)
print(next_prompt)
Automate the process
action_re = re.compile('^Action: (\w+): (.*)
Thought: I need to find the average weight of both a Border Collie and a Scottish Terrier, then add them together to get the combined weight.
Action: average_dog_weight: Border Collie
PAUSE
-- running average_dog_weight Border Collie
Observation: a Border Collies average weight is 37 lbs
Thought: Now I need to find the average weight of a Scottish Terrier.
Action: average_dog_weight: Scottish Terrier
PAUSE
-- running average_dog_weight Scottish Terrier
Observation: Scottish Terriers average 20 lbs
Thought: I now have the average weights of both dogs. I will add them together to find their combined weight.
Action: calculate: 37 + 20
PAUSE
-- running calculate 37 + 20
Observation: 57
Answer: The combined weight of a Border Collie and a Scottish Terrier is 57 lbs.
![](https://i.imgur.com/44xS51W.png)
*The overall flow of what we have done till now.*
---
## LangGraph components
![](https://i.imgur.com/qsNkK9i.png)
*components of LangGraph*
- Agent State is accessible to all parts of the graph.
- It is local to the graph.
- It can be stored in a persistence layer.
*Will be resumed when needed. I will follow just in time learning...*
## Source
- [DLAI - AI Agents in LangGraph](https://learn.deeplearning.ai/courses/ai-agents-in-langgraph/)
## Also Read
- [A simple Python implementation of the ReAct pattern for LLMs | Simon Willison’s TILs](https://til.simonwillison.net/llms/python-react-pattern)
- ) # python regular expression to selection action
def query(question, max_turns=5):
i = 0
bot = Agent(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
question = """I have 2 dogs, a border collie and a scottish terrier. \
What is their combined weight"""
query(question)
{{CODE_BLOCK_5}}
The overall flow of what we have done till now.
LangGraph components
components of LangGraph
- Agent State is accessible to all parts of the graph.
- It is local to the graph.
- It can be stored in a persistence layer.
Will be resumed when needed. I will follow just in time learning...