
? Marco de aplicaciones AI que facilita la llamada con LLM?
¡Explore nuestros libros de cocina para obtener tutoriales y ejemplos!
Discordia
Cuadernos para comenzar:
¡Estratas en Github!
ActionWeaver se esfuerza por ser el marco más confiable, fácil de usar, de alta velocidad y rentable de llamado de funciones para ingenieros de IA.
Características:
Puede instalar ActionWeaver usando PIP:
pip install actionweaver ¡Use la última API de OpenAI que admite llamadas de funciones paralelas!
from actionweaver . llms import wrap
from openai import OpenAI
openai_client = wrap ( OpenAI ())o usar el servicio Azure OpenAI
import os
from openai import AzureOpenAI
azure_client = wrap ( AzureOpenAI (
azure_endpoint = os . getenv ( "AZURE_OPENAI_ENDPOINT" ),
api_key = os . getenv ( "AZURE_OPENAI_KEY" ),
api_version = "2023-10-01-preview"
))El cliente envuelto ActionWeaver administrará el bucle de llamadas de funciones, que incluye aprobar descripciones de funciones, ejecutar funciones con argumentos devueltos por LLM y manejo de excepciones.
Este cliente expondrá una API create construida en la API de chat.completions.create original. La API create mejorada conservará todos los argumentos originales e incluirá parámetros adicionales como:
action : proporcionar acciones disponibles a LLM.orch : Orquestaciones de acciones en todo el bucle de llamadas de funciones.exception_handler : un objeto que guía el bucle de llamadas de función sobre cómo manejar las excepciones. Estos argumentos se demostrarán en las secciones posteriores. Estos argumentos adicionales son opcionales, y siempre existe la opción respaldo de acceder al cliente Operai original a través de openai_client.client .
Nota : Una
actionrepresenta una herramienta que puede ser utilizada por LLM. Cada acción comprende dos elementos principales: un modelo pydántico que se genera automáticamente para facilitar la solicitud y una función de pitón convencional.
Los desarrolladores pueden adjuntar cualquier función de Python como una acción con un decorador simple. En el siguiente ejemplo, presentamos Action GetCurrentTime y luego procedemos a usar la API de OpenAI para invocarla.
ActionWeaver utiliza la firma y el documento del método decorado como una descripción, pasándolos a la API de funciones de OpenAI. El decorador de acción también es altamente adaptable y se puede combinar con otros decoradores, siempre que se conserve la firma original.
from actionweaver import action
@ action ( name = "GetCurrentTime" )
def get_current_time () -> str :
"""
Use this for getting the current time in the specified time zone.
:return: A string representing the current time in the specified time zone.
"""
import datetime
current_time = datetime . datetime . now ()
return f"The current time is { current_time } "
# Ask LLM what time is it
response = openai_client . create (
model = "gpt-4o" ,
messages = [{ "role" : "user" , "content" : "what time is it" }],
actions = [ get_current_time ]
)Echa un vistazo a lo que pasa a la API de OpenAi
get_current_weather . get_function_details ()
"""
{'name': 'GetWeather',
'description': 'Get the current weather in a given location',
'parameters': {'properties': {'location': {'title': 'Location'},
'unit': {'default': 'fahrenheit', 'title': 'Unit'}},
'required': ['location'],
'title': 'Get_Current_Weather',
'type': 'object'}}
""" También puede obligar al modelo de idioma a ejecutar la acción llamando al método invoke de una acción. Sus argumentos incluyen el cliente ActionWeaver-Wrapped y otros argumentos pasados a la API de creación.
get_current_time . invoke ( openai_client , messages = [{ "role" : "user" , "content" : "what time is it" }], model = "gpt-3.5-turbo" , stream = False , force = True ) Puede crear un modelo Pydantic para definir los datos estructurales que desea extraer, crear una acción utilizando action_from_model y luego obligar al modelo de lenguaje a extraer datos estructurados de la información en el mensaje.
from pydantic import BaseModel
from actionweaver . actions . factories . pydantic_model_to_action import action_from_model
class User ( BaseModel ):
name : str
age : int
action_from_model ( User , stop = True ). invoke ( client , messages = [{ "role" : "user" , "content" : "Tom is 31 years old" }], model = "gpt-3.5-turbo" , stream = False , force = False )Nota : La propiedad
stopde una acción, con un valor predeterminado de falso, determina si el bucle de llamadas de función devolverá inmediatamente el resultado de la acción en lugar de pasarla a LLM si se establece en verdadero.
Nota : puede aprobar simultáneamente acciones generadas a partir de funciones y modelos pydantic.
ActionWeaver permite el diseño de jerarquías y cadenas de acciones al pasar por el argumento orch . orch es un mapeo de acciones como claves para valores que incluyen
Por ejemplo, digamos que tenemos acciones A1, A2, A3.
client . create (
[
{ "role" : "user" , "content" : "message" }
],
actions = [ a1 , a2 , a3 ], # First, LLM respond with either a1, a2 or a3, or text without action
# Define the orchestration logic for actions:
orch = {
a1 . name : [ a2 , a3 ], # If a1 is invoked, the next response will be either a2, a3 or a text response.
a2 . name : a3 , # If a2 is invoked, the next action will be a3
a3 . name : [ a4 ] # If a3 is invoked, the next response will be a4 or a text response.
a4 . name : None # If a4 is invoked, the next response will guarantee to be a text message
}
) Los usuarios pueden proporcionar una implementación específica de ExceptionHandler, donde se invoca el método handle_exception al encontrar una excepción. El parámetro info encapsula detalles contextuales como mensajes y respuestas de API dentro de un diccionario.
El método handle_exception dicta el curso de acción para el bucle de llamadas de funciones, devolviendo:
Return : proporcionar contenido inmediato al usuarioContinue : instruir al bucle para continuar. from actionweaver . llms import ExceptionAction , ChatLoopInfo , Continue , Return
class ExceptionHandler ( ABC ):
"""Base class for exception handlers.
This class provides a framework for handling exceptions within the function calling loop.
"""
@ abstractmethod
def handle_exception ( self , e : Exception , info : ChatLoopInfo ) -> ExceptionAction :
passEche un vistazo a este ejemplo para más detalles.
Las contribuciones en forma de correcciones de errores, nuevas características, mejoras de documentación y solicitudes de extracción son muy bienvenidas.
Si encuentra útil ActionWeaver, considere citar el proyecto:
@software{Teng_Hu_ActionWeaver_2024,
author = {Teng Hu},
license = {Apache-2.0},
month = Aug,
title = {ActionWeaver: Application Framework for LLMs},
url = {https://github.com/TengHu/ActionWeaver},
year = {2024}
}