Kani (カニ)-это легкая и высококачественная структура для языковых моделей на основе чата с вызовом использования инструмента/функции.
По сравнению с другими рамками LM, KANI менее самоуверенна и предлагает более мелкозернистую настраиваемость над частями потока управления, что делает его идеальным выбором для исследователей НЛП, любителей и разработчиков.
Кани поставляется с поддержкой следующих моделей из коробки, с моделью-алкогольной структурой, чтобы добавить поддержку многим другим:
Размещенные модели
Модели с открытым исходным кодом
Кани поддерживает каждую модель чата, доступную для обнимания лица через transformers
или llama.cpp
!
В частности, у нас есть эталонные реализации для следующих базовых моделей и их тонкие настройки:
Проверьте зоопарк модели, чтобы увидеть, как использовать каждую из этих моделей в вашем приложении!
Заинтересованы в содействии? Проверьте наше руководство.
Прочитайте документы на Readthedocs!
Прочитайте нашу газету на Arxiv!
Кани требует Python 3.10 или выше. Чтобы установить зависимости, специфичные для модели, Кани использует различные дополнения (кронштейны после названия библиотеки в 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] "
Для самых современных изменений и новых моделей вы также можете установить версию разработки из main
филиала GIT:
$ pip install " kani[all] @ git+https://github.com/zhudotexe/kani.git@main "
Кани требует Python 3.10 или выше.
Сначала установите библиотеку. В этом QuickStart мы будем использовать двигатель Openai, хотя Кани является модельным агентом.
$ pip install " kani[openai] "
Затем давайте используем Кани, чтобы создать простой чат -бот, используя чатт в качестве бэкэнда.
# 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 и выставить их на модель только одной строкой кода: декоратор @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 ())
Кани гарантирует, что вызовы функций действительны к тому времени, когда они достигают ваших методов, позволяя вам сосредоточиться на написании кода. Для получения дополнительной информации ознакомьтесь с функцией вызова документов.
Кани поддерживает потоковые ответы из базовой языковой модели токеной, даже при наличии функциональных вызовов. Потоковая передача предназначена для того, чтобы быть суперсет методов 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, являются самоуверенными и/или тяжеловеса - они редактируют подсказки разработчиков под капотом, трудно выучить, и их трудно настроить, не добавляя много высокого уровня в вашей кодовой базе.
Мы создали Кани как более гибкую, простую и надежную альтернативу. Хорошей аналогией между рамками было бы сказать, что Кани для Лэнгкейна, как колба (или фастпи), - это Джанго.
Кани подходит для всех, от академических исследователей до профессионалов отрасли и любителей, которые можно использовать, не беспокоясь о взломах под капюшоном.
Чтобы узнать больше о том, как настроить Кани с помощью ваших собственных оперативных оберток, функционировать и многое другое, прочитайте документы!
Или взгляните на практические примеры в этом репо.
Хотите увидеть Кани в действии? Используя 4-битное квантование для сокращения модели, мы запускаем Llama V2 как часть нашего тестового набора прямо на действиях GitHub:
https://github.com/zhudotexe/kani/actions/workflows/pytest.yml?query=branch%3Amain+%3ASUCCESS
Просто нажмите на последнюю сборку, чтобы увидеть вывод Llama!
Основная группа разработчиков состоит из трех докторантов на факультете компьютерных и информационных наук в Университете Пенсильвании. Мы все члены лаборатории профессора Криса Кэллисон-Берч, работая над продвижением будущего НЛП.
Мы активно используем Кани в наших исследованиях и стремимся к тому, чтобы поддерживать его в современных практиках НЛП.
Если вы используете Кани, пожалуйста, цитируйте нас как:
@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",
}
Мы хотели бы поблагодарить членов лаборатории Криса Кэллисон-Берч за их тестирование и подробные отзывы о содержании как нашей статьи, так и в репозитории Кани. Кроме того, мы хотели бы поблагодарить Генри Чжу (никакого отношения к первому автору) за его раннюю и восторженную поддержку проекта.
Это исследование основано на работе, частично поддерживаемой исследовательской лабораторией ВВС (контракт FA8750-23-C-0507), программой Hiatus IARPA (контракт 2022-2207220055) и NSF (Award 1928631). Одобрено для публичного освобождения, дистрибуция неограниченное. Мнения и выводы, содержащиеся в данном документе, относятся к авторам и не должны интерпретироваться как обязательно представляющие официальную политику, либо выраженную, либо подразумеваемой IARPA, NSF или правительства США.