در روزهای اولیه مدلهای زبانی بزرگ (LLM)، تعامل با هوش مصنوعی عمدتاً مکالمهای بود. شما سوالی میپرسیدید و مدل پاسخی متنی ارائه میداد. اگرچه این رویکرد برای طوفان فکری یا نویسندگی خلاقانه قدرتمند است، اما در محیطهای تولیدی کم میآورد. هنگام ساخت برنامههایی که نیاز به استخراج دقیق داده، یکپارچهسازی API یا بهروزرسانی پایگاه داده دارند، تصادفی بودن یک ویژگی نیست، بلکه یک ریسک است.
اینجاست که خروجیهای ساختاریافته حیاتی میشوند. با محدود کردن مدل برای بازگرداندن دادهها در یک قالب خاص—معمولاً JSON—توسعهدهندگان میتوانند جریانهای کاری مقاوم و قطعی بسازند. در این پست، ما بررسی خواهیم کرد که چگونه میتوان با استفاده از طرحوارههای JSON ساختار را اجبار کرد، چرا این موضوع برای مقیاسپذیری مهم است و چگونه میتوان آن را به طور موثر پیادهسازی کرد.
گذار از متن آزاد به تعامل مبتنی بر طرحواره
به طور سنتی، استخراج داده از LLMها نیازمند مراحل پردازش پس از تولید بود. ممکن است از مدل بخواهید پروفایل کاربری را توصیف کند، سپس از عبارات با قاعده (Regular Expressions) یا دستکاری رشته برای تجزیه نام، ایمیل و سن استفاده کنید. این روش شکننده است. اگر مدل خروجی خود را کمی تغییر دهد (مثلاً به جای "سن:" از "سن برابر است با:" استفاده کند)، تجزیهگر شما از کار میافتد.
خروجیهای ساختاریافته این مشکل را با تعریف شکل مورد انتظار پاسخ قبل از اینکه مدل حتی آن را تولید کند، حل میکنند. این کار را میتوان مانند امضای تابع با تایپ قوی در برنامهنویسی در نظر گرفت. به جای یک نوع بازگشتی string عمومی، شما یک شیء با فیلدها و انواع خاص را تعریف میکنید. بیشتر ارائهدهندگان مدرن LLM اکنون از اجبار طرحواره JSON بومی پشتیبانی میکنند، به این معنی که مدل از نظر ریاضی محدود است تا به ساختار ارائه شده پایبند باشد.
پیادهسازی محدودیتهای طرحواره JSON
برای بهرهبرداری از خروجیهای ساختاریافته، باید یک طرحواره JSON تعریف کنید که خروجی مورد نظر شما را توصیف میکند. این طرحواره به عنوان یک قرارداد بین برنامه شما و مدل هوش مصنوعی عمل میکند. در اینجا یک مثال عملی از نحوه تعریف یک طرحواره برای سیستم تحلیل تیکتهای پشتیبانی مشتری آورده شده است.
{
"type": "object",
"properties": {
"sentiment": {
"type": "string",
"enum": ["positive", "neutral", "negative"]
},
"priority_score": {
"type": "integer",
"minimum": 1,
"maximum": 10
},
"summary": {
"type": "string",
"maxLength": 280
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": ["sentiment", "priority_score", "summary", "tags"],
"additionalProperties": false
}
به تعاریف دقیق توجه کنید. ما از enum برای احساسات استفاده میکنیم تا از بازگرداندن کلماتی مانند "خوب"، "زیبا" یا "مثبت" توسط مدل جلوگیری شود. ما محدودیتهای minimum و maximum را برای امتیاز اولویت تنظیم میکنیم تا یکپارچگی دادهها تضمین شود. دستور additionalProperties: false حیاتی است؛ این دستور به مدل میگوید که هیچ فیلد اضافی که در طرحواره تعریف نشده است را شامل نکند، که پاسخ را تمیز و قابل پیشبینی نگه میدارد.
پیادهسازی عملی در کد
هنگام یکپارچهسازی این مورد در برنامه شما، تماس API کمی تغییر میکند. شما طرحواره را به عنوان یک پارامتر در کنار پرامپت خود ارسال میکنید. در زیر یک مثال شبهکد آورده شده است که نشان میدهد این موضوع در یک پیادهسازی SDK معمولی چگونه به نظر میرسد.
import anthropic
client = anthropic.Anthropic()
message = client.messages.create(
model="claude-3-sonnet-20240229",
max_tokens=1024,
messages=[
{"role": "user", "content": "Analyze this ticket: 'My internet has been down for 3 days and I am furious.'"}
],
# Pass the schema directly to the API
response_format={
"type": "json_schema",
"json_schema": {
"name": "ticket_analysis",
"schema": { ... # Insert schema from above ... }
}
}
)
# The output is guaranteed to be valid JSON matching the schema
parsed_response = json.loads(message.content[0].text)
print(parsed_response['priority_score'])
با اجبار این ساختار در سطح API، نیاز به حلقههای پیچیده مدیریت خطا از بین میرود. اگر مدل نتواند از دستورالعملها پیروی کند، API یک خطای اعتبارسنجی پرتاب میکند که به برنامه شما اجازه میدهد استثنا را به صورت شایسته مدیریت کند، به جای اینکه در طول پردازشهای بعدی دچار کرش شود.
نتیجهگیری
خروجیهای ساختاریافته دیگر یک کالای لوکس نیستند؛ آنها برای هر توسعهدهندهای که جدی بودن ادغام هوش مصنوعی در برنامههای تولیدی را درک میکند، ضروری هستند. با دوری از متن آزاد و پذیرش تعاملات مبتنی بر طرحواره، شما قابلیت اطمینان، عیبیابی آسانتر و یکپارچهسازی بیدرنگ با سیستمهای بکاند را به دست میآورید. با تکامل اکوسیستم، احتمالاً شاهد محدودیتهای نوع پیچیدهتر و خروجیهای ساختاریافته چندوجهی بیشتر خواهیم بود که شکاف بین هوش مصنوعی مکالمهای و پارادایمهای مهندسی نرمافزار سنتی را بیشتر پر میکند.