Генерация структурированных данных
Модели GigaChat могут генерировать структурированные данные в соответствии с переданной в запросе JSON-схемой или регулярным выражением. Такая функциональность полезна, например, для извлечения сущностей из текста или парсинга документов.
Функциональность доступна клиентам ООО «Салют для Бизнеса» при запросах к адресу https://api.giga.chat/.
Как и для генерации текста, для получения структурированных данных используются запросы POST /v1/chat/completions и POST /v2/chat/completions.
Формат и схема данных задаются в объекте response_format.
Возможные значения поля response_format.type:
text— принудительная генерация текста. В этом случае объектresponse_formatне может содержать другие поля;json_schema— генерация JSON-объекта, обернутого в строку. Схема объекта передается в полеresponse_format.schema.
Примеры запросов:
from gigachat import GigaChat
from gigachat.models import Chat, Messages, MessagesRole
from gigachat import GigaChat
client = GigaChat(
base_url="https://api.giga.chat/v1",
credentials="<ключ_авторизации>",
scope="GIGACHAT_API_CORP",
verify_ssl_certs=False,
)
PROMPT = "27 октября 2023 года у меня родился сын"
chat = Chat(
model="GigaChat-2-Max",
messages=[Messages(role=MessagesRole.USER, content=PROMPT)],
response_format={
"type": "json_schema",
"schema": {
"type": "object",
"properties": {
"date": {
"type": "string",
"description": "Дата в формате dd.mm"
},
"event": {
"type": "string",
"description": "Наименование события"
}
},
"additionalProperties": True,
"required": [
"date"
]
},
"strict": True
},
)
resp = client.chat(chat)
print(resp)
curl --request POST \
--url https://api.giga.chat/v1/chat/completions \
--header 'Authorization: Bearer <токен_доступа>' \
-k \
--header "Content-Type: application/json" \
--data '{
"model": "GigaChat-2-Max",
"messages": [
{
"content": "27 октября 2023 года у меня родился сын",
"role": "user"
}
],
"response_format": {
"type": "json_schema",
"schema": {
"type": "object",
"properties": {
"date": {
"type": "string",
"description": "Дата в формате dd.mm"
},
"event": {
"type": "string",
"description": "Наименование события"
}
},
"required": ["date"]
},
"strict": true
}
}'
Пример ответа модели в виде обернутого в строку JSON-объекта:
{
"choices": [
{
"message": {
"content": "{\n \"date\": \"27 октября 2023\",\n \"event\": \"рождение сына\"\n}",
"role": "assistant"
},
"index": 0,
"finish_reason": "stop"
}
],
"created": 1781694805,
"model": "GigaChat-2-Max:2.0.30.01",
"object": "chat.completions",
"usage": {
"prompt_tokens": 29,
"completion_tokens": 32,
"total_tokens": 61,
"precached_prompt_tokens": 3
}
}
Описание схемы данных
Схема данных, которой должен соответствовать ответ модели, передается в поле response_format.schema.
При этом, если в схеме отсутствует описание обязательных полей в массиве required, модель сгенерирует произвольный JSON-объект.
Чтобы ответ строго соответствовал схеме, передайте список обязательных полей в массиве required и задайте параметр "strict": true.
Тогда ответ будет содержать все поля, в том числе необязательные.
Если передать список обязательных полей без параметра "strict": true, ответ модели может содержать поля, неописанные в схеме.
Вы также можете задать схему данных с помощью модели Pydantic.
{
"response_format": {
"type": "json_schema",
"schema": {
"type": "object",
"properties": {
"date": {
"type": "string",
"description": "Дата в формате dd.mm"
},
"event": {
"type": "string",
"description": "Наименование события"
}
},
"additionalProperties": true,
"required": [
"date"
]
},
"strict": true
}
}
from pydantic import BaseModel, Field
class Event(BaseModel):
date: str = Field(description="Дата в формате dd.mm")
event: str | None = Field(default=None, description="Наименование события")
SDK автоматически обрабатывает Pydantic-модель и создает соответствующую JSON-схему:
from gigachat import GigaChat
from gigachat.models import ChatCompletionRequest, ChatMessage, ChatModelOptions, ChatResponseFormat
from pydantic import BaseModel, Field
# Описание данных с помощью Pydantic
class Event(BaseModel):
date: str = Field(description="Дата в формате dd.mm")
event: str | None = Field(default=None, description="Наименование события")
request = ChatCompletionRequest(
messages=[ChatMessage(
role="user",
content="27 октября 2023 года у меня родился сын"
)],
model_options=ChatModelOptions(
response_format=ChatResponseFormat(
type="json_schema",
schema=Event,
strict=True)
),
)
with GigaChat(
base_url="https://api.giga.chat/v2",
credentials="<ключ_авторизации>",
scope="GIGACHAT_API_CORP",
verify_ssl_certs=False,
) as client:
response = client.chat.create(request)
print(response.messages[0])
Структурированные данные в v2/chat/completions
В отличие от POST /v1/chat/completions, в запросе POST /v2/chat/completions параметры структурированного вывода и описание схемы данных передаются в объекте model_options.response_format.
В остальном оба способа работают одина ково:
from gigachat import GigaChat
from gigachat.models import ChatCompletionRequest, ChatMessage, ChatModelOptions, ChatResponseFormat
SCHEMA = {
"type": "object",
"properties": {
"date": {
"type": "string",
"description": "Дата в формате dd.mm"
},
"event": {
"type": "string",
"description": "Наименование события"
}
},
"additionalProperties": True,
"required": ["date"]
}
request = ChatCompletionRequest(
model="GigaChat-2-Max",
messages=[ChatMessage(role="user", content=[{"text": "27 октября 2023 года у меня родился сын"}])],
model_options=ChatModelOptions(
response_format=ChatResponseFormat(
type="json_schema",
schema=SCHEMA,
strict=True,
)
),
)
client = GigaChat(
base_url="https://api.giga.chat/v1",
credentials="<ключ_авторизации>",
scope="GIGACHAT_API_CORP",
verify_ssl_certs=False,
)
response = client.chat.create(request)
print(response)
curl --request POST \
--url https://api.giga.chat/v2/chat/completions \
--header 'Authorization: Bearer <токен_доступа>' \
-k \
--header "Content-Type: application/json" \
--data '{
"model": "GigaChat-2-Max",
"messages": [
{
"role": "user",
"content": [
{
"text": "27 октября 2023 года у меня родился сын"
}
]
}
],
"model_options": {
"response_format": {
"type": "json_schema",
"schema": {
"type": "object",
"properties": {
"date": {
"type": "string",
"description": "Дата в формате dd.mm"
},
"event": {
"type": "string",
"description": "Наименование события"
}
},
"required": [
"date"
]
},
"strict": true
}
}
}'