
؟ إطار تطبيق AI الذي يجعل الاتصال بالوظيفة مع LLM أسهل؟
استكشاف كتب الطبخ الخاصة بنا للدروس التعليمية والأمثلة!
خلاف
دفاتر الملاحظات للبدء:
نجمنا على جيثب!
تسعى ActionWeaver إلى أن تكون الإطار الأكثر موثوقية ، وسهل الاستخدام ، وعالي السرعة ، ومكافحة الوظائف الفعالة من حيث التكلفة لمهندسي الذكاء الاصطناعى.
سمات:
يمكنك تثبيت ActionWeaver باستخدام PIP:
pip install actionweaver استخدم أحدث واجهة برمجة تطبيقات Openai التي تدعم استدعاء الوظيفة المتوازية!
from actionweaver . llms import wrap
from openai import OpenAI
openai_client = wrap ( OpenAI ())أو باستخدام خدمة 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"
))سيقوم عميل ActionWeaver ملفوف بإدارة حلقة استدعاء الوظائف ، والتي تتضمن أوصاف الوظائف المارة ، وتنفيذ الوظائف مع الوسائط التي يتم إرجاعها بواسطة LLM ، والاستثناءات المعالجة.
سيعرض هذا العميل إنشاء واجهة create تطبيقات مبنية على chat.completions.create API. سيحتفظ API create المحسّن بجميع الوسائط الأصلية ويتضمن معلمات إضافية مثل:
action : توفير الإجراءات المتاحة إلى LLM.orch : تنسيق الإجراءات خلال حلقة استدعاء الوظيفة.exception_handler : كائن يوجه حلقة استدعاء الوظيفة حول كيفية التعامل مع الاستثناءات. سيتم عرض هذه الحجج في الأقسام اللاحقة. هذه الوسائط الإضافية اختيارية ، وهناك دائمًا خيار الاحتياط للوصول إلى عميل Openai الأصلي عبر openai_client.client .
ملاحظة : يمثل
actionأداة يمكن استخدامها بواسطة LLM. يشتمل كل إجراء على عنصرين رئيسيين: نموذج Pydantic الذي يتم إنشاؤه تلقائيًا لتسهيل المطالبة ، ووظيفة Python التقليدية.
يمكن للمطورين إرفاق أي وظيفة Python كعمل مع ديكور بسيط. في المثال التالي ، نقدم Action GetCurrentTime ، ثم ننتقل إلى استخدام API Openai لاستدعاءها.
يستخدم ActionWeaver توقيع الأسلوب المزيّن والموظف كوصفًا ، ويمررها إلى API من Openai. يعتبر Decorator Action أيضًا قابلاً للتكيف بشكل كبير ويمكن دمجه مع ديكورات أخرى ، شريطة الحفاظ على التوقيع الأصلي.
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 ]
)ألقِ نظرة على ما يمر إلى 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'}}
""" يمكنك أيضًا إجبار نموذج اللغة على تنفيذ الإجراء من خلال استدعاء طريقة invoke لاتخاذ إجراء. تتضمن حججها عميل ActionWeaver المغطى والوسائط الأخرى التي تم تمريرها إلى 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 ) يمكنك إنشاء نموذج Pydantic لتحديد البيانات الهيكلية التي تريد استخراجها ، وإنشاء إجراء باستخدام action_from_model ثم إجبار نموذج اللغة على استخراج البيانات المنظمة من المعلومات في المطالبة.
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 )ملاحظة : تحدد خاصية
stopلاتخاذ إجراء ، مع قيمة افتراضية لـ FALSE ، ما إذا كانت حلقة استدعاء الوظيفة ستعود على الفور إلى نتيجة الإجراء بدلاً من نقلها إلى LLM إذا تم ضبطها على TRUE.
ملاحظة : يمكنك تمرير الإجراءات التي تم إنشاؤها في وقت واحد من كلتا الوظيفتين والنماذج الأطلسية.
يتيح ActionWeaver تصميم التسلسلات الهرمية وسلاسل الإجراءات من خلال تمرير حجة orch . orch هو رسم خرائط من الإجراءات كمفاتيح للقيم بما في ذلك
على سبيل المثال ، دعنا نقول أن لدينا إجراءات 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
}
) يمكن للمستخدمين توفير تطبيق محدد لـ ExceptionHandler ، حيث يتم استدعاء طريقة handle_exception عند مواجهة استثناء. تقوم معلمة info بتغليف التفاصيل السياقية مثل الرسائل واستجابات API داخل القاموس.
تملي طريقة handle_exception مسار الإجراء لحلقة استدعاء الوظيفة ، وإرجاعها إما:
Return : توفير محتوى فوري للمستخدمContinue : توجيه الحلقة للمتابعة. 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 :
passألق نظرة على هذا المثال للحصول على التفاصيل.
المساهمات في شكل إصلاحات الأخطاء ، والميزات الجديدة ، وتحسين الوثائق ، وطلبات السحب يتم الترحيب بها للغاية.
إذا وجدت ActionWeaver مفيدًا ، فيرجى التفكير في الاستشهاد بالمشروع:
@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}
}