AI Engineering/LLM API-র ভিত্তি/Lesson 03
Output validation
LLM-এর output-কে কখনো অন্ধভাবে বিশ্বাস করো না। লেখার ভেতর থেকে JSON বের করা, schema দিয়ে যাচাই, আর ভুল হলে error জানিয়ে আবার চেষ্টা (retry)।
- সময়
- 24 মিনিট
- Exercise
- 1
- Challenge
- 1
- Quiz
- 3 প্রশ্ন
সহজ ভাষায়
তুমি model-কে বললে: "এই review থেকে sentiment আর rating JSON-এ দাও।" উত্তর আসতে পারে এরকম:
অবশ্যই! এখানে বিশ্লেষণ:
```json
{"sentiment": "Positive", "rating": "5/5"}
```
আশা করি সাহায্য করলো!
মানুষ এটা পড়ে বুঝতে পারে, কিন্তু code ভেঙে পড়ে। আশেপাশে অতিরিক্ত লেখা আছে, "Positive"-এ বড় হাতের অক্ষর, আর rating সংখ্যা না হয়ে string। LLM output হলো বাইরে থেকে আসা input। User-এর form-এর মতোই যাচাই না করে বিশ্বাস করবে না।
কেন দরকার?
AI app-এ LLM output প্রায়ই সরাসরি অন্য code-এ যায়: database, API, UI। একটা ভুল format মানে crash, অথবা আরও খারাপ, চুপচাপ ভুল data সেভ হয়ে যাওয়া। Production AI system আর demo-র বড় পার্থক্য হলো এই validation।
তিন স্তরের সুরক্ষা
1. Prompt → পরিষ্কার নির্দেশনা + উদাহরণ (format কেমন হবে)
2. Parse → লেখা থেকে JSON বের করা
3. Validate → schema: field আছে? type ঠিক? মান সীমার মধ্যে?
↓ ভুল হলে
4. Retry → error জানিয়ে আবার চাও (সীমিত বার)
Parse আর validate: হাতে
Parse ঠিকমতো হলো, কিন্তু data তবুও ভুল। শুধু json.loads সফল হলেই যথেষ্ট না।
Schema library: Pydantic
হাতে লেখা validation দ্রুত জটিল হয়ে যায়। বাস্তবে Pydantic ব্যবহার হয়। Schema একবার লেখো, তারপর যাচাই আর পরিষ্কার error message দুটোই পাও:
from typing import Literal
from pydantic import BaseModel, Field, ValidationError
class Review(BaseModel):
sentiment: Literal["positive", "negative", "neutral"]
rating: int = Field(ge=1, le=5)
summary: str = Field(min_length=1)
try:
review = Review.model_validate_json('{"sentiment": "good", "rating": 9, "summary": "ভালো"}')
except ValidationError as e:
print(e) # কোন field-এ কী ভুল — এটাই retry-তে model-কে পাঠাও
(Pydantic playground-এ নেই। তোমার computer-এ pip install pydantic করে চালাবে।)
Retry: ভুল জানিয়ে আবার চাও
user: review বিশ্লেষণ করো ... (JSON-এ)
assistant: {"sentiment": "good", "rating": 9, ...}
user: ভুল: sentiment হতে হবে positive/negative/neutral; rating 1-5
assistant: {"sentiment": "positive", "rating": 5, ...} ✓
Retry-র সংখ্যা সবসময় সীমিত রাখো (২-৩ বার)। নাহলে খরচ বাড়ে আর একটা ভুল request অসীম loop হয়ে যায়।
Exercise
Exercise
লেখা থেকে JSON বের করো
Model প্রায়ই JSON-এর চারপাশে কিছু লেখা বা ``json fence জুড়ে দেয়। extract_json(text)` লেখো:
- text-এর প্রথম
{থেকে শেষ}পর্যন্ত অংশ নিয়েjson.loadsকরবে, আর dict return করবে - কোনো
{বা}না থাকলেValueErrorraise করবে
(json.loads নিজেই অবৈধ JSON-এ json.JSONDecodeError দেয়, যেটা ValueError-এরই subclass।)
Quiz
Challenge
Challenge
যাচাই করো, ভুল হলে আবার চাও
দুটো function লেখো:
1. validate_review(data) — একটা product review-এর data যাচাই করবে। ঠিক থাকলে খালি list, নাহলে error message-এর list (string)। নিয়ম:
- sentiment: অবশ্যই "positive", "negative" বা "neutral"
- rating: int (bool না), 1 থেকে 5
- summary: খালি নয় এমন str
2. get_review(call_model, prompt, max_attempts=3) — call_model(messages) একটা string দেয়। প্রতিবার:
- extract_json দিয়ে পড়ো (দেওয়া আছে), তারপর validate_review
- ঠিক হলে data return করো
- JSON পড়া না গেলে বা validation error থাকলে model-এর উত্তর assistant হিসেবে, আর error-গুলো একটা নতুন user message হিসেবে ("ভুল: " দিয়ে শুরু) messages-এ যোগ করে আবার চেষ্টা করো
- max_attempts বার পরও না হলে ValueError
বাস্তবে কোথায় ব্যবহার হয়?
অনেক provider এখন structured outputs দেয়: তুমি একটা JSON schema পাঠাও, আর model-এর output সেই schema মানতে বাধ্য হয় (constrained decoding)। তবুও নিজের validation রেখে দাও:
- Schema শুধু গঠন নিশ্চিত করে, অর্থ নয়।
rating: 5বৈধ JSON, কিন্তু review খারাপ হলে ভুল। - Feature বা model বদলালে আচরণ বদলাতে পারে।
max_tokens-এ কাটা উত্তর তবুও অসম্পূর্ণ হতে পারে।
সব ধরনের structured data-র ক্ষেত্রে, যেমন form থেকে তথ্য বের করা, ticket classify করা বা database query বানানো, এই validate → retry pattern-টাই কাজে লাগে।
Interview প্রশ্ন
- Beginner: LLM output কেন যাচাই করা দরকার?
- Intermediate: একটা নির্ভরযোগ্য JSON extraction pipeline কীভাবে বানাবে?
- Advanced: Structured outputs (constrained decoding) থাকলেও কোন কোন জায়গায় application-level validation লাগে? Retry-র খরচ আর latency কীভাবে নিয়ন্ত্রণ করবে?
এরপর কী?
Model এখন নির্ভরযোগ্যভাবে structured data দিতে পারে। এর সবচেয়ে শক্তিশালী ব্যবহার হলো model নিজেই বলবে কোন function call করতে হবে আর কোন argument দিয়ে। পরের lesson: Tool calling loop।