Langroid ist ein intuitives, leichtes, erweiterbares und prinzipielles Python-Rahmen, um LLM-Anträge von CMU- und UW-Madison-Forschern leicht zu erstellen. Sie richten Agenten ein, rüsten Sie sie mit optionalen Komponenten (LLM, Vektorgeschäft und Tools/Funktionen) aus, weisen Sie ihnen Aufgaben zu und lösen Sie ein Problem, indem sie Nachrichten austauschen. Dieses Paradigma mit mehreren Agenten ist vom Schauspieler-Framework inspiriert (aber Sie müssen nichts darüber wissen!).
Langroid ist eine frische Sicht auf die LLM-App-Entwicklung, bei der beträchtliche Überlegungen in die Vereinfachung der Entwicklererfahrung eingeholt wurden. Es verwendet keine Langchain oder ein anderes LLM -Framework.
Lesen Sie den (WIP) Überblick über die Langroid -Architektur
? Unternehmen verwenden/adaptieren Langroid in der Produktion . Hier ist ein Zitat:
Nullify verwendet AI -Agenten für sichere Softwareentwicklung. Es findet, priorisiert und behebt Schwachstellen. Nach der Bewertung von Crewai, Autogen, Langchain, Langflow usw. haben wir den Multi-Agent-Orchestrierungsrahmen von Langroid intern angepasst. Die Agenten- und Aufgabenabstraktionen von Langroid sind intuitiv, gut durchdacht und bieten ein großartiges Entwicklererlebnis. Wir wollten den schnellsten Weg, um etwas in die Produktion zu bekommen. Bei anderen Frameworks hätte es uns Wochen gedauert, aber mit Langroid haben wir in Minuten gut zu guten Ergebnissen gekommen. Sehr empfohlen!
- Jacky Wong, Leiter der KI bei Nullify.
Sehen Sie sich dieses Intro zum Langroid -Blog -Beitrag des LancedB -Teams an
Gerade in ML für Healthcare (2024) veröffentlicht: Ein Lagentsystem auf Langroid-basiert
Wir begrüßen Beiträge: Sehen Sie sich die Beiträge dokument an, um zu ideen, was zu beitragen ist.
Bauen Sie LLM-Anwendungen auf oder möchten Hilfe bei Langroid für Ihr Unternehmen oder möchten Langroid-Funktionen für Ihre Unternehmensnutzungskasen priorisieren? Prasad Chalasani ist zur Beratung (Beratung/Entwicklung) erhältlich: pchalasani bei Google Mail dot com.
Das Sponsoring wird auch über Github -Sponsoren akzeptiert
Fragen, Feedback, Ideen? Begleiten Sie uns auf Zwietracht!
Dies ist nur ein Teaser; Es gibt noch viel mehr, wie Funktionen für Funktionen/Tools, Zusammenarbeit mit mehreren Agenten, strukturierte Informationsextraktion, Doktor (LAB), SQLChatent, nicht geöffnetes Lokal-/Remote-LLMs usw. Scrollen Sie nach unten oder sehen Sie Dokumente nach mehr. Siehe das Langroid Quick-Start Colab, das mit der OpenAI-ChatCompletion-API zu einem 2-Agent-Informationen-Extraktion-Beispiel aufbaut. Siehe auch diese Version, die stattdessen die OpenAI -Assistenten -API verwendet.
Ich habe gerade veröffentlicht! Beispielskript zeigt, wie Sie Langroid-Multi-Agents und Tools verwenden können, um strukturierte Informationen aus einem Dokument mit nur einer lokalen LLM (Mistral-7b-Instruct-V0.2) zu extrahieren.
import langroid as lr
import langroid . language_models as lm
# set up LLM
llm_cfg = lm . OpenAIGPTConfig ( # or OpenAIAssistant to use Assistant API
# any model served via an OpenAI-compatible API
chat_model = lm . OpenAIChatModel . GPT4o , # or, e.g., "ollama/mistral"
)
# use LLM directly
mdl = lm . OpenAIGPT ( llm_cfg )
response = mdl . chat ( "What is the capital of Ontario?" , max_tokens = 10 )
# use LLM in an Agent
agent_cfg = lr . ChatAgentConfig ( llm = llm_cfg )
agent = lr . ChatAgent ( agent_cfg )
agent . llm_response ( "What is the capital of China?" )
response = agent . llm_response ( "And India?" ) # maintains conversation state
# wrap Agent in a Task to run interactive loop with user (or other agents)
task = lr . Task ( agent , name = "Bot" , system_message = "You are a helpful assistant" )
task . run ( "Hello" ) # kick off with user saying "Hello"
# 2-Agent chat loop: Teacher Agent asks questions to Student Agent
teacher_agent = lr . ChatAgent ( agent_cfg )
teacher_task = lr . Task (
teacher_agent , name = "Teacher" ,
system_message = """
Ask your student concise numbers questions, and give feedback.
Start with a question.
"""
)
student_agent = lr . ChatAgent ( agent_cfg )
student_task = lr . Task (
student_agent , name = "Student" ,
system_message = "Concisely answer the teacher's questions." ,
single_round = True ,
)
teacher_task . add_sub_task ( student_task )
teacher_task . run ()Nov 2024:
Agent mit einem strengen JSON -Schema -Ausgangsformat für kompatible LLMs und strenge Modus für die OpenAI -Tools -API.Qwen2.5-Coder-32b-InstructOkt 2024:
September 2024:
o1-mini und o1-preview Vorbereitungsmodelle.DocChatAgent verwendet den wechselseitigen Rang Fusion (RRF), um mit verschiedenen Methoden abgerufenen Teile zu rangieren.run_batch_task Neue Option - stop_on_first_result - Ermöglicht die Beendigung von Batch, sobald jede Aufgabe ein Ergebnis zurückgibt.August 2024:
Task.run(), Task.run_async .Jul 2024:
Jun 2024:
RewindTool , mit dem ein Agent eine frühere Nachricht "zurückspulen und wiederholen" lässt (und alle abhängigen Nachrichten werden dank der Linienverfolgung ausgelöscht). Lesen Sie hier Notizen.Mai 2024:
doc-chat , db (für datenbankbezogene Abhängigkeiten). Siehe aktualisierte Installationsanweisungen unten und in den Dokumenten.examples einfügen, und ein zufälliges Beispiel aus dieser Liste würde verwendet, um ein 1-Shot-Beispiel für das LLM zu generieren. Dies wurde verbessert, sodass Sie jetzt eine Liste von Beispielen angeben können, bei denen jedes Beispiel entweder eine Toolinstanz oder ein Tupel (Beschreibung, Werkzeuginstanz) ist, wobei die Beschreibung ein "Gedanke" ist, der das LLM zur Verwendung des Tools leitet (siehe Beispiel in den Dokumenten). In einigen Szenarien kann dies die Genauigkeit der LLM -Toolgenerierung verbessern. Anstelle eines zufälligen Beispiels werden jetzt alle Beispiele verwendet, um nur wenige Beispiele zu erzeugen.TaskConfig . Erkennt nur genaue Schleifen, anstatt ungefähre Schleifen, bei denen die Entitäten im Wesentlichen ähnlich (aber nicht genau gleich) Dinge sagen.RecipientTool -Mechanismus mit dem Kompromiss, dass es keine Möglichkeit gibt, die LLM ausdrücklich durchzusetzen/daran zu erinnern, einen Adressaten explizit festzulegen (in Szenarien, in denen dies wichtig ist).DocChatAgent .gpt-4o ist jetzt der Standard-LLM durchgehend. Aktualisieren Sie Tests und Beispiele, um mit dieser LLM zu arbeiten. Verwenden Sie Tokenizer, die dem LLM entsprechen.gemini 1.5 pro Support über litellmQdrantDB: Update zur Unterstützung erlernter erlernter Einbettungen.Apr 2024:
chat_model="groq/llama3-8b-8192" . Siehe Tutorial.Task.run(), Task.run_async(), run_batch_tasks haben max_cost und max_tokens params, um zu beenden, wann Token oder Kosten eine Grenze überschreiten. Das Ergebnis ChatDocument.metadata enthält jetzt ein status , das ein Code ist, der einen Grundcode für Aufgabenabschluss angibt. Auch task.run() usw. kann mit einem expliziten session_id -Feld aufgerufen werden, das als Schlüssel verwendet wird, um verschiedene Einstellungen in Redis -Cache zu suchen. Derzeit nur verwendet, um den "Kill -Status" nachzuschlagen - dies ermöglicht das Töten einer Laufaufgabe entweder nach task.kill() oder durch die ClassMethod Task.kill_session(session_id) . test_task_killMärz 2024:
DocChatAgent , siehe test_doc_chat_agent.py , insbesondere die test_doc_chat_batch() ; Neue Task -Utility: run_batch_task_gen wobei ein Taskgenerator angegeben werden kann, um eine Aufgabe pro Eingabe zu generieren.DocChatAgent jetzt mit Image-PDFs funktioniert).DocChatAgent Kontext-Window-KorrekturenURLLoader : Dateizeit aus Header erkennen, wenn die URL nicht mit einem erkennbaren Suffix wie .pdf , .docx usw. endet.sentence_transformer verfügbar ist.mkdocs haystack , machen sentence-transformers einige schwere optionale chromadb unstructured huggingface-hubimport langroid as lrFebruar 2024:
chat_model="ollama/mistral" an. Siehe Versionshinweise.Jan 2024:
SQLChatAgent ). Siehe Beispielskript mit diesem Agenten, um Fragen zu Python PKG -Abhängigkeiten zu beantworten..doc -Dateien (zusätzlich zu .docx )formatter in OpenAIGPTConfig an, um eine genaue Chat -Formatierung für lokale LLMs sicherzustellen.DocChatAgentConfig hat einen neuen Param: add_fields_to_content , um zusätzliche Dokumentfelder anzugeben, die in das Feld content eingefügt werden sollen, um das Abruf zu verbessern.Dez. 2023:
DocChatAgent : Einnahme von Pandas -Datenrahmen und Filterung.LanceDocChatAgent Level LanceDB Vector-DB für effiziente Vektorsuche und Volltext-Suche und -Filterung.LanceRAGTaskCreator um ein 2-Agent-System zu erstellen, das aus einer LanceFilterAgent besteht, die eine Filter- und Reformabfrage entscheidet, um an einen RAG-Agenten zu senden.Task mit Standard ChatAgent .Nov 2023:
0.1.126: Openaiassistant Agent: Unterstützung bei der Zwischenspeicherung.
0.1.117: Unterstützung für OpenAI-Assistenten-API-Tools: Funktionshalle, Code-Unternehmer und Retriever (RAG), Datei-Uploads. Diese arbeiten nahtlos mit Langroids Aufgabenorchestrierung. Bis Dokumente bereit sind, sehen Sie diese Nutzungsbeispiele am besten:
Tests:
Beispielskripte:
0.1.112: OpenAIAssistant ist eine Unterklasse von ChatAgent , die die neue OpenAI -Assistent -API nutzt. Es kann als Drop-In-Ersatz für ChatAgent verwendet werden und stützt sich auf die Assistant-API, um den Konversationsstatus aufrechtzuerhalten, und nutzt anhaltende Themen und Assistenten, um sie bei Bedarf wieder zu verbinden. Beispiele: test_openai_assistant.py , test_openai_assistant_async.py
0.1.111: Unterstützen Sie das neueste OpenAI -Modell: GPT4_TURBO (siehe test_llm.py, beispielsweise Verwendung)
0.1.110: Upgrade von OpenAI v0.x auf v1.1.1 (zur Vorbereitung auf Assistenten -API und mehr); ( litellm aufgrund eines OpenAI -Versionskonflikts vorübergehend deaktiviert).
Okt 2023:
DocChatAgent Re-Ranker: rank_with_diversity , rank_to_periphery (in der Mitte verloren).DocChatAgentConfig.n_neighbor_chunks > 0 ermöglicht die Rückgabe von Kontextbrocken um die Übereinstimmung.DocChatAgent verwendet RelevanceExtractorAgent , damit die LLM relevante Teile eines Chunks unter Verwendung von Satzzahlen extrahieren, was zu einer enormen Geschwindigkeit und Kostenreduzierung im Vergleich zu dem naiven "Satzpecting" -Ansatz (das Ausschreiben der vollständigen Sätze relevanter Sätze LLMChainExtractor LangChain ) führt.import langroid as lr . Siehe Dokumentation zur Verwendung.September 2023:
docx -Dateien (vorläufig).SQLChatAgent , der relevante Schema -Informationen effizient abruft, wenn die natürliche Sprache in SQL übersetzt wird.August 2023:
GoogleSearchTool , um Agenten (LLM) zu ermöglichen, Google-Suchanfragen über Funktionen/Tools durchzuführen. Sehen Sie sich dieses Chat -Beispiel an, wie einfach es ist, dieses Tool einem Agenten hinzuzufügen.SQLChatAgent hinzugefügt - dank unseres neuesten Mitarbeiter Rithwik Babu!Juli 2023:
TableChatAgent wurde hinzugefügt, um mit tabellarischen Datensätzen (DataFrames, Dateien, URLs) zu chatten.DocChatAgent nimmt jetzt PDF -Dateien oder URLs an.Angenommen, Sie möchten strukturierte Informationen über die wichtigsten Begriffe eines kommerziellen Mietdokuments extrahieren. Sie können dies problemlos mit Langroid mit einem Zwei-Agent-System tun, wie wir im Langroid-Examples Repo zeigen. (Siehe dieses Skript für eine Version mit der gleichen Funktionalität unter Verwendung eines lokalen Mistral-7b-Modells.) Die Demo zeigt nur einige der vielen Funktionen von Langroid, wie z. B.:
LeaseExtractor ist für die Aufgabe verantwortlich, und sein LLM (GPT4) generiert Fragen, die vom DocAgent beantwortet werden sollen.DocAgent LLM (GPT4) verwendet das Abrufen von einem Vektor-Store, um die Fragen des LeaseExtractor zu beantworten, zitiert den spezifischen Auszug, der die Antwort unterstützt.LeaseExtractor LLM die Informationen in einem strukturierten Format unter Verwendung eines Funktion Calls.So sieht es in Aktion aus (ein penstable MP4 -Video ist hier).

