Рэакцыя з нуля: думка, дзеянне, пауза, абазаванне без кантрэлі.
Мініяцюрны цыкл ReAct, створаны ручная на Groq: думка, дзеянне, пауза, абазаванне, спачатку ручная обработка, а потым вызовы інструментаў з рэгулярнымі выразамі, таму фрэймворкі агентаў LLM стаюць зрозумелымі.
Крыніцы: The Origins of AI Agents -How ReAct Rewired the Way LLMs Think and Act
Вступ
Запытайце мадэль на простай мове пра цэну Nvidia у рэальны час і пра тое, скількі акцыяў можна купіць за 100 000 долераў. Без спецыяльных засобаў яна выдумвае застарэлыя даныя з матэрыялаў навчання, а потым правельна вырахоўвае рэзультаты на неправільных даных. У яе няма вбудованага механізму, які б значыў «Я не ведаю — трэба паглядзець», таму што пошук інформацыі не ўскладнюецца адзіным працэсам обработкі даных.
Калітэт адпаведзяў паднялася, і мадэлі паказаліся корыстнымі для адгукнення ў адзін момент. Толькі планаванне яшчэ не дае автонаміі. Запытанні, якія візначаюць агентаў, такія: што знаходзіцца за межамі ведомасці мадэлі, якія дзеяння ўможлівяюць ёй яго атрыманне, як практычна даць рэзультат, як перасмотраць план і калі зупыніцца. Працэс «Рашэнь → дзеянне → перакантроль → парадзейнаўкі» — гэта цыкл, а не праўая лінія. Гэты цыкл ёсць вучою савечных штучных інтэлектуальных агентаў. Мадэль ReAct (Рашэнь + Дзеянне) задала такі патэрн. Пачатковыя дамастанты не былі прыкладамі аплікацый LangChain — гэта быў LLM, структураваны запыт і чалавек (або пазней скрыпт), які выкананаў дзеянні і вернуў адзысканыя даныя.
Практычны прыклад ReAct: Рашэнь + Дзеянне
Прыклад з пашаго адгукнення:
from groq import Groq
import re
from dotenv import load_dotenv
_ = load_dotenv()
client = Groq()
message = client.chat.completions.create(
model="openai/gpt-oss-120b", # free, fast open-weight model hosted on Groq
max_tokens=1000,
messages=[
{"role": "user", "content": "Hello, GPT!"}
],
)
print(message.choices[0].message.content) # Check the client
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):
response = client.chat.completions.create(
model="openai/gpt-oss-120b",
max_tokens=1000,
messages=self.messages,
).choices[0].message.content
return response
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
fish_weight:
e.g. fish_weight: Shark
returns weight of a fish when given the breed
Example session:
Question: How much does a shark weigh?
Thought: I should look the fish weight using fish_weight
Action: fish_weight: Shark
PAUSE
You will be called again with this:
Observation: A Great white shark weights 41000 lbs
You then output:
Answer: A Great white shark weights 41000 lbs
""".strip()
def calculate(expression):
return eval(expression)
def fish_weight(name):
if "Shark" in name:
return("Great white shark weighs 41000 lbs")
elif "Puffer" in name:
return("A puffer fish weighs 20 lbs")
else:
return("A fish can weight upto 47000 lbs")
known_actions = {
"calculate": calculate,
"fish_weight": fish_weight
}
abot = Agent(prompt)
result = abot("How much does a Shark weigh?")
print(result)
result = fish_weight("Shark")
result
next_prompt = "Observation: {}".format(result)
abot(next_prompt)
abot.messages # View the list of messages containing the conversation
# Present a compund query
abot = Agent(prompt)
# New query
question = """I have 2 fishes, a Shark and a puffer fish. \
What is their combined weight"""
abot(question)
next_prompt = "Observation: {}".format(fish_weight("Shark"))
print(next_prompt)
abot(next_prompt)
next_prompt = "Observation: {}".format(fish_weight("Puffer fish"))
print(next_prompt)
abot(next_prompt)
next_prompt = "Observation: {}".format(eval("41000 + 20"))
print(next_prompt)
abot(next_prompt)
## Add loop (automate the reasoning + act process)
action_re = re.compile('^Action: (\w+): (.*)