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-Instruct
Okt 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 litellm
QdrantDB:
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_kill
Mä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-hub
import langroid as lr
Februar 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-id
Alternativ 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-quotes
Alle 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_KEY
AZURE_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.