In Teil 1 Von dieser Tutorial -Serie haben wir vorgestellt KI -Agentenautonome Programme, die Aufgaben ausführen, Entscheidungen treffen und mit anderen kommunizieren.
Agenten führen Aktionen durch Instruments aus. Es kann passieren, dass ein Device beim ersten Versuch nicht funktioniert oder dass mehrere Instruments nacheinander aktiviert werden müssen. Agenten sollten in der Lage sein, Aufgaben in einen logischen Fortschritt zu organisieren und ihre Strategien in einer dynamischen Umgebung zu ändern.
Einfach gesagt, die Struktur des Agenten muss solide sein und das Verhalten muss zuverlässig sein. Der häufigste Weg, dies zu tun, ist durch:
- Iterationen – Wiederholung einer bestimmten Aktion mehrmals, oft mit geringfügigen Änderungen oder Verbesserungen in jedem Zyklus. Jedes Mal kann der Agent bestimmte Schritte übernehmen, um seine Ausgabe zu verfeinern oder eine optimale Lösung zu erreichen.
- Ketten – – Eine Reihe von Aktionen, die in einer Sequenz miteinander verbunden sind. Jeder Schritt in der Kette hängt von der vorherigen ab, und die Ausgabe einer Aktion wird zum Eingang für die nächste.
In diesem Tutorial werde ich zeigen, wie man benutzt Iterationen und Ketten für Agenten. Ich werde einen nützlichen Python -Code präsentieren, der in ähnlichen Fällen leicht angewendet werden kann (einfach kopieren, einfügen, einfügen) und jede Codezeile mit Kommentaren durchgehen, damit Sie dieses Beispiel replizieren können (Hyperlink zum vollständigen Code am Ende des Artikels).
Aufstellen
Bitte beziehen Sie sich auf Teil 1 für die Einrichtung von Ollama und die Haupt -LLM.
import Ollama
llm = "qwen2.5"
Wir werden die verwenden Yahoofinance Öffentliche APIs mit dem Python Bibliothek (pip set up yfinance==0.2.55
) Finanzdaten herunterladen.
import yfinance as yf
inventory = "MSFT"
yf.Ticker(ticker=inventory).historical past(interval='5d') #1d,5d,1mo,3mo,6mo,1y,2y,5y,10y,ytd,max
Lassen Sie uns das in ein Werkzeug einbetten.
import matplotlib.pyplot as plt
def get_stock(ticker:str, interval:str, col:str):
information = yf.Ticker(ticker=ticker).historical past(interval=interval)
if len(information) > 0:
information(col).plot(shade="black", legend=True, xlabel='', title=f"{ticker.higher()} ({interval})").grid()
plt.present()
return 'okay'
else:
return 'no'
tool_get_stock = {'sort':'perform', 'perform':{
'identify': 'get_stock',
'description': 'Obtain inventory information',
'parameters': {'sort': 'object',
'required': ('ticker','interval','col'),
'properties': {
'ticker': {'sort':'str', 'description':'the ticker image of the inventory.'},
'interval': {'sort':'str', 'description':"for 1 month enter '1mo', for six months enter '6mo', for 1 yr enter '1y'. Use '1y' if not specified."},
'col': {'sort':'str', 'description':"one in every of 'Open','Excessive','Low','Shut','Quantity'. Use 'Shut' if not specified."},
}}}}
## take a look at
get_stock(ticker="msft", interval="1y", col="Shut")
Wenn ich den Code aus dem vorherigen Artikel als Referenz nehme, werde ich eine allgemeine Funktion schreiben, um die Modellantwort zu verarbeiten, z. B. wenn der Agent ein Device verwenden möchte oder wenn er nur Textual content zurückgibt.
def use_tool(agent_res:dict, dic_tools:dict) -> dict:
## use device
if "tool_calls" in agent_res("message").keys():
for device in agent_res("message")("tool_calls"):
t_name, t_inputs = device("perform")("identify"), device("perform")("arguments")
if f := dic_tools.get(t_name):
### calling device
print('🔧 >', f"x1b(1;31m{t_name} -> Inputs: {t_inputs}x1b(0m")
### device output
t_output = f(**device("perform")("arguments"))
print(t_output)
### last res
res = t_output
else:
print('🤬 >', f"x1b(1;31m{t_name} -> NotFoundx1b(0m")
## do not use device
if agent_res('message')('content material') != '':
res = agent_res("message")("content material")
t_name, t_inputs = '', ''
return {'res':res, 'tool_used':t_name, 'inputs_used':t_inputs}
Beginnen wir ein kurzes Gespräch mit unserem Agenten. Im Second werde ich eine einfache generische Eingabeaufforderung verwenden.
immediate = '''You're a monetary analyst, help the person utilizing your out there instruments.'''
messages = ({"function":"system", "content material":immediate})
dic_tools = {'get_stock':get_stock}
whereas True:
## person enter
strive:
q = enter('🙂 >')
besides EOFError:
break
if q == "stop":
break
if q.strip() == "":
proceed
messages.append( {"function":"person", "content material":q} )
## mannequin
agent_res = ollama.chat(mannequin=llm, messages=messages,
instruments=(tool_get_stock))
dic_res = use_tool(agent_res, dic_tools)
res, tool_used, inputs_used = dic_res("res"), dic_res("tool_used"), dic_res("inputs_used")
## last response
print("👽 >", f"x1b(1;30m{res}x1b(0m")
messages.append( {"function":"assistant", "content material":res} )
Wie Sie sehen können, stellte ich zunächst eine „einfache“ Frage. Das LLM weiß bereits, dass das Image für Microsoft -Aktien MSFT ist. Daher konnte der Agent das Device mit den richtigen Eingängen aktivieren. Aber was ist, wenn ich etwas frage, das möglicherweise nicht in die LLM -Wissensbasis aufgenommen wird?
Es scheint, dass der LLM nicht weiß, dass Fb seinen Namen in Meta geändert hat, sodass das Device mit den falschen Eingaben verwendet wurde. Ich werde es dem Agenten ermöglichen, eine Aktion mehrmals durch Iterationen auszuprobieren.
Iterationen
Iterationen beziehen sich auf die Wiederholung eines Prozesses, bis eine bestimmte Bedingung erfüllt ist. Wir können den Agenten eine bestimmte Anzahl von Male ausprobieren lassen, aber wir müssen es wissen lassen, dass die vorherigen Parameter nicht funktionieren, indem wir die Particulars im Nachrichtenverlauf hinzufügen.
max_i, i = 3, 0
whereas res == 'no' and that i < max_i:
remark = f'''I used device '{tool_used}' with inputs {inputs_used}. But it surely did not work, so I have to strive once more with totally different inputs'''
messages.append( {"function":"assistant", "content material":remark} )
agent_res = ollama.chat(mannequin=llm, messages=messages,
instruments=(tool_get_stock))
dic_res = use_tool(agent_res, dic_tools)
res, tool_used, inputs_used = dic_res("res"), dic_res("tool_used"), dic_res("inputs_used")
i += 1
if i == max_i:
res = f'I attempted {i} instances however one thing is improper'
## last response
print("👽 >", f"x1b(1;30m{res}x1b(0m")
messages.append( {"function":"assistant", "content material":res} )
Der Agent versuchte es dreimal mit unterschiedlichen Eingaben, aber es konnte keine Lösung finden, da die LLM -Wissensbasis eine Lücke gibt. In diesem Fall benötigte das Modell menschliche Eingaben, um zu verstehen, wie das Device verwendet wird.
Als nächstes können wir den Agenten ermöglichen, die Wissenslücke für sich selbst zu schließen.
Ketten
Eine Kette bezieht sich auf eine lineare Folge von Aktionen, bei denen der Ausgang von einem Schritt als Eingang für den nächsten Schritt verwendet wird. In diesem Beispiel werde ich ein weiteres Device hinzufügen, das der Agent verwenden kann, falls der erste fehlschlägt.
Wir können das Net-Such-Device aus dem vorherigen Artikel verwenden.
from langchain_community.instruments import DuckDuckGoSearchResults
def search_web(question:str) -> str:
return DuckDuckGoSearchResults(backend="information").run(question)
tool_search_web = {'sort':'perform', 'perform':{
'identify': 'search_web',
'description': 'Search the net',
'parameters': {'sort': 'object',
'required': ('question'),
'properties': {
'question': {'sort':'str', 'description':'the subject or topic to go looking on the internet'},
}}}}
## take a look at
search_web(question="fb inventory")
Bisher habe ich immer sehr generische Eingabeaufforderungen verwendet, da die Aufgaben relativ einfach waren. Jetzt möchte ich sicherstellen, dass der Agent versteht richtige Eingabeaufforderung. So sollte eine Eingabeaufforderung getan werden:
- Das Ziel des Agenten
- Was es zurückgeben muss (dh Format, Inhalt)
- Relevante Warnungen, die die Ausgabe beeinflussen könnten
- Kontext -Dump
immediate = '''
(GOAL) You're a monetary analyst, help the person utilizing your out there instruments.
(RETURN) You need to return the inventory information that the person asks for.
(WARNINGS) In an effort to retrieve inventory information, it is advisable to know the ticker image of the corporate.
(CONTEXT) First ALWAYS attempt to use the device 'get_stock'.
If it does not work, you need to use the device 'search_web' and search 'firm identify inventory'.
Get details about the inventory and deduct what's the proper ticker image of the corporate.
Then, you need to use AGAIN the device 'get_stock' with the ticker you bought utilizing the earlier device.
'''
Wir können die Kette einfach zur Iterationsschleife hinzufügen, die wir bereits haben. Diesmal hat der Agent zwei Instruments, und wenn das erste fehlschlägt, kann das Modell entscheiden, ob sie wiederholen oder die zweite verwenden sollen. Dann, wenn das zweite Werkzeug verwendet wird, Der Agent muss die Ausgabe verarbeiten und lernen Was ist die richtige Eingabe für das erste Device, das zunächst fehlgeschlagen ist?
max_i, i = 3, 0
whereas res in ('no','') and that i < max_i:
remark = f'''I used device '{tool_used}' with inputs {inputs_used}. But it surely did not work, so I have to strive a distinct manner.'''
messages.append( {"function":"assistant", "content material":remark} )
agent_res = ollama.chat(mannequin=llm, messages=messages,
instruments=(tool_get_stock, tool_search_web))
dic_res = use_tool(agent_res, dic_tools)
res, tool_used, inputs_used = dic_res("res"), dic_res("tool_used"), dic_res("inputs_used")
## chain: output of earlier device = enter of subsequent device
if tool_used == 'search_web':
question = q+". You need to return simply the compay ticker.nContext: "+res
llm_res = ollama.generate(mannequin=llm, immediate=question)("response")
messages.append( {"function":"person", "content material":f"strive ticker: {llm_res}"} )
print("👽 >", f"x1b(1;30mI can strive with {llm_res}x1b(0m")
agent_res = ollama.chat(mannequin=llm, messages=messages, instruments=(tool_get_stock))
dic_res = use_tool(agent_res, dic_tools)
res, tool_used, inputs_used = dic_res("res"), dic_res("tool_used"), dic_res("inputs_used")
i += 1 if i == max_i: res = f'I attempted {i} instances however one thing is improper'
## last response
print("👽 >", f"x1b(1;30m{res}x1b(0m")
messages.append( {"function":"assistant", "content material":res} )
Wie erwartet versuchte der Agent, das erste Device mit den falschen Eingaben zu verwenden, aber anstatt dieselbe Aktion wie zuvor erneut auszuprobieren, entschied er sich für das zweite Device. Durch den Verzehr von Informationen sollte die Lösung ohne die Notwendigkeit menschlicher Eingaben verstehen.
Zusammenfassend versuchte die KI, eine Aktion auszuführen, scheiterte jedoch aufgrund einer Lücke in ihrer Wissensbasis. So aktivierte es Instruments, um diese Lücke zu füllen und die vom Benutzer angeforderte Ausgabe zu liefern. Das ist in der Tat die wahre Essenz von AI -Agenten.
Abschluss
In diesem Artikel wurden strukturiertere Möglichkeiten behandelt, um Agenten zuverlässiger zu machen, indem Iterationen und Ketten verwendet werden. Mit diesen Bausteinen sind Sie bereits ausgestattet, um Ihre eigenen Agenten für verschiedene Anwendungsfälle zu entwickeln.
Bleib dran für Teil 3wo wir tiefer in fortgeschrittenere Beispiele eintauchen.
Voller Code für diesen Artikel: Github
Ich hoffe es hat dir gefallen! Wenden Sie sich an mich, um mich für Fragen und Suggestions zu kontaktieren oder einfach Ihre interessanten Projekte zu teilen.
👉 Lassen Sie uns eine Verbindung herstellen 👈