قم بتبسيط حياتك باستخدام PromptingTools.JL ، حزمة Julia التي تبسط التفاعل مع نماذج اللغة الكبيرة.
promptingtools.jl ليس المقصود لبناء أنظمة واسعة النطاق. من المفترض أن تكون أداة الانتقال في بيئتك العالمية التي ستوفر لك 20 دقيقة كل يوم!
نصيحة
القفز إلى المستندات
@ai_str و TEMPLATING سهلة يعد البدء في PromptingTools.JL سهلاً مثل استيراد الحزمة واستخدام الماكرو @ai_str لأسئلتك.
ملاحظة: ستحتاج إلى تعيين مفتاح Openai API كمتغير للبيئة قبل استخدام PromptingTools.JL (انظر قسم مفتاح Createai API أدناه).
بعد تقديم الفواتير المدفوعة مقدمًا ، ستحتاج إلى شراء بعض الاعتمادات للبدء (5 دولارات كحد أدنى). لبداية سريعة ، ما عليك سوى تعيينه عبر ENV["OPENAI_API_KEY"] = "your-api-key"
تثبيت promptingtools:
using Pkg
Pkg . add ( " PromptingTools " )ونحن على استعداد للذهاب!
using PromptingTools
ai " What is the capital of France? "
# [ Info: Tokens: 31 @ Cost: $0.0 in 1.5 seconds --> Be in control of your spending!
# AIMessage("The capital of France is Paris.") الكائن الذي تم إرجاعه عبارة عن غلاف إضاءة مع رسالة تم إنشاؤها في الحقل :content (على سبيل المثال ، ans.content ) لمعالجة الإضافات الإضافية.
نصيحة
إذا كنت ترغب في الرد على الرسالة السابقة ، أو ببساطة متابعة المحادثة ، استخدم @ai!_str (لاحظ الانفجار ! ):
ai! " And what is the population of it? "يمكنك بسهولة ضخ أي متغيرات مع الاستيفاء السلسلة:
country = " Spain "
ai " What is the capital of $ (country)? "
# [ Info: Tokens: 32 @ Cost: $0.0001 in 0.5 seconds
# AIMessage("The capital of Spain is Madrid.") نصيحة
استخدم عوامل ما بعد السلسلة لتحديد النموذج المراد استدعاؤه ، على سبيل المثال ، ai"What is the capital of France?"gpt4 (استخدم gpt4t لنموذج GPT-4 الجديد). عظيم لتلك الأسئلة الصعبة الإضافية!
للحصول على قوالب موجهة أكثر تعقيدًا ، يمكنك استخدام templating على غرار المقاود وتوفير المتغيرات كوسائط للكلمة الرئيسية:
msg = aigenerate ( " What is the capital of {{country}}? Is the population larger than {{population}}? " , country = " Spain " , population = " 1M " )
# [ Info: Tokens: 74 @ Cost: $0.0001 in 1.3 seconds
# AIMessage("The capital of Spain is Madrid. And yes, the population of Madrid is larger than 1 million. As of 2020, the estimated population of Madrid is around 3.3 million people.") نصيحة
استخدم asyncmap لتشغيل مهام متعددة تعمل منظمة العفو الدولية بشكل متزامن.
نصيحة
@aai!_str كنت تستخدم النماذج البطيئة (مثل GPT -4) ، فيمكنك استخدام إصدار ASYNC من @ai_str -> @aai_str لتجنب حظر الاستبدال ، على سبيل المثال ، aai"Say hi but slowly!"gpt4 (بشكل مشابه @ai!_str
للحصول على المزيد من الأمثلة العملية ، راجع examples/ المجلد وقسم الأمثلة المتقدمة أدناه.
@ai_str و TEMPLATING سهلةai*airetry!aigenerate ( api_kwargs )الهندسة السريعة ليست سريعة ولا سهلة. علاوة على ذلك ، قد تتطلب النماذج المختلفة وضربها تنسيقات وحيل مختلفة ، أو ربما تتطلب المعلومات التي تعمل معها نماذج خاصة لاستخدامها. يهدف promptingtools.jl إلى توحيد المطالبات للخلفية المختلفة وإنشاء المهام الشائعة (مثل المطالبات المحببة) بأكبر قدر ممكن.
بعض الميزات:
aigenerate {{variable}}@ai_str String : احفظ ضربات المفاتيح مع ماكرو سلسلة لمطالبات بسيطةai... لتحسين الاكتشافai* وظائف جديرة بالملاحظة: aigenerate ، aiembed ، aiclassify ، aiextract ، aiscan ، aiimage ، aitemplates
جميع وظائف ai* لها نفس الهيكل الأساسي:
ai*(<optional schema>,<prompt or conversation>; <optional keyword arguments>) ،
لكنها تختلف في الغرض:
aigenerate هي الدالة للأغراض العامة لإنشاء أي استجابة نصية مع LLMS ، أي أنها تُرجع AIMessage مع الحقل :content الذي يحتوي على النص الذي تم إنشاؤه (على سبيل المثال ، ans.content isa AbstractString )aiembed لاستخراج التضمينات من استجابة نموذج الذكاء الاصطناعى ، أي أنه يعيد DataMessage مع الحقل :content الذي يحتوي على التضمينات (على سبيل المثال ، ans.content isa AbstractArray )aiextract لاستخراج البيانات المنظمة من استجابة نموذج الذكاء الاصطناعى وإعادتها كهيكل جوليا (على سبيل المثال ، إذا قدمنا return_type=Food ، فإننا نحصل على ans.content isa Food ). تحتاج إلى تحديد نوع الإرجاع أولاً ثم توفيره كوسيطة للكلمة الرئيسية.aitools لسير العمل Agentic مع مزيج من مكالمات الأدوات ومدخلات المستخدم. يمكن أن تعمل مع وظائف بسيطة وتنفيذها.aiclassify لتصنيف نص الإدخال إلى (أو ببساطة الاستجابة) مجموعة من choices المنفصلة التي يوفرها المستخدم. يمكن أن يكون مفيدًا جدًا كقاضي LLM أو جهاز توجيه لأنظمة RAG ، لأنه يستخدم "خدعة تحيز Logit" ويولد رمزًا واحدًا بالضبط. إنه يعيد AIMessage مع الحقل :content ، ولكن يمكن أن يكون :content واحدًا فقط من choices المقدمة (على سبيل المثال ، ans.content in choices )aiscan هو العمل مع الصور والنماذج التي تدعم الرؤية (كمدخلات) ، ولكنها تُرجع AIMessage مع الحقل :content الذي يحتوي على النص الذي تم إنشاؤه (على سبيل المثال ، ans.content isa AbstractString ) على غرار aigenerate .aiimage لتوليد الصور (على سبيل المثال ، مع Openai Dall-E 3). يقوم بإرجاع DataMessage ، حيث الحقل :content إما على عنوان URL لتنزيل الصورة من أو الصورة المشفرة BASE64 اعتمادًا على KWARG api_kwargs.response_format المقدمة من المستخدم.aitemplates هي وظيفة مساعد لاكتشاف القوالب المتاحة ومشاهدة تفاصيلها (على سبيل المثال ، aitemplates("some keyword") أو aitemplates(:AssistantAsk) )) إذا كنت تستخدم model معروفًا ، فلن تحتاج إلى تقديم schema (الوسيطة الأولى).
تميل وسيطات الكلمات الرئيسية الاختيارية في ai* إلى:
model::String - أي طراز تريد استخدامهverbose::Bool - ما إذا كنت قد ذهبت لرؤية سجلات المعلومات حول تكاليف الذكاء الاصطناعيreturn_all::Bool - سواء كنت تريد المحادثة بأكملها أو مجرد إجابة الذكاء الاصطناعي (أي ، سواء كنت تريد تضمين مدخلاتك/موجه في الإخراج)api_kwargs::NamedTuple - معلمات محددة للنموذج ، على سبيل المثال ، temperature=0.0 ليكون إبداعيًا (ولديها إخراج أكثر مشابهاً في كل تشغيل)http_kwargs::NamedTuple - معلمات حزمة http.jl ، على سبيل المثال ، readtimeout = 120 إلى وقت الخروج في 120 ثانية إذا لم يتم استلام أي رد.التجريبية: AgentTools
بالإضافة إلى القائمة أعلاه لوظائف ai* ، يمكنك أيضًا استخدام نظائر "كسول" لهذه الوظائف من وحدة العامل التجريبي.
using PromptingTools . Experimental . AgentTools على سبيل المثال ، سوف يخلق AIGenerate() مثيلًا كسولًا لـ aigenerate . إنه مثال على AICall مع aigenerate كوظيفة AI. يستخدم بالضبط نفس الوسائط ووسائط الكلمات الرئيسية كما aigenerate (انظر ?aigenerate للحصول على التفاصيل).
يشير "Lazy" إلى حقيقة أنه لا يولد أي إخراج عند إنشاء مثيله (فقط عند run! يتم استدعاء).
أو يتم قوله بشكل مختلف ، تم تصميم هيكل AICall وجميع نكهاته ( AIGenerate ، ...) لتسهيل نموذج التنفيذ المؤجل (التقييم البطيء) لوظائف الذكاء الاصطناعي التي تتفاعل مع نموذج تعلم اللغة (LLM). يقوم بتخزين المعلومات اللازمة لمكالمة AI وتنفذ وظيفة الذكاء الاصطناعى الأساسي فقط عند توفيرها باستخدام UserMessage أو عند run! يتم تطبيق الطريقة. هذا يسمح لنا بتذكر مدخلات المستخدم وتشغيل مكالمة LLM مرارًا وتكرارًا إذا لزم الأمر ، مما يتيح التثبيت التلقائي (انظر ?airetry! ).
إذا كنت ترغب في عمل سير عمل قوي ، يمكنك استخدام airetry! ، الذي يستفيد من البحث عن شجرة مونتي كارلو لاختيار المسار الأمثل للمحادثة بناءً على متطلباتك.
التجريبية: ragtools
أخيرًا ، نقدم مجموعة من الأدوات لبناء تطبيقات خرقة (استرداد ، الإجابة ، توليد).
يمكن أن تكون بسيطة مثل مكالمتين: build_index و airag (استرداد ، الإجابة ، توليد).
إذا كنت تستخدم الطباعة الجميلة مع PromptingTools.pprint ، فإننا نسلط الضوء على النص الذي تم إنشاؤه مقابل النص الذي يحتمل أن يتم الحصول عليه من السياق ونحن نسجل مدى قوة الإجابة التي تم إنشاؤها بواسطة السياق. بالإضافة إلى ذلك ، نقوم بتعليق كل قطعة تم إنشاؤها مع مرجع إلى المستند المصدر الذي من المحتمل أن يكون منه (بما في ذلك درجة الثقة بين 0 و 1).
بحث Google رائع ، لكنه مفتاح سياق. غالبًا ما يتعين عليك فتح بضع صفحات وقراءة المناقشة للعثور على الإجابة التي تحتاجها. نفس الشيء مع موقع chatgpt.
تخيل أنك في vscode ، تحرير ملف .gitignore الخاص بك. كيف أتجاهل ملفًا في جميع المجلدات الفرعية مرة أخرى؟
كل ما عليك فعله هو الكتابة: aai"What to write in .gitignore to ignore file XYZ in any folder or subfolder?"
مع aai"" (على عكس ai"" ) ، نقوم بإجراء مكالمة غير محظورة إلى LLM لعدم منعك من مواصلة عملك. عندما تكون الإجابة جاهزة ، نقوم بتسجيلها من الخلفية:
[معلومات: الرموز: 102 @ التكلفة: 0.0002 دولار في 2.7 ثانية ┌ المعلومات: AIMESSAGE> لتجاهل ملف يسمى "XYZ" في أي مجلد أو مجلد فرعي ، يمكنك إضافة السطر التالي إلى ملف .gitignore الخاص بك: │
│ **/XYZ │**يتجاهل.
ربما قمت بحفظ 3-5 دقائق في هذه المهمة وربما من 5 إلى 10 دقائق أخرى ، بسبب مفتاح السياق/الهاء الذي تجنبته. إنه فوز صغير ، لكنه يضيف بسرعة.
يمكنك استخدام دالة aigenerate لاستبدال متغيرات المقود (على سبيل المثال ، {{name}} ) عبر وسيطات الكلمات الرئيسية.
msg = aigenerate ( " Say hello to {{name}}! " , name = " World " ) تتمثل المطالبات الأكثر تعقيدًا بفعالية في محادثة (مجموعة من الرسائل) ، حيث يمكنك الحصول على رسائل من ثلاثة كيانات: النظام ، المستخدم ، aiassistant. نحن نقدم الأنواع المقابلة لكل منها: SystemMessage ، UserMessage ، AIMessage .
using PromptingTools : SystemMessage, UserMessage
conversation = [
SystemMessage ( " You're master Yoda from Star Wars trying to help the user become a Jedi. " ),
UserMessage ( " I have feelings for my {{object}}. What should I do? " )]
msg = aigenerate (conversation; object = " old iPhone " )AIMESSAGE ("آه ، معضلة ، لديك. يمكن للمرفق العاطفي أن يزعج طريقك إلى أن تصبح جديًا. لكي تكون مرتبطًا بالممتلكات المادية ، يجب ألا. iPhone ليس سوى أداة ، لا شيء أكثر من ذلك.
ابحث عن الانفصال ، يونغ بادوان. التفكير في عدم ثبات كل شيء. نقدر الذكريات التي قدمتها لك ، وامتنان طرق. في غيابها ، ابحث عن تجارب جديدة للنمو وتصبح واحدة مع القوة. عندها فقط ، جدي حقيقي ، ستصبح. ")
يمكنك أيضًا استخدامه لبناء المحادثات ، على سبيل المثال ،
new_conversation = vcat (conversation ... ,msg, UserMessage ( " Thank you, master Yoda! Do you have {{object}} to know what it feels like? " ))
aigenerate (new_conversation; object = " old iPhone " )Aimessage ("هم ، يمتلك جهاز iPhone قديمًا ، أنا لا.
مع LLMS ، تعتمد جودة / متانة نتائجك على جودة المطالبات الخاصة بك. لكن كتابة مطالبات صعبة! لهذا السبب نقدم نظامًا لتوفير الوقت والجهد.
لاستخدام قالب محدد (على سبيل المثال ، `` `لطرح لغة جوليا):
msg = aigenerate ( :JuliaExpertAsk ; ask = " How do I add packages? " ) ما سبق يعادل إصدارًا أكثر مطوّلة يستخدم بشكل صريح الإرسال على AITemplate :
msg = aigenerate ( AITemplate ( :JuliaExpertAsk ); ask = " How do I add packages? " ) ابحث عن القوالب المتاحة مع aitemplates :
tmps = aitemplates ( " JuliaExpertAsk " )
# Will surface one specific template
# 1-element Vector{AITemplateMetadata}:
# PromptingTools.AITemplateMetadata
# name: Symbol JuliaExpertAsk
# description: String "For asking questions about Julia language. Placeholders: `ask`"
# version: String "1"
# wordcount: Int64 237
# variables: Array{Symbol}((1,))
# system_preview: String "You are a world-class Julia language programmer with the knowledge of the latest syntax. Your commun"
# user_preview: String "# Questionnn{{ask}}"
# source: String ""يمنحك ما ورد أعلاه فكرة جيدة عن ماهية القالب ، وما هي العناصر النجمية المتوفرة ، ومقدار تكلفة استخدامه (= WordCount).
ابحث عن جميع القوالب المتعلقة بجوليا:
tmps = aitemplates ( " Julia " )
# 2-element Vector{AITemplateMetadata}... -> more to come later! إذا كنت على VSCODE ، يمكنك الاستفادة من شاشة جدولة لطيفة مع vscodedisplay :
using DataFrames
tmps = aitemplates ( " Julia " ) |> DataFrame |> vscodedisplay لدي قالب محدد ، كيف يمكنني استخدامه؟ ما عليك سوى استخدام "الاسم" في aigenerate أو aiclassify كما تراه في المثال الأول!
يمكنك فحص أي قالب عن طريق "تقديم" (هذا ما ستراه LLM):
julia > AITemplate ( :JudgeIsItTrue ) |> PromptingTools . renderرؤية المزيد من الأمثلة في الأمثلة/ المجلد.
يمكنك الاستفادة من asyncmap لتشغيل مهام متعددة تعمل منظمة العفو الدولية في وقت واحد ، وتحسين الأداء لعمليات الدُفعات.
prompts = [ aigenerate ( " Translate 'Hello, World!' to {{language}} " ; language) for language in [ " Spanish " , " French " , " Mandarin " ]]
responses = asyncmap (aigenerate, prompts)نصيحة
يمكنك الحد من عدد المهام المتزامنة مع الكلمة الرئيسية asyncmap(...; ntasks=10) .
بعض المهام تتطلب نماذج أكثر قوة. تحتوي جميع وظائف تواجه المستخدم على model وسيطة للكلمة الرئيسية يمكن استخدامها لتحديد النموذج المراد استخدامه. على سبيل المثال ، يمكنك استخدام model = "gpt-4-1106-preview" لاستخدام أحدث طراز GPT-4 Turbo. ومع ذلك ، لا أحد يريد كتابة ذلك!
نحن نقدم مجموعة من الأسماء المستعارة النموذجية (على سبيل المثال ، "GPT3" ، "GPT4" ، "GPT4T" -> Turbo GPT -4 أعلاه ، إلخ) التي يمكن استخدامها بدلاً من ذلك.
كل ai... اتصل أولاً بأعلى اسم النموذج المقدم في القاموس PromptingTools.MODEL_ALIASES ، بحيث يمكنك تمديدها بسهولة مع الأسماء المستعارة الخاصة بك!
const PT = PromptingTools
PT . MODEL_ALIASES[ " gpt4t " ] = " gpt-4-1106-preview " يمكن أيضًا استخدام هذه الأسماء المستعارة كعلامات في الماكرو @ai_str ، على سبيل المثال ، ai"What is the capital of France?"gpt4t (GPT-4 Turbo لديها قطع معارف في أبريل 2023 ، لذلك فهي مفيدة للأسئلة المعاصرة).
استخدم وظيفة aiembed لإنشاء التضمينات عبر نموذج Openai الافتراضي الذي يمكن استخدامه للبحث الدلالي ، والتجميع ، وسير العمل أكثر تعقيدًا.
text_to_embed = " The concept of artificial intelligence. "
msg = aiembed (text_to_embed)
embedding = msg . content # 1536-element Vector{Float64}إذا كنت تخطط لحساب مسافة جيب التمام بين التضمينات ، فيمكنك تطبيعها أولاً:
using LinearAlgebra
msg = aiembed ([ " embed me " , " and me too " ], LinearAlgebra . normalize)
# calculate cosine distance between the two normalized embeddings as a simple dot product
msg . content ' * msg . content[:, 1 ] # [1.0, 0.787] يمكنك استخدام دالة aiclassify لتصنيف أي عبارة مقدمة على أنها حقيقية/خاطئة/غير معروفة. هذا مفيد لتكسير الحقائق ، والهلوسة أو الشيكات NLI ، والاعتدال ، والتصفية ، وتحليل المشاعر ، وهندسة الميزات والمزيد.
aiclassify ( " Is two plus two four? " )
# trueيمكن استخدام مطالبات النظام والنماذج ذات الجودة العالية للمهام الأكثر تعقيدًا ، بما في ذلك معرفة متى يجب الإرشاد إلى الإنسان:
aiclassify ( :JudgeIsItTrue ; it = " Is two plus three a vegetable on Mars? " , model = " gpt4t " )
# unknown في المثال أعلاه ، استخدمنا قالبًا موجهًا :JudgeIsItTrue ، والذي يتوسع تلقائيًا إلى موجه النظام التالي (ومطالبة مستخدم منفصلة):
"أنت قاضٍ منظمة العفو الدولية المحايدة يقيم ما إذا كان البيان المقدم" صحيحًا "أو" خطأ ". الإجابة" غير معروف "إذا لم تتمكن من اتخاذ قرار".
لمزيد من المعلومات حول القوالب ، راجع قسم المطالبات المقدر.
يمكن استخدام aiclassify أيضًا للتصنيف في مجموعة من الفئات المحددة (الحد الأقصى 20) ، حتى نتمكن من استخدامه للتوجيه.
بالإضافة إلى ذلك ، إذا قمت بتقديم الخيارات كـ tuples ( (label, description) ) ، فسيستخدم النموذج الأوصاف لتحديده ، لكنه سيعيد الملصقات.
مثال:
choices = [( " A " , " any animal or creature " ), ( " P " , " for any plant or tree " ), ( " O " , " for everything else " )]
input = " spider "
aiclassify ( :InputClassifier ; choices, input) # -> returns "A" for any animal or creature
# Try also with:
input = " daphodil " # -> returns "P" for any plant or tree
input = " castle " # -> returns "O" for everything elseتحت الغطاء ، نستخدم خدعة "Logit Bias" لإجبار الرمز المميز الذي تم إنشاؤه فقط - وهذا يعني أنها رخيصة جدًا وسريعة جدًا!
هل سئمت من استخراج البيانات باستخدام Regex؟ يمكنك استخدام LLMs لاستخراج البيانات المنظمة من النص!
كل ما عليك فعله هو تحديد بنية البيانات التي تريد استخراجها وسيقوم LLM بالباقي.
تحديد return_type مع بنية. توفير docstrings إذا لزم الأمر (يحسن النتائج ويساعد في الوثائق).
لنبدأ بمهمة صعبة - استخراج الطقس الحالي في موقع معين:
@enum TemperatureUnits celsius fahrenheit
""" Extract the current weather in a given location
# Arguments
- `location`: The city and state, e.g. "San Francisco, CA"
- `unit`: The unit of temperature to return, either `celsius` or `fahrenheit`
"""
struct CurrentWeather
location :: String
unit :: Union{Nothing,TemperatureUnits}
end
# Note that we provide the TYPE itself, not an instance of it!
msg = aiextract ( " What's the weather in Salt Lake City in C? " ; return_type = CurrentWeather)
msg . content
# CurrentWeather("Salt Lake City, UT", celsius)ولكن يمكنك استخدامه حتى في المهام الأكثر تعقيدًا ، مثل استخراج العديد من الكيانات من النص:
" Person's age, height, and weight. "
struct MyMeasurement
age :: Int
height :: Union{Int,Nothing}
weight :: Union{Nothing,Float64}
end
struct ManyMeasurements
measurements :: Vector{MyMeasurement}
end
msg = aiextract ( " James is 30, weighs 80kg. He's 180cm tall. Then Jack is 19 but really tall - over 190! " ; return_type = ManyMeasurements)
msg . content . measurements
# 2-element Vector{MyMeasurement}:
# MyMeasurement(30, 180, 80.0)
# MyMeasurement(19, 190, nothing) حتى أن هناك غلاف لمساعدتك على الالتحاق بأخطاء مع تفسيرات مفيدة حول سبب فشل التحليل. انظر ?PromptingTools.MaybeExtract لمزيد من المعلومات.
مع وظيفة aiscan ، يمكنك التفاعل مع الصور كما لو كانت نصًا.
يمكنك ببساطة وصف صورة متوفرة:
msg = aiscan ( " Describe the image " ; image_path = " julia.png " , model = " gpt4v " )
# [ Info: Tokens: 1141 @ Cost: $0.0117 in 2.2 seconds
# AIMessage("The image shows a logo consisting of the word "julia" written in lowercase") أو يمكنك القيام بصفة مربية من لقطة شاشة. دعنا نسخّل بعض رمز SQL من لقطة شاشة (لا مزيد من إعادة الترتيب!) ، نستخدم قالبًا :OCRTask :
# Screenshot of some SQL code
image_url = " https://www.sqlservercentral.com/wp-content/uploads/legacy/8755f69180b7ac7ee76a69ae68ec36872a116ad4/24622.png "
msg = aiscan ( :OCRTask ; image_url, model = " gpt4v " , task = " Transcribe the SQL code in the image. " , api_kwargs = (; max_tokens = 2500 ))
# [ Info: Tokens: 362 @ Cost: $0.0045 in 2.5 seconds
# AIMessage("```sql
# update Orders <continue>يمكنك إضافة تمييز بناء الجملة للمخرجات عن طريق تخفيض الطلب
using Markdown
msg . content |> Markdown . parseairetry!هذه ميزة تجريبية ، لذلك عليك استيرادها بشكل صريح:
using PromptingTools . Experimental . AgentTools تقدم هذه الوحدة نظيرات "كسول" إلى وظائف ai... حتى تتمكن من استخدامها بطريقة أكثر تحكمًا ، على سبيل المثال ، aigenerate -> AIGenerate (لاحظ Camelcase) ، والتي لها نفس الحجج بالضبط باستثناء توليدها فقط عند run! يسمى.
على سبيل المثال:
out = AIGenerate ( " Say hi! " ; model = " gpt4t " )
run! (out) كيف هي مفيدة؟ يمكننا استخدام نفس "المدخلات" للمكالمات المتكررة ، على سبيل المثال ، عندما نريد التحقق من صحة أو تجديد بعض المخرجات. لدينا وظيفة airetry لمساعدتنا في ذلك.
توقيع airetry! Is airetry!(condition_function, aicall::AICall, feedback_function) . يقوم بتقييم الشرط condition_function على كائن aicall (على سبيل المثال ، نقوم بتقييم f_cond(aicall) -> Bool ). إذا فشلت ، فإننا نسمي feedback_function على كائن aicall لتقديم ملاحظات لنموذج الذكاء الاصطناعى (على سبيل المثال ، f_feedback(aicall) -> String ) وكرر العملية حتى تمر أو حتى يتم تجاوز قيمة max_retries .
يمكننا التقاط فشل API (لا حاجة إلى ملاحظات ، لذلك لا يتم توفير أي منها)
# API failure because of a non-existent model
# RetryConfig allows us to change the "retry" behaviour of any lazy call
out = AIGenerate ( " say hi! " ; config = RetryConfig (; catch_errors = true ),
model = " NOTEXIST " )
run! (out) # fails
# we ask to wait 2s between retries and retry 2 times (can be set in `config` in aicall as well)
airetry! (isvalid, out; retry_delay = 2 , max_retries = 2 )أو يمكننا التحقق من صحة بعض المخرجات (على سبيل المثال ، تنسيقه ، محتوىه ، إلخ)
سنلعب لعبة تخمين بالألوان (أفكر "أصفر"):
# Notice that we ask for two samples (`n_samples=2`) at each attempt (to improve our chances).
# Both guesses are scored at each time step, and the best one is chosen for the next step.
# And with OpenAI, we can set `api_kwargs = (;n=2)` to get both samples simultaneously (cheaper and faster)!
out = AIGenerate (
" Guess what color I'm thinking. It could be: blue, red, black, white, yellow. Answer with 1 word only " ;
verbose = false ,
config = RetryConfig (; n_samples = 2 ), api_kwargs = (; n = 2 ))
run! (out)
# # Check that the output is 1 word only, third argument is the feedback that will be provided if the condition fails
# # Notice: functions operate on `aicall` as the only argument. We can use utilities like `last_output` and `last_message` to access the last message and output in the conversation.
airetry! (x -> length ( split ( last_output (x), r" | \ . " )) == 1 , out,
" You must answer with 1 word only. " )
# Note: you could also use the do-syntax, eg,
airetry! (out, " You must answer with 1 word only. " ) do aicall
length ( split ( last_output (aicall), r" | \ . " )) == 1
end يمكنك وضع عدة airetry! يدعو في تسلسل. سوف يستمرون في إعادة المحاولة حتى ينفد من مكالمات الذكاء الاصطناعى المسموح بها ( max_calls ) أو عمليات إعادة المحاكاة القصوى ( max_retries ).
انظر المستندات للحصول على أمثلة أكثر تعقيدًا ونصائح الاستخدام ( ?airetry ). نحن نستفيد من Monte Carlo Tree Search (MCTS) لتحسين تسلسل إعادة المحاولة ، لذلك فهي أداة قوية للغاية لبناء مهام سير عمل قوية من الذكاء الاصطناعي (مستوحاة من ورقة البحث عن شجرة وكيل اللغة وورقة تأكيدات DSPY).
Ollama.ai هي أداة بسيطة بشكل مثير للدهشة تتيح لك تشغيل العديد من نماذج اللغة الكبيرة (LLM) على جهاز الكمبيوتر الخاص بك. إنه مناسب بشكل خاص عندما تعمل مع بعض البيانات الحساسة التي لا ينبغي إرسالها إلى أي مكان.
لنفترض أنك قمت بتثبيت Ollama ، وقمت بتنزيل نموذج ، وهو يعمل في الخلفية.
يمكننا استخدامه مع وظيفة aigenerate :
const PT = PromptingTools
schema = PT . OllamaSchema () # notice the different schema!
msg = aigenerate (schema, " Say hi! " ; model = " openhermes2.5-mistral " )
# [ Info: Tokens: 69 in 0.9 seconds
# AIMessage("Hello! How can I assist you today?") للحصول على النماذج الشائعة التي تم تسجيلها (انظر ?PT.MODEL_REGISTRY ) ، لا تحتاج إلى توفير المخطط بشكل صريح:
msg = aigenerate ( " Say hi! " ; model = " openhermes2.5-mistral " ) ويمكننا أيضًا استخدام وظيفة aiembed :
msg = aiembed (schema, " Embed me " , copy; model = " openhermes2.5-mistral " )
msg . content # 4096-element JSON3.Array{Float64...
msg = aiembed (schema, [ " Embed me " , " Embed me " ]; model = " openhermes2.5-mistral " )
msg . content # 4096×2 Matrix{Float64}: يمكنك الآن استخدام aiscan لتوفير صور لنماذج Ollama! انظر المستندات لمزيد من المعلومات.
إذا كنت تحصل على أخطاء ، تحقق من أن Ollama قيد التشغيل - راجع دليل الإعداد لقسم Ollama أدناه.
لطالما كانت نماذج ميسترا تهيمن على مساحة مفتوحة المصدر. وهي متوفرة الآن عبر واجهة برمجة التطبيقات الخاصة بهم ، حتى تتمكن من استخدامها مع promptingtools.jl!
msg = aigenerate ( " Say hi! " ; model = " mistral-tiny " ) كل هذا يعمل فقط ، لأننا قمنا بتسجيل النماذج في PromptingTools.MODEL_REGISTRY ! تتوفر حاليًا 4 نماذج: mistral-tiny ، mistral-small ، mistral-medium ، mistral-embed .
تحت غطاء المحرك ، نستخدم مخططًا مخصصًا MistralOpenAISchema الذي يستفيد من معظم قاعدة الكود الخاصة بـ Openai ، بحيث يمكنك دائمًا توفير ذلك صراحة كوسيطة أولى:
const PT = PromptingTools
msg = aigenerate (PT . MistralOpenAISchema (), " Say Hi! " ; model = " mistral-tiny " , api_key = ENV [ " MISTRAL_API_KEY " ]) كما ترون ، يمكننا تحميل مفتاح API الخاص بك إما من ENV أو عبر تفضيلات. jl (انظر ?PREFERENCES لمزيد من المعلومات).
لكن ميسترالاي ليست الوحيدة! هناك العديد من مقدمي الخدمات المثيرة الآخرين ، على سبيل المثال ، Perplexity.ai ، الألعاب النارية. طالما أنها متوافقة مع API Openai (على سبيل المثال ، إرسال messages مع مفاتيح role content ) ، يمكنك استخدامها مع promptoools.jl باستخدام schema = CustomOpenAISchema() :
# Set your API key and the necessary base URL for the API
api_key = " ... "
prompt = " Say hi! "
msg = aigenerate (PT . CustomOpenAISchema (), prompt; model = " my_model " , api_key, api_kwargs = (; url = " http://localhost:8081 " ))كما ترون ، فإنه يعمل أيضًا مع أي نماذج محلية قد تكون تعمل على جهاز الكمبيوتر الخاص بك!
ملاحظة: في الوقت الحالي ، ندعم وظائف aigenerate و aiembed فقط من أجل MISTRALAI وغيرها من واجهات برمجة التطبيقات المتوافقة مع OPERAI. نخطط لتوسيع الدعم في المستقبل.
تأكد من ضبط متغير البيئة ANTHROPIC_API_KEY على مفتاح API الخاص بك.
# cladeuh is alias for Claude 3 Haiku
ai " Say hi! " claudeh الأسماء المستعارة المسبقة هي claudeo ، claudes ، claudeh ، لكلود 3 أوبوس ، السوناتة ، وهايكو ، على التوالي.
المخطط المقابل هو AnthropicSchema .
هناك العديد من القوالب السريعة التي تحتوي على XML في الاسم ، مما يشير إلى أنها تستخدم تنسيق XML الصديق للأنثروب. ابحث عنهم مع aitemplates("XML") .
# cladeo is alias for Claude 3 Opus
msg = aigenerate (
:JuliaExpertAskXML , ask = " How to write a function to convert Date to Millisecond? " ,
model = " cladeo " )TBU ...
ابحث عن المزيد من الأمثلة في الأمثلة/ المجلد.
الحزمة مبنية حول ثلاثة عناصر رئيسية:
aigenerate ، aiembed ، aiclassify ) لماذا هذا التصميم؟ واجهات برمجة التطبيقات المختلفة تتطلب تنسيقات موجهة مختلفة. على سبيل المثال ، تتطلب واجهة برمجة تطبيقات Openai مجموعة من القواميس ذات حقول role content ، في حين تتطلب API الخاصة بـ Ollama لنموذج Zephyr-7B مخطط chatml مع سلسلة واحدة كبيرة وفواصل مثل <|im_start|>usernABC...<|im_end|>user . لفصل الأقسام في موجه ، يفضل Openai رؤوس Markdown ( ##Response ) مقابل أنثروبور يؤدي بشكل أفضل مع علامات HTML ( <text>{{TEXT}}</text> ).
هذه الحزمة مستوحاة بشدة من المدرب واستخدامها الذكي لاتصالات الاتصالات الوظيفية.
مخططات سريعة
نوع المفتاح المستخدم لتخصيص منطق إعداد المدخلات لـ LLMS والاتصال بها (عبر إرسال متعددة).
كلها من أنواع فرعية من AbstractPromptSchema وكل وظيفة مهمة لها توقيع عام مع مخطط في الموقف الأول foo(schema::AbstractPromptSchema,...)
يتم تعريف الإرسال على حد سواء عن "تقديم" المطالبات ( render ) وللاستدعاء واجهات برمجة التطبيقات ( aigenerate ).
من الناحية المثالية ، سيتم تعريف كل واجهة جديدة في ملف llm_<interface>.jl منفصل (على سبيل المثال ، llm_openai.jl ).
رسائل
المطالبات هي بشكل فعال محادثة ليتم الانتهاء منها.
تميل المحادثات إلى وجود ثلاثة ممثلين رئيسيين: النظام (للتعليمات الشاملة) ، والمستخدم (للمدخلات/البيانات) ، ومساعد الذكاء الاصطناعي (للمخرجات). نحن نوفر أنواع SystemMessage و UserMessage و AIMessage لكل منها.
بالنظر إلى مخطط موجه ورسالة واحدة أو أكثر ، يمكنك render الكائن الناتج ليتم إطعامه في واجهة برمجة تطبيقات النموذج. على سبيل المثال ، لـ Openai
using PromptingTools : render, SystemMessage, UserMessage
PT = PromptingTools
schema = PT . OpenAISchema () # also accessible as the default schema `PT.PROMPT_SCHEMA`
conversation = conversation = [
SystemMessage ( " Act as a helpful AI assistant. Provide only the information that is requested. " ),
UserMessage ( " What is the capital of France? " )]
messages = render (schema, conversation)
# 2-element Vector{Dict{String, String}}:
# Dict("role" => "system", "content" => "Act as a helpful AI assistant. Provide only the information that is requested.")
# Dict("role" => "user", "content" => "What is the capital of France?")يمكن توفير هذا الكائن مباشرة إلى API Openai.
وظائف موجهة نحو المهمة
تتمثل الطموح في توفير مجموعة من الوظائف سهلة التذكر للمهام الشائعة ، وبالتالي ، تبدأ جميعها بـ ai... يجب أن تُرجع جميع الوظائف غلافًا للضوء مع الاستجابات الناتجة. في الوقت الحالي ، يمكن أن يكون AIMessage فقط (لأي استجابة قائمة على النص) أو DataMessage عام (للبيانات المنظمة مثل التضمين).
بالنظر إلى الاختلافات في واجهات برمجة التطبيقات النموذجية ومعلماتها (على سبيل المثال ، Openai API vs Ollama) ، يتم إرسال وظائف المهام على schema::AbstractPromptSchema كحجة أولى.
راجع src/llm_openai.jl للحصول على مثال. سيتم تعريف كل واجهة جديدة في ملف منفصل llm_<interface>.jl .
نماذج Openai في طليعة أبحاث الذكاء الاصطناعي وتوفر إمكانات قوية وحديثة للعديد من المهام.
ستكون هناك مواقف لا أو لا يمكن استخدامها (على سبيل المثال ، الخصوصية ، التكلفة ، إلخ). في هذه الحالة ، يمكنك استخدام النماذج المحلية (على سبيل المثال ، Ollama) أو واجهات برمجة التطبيقات الأخرى (على سبيل المثال ، الإنسان).
ملاحظة: للبدء مع Ollama.ai ، راجع دليل الإعداد لقسم Ollama أدناه.
هناك العديد من البدائل:
في وقت كتابة هذا التقرير ، لا يستخدم Openai مكالمات API لتدريب نماذجها.
API
لا يستخدم Openai البيانات المقدمة إلى وإنشاء API وتولدها لتدريب نماذج Openai أو تحسين عرض خدمة Openai. من أجل دعم التحسين المستمر لنماذجنا ، يمكنك ملء هذا النموذج للاضطراب لمشاركة بياناتك معنا. - كيف يتم استخدام بياناتك لتحسين نماذجنا
يمكنك دائمًا التحقق من أحدث المعلومات حول كيفية استخدام صفحة البيانات الخاصة بك.
موارد:
يمكنك الحصول على مفتاح API الخاص بك من Openai من خلال الاشتراك في حساب والوصول إلى قسم API في موقع Openai.
موارد:
نصيحة
قم دائمًا بتعيين حدود الإنفاق!
يتيح لك Openai تعيين حدود الإنفاق مباشرة على لوحة معلومات حسابك لمنع تكاليف غير متوقعة.
قد تكون البداية الجيدة بمثابة حد ناعم قدره 5 دولارات وحد صلب قدره 10 دولارات - يمكنك دائمًا زيادة في وقت لاحق من الشهر.
موارد:
إذا كنت تستخدم نموذجًا محليًا (على سبيل المثال ، مع Ollama) ، فهو مجاني. إذا كنت تستخدم أي واجهات برمجة تطبيقات تجارية (على سبيل المثال ، Openai) ، فمن المحتمل أن تدفع لكل "رمز" (وحدة كلمة فرعية).
على سبيل المثال ، هناك طلب بسيط مع سؤال بسيط ورد واحد على الجملة في المقابل ("هو بيان XYZ تعليق إيجابي") سيكلفك ~ 0.0001 دولار (أي ، مائة مئوية)
هل يستحق الدفع مقابل؟
Genai هي وسيلة لشراء الوقت! يمكنك دفع سنتات لتوفير عشرات الدقائق كل يوم.
مواصلة المثال أعلاه ، تخيل أن لديك جدولًا يحتوي على 200 تعليق. الآن ، يمكنك تحليل كل واحد منهم مع LLM للميزات/الشيكات التي تحتاجها. على افتراض أن السعر لكل مكالمة كان 0.0001 دولار ، فإنك تدفع 2 سنتًا للوظيفة وتوفير 30-60 دقيقة من وقتك!
موارد:
هذا دليل لمفتاح API الخاص بـ Openai ، ولكنه يعمل مع أي مفتاح API آخر قد تحتاجه (على سبيل المثال ، MISTRAL_API_KEY من أجل MISTRALAI API).
لاستخدام API Openai مع promptingtools.jl ، قم بتعيين مفتاح API الخاص بك كمتغير للبيئة:
ENV [ " OPENAI_API_KEY " ] = " your-api-key "كمرة واحدة ، يمكنك:
export OPENAI_API_KEY = <your key>setup.jl (تأكد من عدم الالتزام به GitHub!) تأكد من بدء جوليا من نفس النافذة الطرفية حيث تقوم بتعيين المتغير. من السهل التحقق من Julia ، Run ENV["OPENAI_API_KEY"] ويجب أن ترى مفتاحك!
طريقة أفضل:
~/.zshrc ). سيتم تحميله تلقائيًا في كل مرة تقوم فيها بتشغيل المحطة PromptingTools.set_preferences!("OPENAI_API_KEY"=>"your-api-key") ندعم أيضًا تفضيلات. للاطلاع على التفضيلات الحالية ، قم بتشغيل PromptingTools.get_preferences("OPENAI_API_KEY") .
احرص على عدم ارتكاب LocalPreferences.toml .
موارد:
aigenerate ( api_kwargs )انظر Openai API Reference لمزيد من المعلومات.
لسهولة الوصول من أي مكان ، أضف promptingtools إلى startup.jl الخاص بك (يمكن العثور عليه في ~/.julia/config/startup.jl ).
أضف المقتطف التالي:
using PromptingTools
const PT = PromptingTools # to access unexported functions and types
الآن ، يمكنك فقط استخدام ai"Help me do X to achieve Y" من أي جلسة استبدال!
إن روح PromptingTools.JL هي السماح لك باستخدام أي نموذج تريده ، والذي يتضمن LLMs مفتوح المصدر. الأكثر شعبية وأسهل في الإعداد هو Ollama.ai - انظر أدناه لمزيد من المعلومات.
تقوم Ollama بتشغيل خدمة خلفية تستضيف LLMs التي يمكنك الوصول إليها عبر واجهة برمجة تطبيقات بسيطة. إنه مفيد بشكل خاص عندما تعمل مع بعض البيانات الحساسة التي لا ينبغي إرسالها إلى أي مكان.
التثبيت سهل للغاية ، فقط قم بتنزيل أحدث إصدار هنا.
بمجرد تثبيته ، ما عليك سوى تشغيل التطبيق وأنت مستعد للذهاب!
للتحقق مما إذا كان يعمل ، انتقل إلى متصفحك وافتح 127.0.0.1:11434 . يجب أن ترى رسالة "Ollama تعمل". بدلاً من ذلك ، يمكنك تشغيل ollama serve في المحطة الخاصة بك وستحصل على رسالة بأنها تعمل بالفعل.
هناك العديد من النماذج المتوفرة في مكتبة Ollama ، بما في ذلك LLAMA2 أو Codellama أو SQLCODER أو بلدي المفضل openhermes2.5-mistral .
قم بتنزيل نماذج جديدة مع ollama pull <model_name> (على سبيل المثال ، ollama pull openhermes2.5-mistral ).
عرض النماذج المتاحة حاليًا مع ollama list .
انظر Ollama.ai لمزيد من المعلومات.
يعد التكييف تقنية قوية لتكييف نموذج مع حالة الاستخدام المحددة (معظمها من التنسيق/بناء الجملة/المهمة). يتطلب مجموعة بيانات من الأمثلة ، والتي يمكنك الآن توليدها بسهولة باستخدام promptingtools.jl!
يمكنك حفظ أي محادثة (متجه الرسائل) إلى ملف مع PT.save_conversation("filename.json", conversation) .
بمجرد أن يحين الوقت المحدد ، قم بإنشاء مجموعة من المحادثات التي تنظمها ShareGPT (تنسيق شائع في الحدود المعدنية) في ملف .jsonl واحد. استخدم PT.save_conversations("dataset.jsonl", [conversation1, conversation2, ...]) (لاحظ أن "المحادثات" في اسم الوظيفة).
للحصول على مثال على عملية التغذية الشاملة ، تحقق من تجربة شقيقنا Juliallmleaderboard. إنه يوضح عملية التغلب على نصف دولار مع Jarvislabs.ai و Axolotl.
هذه قائمة بالميزات التي أود رؤيتها في المستقبل (في أي ترتيب معين):
لمزيد من المعلومات أو المساهمات أو الأسئلة ، يرجى زيارة مستودع github promptingtools.jl.
يرجى ملاحظة أنه على الرغم من أن promptingtools.jl يهدف إلى توفير تجربة سلسة ، فإنها تعتمد على واجهات برمجة التطبيقات الخارجية التي قد تتغير. ترقبوا المستودع للحصول على التحديثات والميزات الجديدة.
شكرًا لك على اختيار promptingtools.jl لتمكين طلباتك مع الذكاء الاصطناعي!