Kani (カニ) adalah kerangka kerja yang ringan dan sangat dapat diretas untuk model bahasa berbasis obrolan dengan panggilan penggunaan alat/fungsi.
Dibandingkan dengan kerangka kerja LM lainnya, Kani kurang memiliki pendapat dan menawarkan lebih banyak kemampuan kustomisasi berbutir halus atas bagian-bagian dari aliran kontrol yang penting, menjadikannya pilihan yang sempurna bagi para peneliti NLP, hobi, dan pengembang.
Kani hadir dengan dukungan untuk model-model berikut di luar kotak, dengan kerangka kerja model-agnostik untuk menambah dukungan lebih banyak:
Model yang di -host
Model Sumber Terbuka
Kani mendukung setiap model obrolan yang tersedia di Face memeluk melalui transformers
atau llama.cpp
!
Secara khusus, kami memiliki implementasi referensi untuk model dasar berikut, dan fine-tunes mereka:
Lihat Model Zoo untuk melihat cara menggunakan masing -masing model ini di aplikasi Anda!
Tertarik berkontribusi? Lihat panduan kami.
Baca dokumen di readthedocs!
Baca makalah kami di Arxiv!
Kani membutuhkan Python 3.10 atau lebih. Untuk menginstal ketergantungan model-spesifik, Kani menggunakan berbagai tambahan (braket setelah nama perpustakaan di pip install
). Untuk menentukan ekstra mana yang akan diinstal, lihat tabel model, atau gunakan ekstra [all]
untuk menginstal semuanya.
# for OpenAI models
$ pip install " kani[openai] "
# for Hugging Face models
$ pip install " kani[huggingface] " torch
# or install everything:
$ pip install " kani[all] "
Untuk perubahan terbaru dan model baru, Anda juga dapat menginstal versi pengembangan dari cabang main
Git:
$ pip install " kani[all] @ git+https://github.com/zhudotexe/kani.git@main "
Kani membutuhkan Python 3.10 atau lebih.
Pertama, instal perpustakaan. Di quickstart ini, kami akan menggunakan mesin OpenAI, meskipun Kani adalah model-agnostik.
$ pip install " kani[openai] "
Kemudian, mari kita gunakan Kani untuk membuat chatbot sederhana menggunakan chatgpt sebagai backend.
# 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 menyediakan waktu untuk mengatur model obrolan yang berfungsi pendek, sambil menawarkan promosi yang mendalam pada setiap prompt, panggilan fungsi, dan bahkan model bahasa yang mendasarinya.
Panggilan fungsi memberikan model bahasa kemampuan untuk memilih kapan harus memanggil fungsi yang Anda berikan berdasarkan dokumentasinya.
Dengan Kani, Anda dapat menulis fungsi di Python dan mengeksposnya ke model hanya dengan satu baris kode: dekorator @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 menjamin bahwa panggilan fungsi valid pada saat mereka mencapai metode Anda sambil memungkinkan Anda untuk fokus pada kode penulisan. Untuk informasi lebih lanjut, periksa fungsi dokumen yang menelepon.
Kani mendukung respons streaming dari model bahasa yang mendasari token-by-token, bahkan dengan adanya panggilan fungsi. Streaming dirancang untuk menjadi superset drop-in dari metode chat_round
dan full_round
, memungkinkan Anda untuk secara bertahap refactor kode Anda tanpa pernah meninggalkannya dalam keadaan rusak.
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 ()
Kerangka kerja yang ada untuk model bahasa seperti Langchain dan SimpleAichat memiliki pendapat dan/atau kelas berat - mereka mengedit petunjuk pengembang di bawah kap, menantang untuk dipelajari, dan sulit untuk disesuaikan tanpa menambahkan banyak pemeliharaan tinggi yang mementingkan basis kode Anda.
Kami membangun Kani sebagai alternatif yang lebih fleksibel, sederhana, dan kuat. Analogi yang baik antara kerangka kerja adalah dengan mengatakan bahwa Kani adalah dengan langchain sebagai labu (atau Fastapi) adalah untuk Django.
Kani cocok untuk semua orang dari peneliti akademik hingga profesional industri hingga penggemar untuk digunakan tanpa khawatir tentang peretasan di bawah-rumah.
Untuk mempelajari lebih lanjut tentang cara menyesuaikan Kani dengan pembungkus prompt Anda sendiri, panggilan fungsi, dan banyak lagi, baca dokumen!
Atau lihat contoh langsung dalam repo ini.
Ingin melihat Kani beraksi? Menggunakan kuantisasi 4-bit untuk mengecilkan model, kami menjalankan llama v2 sebagai bagian dari suite test kami tepat pada tindakan github:
https://github.com/zhudotexe/kani/actions/workflows/pytest.yml?Query=Branch%3Amain+is%3asuccess
Cukup klik build terbaru untuk melihat output Llama!
Tim pengembangan inti terbuat dari tiga mahasiswa PhD di Departemen Komputer dan Ilmu Informasi di University of Pennsylvania. Kita semua anggota laboratorium Prof. Chris Callison-Burch, berupaya memajukan masa depan NLP.
Kami menggunakan Kani secara aktif dalam penelitian kami, dan bertujuan untuk memperbarui dengan praktik NLP modern.
Jika Anda menggunakan Kani, silakan mengutip kami sebagai:
@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",
}
Kami ingin mengucapkan terima kasih kepada anggota lab Chris Callison-Burch atas pengujian mereka dan umpan balik terperinci tentang isi makalah kami dan repositori Kani. Selain itu, kami ingin mengucapkan terima kasih kepada Henry Zhu (tidak ada hubungannya dengan penulis pertama) atas dukungan awal dan antusiasnya dari proyek tersebut.
Penelitian ini didasarkan pada pekerjaan yang didukung sebagian oleh Laboratorium Penelitian Angkatan Udara (Kontrak FA8750-23-C-0507), Program Hiatus IARPA (Kontrak 2022-22072200005), dan NSF (penghargaan 1928631). Disetujui untuk rilis publik, Distribution Unlimited. Pandangan dan kesimpulan yang terkandung di sini adalah pandangan penulis dan tidak boleh ditafsirkan sebagai harus mewakili kebijakan resmi, baik diungkapkan maupun tersirat, dari IARPA, NSF, atau pemerintah AS.