Упростить свою жизнь, используя reftingtools.jl, пакет Юлии, который упрощает взаимодействие с большими языковыми моделями.
ReftingTools.jl не предназначен для создания крупномасштабных систем. Это должно быть инструментом в вашей глобальной среде, который сэкономит вам 20 минут каждый день!
Кончик
Прыгать к документам
@ai_str и легкой шаблон Начало работы с reftingTools.jl так же просто, как импортировать пакет и использовать макрос @ai_str для ваших вопросов.
Примечание. Вам необходимо будет установить свой ключ API OpenAI в качестве переменной среды, прежде чем использовать raptingTools.jl (см. Раздел «Создание ключа API OpenAI» ниже).
После введения предоплаченного выставления счетов вам нужно будет купить несколько кредитов, чтобы начать (минимум 5 долларов). Для быстрого начала, просто установите его через ENV["OPENAI_API_KEY"] = "your-api-key"
Установите reptingTools:
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 для новой Turbo Model GPT-4). Отлично подходит для этих очень сложных вопросов!
Для более сложных шаблонов быстрого приглашения вы можете использовать шаблон в стиле руля и предоставить переменные в качестве аргументов ключевых слов:
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 для выполнения нескольких задач с AI, одновременно.
Кончик
Если вы используете медленные модели (например, GPT -4), вы можете использовать Async версию @ai_str -> @aai_str , чтобы избежать блокировки реплики, например, aai"Say hi but slowly!"gpt4 (аналогично @ai!_str -> @aai!_str
Для более практических примеров см. examples/ папку и раздел «Дополнительные примеры» ниже.
@ai_str и легкой шаблонai*airetry!aigenerate ( api_kwargs )Обратная техническая инженерия не быстрая и не просто. Более того, различные модели и их тонкие настрой могут потребовать различных форматов и трюков, или, возможно, информации, с которой вы работаете, требуется для использования специальных моделей. ReftingTools.jl предназначена для объединения подсказок для различных бэкэнд и сделать общие задачи (например, шаблонные подсказки) как можно просты.
Некоторые функции:
aigenerate : упростить шаблоны приглашения с помощью руля (например, {{variable}} ) и аргументы ключевого слова@ai_str String Macro : Сохраните клавиши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 предназначен для извлечения структурированных данных из ответа модели AI и возврата их как структура Julia (например, если мы предоставим return_type=Food , мы получаем ans.content isa Food ). Сначала необходимо определить тип возврата, а затем предоставить его как аргумент ключевого слова.aitools предназначена для агентских рабочих процессов с сочетанием инструментов и пользовательских входов. Это может работать с простыми функциями и выполнять их.aiclassify предназначена для классификации входного текста в (или просто реагировать на) набор дискретных choices предоставленных пользователем. Он может быть очень полезен в качестве судьи LLM или маршрутизатора для Rag Systems, поскольку он использует «трюк Logit Bias» и генерирует ровно 1 токен. Он возвращает 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 - хотите ли вы весь разговор или просто ответ AI (т.е. хотите ли вы включить свои входы/подсказку в вывод)api_kwargs::NamedTuple - Конкретные параметры для модели, например, temperature=0.0 чтобы не быть креативными (и имеют более похожий результат в каждом заезде)http_kwargs::NamedTuple - Параметры для пакета http.jl, например, readtimeout = 120 до Time Out за 120 секунд, если ответ не был получен.Экспериментальный: Agenttools
В дополнение к вышеуказанному списку функций ai* , вы также можете использовать «ленивые» аналоги этих функций из модуля экспериментальных агентов.
using PromptingTools . Experimental . AgentTools Например, AIGenerate() создаст ленивый экземпляр aigenerate . Это экземпляр AICall с aigenerate в качестве функции ИИ. Он использует точно те же аргументы и аргументы ключевых слов, что и aigenerate (см ?aigenerate ).
«Ленивый» относится к тому факту, что он не генерирует никаких выводов при создании (только при run!
Или по -другому сказано, структура AICall и все его ароматы ( AIGenerate , ...) предназначены для облегчения модели отложенного выполнения (Lazy Excelation) для функций искусственного интеллекта, которые взаимодействуют с моделью изучения языка (LLM). В нем хранится необходимая информация для вызова ИИ и выполняет основную функцию ИИ, только если поставляется с использованием UserMessage или при run! метод применяется. Это позволяет нам запомнить пользовательские входы и запускать вызов LLM, если это необходимо, что позволяет автоматическое исправление (см ?airetry! ).
Если вы хотите мощный рабочий процесс автоматического фиксирования, вы можете использовать airetry! , который использует поиск дерева Монте-Карло, чтобы выбрать оптимальную траекторию разговора на основе ваших требований.
Экспериментальный: Ragtools
Наконец, мы предоставляем набор инструментов для создания тряпичных приложений (извлечь, ответ, генерировать).
Это может быть так же просто, как два вызова: build_index и airag (извлечь, ответ, генерировать).
Если вы затем используете Pretty Printting с помощью 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 для выполнения нескольких задач с AI одновременно, повышая производительность для пакетных операций.
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» -> Вместо этого можно использовать вышеуказанный GPT -4 и т. Д.).
Каждый ai... Call Сначала просматривает приведенное имя модели в словаре 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 для классификации любого предоставленного оператора как true/false/неизвестно. Это полезно для проверки фактов, галлюцинации или проверки 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), поэтому мы можем использовать его для маршрутизации.
Кроме того, если вы предоставите выбор в качестве кортежей ( (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», чтобы заставить только 1 сгенерированный токен - это означает, что он очень дешевый и очень быстрый!
Вы устали извлечь данные с помощью корпорации? Вы можете использовать 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") Или вы можете сделать OCR скриншота. Давайте расшифруем какой-то код 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! это airetry!(condition_function, aicall::AICall, feedback_function) . Он оценивает условие condition_function на объекте aicall (например, мы оцениваем f_cond(aicall) -> Bool ). Если он не удается, мы называем feedback_function на объекте aicall , чтобы обеспечить обратную связь для модели AI (например, 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 (MCT), чтобы оптимизировать последовательность повторных перепис, так что это очень мощный инструмент для создания надежных рабочих процессов искусственного интеллекта (вдохновленным поисковой бумагой Tree Agent Agent и By Dspy Assertions Paper).
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 Models! Смотрите документы для получения дополнительной информации.
Если вы получаете ошибки, убедитесь, что работает Ollama - см. Руководство по настройке для раздела Ollama ниже.
Модели Mistral уже давно доминируют в пространстве с открытым исходным кодом. Теперь они доступны через их API, так что вы можете использовать их с помощью reftingTools.jl!
msg = aigenerate ( " Say hi! " ; model = " mistral-tiny " ) Все это работает, потому что мы зарегистрировали модели в PromptingTools.MODEL_REGISTRY ! В настоящее время доступно 4 моделя: mistral-tiny , mistral-small , mistral-medium , mistral-embed .
Под капотом мы используем выделенную схему MistralOpenAISchema , которая использует большую часть базы кода, специфичной для открытых.
const PT = PromptingTools
msg = aigenerate (PT . MistralOpenAISchema (), " Say Hi! " ; model = " mistral-tiny " , api_key = ENV [ " MISTRAL_API_KEY " ]) Как вы можете видеть, мы можем загрузить ваш ключ API либо из Env, либо через механизм Preferences.jl (см ?PREFERENCES для получения дополнительной информации).
Но Мистралай не единственные! Есть много других захватывающих поставщиков, например, смущения. Пока они совместимы с API OpenAI (например, отправка messages с клавишами role и content ), вы можете использовать их с помощью reftingTools.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 для Мистралай и других API-совместимых с OpenAI. Мы планируем продлить поддержку в будущем.
Убедитесь, что переменная среды ANTHROPIC_API_KEY установлена на ваш ключ API.
# cladeuh is alias for Claude 3 Haiku
ai " Say hi! " claudeh Предварительно установленные псевдонимы - claudeo , claudes и claudeh , для Claude 3 Opus, Sonnet и Haiku соответственно.
Соответствующей схемой является 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 ) Почему этот дизайн? Различные API требуют разных форматов приглашения. Например, API OpenAI требует массива словарей с role и полями content , в то время как API Ollama для модели Zephyr-7B требует схемы Chatml с одной большой строкой и сепараторами, такими как <|im_start|>usernABC...<|im_end|>user . Для разделения разделов в вашей подсказке OpenAI предпочитает заголовки разметки ( ##Response ) против антропического показателя лучше с тегами HTML ( <text>{{TEXT}}</text> ).
Этот пакет сильно вдохновлен инструктором, и это умное использование функциональных вызовов API.
Быстрые схемы
Тип ключа, используемый для настройки логики подготовки входов для LLMS и вызова их (через несколько диспетчеров).
Все они являются подтипами AbstractPromptSchema , и каждая функция задачи имеет общую подпись со схемой в первой позиции foo(schema::AbstractPromptSchema,...)
Диспетчер определяется как для «рендеринга» подсказок ( render ), так и для вызова API ( aigenerate ).
В идеале каждый новый интерфейс будет определен в отдельном файле llm_<interface>.jl (например, llm_openai.jl ).
Сообщения
Подсказки фактически являются разговором, который должен быть завершен.
В разговорах, как правило, есть три ключевых актера: система (для общих инструкций), пользователь (для входов/данных) и помощника по искусственному интеллекту (для выходов). Мы предоставляем SystemMessage , UserMessage и типы AIMessage для каждого из них.
Учитывая оперативную схему и одно или несколько сообщений, вы можете render полученный объект, который будет подаваться в модель API. Например, для 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 (для структурированных данных, таких как Enterdings).
Учитывая различия в модельных API и их параметрах (например, API OpenAI против Ollama), функции задач отправляются на schema::AbstractPromptSchema в качестве своего первого аргумента.
См src/llm_openai.jl для примера реализации. Каждый новый интерфейс будет определен в отдельном файле llm_<interface>.jl .
Модели OpenAI находятся в авангарде исследования ИИ и обеспечивают надежные, современные возможности для многих задач.
Там будут ситуации не или не могут их использовать (например, конфиденциальность, стоимость и т. Д.). В этом случае вы можете использовать местные модели (например, Ollama) или другие API (например, антропный).
Примечание. Чтобы начать с Ollama.ai, см. Руководство по настройке для раздела Ollama ниже.
Есть много альтернатив:
На момент написания статьи OpenAI не использует призывы API для обучения своих моделей.
API
OpenAI не использует данные, представленные и генерируемые нашим API для обучения моделей OpenaI или улучшения обслуживания OpenAI. Чтобы поддержать постоянное улучшение наших моделей, вы можете заполнить эту форму, чтобы выбрать свои данные с нами. - Как ваши данные используются для улучшения наших моделей
Вы всегда можете дважды проверить последнюю информацию о том, как мы используем ваши данные.
Ресурсы:
Вы можете получить свой ключ API от OpenAI, зарегистрировавшись в учетной записи и получив доступ к разделу API на веб -сайте OpenAI.
Ресурсы:
Кончик
Всегда устанавливайте ограничения расходов!
OpenAI позволяет вам установить ограничения расходов непосредственно на панели панели учетной записи, чтобы предотвратить неожиданные затраты.
Хорошим началом может быть мягкий предел в 5 долларов США и жесткий лимит в 10 долларов США - вы всегда можете увеличить его позже в течение месяца.
Ресурсы:
Если вы используете локальную модель (например, с Ollama), это бесплатно. Если вы используете какие-либо коммерческие API (например, OpenAI), вы, скорее всего, заплатите за «токен» (подразделение подлоги).
Например, простой запрос с простым вопросом и 1-м ответом на предложение в ответ (»IS оператор XYZ положительный комментарий») будет стоить вам ~ 0,0001 долл. США (т.е. один сотый сотую цента)
Стоит заплатить?
Genai - это способ купить время! Вы можете заплатить центы, чтобы сэкономить десятки минут каждый день.
Продолжая пример выше, представьте, что у вас есть таблица с 200 комментариями. Теперь вы можете проанализировать каждого из них с помощью LLM для необходимых вам функций/проверок. Предполагая, что цена за звонок составила 0,0001 долл. США, вы заплатите 2 цента за работу и сэкономили 30-60 минут вашего времени!
Ресурсы:
Это руководство для ключа API Openai, но он работает для любого другого ключа API, который вам может понадобиться (например, MISTRAL_API_KEY для API Mistralai).
Чтобы использовать API OpenAI с помощью reftingTools.jl, установите свой ключ API в качестве переменной среды:
ENV [ " OPENAI_API_KEY " ] = " your-api-key "Как один раз, вы можете:
export OPENAI_API_KEY = <your key>setup.jl (обязательно не совершайте его Github!) Обязательно запустите Джулию из того же окна терминала, где вы устанавливаете переменную. Легко проверить Джулию, запустить ENV["OPENAI_API_KEY"] , и вы должны увидеть свой ключ!
Лучший способ:
~/.zshrc ). Он будет автоматически загружаться каждый раз, когда вы запускаете терминал Мы также поддерживаем Preferences.jl, так что вы можете просто запустить: PromptingTools.set_preferences!("OPENAI_API_KEY"=>"your-api-key") , и это будет настойчиво в течение сеансов. Чтобы увидеть текущие предпочтения, запустите PromptingTools.get_preferences("OPENAI_API_KEY") .
Будьте осторожны, чтобы не совершать LocalPreferences.toml .
Ресурсы:
aigenerate ( api_kwargs )См. Openai API -ссылка для получения дополнительной информации.
Для легкого доступа из любого места добавьте raptingTools в свой 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" из любого сеанса реплики!
Этос reftingTools.jl должен позволить вам использовать любую модель, которую вы хотите, которая включает LLMS с открытым исходным кодом. Самым популярным и простым для настройки является Ollama.ai - см. Ниже для получения дополнительной информации.
Ollama запускает фоновую службу хостинга LLM, которые вы можете получить через простой API. Это особенно полезно, когда вы работаете с некоторыми конфиденциальными данными, которые нигде не должны отправлять.
Установка очень проста, просто загрузите последнюю версию здесь.
После того, как вы установили его, просто запустите приложение, и вы готовы к работе!
Чтобы проверить, работает ли он, перейдите в свой браузер и откройте 127.0.0.1:11434 . Вы должны увидеть сообщение «Ollama работает». В качестве альтернативы, вы можете запустить ollama serve в своем терминале, и вы получите сообщение, что он уже работает.
В библиотеке Ollama доступно много моделей, в том числе Llama2, Codellama, SQLCoder или My Personal Personal openhermes2.5-mistral .
Загрузите новые модели с ollama pull <model_name> (например, ollama pull openhermes2.5-mistral ).
Показать в настоящее время доступные модели с ollama list .
См. Ollama.ai для получения дополнительной информации.
Точная настройка-это мощный метод для адаптации модели к вашему конкретному варианту использования (в основном формат/синтаксис/задача). Это требует набора примеров, который вы теперь можете легко генерировать с помощью recomptingTools.jl!
Вы можете сохранить любой разговор (вектор сообщений) в файл с PT.save_conversation("filename.json", conversation) .
После того, как приходит время настройки, создайте пакет разговоров, форматированных форматом, в одном файле .jsonl . Используйте PT.save_conversations("dataset.jsonl", [conversation1, conversation2, ...]) (обратите внимание на то, что во множественном числе «разговоры» в имени функции).
Для примера сквозного процесса создания, ознакомьтесь с нашим дочерним проектом Juliallmleaderboard MineTuning Experiment. Он показывает процесс создания в течение половины доллара с jarvislabs.ai и axolotl.
Это список функций, которые я хотел бы увидеть в будущем (в любом случае):
Для получения дополнительной информации, взносов или вопросов, пожалуйста, посетите репозиторий Github GitHub.
Обратите внимание, что, хотя reftingTools.jl стремится обеспечить плавный опыт, он опирается на внешние API, которые могут измениться. Следите за обновлениями в репозитории для обновлений и новых функций.
Спасибо за то, что вы выбрали redptingTools.jl, чтобы расширить возможности ваших приложений с ИИ!