Moatless Tools es un proyecto de pasatiempo en el que experimento con algunas ideas que tengo sobre cómo los LLM se pueden usar para editar el código en grandes bases existentes. Creo que, en lugar de confiar en un agente para razonar hacia una solución, es crucial construir buenas herramientas para insertar el contexto correcto en la solicitud y manejar la respuesta.
En este momento me estoy centrando en la búsqueda de árboles sin moat, una versión extendida de herramientas sin foso que construye una estructura de árboles de nodos con soluciones paralelas y utiliza búsqueda de árboles para encontrar la trayectoria óptima. El código en moatless-tools se ha simplificado y ahora es una versión optimizada de esta base de código ampliada.
Utilizo el punto de referencia SWE-Bench como una forma de verificar mis ideas.
Con la versión 0.0.3 obtengo una tasa de resolución del 38.3% con el soneto Claude 3.5 V20241022. El costo promedio por instancia es de $ 0.30.
Las tres razones principales por las que he podido pasar del 27% al 38% resueltos en esta versión:
Uso de soneto y computadora de Claude 3.5
La solución se ha ajustado para usar la herramienta text_editor_20241022 introducida en la nueva versión de Claude 3.5 Sonnet. Esto proporciona resultados más estables al editar el código existente.
Testbeds sin foso
Configuré una solución basada en Kubernetes para ejecutar pruebas y proporcionar comentarios sobre los resultados de las pruebas al agente. Vale la pena señalar que el agente tiene que identificar de forma independiente las pruebas y no puede confiar en los datos PASS_TO_PASS o FAIL_TO_PASS para cada instancia.
Modelo más flexible
En la versión anterior de Moatless Tools, el agente siguió un flujo rígido donde primero recuperó el contenido y luego editó el código. Ahora, puede elegir dinámicamente entre acciones para la recuperación o edición de código, dependiendo de la situación.
Pruebe la evaluación Claude 3.5 Sonnet V20241022 configurada en Google Colab
Con la versión 0.0.2 obtengo una tasa de resolución del 26.7% con el soneto Claude 3.5, con un costo un poco más alto de $ 0.17 por instancia.
Pruebe la evaluación de Claude 3.5 configurada en Google Colab
Moatless Tools 0.0.1 tiene una tasa de resolución del 24%, con cada instancia de referencia que cuesta un promedio de $ 0.13 para resolver con GPT-4O. Ejecutar el conjunto de datos SWE Bench Lite con 300 instancias cuesta aproximadamente 40 dólares.
Pruébalo en Google Colab
Me he centrado en probar mis ideas, y el proyecto actualmente es un poco desordenado. Mi plan es organizarlo en el próximo período. Sin embargo, no dude en clonar el repositorio e intente ejecutar este cuaderno:
Antes de ejecutar la evaluación, necesitará:
Puede configurar estos ajustes por:
.env en la raíz del proyecto (copiar desde .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> " Configuración básica utilizando el AgenticLoop para resolver una instancia de Swe-Bench.
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 )