Преподаватель является самой популярной библиотекой Python для работы со структурированными выходами из крупных языковых моделей (LLMS), имеющая более 600 000 ежемесячных загрузок. Построенный на вершине Pydantic, он обеспечивает простой, прозрачный и удобный API для управления валидацией, повторными и потоковыми ответами. Будьте готовы перегружать свои рабочие процессы LLM с главным выбором сообщества!
Если ваша компания часто использует инструктор, мы хотели бы иметь ваш логотип на нашем сайте! Пожалуйста, заполните эту форму
Установите инструктора с одной командой:
pip install -U instructor
Теперь давайте посмотрим инструктора в действии с простым примером:
import instructor
from pydantic import BaseModel
from openai import OpenAI
# Define your desired output structure
class UserInfo ( BaseModel ):
name : str
age : int
# Patch the OpenAI client
client = instructor . from_openai ( OpenAI ())
# Extract structured data from natural language
user_info = client . chat . completions . create (
model = "gpt-4o-mini" ,
response_model = UserInfo ,
messages = [{ "role" : "user" , "content" : "John Doe is 30 years old." }],
)
print ( user_info . name )
#> John Doe
print ( user_info . age )
#> 30
Инструктор предоставляет мощную систему крючков, которая позволяет перехватывать и регистрировать различные этапы процесса взаимодействия LLM. Вот простой пример, демонстрирующий, как использовать крючки:
import instructor
from openai import OpenAI
from pydantic import BaseModel
class UserInfo ( BaseModel ):
name : str
age : int
# Initialize the OpenAI client with Instructor
client = instructor . from_openai ( OpenAI ())
# Define hook functions
def log_kwargs ( ** kwargs ):
print ( f"Function called with kwargs: { kwargs } " )
def log_exception ( exception : Exception ):
print ( f"An exception occurred: { str ( exception ) } " )
client . on ( "completion:kwargs" , log_kwargs )
client . on ( "completion:error" , log_exception )
user_info = client . chat . completions . create (
model = "gpt-4o-mini" ,
response_model = UserInfo ,
messages = [
{ "role" : "user" , "content" : "Extract the user name: 'John is 20 years old'" }
],
)
"""
{
'args': (),
'kwargs': {
'messages': [
{
'role': 'user',
'content': "Extract the user name: 'John is 20 years old'",
}
],
'model': 'gpt-4o-mini',
'tools': [
{
'type': 'function',
'function': {
'name': 'UserInfo',
'description': 'Correctly extracted `UserInfo` with all the required parameters with correct types',
'parameters': {
'properties': {
'name': {'title': 'Name', 'type': 'string'},
'age': {'title': 'Age', 'type': 'integer'},
},
'required': ['age', 'name'],
'type': 'object',
},
},
}
],
'tool_choice': {'type': 'function', 'function': {'name': 'UserInfo'}},
},
}
"""
print ( f"Name: { user_info . name } , Age: { user_info . age } " )
#> Name: John, Age: 20
Этот пример демонстрирует:
Крюки дают ценную информацию о входах функции и любых ошибках, улучшая возможности отладки и мониторинга.
import instructor
from anthropic import Anthropic
from pydantic import BaseModel
class User ( BaseModel ):
name : str
age : int
client = instructor . from_anthropic ( Anthropic ())
# note that client.chat.completions.create will also work
resp = client . messages . create (
model = "claude-3-opus-20240229" ,
max_tokens = 1024 ,
system = "You are a world class AI that excels at extracting user data from a sentence" ,
messages = [
{
"role" : "user" ,
"content" : "Extract Jason is 25 years old." ,
}
],
response_model = User ,
)
assert isinstance ( resp , User )
assert resp . name == "Jason"
assert resp . age == 25
Обязательно установите cohere
и установите переменную вашей системной среды с помощью export CO_API_KEY=<YOUR_COHERE_API_KEY>
.
pip install cohere
import instructor
import cohere
from pydantic import BaseModel
class User ( BaseModel ):
name : str
age : int
client = instructor . from_cohere ( cohere . Client ())
# note that client.chat.completions.create will also work
resp = client . chat . completions . create (
model = "command-r-plus" ,
max_tokens = 1024 ,
messages = [
{
"role" : "user" ,
"content" : "Extract Jason is 25 years old." ,
}
],
response_model = User ,
)
assert isinstance ( resp , User )
assert resp . name == "Jason"
assert resp . age == 25
Убедитесь, что вы установили Google AI Python SDK. Вы должны установить переменную среды GOOGLE_API_KEY
с вашим ключом API. Инструментальный вызов Gemini также требует установки jsonref
.
pip install google-generativeai jsonref
import instructor
import google . generativeai as genai
from pydantic import BaseModel
class User ( BaseModel ):
name : str
age : int
# genai.configure(api_key=os.environ["API_KEY"]) # alternative API key configuration
client = instructor . from_gemini (
client = genai . GenerativeModel (
model_name = "models/gemini-1.5-flash-latest" , # model defaults to "gemini-pro"
),
mode = instructor . Mode . GEMINI_JSON ,
)
В качестве альтернативы вы можете позвонить Gemini от клиента Openai. Вам придется настроить gcloud
, получить настройку на Vertex AI и установить библиотеку Google Auth.
pip install google-auth
import google . auth
import google . auth . transport . requests
import instructor
from openai import OpenAI
from pydantic import BaseModel
creds , project = google . auth . default ()
auth_req = google . auth . transport . requests . Request ()
creds . refresh ( auth_req )
# Pass the Vertex endpoint and authentication to the OpenAI SDK
PROJECT = 'PROJECT_ID'
LOCATION = (
'LOCATION' # https://cloud.google.com/vertex-ai/generative-ai/docs/learn/locations
)
base_url = f'https:// { LOCATION } -aiplatform.googleapis.com/v1beta1/projects/ { PROJECT } /locations/ { LOCATION } /endpoints/openapi'
client = instructor . from_openai (
OpenAI ( base_url = base_url , api_key = creds . token ), mode = instructor . Mode . JSON
)
# JSON mode is req'd
class User ( BaseModel ):
name : str
age : int
resp = client . chat . completions . create (
model = "google/gemini-1.5-flash-001" ,
max_tokens = 1024 ,
messages = [
{
"role" : "user" ,
"content" : "Extract Jason is 25 years old." ,
}
],
response_model = User ,
)
assert isinstance ( resp , User )
assert resp . name == "Jason"
assert resp . age == 25
import instructor
from litellm import completion
from pydantic import BaseModel
class User ( BaseModel ):
name : str
age : int
client = instructor . from_litellm ( completion )
resp = client . chat . completions . create (
model = "claude-3-opus-20240229" ,
max_tokens = 1024 ,
messages = [
{
"role" : "user" ,
"content" : "Extract Jason is 25 years old." ,
}
],
response_model = User ,
)
assert isinstance ( resp , User )
assert resp . name == "Jason"
assert resp . age == 25
Это была мечта инструктора, но из -за исправления Openai я не мог заставить печатать хорошо. Теперь, с новым клиентом, мы можем хорошо работать! Мы также добавили несколько методов create_*
, чтобы упростить создание итераблевых и частичных, а также для доступа к исходному завершению.
create
import openai
import instructor
from pydantic import BaseModel
class User ( BaseModel ):
name : str
age : int
client = instructor . from_openai ( openai . OpenAI ())
user = client . chat . completions . create (
model = "gpt-4-turbo-preview" ,
messages = [
{ "role" : "user" , "content" : "Create a user" },
],
response_model = User ,
)
Теперь, если вы используете IDE, вы можете увидеть, как тип правильно выведен.
await create
Это также будет работать правильно с асинхронными клиентами.
import openai
import instructor
from pydantic import BaseModel
client = instructor . from_openai ( openai . AsyncOpenAI ())
class User ( BaseModel ):
name : str
age : int
async def extract ():
return await client . chat . completions . create (
model = "gpt-4-turbo-preview" ,
messages = [
{ "role" : "user" , "content" : "Create a user" },
],
response_model = User ,
)
Обратите внимание, что просто потому, что мы возвращаем метод create
, функция extract()
вернет правильный тип пользователя.
create_with_completion
Вы также можете вернуть исходный объект завершения
import openai
import instructor
from pydantic import BaseModel
client = instructor . from_openai ( openai . OpenAI ())
class User ( BaseModel ):
name : str
age : int
user , completion = client . chat . completions . create_with_completion (
model = "gpt-4-turbo-preview" ,
messages = [
{ "role" : "user" , "content" : "Create a user" },
],
response_model = User ,
)
create_partial
Чтобы обрабатывать потоки, мы все еще поддерживаем Iterable[T]
и Partial[T]
но чтобы упростить вывод типа, мы также добавили методы create_iterable
и create_partial
!
import openai
import instructor
from pydantic import BaseModel
client = instructor . from_openai ( openai . OpenAI ())
class User ( BaseModel ):
name : str
age : int
user_stream = client . chat . completions . create_partial (
model = "gpt-4-turbo-preview" ,
messages = [
{ "role" : "user" , "content" : "Create a user" },
],
response_model = User ,
)
for user in user_stream :
print ( user )
#> name=None age=None
#> name=None age=None
#> name=None age=None
#> name=None age=None
#> name=None age=None
#> name=None age=None
#> name='John Doe' age=None
#> name='John Doe' age=None
#> name='John Doe' age=None
#> name='John Doe' age=30
#> name='John Doe' age=30
# name=None age=None
# name='' age=None
# name='John' age=None
# name='John Doe' age=None
# name='John Doe' age=30
Заметьте теперь, что вывод типа является Generator[User, None]
create_iterable
Мы получаем итерационные объекты, когда хотим извлечь несколько объектов.
import openai
import instructor
from pydantic import BaseModel
client = instructor . from_openai ( openai . OpenAI ())
class User ( BaseModel ):
name : str
age : int
users = client . chat . completions . create_iterable (
model = "gpt-4-turbo-preview" ,
messages = [
{ "role" : "user" , "content" : "Create 2 users" },
],
response_model = User ,
)
for user in users :
print ( user )
#> name='John Doe' age=30
#> name='Jane Doe' age=28
# User(name='John Doe', age=30)
# User(name='Jane Smith', age=25)
Мы приглашаем вас внести свой вклад в Evals в pytest
как способ контролировать качество моделей OpenAI и библиотеки instructor
. Чтобы начать, ознакомьтесь с Evals для антропного и OpenAI и внесите свои собственные Evals в виде тестов Pytest. Эти эвалы будут запущены раз в неделю, и результаты будут опубликованы.
Если вы хотите помочь, проверьте некоторые проблемы, отмеченные как good-first-issue
или help-wanted
найденные здесь. Они могут быть чем угодно от улучшений кода, гостевого сообщения в блоге или новой кулинарной книги.
Мы также предоставляем некоторые дополнительные функции CLI для удобства удобства:
instructor jobs
: это помогает с созданием тонкой настройки с OpenAI. Простое использование instructor jobs create-from-file --help
чтобы начать создавать свою первую модель GPT-3.5 GPT-3.5
instructor files
: с легкостью управляйте загруженными файлами. Вы сможете создавать, удалять и загружать файлы все из командной строки
instructor usage
: Вместо того, чтобы каждый раз отправляться на сайт Openai, вы можете следить за использованием из CLI и фильтровать по дате и периоду времени. Обратите внимание, что использование часто занимает ~ 5-10 минут, чтобы обновить со стороны Openai
Этот проект лицензирован в соответствии с условиями лицензии MIT.