Moatless Tools ist ein Hobbyprojekt, bei dem ich mit einigen Ideen experimentiere, die ich habe, wie LLMs verwendet werden können, um Code in großen vorhandenen Codebasen zu bearbeiten. Ich glaube, dass es entscheidend ist, gute Werkzeuge zu erstellen, um den richtigen Kontext in die Eingabeaufforderung einzufügen und die Antwort zu bewältigen, anstatt sich auf einen Agenten zu verlassen, um den Weg zu einer Lösung zu begründen.
Im Moment konzentriere ich mich auf die Search-Search mit vergrößerlichem Bäumen, eine erweiterte Version von vergleichungslosen Tools, die eine Baumstruktur von Knoten mit parallelen Lösungen erstellt und die Baumsuche verwendet, um die optimale Flugbahn zu finden. Der Code in Moatless-Tools wurde vereinfacht und ist jetzt eine optimierte Version dieser erweiterten Codebasis.
Ich benutze den SWE-Bench-Benchmark, um meine Ideen zu überprüfen.
Mit Version 0.0.3 bekomme ich 38,3% Lösungsrate mit Claude 3.5 Sonnet V20241022. Die durchschnittlichen Kosten pro Instanz betragen 0,30 USD.
Die drei Hauptgründe, warum ich in dieser Version von 27% auf 38% gelöste Instanzen in dieser Version verlaufen konnte:
Claude 3.5 Sonett und Computergebrauch
Die Lösung wurde angepasst, um das in der neue Version von Claude 3.5 Sonnet eingeführte text_editor_20241022 -Tool zu verwenden. Dies liefert stabilere Ergebnisse bei der Bearbeitung vorhandener Code.
bossiger Testbetten
Ich habe eine Kubernetes-basierte Lösung eingerichtet, um Tests auszuführen und dem Agenten Feedback zu Testergebnissen zu geben. Es ist erwähnenswert, dass der Agent die Tests unabhängig identifizieren muss und sich für jede Instanz nicht auf die Daten PASS_TO_PASS oder FAIL_TO_PASS verlassen muss.
Flexibleres Modell
In der früheren Version von Moatless Tools folgte der Agent einem starren Fluss, in dem er zuerst den Inhalt abgerufen und dann den Code bearbeitete. Jetzt kann es je nach Situation dynamisch zwischen Aktionen für das Abrufen oder Bearbeiten von Code oder Bearbeitung wählen.
Probieren Sie die Claude 3.5 Sonnet V20241022 Evaluation auf Google Colab ein
Mit Version 0.0.2 erhalte ich 26,7% Lösungsrate mit Claude 3.5 -Sonett mit etwas höheren Kosten von 0,17 USD pro Instanz.
Probieren Sie die in Google Colab eingerichtete Claude 3.5 -Bewertung aus
Boslosen Werkzeuge 0,0,1 haben eine Lösungsrate von 24%, wobei jede Benchmark-Instanz einen Durchschnitt von 0,13 USD für die Lösung von GPT-4O kostet. Ausführen des SWE Bank Lite -Datensatzes mit 300 Instanzen kostet ca. 40 Dollar.
Probieren Sie es in Google Colab aus
Ich habe mich darauf konzentriert, meine Ideen zu testen, und das Projekt ist derzeit etwas chaotisch. Mein Plan ist es, es in der kommenden Zeit zu organisieren. Sie können jedoch gerne das Repo klonen und dieses Notebook ausführen:
Bevor Sie die Bewertung ausführen, benötigen Sie:
Sie können diese Einstellungen nach beiden konfigurieren:
.env -Datei im Projektroot (kopieren Sie von .env.example ): cp .env.example .env
# Edit .env with your values # Directory for storing vector index store files
export INDEX_STORE_DIR= " /tmp/index_store "
# Directory for storing clonedrepositories
export REPO_DIR= " /tmp/repos "
# Required: At least one LLM provider API key
export OPENAI_API_KEY= " <your-key> "
export ANTHROPIC_API_KEY= " <your-key> "
# ...or Base URL for custom LLM API service (optional)
export CUSTOM_LLM_API_BASE= " <your-base-url> "
export CUSTOM_LLM_API_KEY= " <your-key> "
# Required: API Key for Voyage Embeddings
export VOYAGE_API_KEY= " <your-key> "
# Optional: Configuration for testbed environment (https://github.com/aorwall/moatless-testbeds)
export TESTBED_API_KEY= " <your-key> "
export TESTBED_BASE_URL= " <your-base-url> " Basic Setup mithilfe der AgenticLoop , um eine SWE-Bench-Instanz zu lösen.
from moatless . agent import ActionAgent
from moatless . agent . code_prompts import SIMPLE_CODE_PROMPT
from moatless . benchmark . swebench import create_repository
from moatless . benchmark . utils import get_moatless_instance
from moatless . completion import CompletionModel
from moatless . file_context import FileContext
from moatless . index import CodeIndex
from moatless . loop import AgenticLoop
from moatless . actions import FindClass , FindFunction , FindCodeSnippet , SemanticSearch , RequestMoreContext , RequestCodeChange , Finish , Reject
index_store_dir = "/tmp/index_store"
repo_base_dir = "/tmp/repos"
persist_path = "trajectory.json"
instance = get_moatless_instance ( "django__django-16379" )
completion_model = CompletionModel ( model = "gpt-4o" , temperature = 0.0 )
repository = create_repository ( instance )
code_index = CodeIndex . from_index_name (
instance [ "instance_id" ], index_store_dir = index_store_dir , file_repo = repository
)
actions = [
FindClass ( code_index = code_index , repository = repository ),
FindFunction ( code_index = code_index , repository = repository ),
FindCodeSnippet ( code_index = code_index , repository = repository ),
SemanticSearch ( code_index = code_index , repository = repository ),
RequestMoreContext ( repository = repository ),
RequestCodeChange ( repository = repository , completion_model = completion_model ),
Finish (),
Reject ()
]
file_context = FileContext ( repo = repository )
agent = ActionAgent ( actions = actions , completion = completion_model , system_prompt = SIMPLE_CODE_PROMPT )
loop = AgenticLoop . create (
message = instance [ "problem_statement" ],
agent = agent ,
file_context = file_context ,
repository = repository ,
persist_path = persist_path ,
max_iterations = 50 ,
max_cost = 2.0 # Optional: Set maximum cost in dollars
)
final_node = loop . run ()
if final_node :
print ( final_node . observation . message )