تعمل AskIt كمكتبة مخصصة أو لغة خاصة بالمجال مصممة لتبسيط استخدام نماذج اللغات الكبيرة (LLMs) مثل GPT-4، وGemini، وClaude، وCOHERE، وLLama2. فهو يبسط تعقيدات الهندسة السريعة ويلغي الحاجة إلى تحليل الاستجابات من حاملي شهادات LLM، مما يجعل مهام البرمجة أكثر سلاسة.
باستخدام AskIt ، يمكنك نشر LLMs لعدد كبير من المهام، مثل:
يمكن لـ pyaskit استخدام GPT أو Gemini أو Claude أو COHERE أو LLama2 كواجهة خلفية. تعمل pyaskit من خلال OpenAI API وGemini API وClaude API وCOHERE API أو LLama2 API. إلى جانب Python، تم أيضًا تطبيق AskIt في TypeScript. يمكنك الوصول إلى إصدار TypeScript، ts-askit.
from pyaskit import ask
# Automatically parses the response to an integer
sum = ask ( int , "add 1 + 1" )
# `sum` is an integer with a value of 2
from typing import TypedDict , List
from pyaskit import ask
# Define a typed dictionary for programming languages
class PL ( TypedDict ):
name : str
year_created : int
# Automatically extracts structured information into a list of dictionaries
langs = ask ( List [ PL ], "List the two oldest programming languages." )
# `langs` holds information on the oldest programming languages in a structured format like
# [{'name': 'Fortran', 'year_created': 1957},
# {'name': 'Lisp', 'year_created': 1958}]
from pyaskit import function
@ function ( codable = False )
def translate ( s : str , lang : str ) -> str :
"""Translate {{s}} into {{lang}} language."""
s = translate ( "こんにちは世界。" , "English" )
# `s` would be "Hello, world."
from pyaskit import function
@ function ( codable = True )
def get_html ( url : str ) -> str :
"""Get the webpage from {{url}}."""
# When `codable` is set to True, the body of the function is automatically coded by an LLM.
html = get_html ( "https://github.com/katsumiok/pyaskit/blob/main/README.md" )
# `html` contains the HTML version of this README.md
لتثبيت AskIt ، قم بتشغيل هذا الأمر في جهازك الطرفي:
pip install pyaskit
أو
pip install git+https://github.com/katsumiok/pyaskit.git
قبل استخدام AskIt ، تحتاج إلى تعيين مفتاح API الخاص بك كمتغير بيئة مناسب:
OPENAI_API_KEY
GOOGLE_API_KEY
ANTHROPIC_API_KEY
CO_API_KEY
GROQ_API_KEY
على سبيل المثال، لاستخدام OpenAI API، تحتاج إلى تعيين مفتاح OpenAI API الخاص بك كمتغير بيئة OPENAI_API_KEY
:
export OPENAI_API_KEY= < your OpenAI API key >
<your OpenAI API key>
عبارة عن سلسلة تبدو كما يلي: sk-<your key>
. يمكنك العثور على مفتاح OpenAI API الخاص بك في لوحة معلومات OpenAI.
تحتاج إلى تحديد اسم النموذج كمتغير بيئة ASKIT_MODEL
:
export ASKIT_MODEL= < model name >
<model name>
هو اسم النموذج الذي تريد استخدامه. تم اختبار أحدث إصدار من AskIt باستخدام gpt-4
و gpt-3.5-turbo-16k
و gemini-pro
و claude-2.1
و cohere-2.0
. يمكنك العثور على قائمة النماذج المتاحة في وثائق OpenAI API، ووثائق Gemini API، ووثائق Claude API، ووثائق COHERE API. يمكنك أيضًا العثور على النماذج المتاحة في ملف models.py
.
قبل استخدام AskIt مع Llama 2، تحتاج إلى تثبيته. لتثبيت Llama 2، قم بتشغيل هذا الأمر في جهازك الطرفي:
pip install git+https://github.com/facebookresearch/llama.git
تحتاج أيضًا إلى تنزيل نموذج الرمز المميز ونقطة التحقق الخاصة بالنموذج الذي تريد استخدامه. يرجى الرجوع إلى وثائق Llama 2 لمزيد من التفاصيل.
نقدم مثالاً لاستخدام AskIt مع Llama 2 في دليل الأمثلة. لتشغيل المثال، قم بتشغيل هذا الأمر في المحطة الطرفية الخاصة بك:
torchrun --nproc_per_node 1 examples/use_llama2.py
--ckpt_dir llama-2-7b-chat/
--tokenizer_path tokenizer.model
--max_seq_len 512 --max_batch_size 6
فيما يلي بعض الأمثلة الأساسية لمساعدتك على التعرف على AskIt :
import pyaskit as ai
s = ai . ask ( str , 'Paraphrase "Hello World!"' )
print ( s )
لاستخدام AskIt ، ابدأ باستيراد وحدة pyaskit
. تقوم واجهة برمجة التطبيقات ask
، التي تأخذ وسيطتين - نوع الإخراج والموجه - بإنتاج مخرجات LLM بالتنسيق المحدد. في هذه الحالة، يكون نوع الإخراج هو str
والموجه هو Paraphrase "Hello World!"
. يتوفر شرح شامل للأنواع في AskIt في قسم الأنواع. سيؤدي تنفيذ هذا الرمز إلى إعادة صياغة الموجه، مثل:
Greetings, Planet!
function
الديكور يسمح مصمم function
بتعريف دالة باستخدام قالب موجه. يمكن استخدام معلمات دالة محددة كمعلمات لقالب موجه. على سبيل المثال،
from pyaskit import function
@ function ( codable = False )
def paraphrase ( text : str ) -> str :
"""Paraphrase {{text}}"""
s = paraphrase ( 'Hello World!' )
print ( s )
حيث يمثل {{text}}
معلمة قالب ويتوافق مع معلمة الوظيفة.
define
API تتيح واجهة برمجة التطبيقات define
إمكانية تحديد المعلمات بشكل سريع باستخدام صيغة القالب:
import pyaskit as ai
paraphrase = ai . define ( str , 'Paraphrase {{text}}' )
s = paraphrase ( text = 'Hello World!' )
# s = paraphrase('Hello World!') # This is also valid
print ( s )
في هذه الحالة، تقوم واجهة define
API بإنشاء وظيفة نموذجية توجه LLM إلى إعادة صياغة النص المحدد. استدعاء وظيفة paraphrase
باستخدام "Hello World!" سيعود نسخة معاد صياغتها من هذا النص. قد يؤدي تشغيل هذا الرمز إلى إخراج شيء مثل "Greetings, Planet!".
تسمح واجهة برمجة التطبيقات (API) define
بإنشاء وظائف مخصصة بشكل مباشر لتسخير إمكانات نماذج اللغات الكبيرة للقيام بمهام متنوعة. يمكن العثور على المزيد من الأمثلة في دليل الأمثلة.
بعض المهام، مثل تلك التي تتطلب بيانات في الوقت الفعلي، أو موارد خارجية مثل الوصول إلى الشبكة، أو الوصول إلى الملفات، أو الوصول إلى قاعدة البيانات، غير مناسبة لتنفيذ LLM. ومع ذلك، يمكن لـ AskIt التعامل مع هذه المهام عن طريق تحويل الموجه إلى برنامج Python في الخلفية.
يوضح المثال التالي استخدام AskIt لمعالجة مهمة تتطلب الوصول إلى الشبكة:
import pyaskit as ai
get_html = ai . define ( str , 'Get the webpage from {{url}}' ). compile ()
html = get_html ( url = 'https://csail.mit.edu' )
print ( html )
في هذا السيناريو، تحتاج فقط إلى استدعاء compile()
على الوظيفة التي يتم إرجاعها بواسطة واجهة برمجة التطبيقات define
. تعمل وظيفة compile
على تحويل الموجه إلى برنامج بايثون وإرجاع وظيفة تنفذ هذا الكود، وتتصرف تمامًا مثل وظيفة بايثون العادية.
على الرغم من أن المثال أعلاه لا يحدد نوع المعلمة url
، فإن AskIt يوفر واجهة برمجة تطبيقات defun
للقيام بذلك. يوضح التعليمة البرمجية التالية كيفية تحديد دالة يتم فيها تحديد نوع عنوان url
للمعلمة كـ str
:
import pyaskit as ai
get_html = ai . defun ( str , { "url" : str }, 'Get the webpage from {{url}}' ). compile ()
html = get_html ( url = 'https://csail.mit.edu' )
print ( html )
الوسيطة الثانية لـ defun
API هي قاموس يقوم بتعيين أسماء المعلمات لأنواعها.
يمكننا نفس الشيء مع الكود التالي:
from pyaskit import function
@ function ( codable = True )
def get_html ( url : str ) -> str :
"""Get the webpage from {{url}}"""
html = get_html ( url = 'https://csail.mit.edu' )
print ( html )
توفر نماذج تعلم اللغة (LLMs) ميزة التعلم بعدد قليل من اللقطات، وهي القدرة التي يستخدمها AskIt في مهام البرمجة. يمكّنك AskIt من حل المهام باستخدام تقنية البرمجة بالأمثلة (PBE)، حيث تقدم أمثلة على المدخلات والمخرجات المطلوبة.
لنفكر في إنشاء دالة لإضافة رقمين ثنائيين (ممثلين على شكل سلاسل). تقبل هذه الدالة رقمين ثنائيين وترجع مجموعهما أيضًا في شكل ثنائي. يوضح التعليمة البرمجية التالية تعريف مثل هذه الوظيفة باستخدام أمثلة توضيحية.
from pyaskit import define
training_examples = [
{ "input" : { "x" : "1" , "y" : "0" }, "output" : "1" },
{ "input" : { "x" : "1" , "y" : "1" }, "output" : "10" },
{ "input" : { "x" : "101" , "y" : "11" }, "output" : "1000" },
{ "input" : { "x" : "1001" , "y" : "110" }, "output" : "1111" },
{ "input" : { "x" : "1111" , "y" : "1" }, "output" : "10000" },
]
add_binary_numbers = define ( str , "Add {{x}} and {{y}}" , training_examples = training_examples )
sum_binary = add_binary_numbers ( x = "101" , y = "11" )
print ( sum_binary ) # Output: "1000"
في هذا المثال، تأخذ واجهة برمجة التطبيقات define
ثلاث وسيطات: نوع المخرجات، والموجه، وأمثلة التدريب. كل إدخال في قائمة أمثلة التدريب عبارة عن قاموس يحتوي على قاموس "إدخال" (مع أسماء وقيم متغيرة) و"مخرجات" تمثل مخرجات الوظيفة المتوقعة في ضوء الإدخال. تقوم واجهة برمجة التطبيقات define
بعد ذلك بإرجاع وظيفة تقبل متغيرات الإدخال كوسيطات للكلمات الرئيسية وتخرج مخرجات LLM بالنوع المحدد.
تعمل الدالة add_binary_numbers
، التي تضيف رقمين ثنائيين، مثل أي دالة عادية في لغة Python.
يمكنك استخدام وظيفة compile
لاختبار الوظيفة التي تم إنشاؤها باستخدام قائمة اختيارية من أمثلة الاختبار.
يوضح التعليمة البرمجية التالية كيفية اختبار الوظيفة المحددة أعلاه باستخدام أمثلة اختبار جديدة:
test_examples = [
{ "input" : { "x" : "0" , "y" : "1" }, "output" : "1" },
{ "input" : { "x" : "10" , "y" : "0" }, "output" : "10" },
{ "input" : { "x" : "110" , "y" : "10" }, "output" : "1000" },
]
f = add_binary_numbers . compile ( test_examples = test_examples )
sum_binary = f ( x = "101" , y = "11" )
print ( sum_binary ) # Output: "1000"
هنا، f
هي الدالة التي تم إنشاؤها والتي تعمل بشكل مشابه لـ add_binary_numbers
. من خلال مقارنة مخرجات الوظيفة التي تم إنشاؤها مع المخرجات المتوقعة لكل مثال اختبار، يضمن AskIt أن الوظيفة التي تم إنشاؤها تتصرف كما هو متوقع. في حالة ظهور أي تناقض، يقوم AskIt بإعادة محاولة الترجمة. بعد عدة محاولات ترجمة غير ناجحة، يطرح AskIt استثناءً.
تقدم AskIt واجهات برمجة التطبيقات لتعيين أنواع المخرجات لنماذج تعلم اللغة (LLMs). من خلال توفير هذه الأنواع كوسيطة أولى لواجهات برمجة التطبيقات (APIs) ask
define
، يمكنك إدارة تنسيق إخراج LLM. يمكنك أيضًا استخدام تلميحات الكتابة المتوفرة في Python.
يصف الجدول التالي الأنواع المختلفة التي يدعمها AskIt :
يكتب | وصف | اكتب مثالاً | مثال القيمة |
---|---|---|---|
int | عدد صحيح | t.int | 123 |
float | رقم النقطة العائمة | t.float | 1.23 |
bool | منطقية | t.bool | حقيقي |
str | خيط | t.str | "مرحبا بالعالم!" |
literal | حرفي | t.literal(123) | 123 |
list | قائمة | t.list(t.int) | [1، 2، 3] |
dict | قاموس | t.dict({ 'a': t.int, 'b': t.str }) | {'أ': 1، 'ب': "أي بي سي"} |
record | قاموس | t.record(t.str, t.int) | {'أ': 1، 'ب': 2} |
tuple | مترابطة بيانية | t.tuple(t.int, t.str) | (1، "اي بي سي") |
union | الاتحاد (القيم المحتملة المتعددة) | t.union(t.literal('yes'), t.literal('no')) | "نعم أو لا" |
t.literal('yes') | t.literal('no') | "نعم أو لا" | ||
t.literal('yes', 'no') | "نعم أو لا" | ||
None | لا أحد | None | لا أحد |
لاحظ أن كل تعريف عن النوع يساعد AskIt في تحليل وفهم المخرجات المطلوبة، مما يضمن إرجاع LLM الخاص بك للبيانات بالتنسيق الدقيق الذي تحتاجه.
قالب المطالبة عبارة عن سلسلة مكونة من عناصر نائبة لمعلمات الوظيفة التي يتم تعريفها. تتم الإشارة إلى العناصر النائبة بواسطة قوسين متعرجين مزدوجين {{
و }}
ويمكن أن تحتوي فقط على اسم متغير. يتم بعد ذلك استخدام اسم المتغير هذا كمعلمة في الوظيفة المحددة.
يمكن تعريف معلمات الدالة بطريقتين: إما عن طريق وسائط الكلمات الرئيسية أو عن طريق الوسائط الموضعية. بالنسبة لوسيطات الكلمات الرئيسية، يكون اسم المتغير الموجود داخل العنصر النائب بمثابة اسم وسيطة الكلمة الأساسية. بالنسبة للوسائط الموضعية، يحدد التسلسل الذي تظهر به العناصر النائبة ترتيب الوسائط الموضعية.
خذ بعين الاعتبار المثال التالي الذي يوضح كيفية تعريف دالة، add
، تقبل وسيطتين x
و y
وإرجاع مجموعهما:
from pyaskit import define
import pyaskit . types as t
add = define ( t . int , '{{x}} + {{y}}' )
print ( add ( x = 1 , y = 2 )) # keyword arguments
print ( add ( 1 , 2 )) # positional arguments
في هذه الحالة، يمكن استدعاء وظيفة add
باستخدام إما الكلمة الأساسية أو الوسائط الموضعية، مع إرجاع مجموع x
و y
كمخرجات.
بشكل ملحوظ، إذا تم استخدام نفس اسم المتغير عدة مرات في قالب المطالبة، فسيتم تعيين الاستخدامات اللاحقة إلى التكرار الأولي. لاحظ هذا السلوك في المثال التالي:
from pyaskit import define
import pyaskit . types as t
add = define ( t . int , '{{x}} + {{y}} + {{x}} + {{z}}' )
print ( add ( x = 1 , y = 2 , z = 3 ))
print ( add ( 1 , 2 , 3 ))
هنا، يظهر {{x}}
مرتين في قالب المطالبة. التواجد الثاني لـ {{x}}
يعود إلى الأول. ومن ثم، على الرغم من أن {{z}}
هو العنصر النائب الرابع في القالب، إلا أنه يتماشى مع الوسيطة الثالثة للدالة.
راجع CONTRIBUTING.md للحصول على تفاصيل حول قواعد السلوك لدينا، وعملية إرسال طلبات السحب إلينا.
تم ترخيص هذا المشروع بموجب ترخيص MIT - راجع ملف LICENSE.md للحصول على التفاصيل
إذا كنت تستخدم برنامجنا في بحثك، فيرجى ذكر ورقتنا البحثية:
@misc { okuda2023askit ,
title = { AskIt: Unified Programming Interface for Programming with Large Language Models } ,
author = { Katsumi Okuda and Saman Amarasinghe } ,
year = { 2023 } ,
eprint = { 2308.15645 } ,
archivePrefix = { arXiv } ,
primaryClass = { cs.PL }
}