optillm ist ein OpenAI-API-kompatibler optimierender Inferenz-Proxy, der mehrere hochmoderne Techniken implementiert, die die Genauigkeit und Leistung von LLMs verbessern können. Der aktuelle Schwerpunkt liegt auf der Implementierung von Techniken, die das Denken gegenüber Codierung sowie logischen und mathematischen Abfragen verbessern. Mit diesen Techniken ist es möglich, die Grenzmodelle bei verschiedenen Aufgaben zu übertreffen, indem zur Inferenzzeit zusätzliche Berechnungen durchgeführt werden.
pip install optillm
optillm
2024-10-22 07:45:05,612 - INFO - Loaded plugin: privacy
2024-10-22 07:45:06,293 - INFO - Loaded plugin: memory
2024-10-22 07:45:06,293 - INFO - Starting server with approach: auto
Klonen Sie das Repository mit git
und verwenden Sie pip install
um die Abhängigkeiten einzurichten.
git clone https://github.com/codelion/optillm.git
cd optillm
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Richten Sie die Umgebungsvariable OPENAI_API_KEY
(für OpenAI) oder die Umgebungsvariablen AZURE_OPENAI_API_KEY
, AZURE_API_VERSION
und AZURE_API_BASE
(für Azure OpenAI) oder die Umgebungsvariablen AZURE_API_VERSION
und AZURE_API_BASE
ein und melden Sie sich mit az login
für Azure OpenAI mit verwalteter Identität an (siehe hier).
Anschließend können Sie den optillm -Proxy wie folgt ausführen.
python optillm .py
2024-09-06 07:57:14,191 - INFO - Starting server with approach: auto
2024-09-06 07:57:14,191 - INFO - Server configuration: { ' approach ' : ' auto ' , ' mcts_simulations ' : 2, ' mcts_exploration ' : 0.2, ' mcts_depth ' : 1, ' best_of_n ' : 3, ' model ' : ' gpt-4o-mini ' , ' rstar_max_depth ' : 3, ' rstar_num_rollouts ' : 5, ' rstar_c ' : 1.4, ' base_url ' : ' ' }
* Serving Flask app ' optillm '
* Debug mode: off
2024-09-06 07:57:14,212 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:8000
* Running on http://192.168.10.48:8000
2024-09-06 07:57:14,212 - INFO - Press CTRL+C to quit
Sobald der Proxy ausgeführt wird, können Sie ihn als Ersatz für einen OpenAI-Client verwenden, indem Sie die base_url
auf http://localhost:8000/v1
festlegen.
import os
from openai import OpenAI
OPENAI_KEY = os . environ . get ( "OPENAI_API_KEY" )
OPENAI_BASE_URL = "http://localhost:8000/v1"
client = OpenAI ( api_key = OPENAI_KEY , base_url = OPENAI_BASE_URL )
response = client . chat . completions . create (
model = "moa-gpt-4o" ,
messages = [
{
"role" : "user" ,
"content" : "Write a Python program to build an RL model to recite text from any position that the user provides, using only numpy."
}
],
temperature = 0.2
)
print ( response )
Der obige Code gilt sowohl für OpenAI als auch für Azure OpenAI. Denken Sie jedoch daran, die Umgebungsvariable OPENAI_API_KEY
mit dem richtigen Schlüssel zu füllen. Es gibt mehrere Möglichkeiten, die Optimierungstechniken zu steuern. Sie werden in der folgenden Reihenfolge ihrer Präferenz angewendet:
{slug}-model-name
voranstellen. Im obigen Code verwenden wir beispielsweise moa
oder eine Mischung von Agenten als Optimierungsansatz. In den Proxy-Protokollen sehen Sie Folgendes, das zeigt, dass das moa
mit dem Basismodell als gpt-4o-mini
verwendet wurde. 2024-09-06 08:35:32,597 - INFO - Using approach moa, with gpt-4o-mini
2024-09-06 08:35:35,358 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions " HTTP/1.1 200 OK "
2024-09-06 08:35:39,553 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions " HTTP/1.1 200 OK "
2024-09-06 08:35:44,795 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions " HTTP/1.1 200 OK "
2024-09-06 08:35:44,797 - INFO - 127.0.0.1 - - [06/Sep/2024 08:35:44] " POST /v1/chat/completions HTTP/1.1 " 200 -
optillm _approach
im extra_body
übergeben. response = client.chat.completions.create(
model= " gpt-4o-mini " ,
messages=[{ " role " : " user " , " content " : " " }],
temperature=0.2,
extra_body={ " optillm _approach " : " bon|moa|mcts " }
)
system
oder user
Benutzeraufforderung innerhalb der Tags < optillm _approach> </ optillm _approach>
erwähnen. response = client.chat.completions.create(
model= " gpt-4o-mini " ,
messages=[{ " role " : " user " , " content " : " < optillm _approach>re2</ optillm _approach> How many r's are there in strawberry? " }],
temperature=0.2
)
Tipp
Sie können auch verschiedene Techniken kombinieren, indem Sie die Symbole &
und |
verwenden . Wenn Sie &
verwenden, werden die Techniken in der Reihenfolge von links nach rechts in einer Pipeline verarbeitet, wobei die Antwort von der vorherigen Stufe als Anfrage für die nächste verwendet wird. Während, mit |
Wir führen alle Anfragen parallel aus und generieren mehrere Antworten, die als Liste zurückgegeben werden.
Bitte beachten Sie, dass die oben beschriebene Konvention nur funktioniert, wenn der optillm -Server mit der Einstellung auto
für den Inferenzansatz gestartet wurde. Andernfalls darf das model
in der Clientanforderung nur mit dem Modellnamen festgelegt werden.
Wir unterstützen jetzt alle LLM-Anbieter (indem wir das LiteLLM-SDK umschließen). Sie können beispielsweise das Gemini-Flash-Modell mit moa
verwenden, indem Sie die Übergabe des API-Schlüssels in der Umgebungsvariablen os.environ['GEMINI_API_KEY']
festlegen und dann das Modell moa-gemini/gemini-1.5-flash-002
aufrufen. In der Ausgabe sehen Sie dann, dass LiteLLM zum Aufruf des Basismodells verwendet wird.
9:43:21 - LiteLLM:INFO: utils.py:2952 -
LiteLLM completion () model= gemini-1.5-flash-002; provider = gemini
2024-09-29 19:43:21,011 - INFO -
LiteLLM completion () model= gemini-1.5-flash-002; provider = gemini
2024-09-29 19:43:21,481 - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-002:generateContent ? key=[redacted] " HTTP/1.1 200 OK "
19:43:21 - LiteLLM:INFO: utils.py:988 - Wrapper: Completed Call, calling success_handler
2024-09-29 19:43:21,483 - INFO - Wrapper: Completed Call, calling success_handler
19:43:21 - LiteLLM:INFO: utils.py:2952 -
LiteLLM completion () model= gemini-1.5-flash-002; provider = gemini
Tipp
optillm ist ein transparenter Proxy und funktioniert mit jeder LLM-API oder jedem LLM-Anbieter, der über einen OpenAI-API-kompatiblen Chat-Abschluss-Endpunkt verfügt. Im Gegenzug stellt optillm auch denselben OpenAI-API-kompatiblen Chat-Abschluss-Endpunkt bereit. Dies sollte Ihnen eine einfache Integration in alle vorhandenen Tools oder Frameworks ermöglichen. Wenn das LLM, das Sie verwenden möchten, nicht über einen mit der OpenAI-API kompatiblen Endpunkt (wie Google oder Anthropic) verfügt, können Sie den LiteLLM-Proxyserver verwenden, der die meisten LLMs unterstützt.
Das folgende Sequenzdiagramm veranschaulicht, wie die Anfrage und die Antworten optillm durchlaufen.
Im Diagramm:
A
ist ein vorhandenes Tool (wie oobabooga), Framework (wie Patchwork) oder Ihr eigener Code, in dem Sie die Ergebnisse von optillm verwenden möchten. Sie können es direkt mit jedem OpenAI-Client-SDK verwenden.B
ist der optillm Dienst (der direkt oder in einem Docker-Container ausgeführt wird), der Anforderungen an base_url
sendet.C
ist ein Dienst, der einen mit der OpenAI-API kompatiblen Chat-Abschlussendpunkt bereitstellt. Wir unterstützen das direkte Laden jedes HuggingFace-Modells oder LoRA in optillm . Um den integrierten Inferenzserver zu verwenden, setzen Sie optillm _API_KEY
auf einen beliebigen Wert (z. B. export optillm _API_KEY=" optillm "
) und verwenden Sie denselben dann in Ihrem OpenAI-Client. Sie können jedes HuggingFace-Modell im Modellfeld übergeben. Wenn es sich um ein privates Modell handelt, stellen Sie sicher, dass Sie die Umgebungsvariable HF_TOKEN
mit Ihrem HuggingFace-Schlüssel festlegen. Wir unterstützen auch das Hinzufügen einer beliebigen Anzahl von LoRAs zusätzlich zum Modell, indem wir das +
-Trennzeichen verwenden.
Beispielsweise lädt der folgende Code das Basismodell meta-llama/Llama-3.2-1B-Instruct
und fügt dann zwei LoRAs hinzu – patched-codes/Llama-3.2-1B-FixVulns
und patched-codes/Llama-3.2-1B-FastApply
. Sie können mithilfe des Parameters active_adapter
im Feld extra_args
des OpenAI SDK-Clients angeben, welches LoRA verwendet werden soll. Standardmäßig laden wir den zuletzt angegebenen Adapter.
OPENAI_BASE_URL = "http://localhost:8000/v1"
OPENAI_KEY = " optillm "
response = client . chat . completions . create (
model = "meta-llama/Llama-3.2-1B-Instruct+patched-codes/Llama-3.2-1B-FastApply+patched-codes/Llama-3.2-1B-FixVulns" ,
messages = messages ,
temperature = 0.2 ,
logprobs = True ,
top_logprobs = 3 ,
extra_body = { "active_adapter" : "patched-codes/Llama-3.2-1B-FastApply" },
)
Sie können auch die alternativen Decodierungstechniken wie cot_decoding
und entropy_decoding
direkt mit dem lokalen Inferenzserver verwenden.
response = client . chat . completions . create (
model = "meta-llama/Llama-3.2-1B-Instruct" ,
messages = messages ,
temperature = 0.2 ,
extra_body = {
"decoding" : "cot_decoding" , # or "entropy_decoding"
# CoT specific params
"k" : 10 ,
"aggregate_paths" : True ,
# OR Entropy specific params
"top_k" : 27 ,
"min_p" : 0.03 ,
}
)
OPENAI_API_KEY
auf einen Platzhalterwert festexport OPENAI_API_KEY="sk-no-key"
./llama-server -c 4096 -m path_to_model
aus, um den Server mit dem angegebenen Modell und einer Kontextlänge von 4096 Token zu startenpython3 optillm .py --base_url base_url
aus, um den Proxy zu startenpython3 optillm .py --base_url http://localhost:8080/v1
aus Warnung
Beachten Sie, dass die Anthropic-API, Lama-Server (und Ollama) derzeit nicht das Sampling mehrerer Antworten aus einem Modell unterstützen, was die verfügbaren Ansätze auf die folgenden beschränkt: cot_reflection
, leap
, plansearch
, rstar
, rto
, self_consistency
, re2
und z3
. Für Modelle auf HuggingFace können Sie den integrierten lokalen Inferenzserver verwenden, da dieser mehrere Antworten unterstützt.
Ansatz | Schnecke | Beschreibung |
---|---|---|
CoT mit Reflexion | cot_reflection | Implementiert eine Gedankenkette mit den Abschnitten <thinking>, <reflection> und <output> |
PlanSearch | plansearch | Implementiert einen Suchalgorithmus für Kandidatenpläne zur Lösung eines Problems in natürlicher Sprache |
Nochmals lesen | re2 | Implementiert erneutes Lesen, um die Argumentation zu verbessern, indem Abfragen zweimal verarbeitet werden |
Selbstkonsistenz | self_consistency | Implementiert eine erweiterte Selbstkonsistenzmethode |
Z3-Löser | z3 | Verwendet den Z3-Theorembeweis für logisches Denken |
R*-Algorithmus | rstar | Implementiert den R*-Algorithmus zur Problemlösung |
SPRUNG | leap | Erlernt aufgabenspezifische Prinzipien anhand einiger Schussbeispiele |
Round-Trip-Optimierung | rto | Optimiert Antworten durch einen Round-Trip-Prozess |
Das Beste aus der N-Probenahme | bon | Erzeugt mehrere Antworten und wählt die beste aus |
Mischung von Wirkstoffen | moa | Kombiniert Antworten aus mehreren Kritiken |
Monte-Carlo-Baumsuche | mcts | Verwendet MCTS zur Entscheidungsfindung in Chat-Antworten |
PV-Spiel | pvg | Wendet zur Inferenzzeit einen Prover-Verifier-Spielansatz an |
CoT-Dekodierung | N/A für Proxy | Implementiert die Dekodierung der Gedankenkette, um Argumente ohne explizite Aufforderung hervorzurufen |
Entropie-Dekodierung | N/A für Proxy | Implementiert adaptives Sampling basierend auf der Unsicherheit von Token während der Generierung |
Plugin | Schnecke | Beschreibung |
---|---|---|
Router | router | Verwendet das Modell optillm -bert-uncased, um Anfragen basierend auf der Benutzeraufforderung an verschiedene Ansätze weiterzuleiten |
Chain-of-Code | coc | Implementiert einen Chain-of-Code-Ansatz, der CoT mit Codeausführung und LLM-basierter Codesimulation kombiniert |
Erinnerung | memory | Implementiert eine Kurzzeitgedächtnisschicht und ermöglicht die Verwendung unbegrenzter Kontextlänge mit jedem LLM |
Privatsphäre | privacy | Anonymisieren Sie PII-Daten bei der Anfrage und deanonymisieren Sie sie als Antwort wieder auf den ursprünglichen Wert |
URLs lesen | readurls | Liest alle in der Anfrage gefundenen URLs, ruft den Inhalt unter der URL ab und fügt ihn dem Kontext hinzu |
Code ausführen | executecode | Ermöglicht die Verwendung eines Code-Interpreters zur Ausführung von Python-Code in Anfragen und LLM-generierten Antworten |
optillm unterstützt verschiedene Befehlszeilenargumente und Umgebungsvariablen für die Konfiguration.
Parameter | Beschreibung | Standardwert |
---|---|---|
--approach | Zu verwendender Inferenzansatz | "auto" |
--simulations | Anzahl der MCTS-Simulationen | 2 |
--exploration | Explorationsgewicht für MCTS | 0,2 |
--depth | Simulationstiefe für MCTS | 1 |
--best-of-n | Anzahl der Stichproben für den Best_of_n-Ansatz | 3 |
--model | Zu verwendendes OpenAI-Modell | "gpt-4o-mini" |
--base-url | Basis-URL für OpenAI-kompatiblen Endpunkt | "" |
--rstar-max-depth | Maximale Tiefe für den rStar-Algorithmus | 3 |
--rstar-num-rollouts | Anzahl der Rollouts für den rStar-Algorithmus | 5 |
--rstar-c | Explorationskonstante für den rStar-Algorithmus | 1.4 |
--n | Anzahl der endgültigen Antworten, die zurückgegeben werden sollen | 1 |
--return-full-response | Geben Sie die vollständige Antwort einschließlich des CoT mit Tags zurück | False |
--port | Geben Sie den Port an, um den Proxy auszuführen | 8000 |
-- optillm -api-key | Optionaler API-Schlüssel für die Client-Authentifizierung bei optillm | "" |
Bei Verwendung von Docker können diese als Umgebungsvariablen mit dem Präfix optillm _
festgelegt werden.
optillm kann optional mit Docker und der bereitgestellten Docker-Datei erstellt und ausgeführt werden.
Stellen Sie sicher, dass Docker und Docker Compose auf Ihrem System installiert sind.
Aktualisieren Sie entweder die Umgebungsvariablen in der Datei docker-compose.yaml oder erstellen Sie eine .env
Datei im Projektstammverzeichnis und fügen Sie alle Umgebungsvariablen hinzu, die Sie festlegen möchten. Um beispielsweise den OpenAI-API-Schlüssel festzulegen, fügen Sie der .env
Datei die folgende Zeile hinzu:
OPENAI_API_KEY=your_openai_api_key_here
Führen Sie den folgenden Befehl aus, um optillm zu starten:
docker compose up -d
Dadurch wird das Docker-Image erstellt, falls es nicht vorhanden ist, und der optillm Dienst gestartet.
optillm wird unter http://localhost:8000
verfügbar sein.
Bei Verwendung von Docker können Sie diese Parameter als Umgebungsvariablen festlegen. Um den Ansatz und das Modell festzulegen, würden Sie beispielsweise Folgendes verwenden:
optillm _APPROACH=mcts
optillm _MODEL=gpt-4
Um den optillm Proxy mit einem API-Schlüssel zu sichern, legen Sie die Umgebungsvariable optillm _API_KEY
fest:
optillm _API_KEY=your_secret_api_key
Wenn der API-Schlüssel festgelegt ist, müssen Clients ihn mithilfe des Authorization
Headers in ihre Anforderungen aufnehmen:
Authorization: Bearer your_secret_api_key
Modell | Punktzahl |
---|---|
o1-mini | 56,67 |
coc-claude-3-5-sonett-20241022 | 46,67 |
coc-gemini/gemini-exp-1121 | 46,67 |
o1-Vorschau | 40,00 |
gemini-exp-1114 | 36,67 |
claude-3-5-sonett-20241022 | 20.00 |
gemini-1.5-pro-002 | 20.00 |
gemini-1.5-flash-002 | 16.67 |
Modell | Genauigkeit |
---|---|
readurls&memory-gpt-4o-mini | 61,29 |
gpt-4o-mini | 50,61 |
readurls&memory-Gemma2-9b | 30.1 |
Gemma2-9b | 5.1 |
Gemma2-27b | 30.8 |
Gemini Flash 1.5 | 66,5 |
Gemini Pro 1.5 | 72,9 |
Modell | pass@1 | pass@5 | pass@10 |
---|---|---|---|
plansearch-gpt-4o-mini | 44.03 | 59.31 | 63,5 |
gpt-4o-mini | 43.9 | 50,61 | 53,25 |
Claude-3.5-Sonett | 51.3 | ||
gpt-4o-2024-05-13 | 45.2 | ||
gpt-4-turbo-2024-04-09 | 44.2 |
Da optillm ein Drop-in-Ersatz für die OpenAI-API ist, können Sie es mithilfe des OpenAI-Clients problemlos in vorhandene Tools und Frameworks integrieren. Wir haben optillm mit Patchwork verwendet, einem Open-Source-Framework, das Entwicklungsarbeit wie PR-Überprüfungen, Fehlerbehebung und Sicherheitspatches mithilfe von Workflows namens Patchflows automatisiert. Bei Verwendung des Mix-of-Agents-Ansatzes (MOA) haben wir enorme Leistungssteigerungen bei allen unterstützten Patchflows festgestellt, wie unten gezeigt.