Kani (カニ) هو إطار خفيف الوزن وقابل للاختراق للغاية لنماذج اللغة القائمة على الدردشة مع استدعاء استخدام الأدوات/الدالة.
بالمقارنة مع أطر LM الأخرى ، فإن Kani أقل رأيًا ويقدم المزيد من التخصيص الدقيق على أجزاء من تدفق التحكم الذي يهم ، مما يجعله الخيار الأمثل للباحثين في NLP والهواة والمطورين على حد سواء.
يأتي Kani مع دعم للنماذج التالية خارج المربع ، مع إطار عمل غير محدد لإضافة دعم للعديد من:
نماذج مستضافة
نماذج مفتوحة المصدر
يدعم Kani كل نموذج دردشة متوفر على وجه المعانقة من خلال transformers
أو llama.cpp
!
على وجه الخصوص ، لدينا تطبيقات مرجعية للنماذج الأساسية التالية ، وضرباتها الدقيقة:
تحقق من حديقة حيوان Model لمعرفة كيفية استخدام كل من هذه النماذج في التطبيق الخاص بك!
مهتم بالمساهمة؟ تحقق من دليلنا.
قراءة المستندات على readthedocs!
اقرأ ورقتنا على Arxiv!
يتطلب Kani Python 3.10 أو أعلى. لتثبيت التبعيات الخاصة بالنموذج ، يستخدم Kani إضافات مختلفة (قوسين بعد اسم المكتبة في pip install
). لتحديد أي (أجهزة) الإضافية التي يجب تثبيتها ، راجع جدول النموذج ، أو استخدم [all]
إضافيًا لتثبيت كل شيء.
# for OpenAI models
$ pip install " kani[openai] "
# for Hugging Face models
$ pip install " kani[huggingface] " torch
# or install everything:
$ pip install " kani[all] "
للحصول على أحدث التغييرات والموديلات الجديدة ، يمكنك أيضًا تثبيت إصدار التطوير من فرع GIT main
:
$ pip install " kani[all] @ git+https://github.com/zhudotexe/kani.git@main "
يتطلب Kani Python 3.10 أو أعلى.
أولا ، تثبيت المكتبة. في هذا المنشار السريع ، سنستخدم محرك Openai ، على الرغم من أن Kani هو موديل.
$ pip install " kani[openai] "
بعد ذلك ، دعنا نستخدم Kani لإنشاء chatbot بسيط باستخدام ChatGPT كواجهة خلفية.
# import the library
import asyncio
from kani import Kani , chat_in_terminal
from kani . engines . openai import OpenAIEngine
# Replace this with your OpenAI API key: https://platform.openai.com/account/api-keys
api_key = "sk-..."
# kani uses an Engine to interact with the language model. You can specify other model
# parameters here, like temperature=0.7.
engine = OpenAIEngine ( api_key , model = "gpt-4o-mini" )
# The kani manages the chat state, prompting, and function calling. Here, we only give
# it the engine to call ChatGPT, but you can specify other parameters like
# system_prompt="You are..." here.
ai = Kani ( engine )
# kani comes with a utility to interact with a kani through your terminal...
chat_in_terminal ( ai )
# or you can use kani programmatically in an async function!
async def main ():
resp = await ai . chat_round ( "What is the airspeed velocity of an unladen swallow?" )
print ( resp . text )
asyncio . run ( main ())
يوفر Kani الوقت الكافي لإعداد نموذج دردشة العمل ، مع تقديم التخصيص العميق للمبرمج على كل مكالمة موجهة ، وحتى نموذج اللغة الأساسي.
يمنح استدعاء الوظيفة نماذج اللغة القدرة على اختيار وقت الاتصال بوظيفة تقدمها بناءً على وثائقها.
مع Kani ، يمكنك كتابة وظائف في Python وفضحها للنموذج مع سطر واحد فقط من التعليمات البرمجية: Decorator @ai_function
.
# import the library
import asyncio
from typing import Annotated
from kani import AIParam , Kani , ai_function , chat_in_terminal , ChatRole
from kani . engines . openai import OpenAIEngine
# set up the engine as above
api_key = "sk-..."
engine = OpenAIEngine ( api_key , model = "gpt-4o-mini" )
# subclass Kani to add AI functions
class MyKani ( Kani ):
# Adding the annotation to a method exposes it to the AI
@ ai_function ()
def get_weather (
self ,
# and you can provide extra documentation about specific parameters
location : Annotated [ str , AIParam ( desc = "The city and state, e.g. San Francisco, CA" )],
):
"""Get the current weather in a given location."""
# In this example, we mock the return, but you could call a real weather API
return f"Weather in { location } : Sunny, 72 degrees fahrenheit."
ai = MyKani ( engine )
# the terminal utility allows you to test function calls...
chat_in_terminal ( ai )
# and you can track multiple rounds programmatically.
async def main ():
async for msg in ai . full_round ( "What's the weather in Tokyo?" ):
print ( msg . role , msg . text )
asyncio . run ( main ())
يضمن Kani أن مكالمات الوظائف صالحة بحلول الوقت الذي تصل فيه إلى أساليبك مع السماح لك بالتركيز على كتابة التعليمات البرمجية. لمزيد من المعلومات ، تحقق من مستندات استدعاء الوظيفة.
يدعم Kani استجابات البث من نموذج اللغة الأساسية الكامنة ، حتى في وجود مكالمات الوظائف. تم تصميم Streaming لتكون مجموعة من الأساليب المتدلية لطرق chat_round
و full_round
، مما يتيح لك إعادة تشكيل الكود تدريجياً دون تركه في حالة مكسورة.
async def stream_chat ():
stream = ai . chat_round_stream ( "What does kani mean?" )
async for token in stream :
print ( token , end = "" )
print ()
msg = await stream . message () # or `await stream`
async def stream_with_function_calling ():
async for stream in ai . full_round_stream ( "What's the weather in Tokyo?" ):
async for token in stream :
print ( token , end = "" )
print ()
msg = await stream . message ()
الأطر الحالية لنماذج اللغات مثل Langchain و Simpleaichat هي رأي و/أو وزن ثقيل - فهي تحرر مطالبات المطورين تحت غطاء محرك السيارة ، ويشكلون تحديًا للتعلم ، ويصعب تخصيصه دون إضافة الكثير من الانتفاخات عالية الصيانة إلى قاعدة الكود الخاصة بك.
قمنا ببناء Kani كبديل أكثر مرونة وبسيطة وقوية. سيكون هناك تشبيه جيد بين الأطر هو القول إن Kani هو لانجشين كقارورة (أو fastapi) هو Django.
Kani مناسب للجميع من الباحثين الأكاديميين إلى المتخصصين في الصناعة إلى الهواة لاستخدامه دون القلق بشأن الاختراقات تحت الغطاء.
لمعرفة المزيد حول كيفية تخصيص Kani باستخدام أغلفة موجودة الخاصة بك ، ودعوة الوظائف ، وأكثر من ذلك ، اقرأ المستندات!
أو إلقاء نظرة على الأمثلة العملية في هذا الريبو.
تريد أن ترى كاني في العمل؟ باستخدام كمية 4 بت لتقليص النموذج ، نقوم بتشغيل Llama V2 كجزء من مجموعة الاختبار الخاصة بنا مباشرة على إجراءات GitHub:
https://github.com/zhudotexe/kani/actions/workflows/pytest.yml؟query=Branch٪3AMAIN+is٪3ASUCCESS
ما عليك سوى النقر على أحدث بناء لرؤية إخراج Llama!
يتكون فريق التطوير الأساسي من ثلاثة طلاب دكتوراه في قسم علوم الكمبيوتر والمعلومات بجامعة بنسلفانيا. نحن جميعًا أعضاء في مختبر البروفيسور كريس كاليسون-بورش ، حيث نعمل من أجل النهوض بمستقبل NLP.
نحن نستخدم Kani بنشاط في بحثنا ، ونهدف إلى الحفاظ على ما يرام مع ممارسات NLP الحديثة.
إذا كنت تستخدم Kani ، يرجى الاستشهاد بنا على النحو التالي:
@inproceedings{zhu-etal-2023-kani,
title = "Kani: A Lightweight and Highly Hackable Framework for Building Language Model Applications",
author = "Zhu, Andrew and
Dugan, Liam and
Hwang, Alyssa and
Callison-Burch, Chris",
editor = "Tan, Liling and
Milajevs, Dmitrijs and
Chauhan, Geeticka and
Gwinnup, Jeremy and
Rippeth, Elijah",
booktitle = "Proceedings of the 3rd Workshop for Natural Language Processing Open Source Software (NLP-OSS 2023)",
month = dec,
year = "2023",
address = "Singapore",
publisher = "Association for Computational Linguistics",
url = "https://aclanthology.org/2023.nlposs-1.8",
doi = "10.18653/v1/2023.nlposs-1.8",
pages = "65--77",
}
نود أن نشكر أعضاء مختبر كريس كاليسون-بورش على اختبارهم وردود الفعل التفصيلية على محتويات كل من ورقيتنا ومستودع Kani. بالإضافة إلى ذلك ، نود أن نشكر هنري تشو (لا علاقة للمؤلف الأول) على دعمه المبكر والمتحمس للمشروع.
يعتمد هذا البحث على العمل المدعوم جزئيًا من قبل مختبر أبحاث القوات الجوية (العقد FA8750-23-C-0507) ، وبرنامج IARPA Hiatus (العقد 2022-22072200005) ، و NSF (الجائزة 1928631). معتمدة للإصدار العام ، توزيع غير محدود. الآراء والاستنتاجات الواردة هنا هي آراء المؤلفين ويجب عدم تفسيرها على أنها تمثل بالضرورة السياسات الرسمية ، إما المعبر عنها أو الضمني ، من IARPA ، NSF ، أو الحكومة الأمريكية.