نحن في مهمة تبسيط مشهد LLM ، يتيح لك Unify:
؟ استخدم أي LLM من أي مزود : مع واجهة واحدة ، يمكنك استخدام جميع LLMs من جميع مقدمي الخدمات عن طريق تغيير سلسلة واحدة. لا حاجة لإدارة العديد من مفاتيح واجهة برمجة التطبيقات أو التعامل مع تنسيقات مدخلات خارجية مختلفة. توحيد معالجة كل ذلك من أجلك!
تحسين أداء LLM : أضف اختباراتك المخصصة الخاصة بك و EVALs ، وقياس المطالبات الخاصة بك على جميع النماذج ومقدمي الخدمات. مقارنة الجودة والتكلفة والسرعة ، والتكرار على موجه النظام الخاص بك حتى تمر جميع حالات الاختبار ، ويمكنك نشر التطبيق الخاص بك!
؟ الطريق إلى أفضل LLM : تحسين الجودة والتكلفة والسرعة عن طريق التوجيه إلى النموذج المثالي والمزود لكل موجه فردي.
ما عليك سوى تثبيت الحزمة:
pip install unifyai
ثم اشترك للحصول على مفتاح API الخاص بك ، ثم أنت مستعد للذهاب!
import unify
client = unify . Unify ( "gpt-4o@openai" , api_key = < your_key > )
client . generate ( "hello world!" )
ملحوظة
نوصي باستخدام Python-dotenv لإضافة UNIFY_KEY="My API Key"
إلى ملف .env
الخاص بك ، وتجنب الحاجة إلى استخدام وسيطة api_key
على النحو الوارد أعلاه. بالنسبة لبقية README ، سنفترض أنك تقوم بتعيين مفتاحك كمتغير للبيئة.
يمكنك إدراج جميع النماذج والمقدمات ونقاط النهاية ( <model>@<provider>
الزوج) على النحو التالي:
models = unify . list_models ()
providers = unify . list_providers ()
endpoints = unify . list_endpoints ()
يمكنك أيضًا التصفية ضمن هذه الوظائف على النحو التالي:
import random
anthropic_models = unify . list_models ( "anthropic" )
client . set_endpoint ( random . choice ( anthropic_models ) + "@anthropic" )
latest_llama3p1_providers = unify . list_providers ( "llama-3.1-405b-chat" )
client . set_endpoint ( "llama-3.1-405b-chat@" + random . choice ( latest_llama3p1_providers ))
openai_endpoints = unify . list_endpoints ( "openai" )
client . set_endpoint ( random . choice ( openai_endpoints ))
mixtral8x7b_endpoints = unify . list_endpoints ( "mixtral-8x7b-instruct-v0.1" )
client . set_endpoint ( random . choice ( mixtral8x7b_endpoints ))
إذا كنت تريد تغيير endpoint
أو model
أو provider
، فيمكنك القيام بذلك باستخدام أساليب .set_endpoint
، .set_model
، .set_provider
على التوالي.
client . set_endpoint ( "mistral-7b-instruct-v0.3@deepinfra" )
client . set_model ( "mistral-7b-instruct-v0.3" )
client . set_provider ( "deepinfra" )
يمكنك التأثير على شخصية النموذج باستخدام وسيطة system_message
في وظيفة .generate
:
response = client . generate (
user_message = "Hello Llama! Who was Isaac Newton?" , system_message = "You should always talk in rhymes"
)
إذا كنت ترغب في إرسال رسائل متعددة باستخدام وظيفة .generate
، فيجب عليك استخدام وسيطة messages
على النحو التالي:
messages = [
{ "role" : "user" , "content" : "Who won the world series in 2020?" },
{ "role" : "assistant" , "content" : "The Los Angeles Dodgers won the World Series in 2020." },
{ "role" : "user" , "content" : "Where was it played?" }
]
res = client . generate ( messages = messages )
عند الاستعلام عن LLMS ، غالبًا ما تريد الاحتفاظ بالعديد من جوانب المطالبة الخاصة بك ، وتغيير مجموعة فرعية صغيرة فقط من المطالبة في كل مكالمة لاحقة.
على سبيل المثال ، قد ترغب في إصلاح المعتدلة ، ومطالبة النظام ، والأدوات المتاحة ، مع تمرير رسائل المستخدم المختلفة القادمة من تطبيق المصب. جميع العملاء في Unify يجعل هذا الأمر بسيطًا للغاية عبر الوسائط الافتراضية ، والتي يمكن تحديدها في المُنشئ ، ويمكن أيضًا تعيينها في أي وقت باستخدام أساليب Setters.
على سبيل المثال ، سوف يمر الكود التالي temperature=0.5
إلى جميع الطلبات اللاحقة ، دون الحاجة إلى تمريرها مرارًا وتكرارًا إلى طريقة .generate()
.
client = unify . Unify ( "claude-3-haiku@anthropic" , temperature = 0.5 )
client . generate ( "Hello world!" )
client . generate ( "What a nice day." )
يمكن أيضًا استرداد جميع المعلمات بواسطة Getters ، وتعيينها عبر المستقدين:
client = unify . Unify ( "claude-3-haiku@anthropic" , temperature = 0.5 )
print ( client . temperature ) # 0.5
client . set_temperature ( 1.0 )
print ( client . temperature ) # 1.0
سيتم نقل قيمة إلى طريقة .generate()
الكتابة فوق القيمة الافتراضية المحددة للعميل.
client = unify . Unify ( "claude-3-haiku@anthropic" , temperature = 0.5 )
client . generate ( "Hello world!" ) # temperature of 0.5
client . generate ( "What a nice day." , temperature = 1.0 ) # temperature of 1.0
للحصول على الأداء الأمثل في التعامل مع طلبات المستخدم المتعددة في وقت واحد ، كما هو الحال في تطبيق chatbot ، يوصى بمعالجتها بشكل غير متزامن. فيما يلي مثال أدنى باستخدام AsyncUnify
:
import unify
import asyncio
async_client = unify . AsyncUnify ( "llama-3-8b-chat@fireworks-ai" )
asyncio . run ( async_client . generate ( "Hello Llama! Who was Isaac Newton?" ))
أكثر مثالًا أكثر تطبيراً ، يمكن بعد ذلك إجراء معالجة طلبات متعددة بالتوازي على النحو التالي:
import unify
import asyncio
clients = dict ()
clients [ "gpt-4o@openai" ] = unify . AsyncUnify ( "gpt-4o@openai" )
clients [ "claude-3-opus@anthropic" ] = unify . AsyncUnify ( "claude-3-opus@anthropic" )
clients [ "llama-3-8b-chat@fireworks-ai" ] = unify . AsyncUnify ( "llama-3-8b-chat@fireworks-ai" )
async def generate_responses ( user_message : str ):
responses_ = dict ()
for endpoint_ , client in clients . items ():
responses_ [ endpoint_ ] = await client . generate ( user_message )
return responses_
responses = asyncio . run ( generate_responses ( "Hello, how's it going?" ))
for endpoint , response in responses . items ():
print ( "endpoint: {}" . format ( endpoint ))
print ( "response: {} n " . format ( response ))
الوظيفة الحكيمة ، العملاء غير المتزامنين والمتزامن متطابقون.
يمكنك تمكين استجابات البث عن طريق تعيين stream=True
في وظيفة .generate
.
import unify
client = unify . Unify ( "llama-3-8b-chat@fireworks-ai" )
stream = client . generate ( "Hello Llama! Who was Isaac Newton?" , stream = True )
for chunk in stream :
print ( chunk , end = "" )
إنه يعمل بنفس الطريقة تمامًا مع عملاء ASYNC.
import unify
import asyncio
async_client = unify . AsyncUnify ( "llama-3-8b-chat@fireworks-ai" )
async def stream ():
async_stream = await async_client . generate ( "Hello Llama! Who was Isaac Newton?" , stream = True )
async for chunk in async_stream :
print ( chunk , end = "" )
asyncio . run ( stream ())
لمعرفة المزيد حول ميزات واجهة برمجة التطبيقات الأكثر تقدماً ، والمعايير ، وتوجيه LLM ، انتقل إلى مستنداتنا الشاملة!