
? Estrutura de aplicativos de IA que facilita a chamada de função com o LLM?
Explore nossos livros de receitas para tutoriais e exemplos!
Discórdia
Notebooks para começar:
Estrela -nos no github!
O ActionWeaver se esforça para ser a estrutura de chamada de função mais confiável, amigável, de alta velocidade e custo-benefício para os engenheiros de IA.
Características:
Você pode instalar o ActionWeaver usando PIP:
pip install actionweaver Use a mais recente API do OpenAI que suporta chamadas de função paralela!
from actionweaver . llms import wrap
from openai import OpenAI
openai_client = wrap ( OpenAI ())ou usando o serviço do 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"
))O cliente embrulhado ActionWeaver gerenciará o loop de chamada de função, que inclui a aprovação de descrições de funções, executando funções com argumentos retornados pelo LLM e lidando com exceções.
Este cliente exporá uma API create criada na API original chat.completions.create . A API create aprimorada reter todos os argumentos originais e incluirá parâmetros adicionais, como:
action : Fornecendo ações disponíveis para LLM.orch : orquestrar ações ao longo da função Chamando Loop.exception_handler : um objeto que orienta o loop de chamada de função sobre como lidar com exceções. Esses argumentos serão demonstrados nas seções subsequentes. Esses argumentos adicionais são opcionais e sempre há a opção de fallback para acessar o cliente OpenAI original via openai_client.client .
Nota : Uma
actionrepresenta uma ferramenta que pode ser usada pelo LLM. Cada ação compreende dois elementos principais: um modelo pydantic que é gerado automaticamente para facilitar o impulsionamento e uma função Python convencional.
Os desenvolvedores podem anexar qualquer função python como uma ação a um decorador simples. No exemplo a seguir, introduzimos a ação GetCurrentTime e depois usamos a API do OpenAI para invocá -la.
A ActionWeaver utiliza a assinatura e o Docstring do método decorado como uma descrição, passando -as para a API de função do OpenAI. O decorador de ação também é altamente adaptável e pode ser combinado com outros decoradores, desde que a assinatura original seja preservada.
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 ]
)Dê uma olhada no que está passando para o OpenAI API
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'}}
""" Você também pode obrigar o modelo de idioma a executar a ação chamando o método invoke de uma ação. Seus argumentos incluem o cliente preenchido pela ActionWeaver e outros argumentos passados para a API CREATE.
get_current_time . invoke ( openai_client , messages = [{ "role" : "user" , "content" : "what time is it" }], model = "gpt-3.5-turbo" , stream = False , force = True ) Você pode criar um modelo pydantic para definir os dados estruturais que deseja extrair, criar uma ação usando action_from_model e, em seguida, forçar o modelo de idioma a extrair dados estruturados das informações no prompt.
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 : A propriedade
stopde uma ação, com um valor padrão do false, determina se o loop de chamada de função retornará imediatamente o resultado da ação em vez de passá -lo para LLM se definido como true.
NOTA : Você pode aprovar simultaneamente ações geradas a partir de funções e modelos pydantic.
O ActionWeaver permite o design de hierarquias e cadeias de ações, passando no argumento orch . orch é um mapeamento de ações como chaves para valores, incluindo
Por exemplo, digamos que temos ações 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
}
) Os usuários podem fornecer uma implementação específica do ExceptionHandler, onde o método handle_exception é chamado ao encontrar uma exceção. O parâmetro info encapsula detalhes contextuais, como mensagens e respostas da API, dentro de um dicionário.
O método handle_exception determina o curso de ação para o loop de chamada de função, retornando:
Return : fornecendo conteúdo imediato de volta ao usuárioContinue : instruindo o loop a prosseguir. 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 :
passDê uma olhada neste exemplo para obter detalhes.
As contribuições na forma de correções de bugs, novos recursos, melhorias de documentação e solicitações de tração são muito bem -vindas.
Se você achar útil o ActionWeaver, considere citar o projeto:
@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}
}