(Eine aktuellere Liste finden Sie im Abschnitt Aktualisierungen/Releases oben.)
Task.run() hat die gleiche Typsignatur wie die Methoden eines Responders eines Agenten, und dies ist der Schlüssel zu einer Aufgabe eines Agenten, die auf andere Unteraufgaben delegieren kann: Aus Sicht einer Aufgabe sind Unteraufgaben einfach zusätzliche Responder, um in einem Round-Robin-Modus nach den eigenen Reaktoren des Agenten verwendet zu werden.Agent und Task ermöglichen es Benutzern, Agenten mit spezifischen Fähigkeiten zu entwerfen, in Aufgaben zu wickeln und Aufgaben auf flexible Weise zu kombinieren.ToolMessage Mechanismus, der mit einem LLM funktioniert, nicht nur mit OpenAI. Funktionsaufrufe und Tools haben die gleiche Entwickleroberfläche, die mit Pydantic implementiert wird, was es sehr einfach macht, Tools/Funktionen zu definieren und Agenten zu ermöglichen, sie zu verwenden. Die Vorteile der Verwendung von Pydantic sind, dass Sie nie komplexe JSON -Spezifikationen für Funktionsanrufe schreiben müssen. Wenn die LLM -Halluzinate JSON misshandelt haben, wird die pydantische Fehlermeldung an die LLM zurückgesendet, damit sie behoben werden kann.langroid installieren Langroid benötigt Python 3.11+. Wir empfehlen die Verwendung einer virtuellen Umgebung. Verwenden Sie pip , um eine schlanke Version von langroid (von PYPI) in Ihre virtuelle Umgebung zu installieren:
pip install langroid Mit dem Core Langroid -Paket können Sie OpenAI -Embodendings -Modelle über ihre API verwenden. Wenn Sie stattdessen die sentence-transformers verwenden möchten, die Modelle von Suggingface einbetten, installieren Sie Langroid wie folgt:
pip install " langroid[hf-embeddings] "Für viele praktische Szenarien benötigen Sie möglicherweise zusätzliche optionale Abhängigkeiten:
doc-chat Extra: So installieren Sie Langroid mit verschiedenen Dokumenten-Parern: pip install " langroid[doc-chat] "db Extra: pip install " langroid[db] "
` `pip install " langroid[doc-chat,db] "all zusätzlichen (Beachten Sie, dass dies zu längeren Last-/Startzeiten und einer größeren Installationsgröße führt): pip install " langroid[all] " Wenn Sie SQLChatAgent (z. B. die Skript- examples/data-qa/sql-chat/sql_chat.py ) verwenden, müssen Sie mit einem Postgres-DB:
sudo apt-get install libpq-dev auf Ubuntu,brew install postgresql auf Mac usw.pip install langroid[postgres] oder poetry add langroid[postgres] oder poetry install -E postgres . Wenn dies einen Fehler gibt, versuchen Sie pip install psycopg2-binary in Ihrem Virtualenv. Wenn Sie seltsame Fehler mit mysqlclient erhalten, versuchen Sie pip uninstall mysqlclient gefolgt von pip install mysqlclient .
Um loszulegen, brauchen Sie nur ein OpenAI -API -Schlüssel. Wenn Sie keine haben, sehen Sie sich diese OpenAI -Seite. (Beachten Sie, dass Langroid zwar der einfachste Weg ist, aber mit praktisch jedem LLM, nicht nur von OpenAI, arbeitet. Sehen Sie die Führer zur Verwendung von Open/Lokal LLMs und anderen nicht geöffneten proprietären LLMs.)
Kopieren Sie im Root des Repo die .env-template Datei in eine neue Datei .env :
cp .env-template .env Fügen Sie dann Ihre OpenAI -API -Schlüssel ein. Ihre .env -Datei sollte so aussehen (die Organisation ist optional, kann jedoch in einigen Szenarien erforderlich sein).
OPENAI_API_KEY=your-key-here-without-quotes
OPENAI_ORGANIZATION=optionally-your-organization-idAlternativ können Sie diese als Umgebungsvariable in Ihrer Shell festlegen (Sie müssen dies jedes Mal tun, wenn Sie eine neue Shell öffnen):
export OPENAI_API_KEY=your-key-here-without-quotesAlle folgenden Umgebungsvariableneinstellungen sind optional und einige werden nur für die Verwendung spezifischer Funktionen benötigt (wie unten angegeben).
.env -Datei als Wert von MOMENTO_AUTH_TOKEN ein (siehe Beispieldatei unten)..env -Datei setzen Sie CACHE_TYPE=momento (anstelle von CACHE_TYPE=redis was die Standardeinstellung ist).GoogleSearchTool verwenden kann. Um die Google-Suche als LLM-Tool/Plugin/Funktions-Call zu verwenden, müssen Sie eine Google-API-Taste einrichten, dann eine Google Custom Search Engine (CSE) einrichten und die CSE-ID abrufen. (Dokumentation dafür kann eine Herausforderung sein. Wir empfehlen, GPT4 für eine Schritt-für-Schritt-Anleitung zu fragen.) Nachdem wir diese Anmeldeinformationen erhalten haben, speichern Sie sie als Werte von GOOGLE_API_KEY und GOOGLE_CSE_ID in Ihrer .env Datei. Die vollständige Dokumentation zur Verwendung dieser (und anderer solcher "staatenlosen" Tools) findet in Kürze statt, aber in der Zwischenzeit werfen Sie einen Blick auf dieses Chat -Beispiel, in dem Sie zeigen, wie Sie einen Agenten problemlos mit einem GoogleSearchtool ausrüsten können. Wenn Sie alle diese optionalen Variablen hinzufügen, sollte Ihre .env -Datei so aussehen:
OPENAI_API_KEY=your-key-here-without-quotes
GITHUB_ACCESS_TOKEN=your-personal-access-token-no-quotes
CACHE_TYPE=redis # or momento
REDIS_PASSWORD=your-redis-password-no-quotes
REDIS_HOST=your-redis-hostname-no-quotes
REDIS_PORT=your-redis-port-no-quotes
MOMENTO_AUTH_TOKEN=your-momento-token-no-quotes # instead of REDIS* variables
QDRANT_API_KEY=your-key
QDRANT_API_URL=https://your.url.here:6333 # note port number must be included
GOOGLE_API_KEY=your-key
GOOGLE_CSE_ID=your-cse-id Bei der Verwendung von Azure OpenAI sind in der .env -Datei zusätzliche Umgebungsvariablen erforderlich. Diese Seite Microsoft Azure OpenAI enthält weitere Informationen. Sie können jede Umgebungsvariable wie folgt festlegen:
AZURE_OPENAI_API_KEY aus dem Wert von API_KEYAZURE_OPENAI_API_BASE aus dem Wert des ENDPOINT sieht typischerweise wie https://your.domain.azure.com aus.AZURE_OPENAI_API_VERSION können Sie den Standardwert in .env-template verwenden, und die neueste Version finden Sie hierAZURE_OPENAI_DEPLOYMENT_NAME ist der Name des bereitgestellten Modells, das vom Benutzer während des Modell -Setups definiert wirdAZURE_OPENAI_MODEL_NAME azure openai erlaubt bestimmte Modellnamen, wenn Sie das Modell für Ihre Bereitstellung auswählen. Sie müssen genau den genauen Modellnamen einfügen, der ausgewählt wurde. Zum Beispiel GPT-4 (sollte gpt-4-32k oder gpt-4 sein).AZURE_OPENAI_MODEL_VERSION ist erforderlich, wenn AZURE_OPENAI_MODEL_NAME = gpt=4 , was Langroid unterstützt, um die Kosten des Modells zu bestimmen Wir bieten eine Containerversion des langroid-examples -Repositorys über dieses Docker-Bild. Sie müssen lediglich Umgebungsvariablen in der .env -Datei einrichten. Bitte befolgen Sie diese Schritte, um den Container einzurichten:
# get the .env file template from `langroid` repo
wget -O .env https://raw.githubusercontent.com/langroid/langroid/main/.env-template
# Edit the .env file with your favorite editor (here nano), and remove any un-used settings. E.g. there are "dummy" values like "your-redis-port" etc -- if you are not using them, you MUST remove them.
nano .env
# launch the container
docker run -it --rm -v ./.env:/langroid/.env langroid/langroid
# Use this command to run any of the scripts in the `examples` directory
python examples/ < Path/To/Example.py > Dies sind schnelle Teaser, um einen Einblick in das zu geben, was Sie mit Langroid tun können und wie Ihr Code aussehen würde.
langroid-examples -Repository zu konsultieren.
Die verschiedenen LLM-Eingabeaufforderungen und -anweisungen in Langroid wurden getestet, um gut mit GPT-4 (und in gewissem Maße GPT-4O) gut zu arbeiten. Das Umschalten auf andere LLMs (lokal/offen und proprietär) ist einfach (siehe oben genannte Anleitungen) und kann für einige Anwendungen ausreichen. Im Allgemeinen können Sie jedoch minderwertige Ergebnisse sehen, es sei denn, Sie passen die Eingabeaufforderungen und/oder das Multi-Agent-Setup an.
Außerdem finden Sie den Getting Started Guide für ein detailliertes Tutorial.
Klicken Sie hier, um eine der folgenden Codebeispiele zu erweitern. All dies kann in einem Colab -Notizbuch ausgeführt werden:
import langroid . language_models as lm
mdl = lm . OpenAIGPT ()
messages = [
lm . LLMMessage ( content = "You are a helpful assistant" , role = lm . Role . SYSTEM ),
lm . LLMMessage ( content = "What is the capital of Ontario?" , role = lm . Role . USER ),
]
response = mdl . chat ( messages , max_tokens = 200 )
print ( response . message ) cfg = lm . OpenAIGPTConfig (
chat_model = "local/localhost:8000" ,
chat_context_length = 4096
)
mdl = lm . OpenAIGPT ( cfg )
# now interact with it as above, or create an Agent + Task as shown below. Wenn das Modell von liteLLM unterstützt wird, müssen Sie den Proxy -Server nicht starten. Setzen Sie einfach den Param chat_model oben auf litellm/[provider]/[model] , z litellm/anthropic/claude-instant-1 Beachten Sie, dass Sie litellm verwenden müssen, um Langroid mit dem litellm Extra zu installieren: poetry install -E litellm oder pip install langroid[litellm] . Für Remote -Modelle müssen Sie in der Regel API -Schlüssel usw. als Umgebungsvariablen festlegen. Sie können diese basierend auf den Litellm -Dokumenten einstellen. Wenn die erforderlichen Umgebungsvariablen fehlen, gibt Langroid eine hilfreiche Fehlermeldung an, die angibt, welche benötigt werden. Beachten Sie, dass Sie langroid mit litellm die litellm Extra installieren müssen, dh entweder pip install langroid[litellm] in Ihrer virtuellen Umwelt oder wenn Sie sich innerhalb des langroid -Repo entwickeln, poetry install -E litellm .
pip install langroid[litellm] import langroid as lr
agent = lr . ChatAgent ()
# get response from agent's LLM, and put this in an interactive loop...
# answer = agent.llm_response("What is the capital of Ontario?")
# ... OR instead, set up a task (which has a built-in loop) and run it
task = lr . Task ( agent , name = "Bot" )
task . run () # ... a loop seeking response from LLM or User at each turn Ein Spielzeugnummernspiel, bei dem eine Nummer n :
repeater_task LLM gibt einfach n zurück, n,even_task gibt n/2 zurück, wenn n gleich ist, sonst sagt "Do-nicht-weiß".odd_task LLM gibt 3*n+1 zurück, wenn n ungerade ist, sonst sagt "Do-nicht-weiß". Jede dieser Task konfiguriert automatisch einen Standard ChatAgent .
import langroid as lr
from langroid . utils . constants import NO_ANSWER
repeater_task = lr . Task (
name = "Repeater" ,
system_message = """
Your job is to repeat whatever number you receive.
""" ,
llm_delegate = True , # LLM takes charge of task
single_round = False ,
)
even_task = lr . Task (
name = "EvenHandler" ,
system_message = f"""
You will be given a number.
If it is even, divide by 2 and say the result, nothing else.
If it is odd, say { NO_ANSWER }
""" ,
single_round = True , # task done after 1 step() with valid response
)
odd_task = lr . Task (
name = "OddHandler" ,
system_message = f"""
You will be given a number n.
If it is odd, return (n*3+1), say nothing else.
If it is even, say { NO_ANSWER }
""" ,
single_round = True , # task done after 1 step() with valid response
) Fügen Sie dann die even_task und odd_task als Unteraufgaben von repeater_task hinzu und führen Sie die repeater_task aus, wobei Sie sie mit einer Nummer als Eingabe ausschalten:
repeater_task . add_sub_task ([ even_task , odd_task ])
repeater_task . run ( "3" )Langroid nutzt Pydantic, um die funktionierende API von OpenAI sowie seine eigenen nativen Werkzeuge zu unterstützen. Die Vorteile sind, dass Sie kein JSON schreiben müssen, um das Schema anzugeben. Auch wenn der LLM eine fehlerhafte Toolsyntax halluziniert, sendet Langroid den pydantischen Validierungsfehler (entsprechend saniert) an die LLM, damit er es beheben kann!
Einfaches Beispiel: Sagen Sie, der Agent hat eine geheime Liste von Zahlen, und wir möchten, dass die LLM die kleinste Nummer in der Liste finden. Wir möchten dem LLM ein probe /eine einzelne Nummer n als Argument angeben. Die Werkzeughandlermethode im Agenten gibt zurück, wie viele Zahlen in seiner Liste höchstens n sind.
Definieren Sie zuerst das Tool mit Langroids ToolMessage -Klasse:
import langroid as lr
class ProbeTool ( lr . agent . ToolMessage ):
request : str = "probe" # specifies which agent method handles this tool
purpose : str = """
To find how many numbers in my list are less than or equal to
the <number> you specify.
""" # description used to instruct the LLM on when/how to use the tool
number : int # required argument to the tool Definieren Sie dann eine SpyGameAgent als Unterklasse ChatAgent mit einer probe , die dieses Tool umgeht:
class SpyGameAgent ( lr . ChatAgent ):
def __init__ ( self , config : lr . ChatAgentConfig ):
super (). __init__ ( config )
self . numbers = [ 3 , 4 , 8 , 11 , 15 , 25 , 40 , 80 , 90 ]
def probe ( self , msg : ProbeTool ) -> str :
# return how many numbers in self.numbers are less or equal to msg.number
return str ( len ([ n for n in self . numbers if n <= msg . number ]))Anschließend instanziieren wir den Agenten und ermöglichen es ihm, das Tool zu verwenden und darauf zu reagieren:
spy_game_agent = SpyGameAgent (
lr . ChatAgentConfig (
name = "Spy" ,
vecdb = None ,
use_tools = False , # don't use Langroid native tool
use_functions_api = True , # use OpenAI function-call API
)
)
spy_game_agent . enable_message ( ProbeTool ) Für ein volles Beispiel für ein vollständiges Beispiel finden Sie das Skript zum Chat-Agent-Tool.py im langroid-examples Repo.
Angenommen, Sie möchten, dass ein Agent die wichtigsten Begriffe eines Mietvertrags aus einem Mietdokument als verschachtelte JSON -Struktur extrahiert. Definieren Sie zuerst die gewünschte Struktur über pydantische Modelle:
from pydantic import BaseModel
class LeasePeriod ( BaseModel ):
start_date : str
end_date : str
class LeaseFinancials ( BaseModel ):
monthly_rent : str
deposit : str
class Lease ( BaseModel ):
period : LeasePeriod
financials : LeaseFinancials
address : str Definieren Sie dann das Tool LeaseMessage als Unterklasse von Langroids ToolMessage . Beachten Sie, dass das Tool eine erforderliche Argumentation des terms des Lease hat:
import langroid as lr
class LeaseMessage ( lr . agent . ToolMessage ):
request : str = "lease_info"
purpose : str = """
Collect information about a Commercial Lease.
"""
terms : Lease Definieren Sie dann einen LeaseExtractorAgent mit einem Methode lease_info , das dieses Tool umgeht, den Agenten instanziiert und es ermöglicht, dieses Tool zu verwenden und darauf zu reagieren:
class LeaseExtractorAgent ( lr . ChatAgent ):
def lease_info ( self , message : LeaseMessage ) -> str :
print (
f"""
DONE! Successfully extracted Lease Info:
{ message . terms }
"""
)
return json . dumps ( message . terms . dict ())
lease_extractor_agent = LeaseExtractorAgent ()
lease_extractor_agent . enable_message ( LeaseMessage ) Siehe das Skript chat_multi_extract.py im langroid-examples Repo, um ein vollständiges Beispiel für Arbeiten zu erhalten.
Langroid bietet zu diesem Zweck eine DocChatAgent . Es umfasst Dokument-Sharding, Einbettung, Speicherung in eine Vektor-DB und abgerufene Erzeugung von Abfragen. Es ist einfach, mit dieser Klasse mit einer Sammlung von Dokumenten zu chatten. Erstellen Sie zunächst eine DocChatAgentConfig -Instanz mit einem Feld doc_paths , mit dem die Dokumente angegeben werden sollen.
import langroid as lr
from langroid . agent . special import DocChatAgentConfig , DocChatAgent
config = DocChatAgentConfig (
doc_paths = [
"https://en.wikipedia.org/wiki/Language_model" ,
"https://en.wikipedia.org/wiki/N-gram_language_model" ,
"/path/to/my/notes-on-language-models.txt" ,
],
vecdb = lr . vector_store . QdrantDBConfig (),
) Instanziieren Sie dann den DocChatAgent (dies nimmt die Dokumente in den Vektor-Store ein):
agent = DocChatAgent ( config )Dann können wir entweder dem Agenten einmalige Fragen stellen,
agent . llm_response ( "What is a language model?" ) Oder wickeln Sie es in eine Task ein und führen Sie eine interaktive Schleife mit dem Benutzer aus:
task = lr . Task ( agent )
task . run () Siehe vollständige Arbeitsskripte im docqa -Ordner des langroid-examples Repo.
Mit Langroid können Sie einen TableChatAgent mit einem Datensatz (Dateipfad, URL oder DataFrame) einrichten und ihn abfragen. Der LLM des Agenten generiert Pandas-Code, um die Abfrage über Funktionen (oder Tool/Plugin) zu beantworten, und die Funktionshandling-Methode des Agenten führt den Code aus und gibt die Antwort zurück.
So können Sie das tun:
import langroid as lr
from langroid . agent . special import TableChatAgent , TableChatAgentConfig Richten Sie einen TableChatAgent für eine Datendatei, eine URL oder einen Datenfrequenz ein (stellen Sie sicher, dass die Datentabelle eine Header-Zeile hat; der Trennzeichen/Trennzeichen ist automatisch anerkannt):
dataset = "https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv"
# or dataset = "/path/to/my/data.csv"
# or dataset = pd.read_csv("/path/to/my/data.csv")
agent = TableChatAgent (
config = TableChatAgentConfig (
data = dataset ,
)
)Richten Sie eine Aufgabe ein und stellen Sie solche einmaligen Fragen:
task = lr . Task (
agent ,
name = "DataAssistant" ,
default_human_response = "" , # to avoid waiting for user input
)
result = task . run (
"What is the average alcohol content of wines with a quality rating above 7?" ,
turns = 2 # return after user question, LLM fun-call/tool response, Agent code-exec result
)
print ( result . content )Oder alternativ eine Aufgabe einrichten und in einer interaktiven Schleife mit dem Benutzer ausführen:
task = lr . Task ( agent , name = "DataAssistant" )
task . run () Für ein volles Arbeitsbeispiel siehe das Skript table_chat.py im langroid-examples Repo.
Wenn Ihnen dieses Projekt gefällt, geben Sie ihm bitte einen Stern und? Verbreiten Sie das Wort in Ihrem Netzwerk oder in Social Media:
Ihre Unterstützung wird dazu beitragen, Langroids Dynamik und Gemeinschaft aufzubauen.