অধ্যায় 6 · অনুশীলন ও ক্যাপস্টোন
ক্যাপস্টোন প্রজেক্ট, চিট শিট ও এরপর কী
- পৃষ্ঠা 22 / 22
- 16 মিনিট পড়া
এখন আপনার হাতে প্রোডাকশন AI ব্যাকএন্ডের সব অংশ আছে: টিমওয়ার্কের জন্য Git ও GitHub, HTTP ও API ডিজাইন, async ক্লায়েন্ট, ডেটাবেসসহ স্তরবিন্যস্ত FastAPI সার্ভিস, অথেন্টিকেশন, ক্যাশিং ও লিমিট, টেস্ট, তার পেছনে একটা মডেল ও LLM, নিরাপত্তা, Docker, CI/CD আর ডিপ্লয়মেন্ট। যা এখনো নেই তা হলো প্রমাণ যে টিউটোরিয়াল হাত ধরে না থাকলেও এগুলো জোড়া দিতে পারেন। সেই প্রমাণ ক্যাপস্টোন (capstone): ছোট ছোট মাইলস্টোনে বানানো একটা প্রজেক্ট, যা আপনি চাকরিদাতা বা ক্লায়েন্টকে দেখাতে পারবেন।
এই পাতার তিনটা অংশ: মাইলস্টোন ও গ্রহণযোগ্যতার চেকলিস্টসহ ক্যাপস্টোনের ব্রিফ, পুরো অ্যাডভান্সড টিউটোরিয়ালের একটা চিট শিট, আর BitByte AI পথে এরপর কী শিখবেন তার মানচিত্র।
যা শিখবেন
- ক্যাপস্টোনের পরিধি কীভাবে ঠিক করলে শেষ করা যায়, আর কীভাবে মাইলস্টোনে ভাগ করলে প্রতিটা ধাপ শেষে প্রজেক্ট চালু থাকে।
- প্রোডাকশন-প্রস্তুত AI ব্যাকএন্ডকে যে গ্রহণযোগ্যতার চেকলিস্ট পার হতে হয়।
- এর আগের ২১টা পাতার কমান্ড, নিয়ম আর সংখ্যার একটা চিট শিট।
- এরপর কী: প্রম্পট ইঞ্জিনিয়ারিং, তারপর AI Engineer পথ (LLM API, RAG, এজেন্ট, MCP, ইভাল ও LLMOps)।
ক্যাপস্টোনের ব্রিফ: একটা স্টাডি অ্যাসিস্ট্যান্ট API
একটা স্টাডি অ্যাসিস্ট্যান্ট-এর ব্যাকএন্ড বানান: শিক্ষার্থীরা নিজেদের কোর্স নোট নিয়ে প্রশ্ন করতে যে সার্ভিস ব্যবহার করে। প্রোডাক্টের ধারণাটা শুধু বাহন; অন্য ক্ষেত্র পছন্দ হলে (সাপোর্ট-টিকেট বাছাই, রেসিপি অ্যাসিস্ট্যান্ট, নিজের কাজের ডকুমেন্ট Q&A টুল) একই কাঠামো রাখুন। আসল কথা, আপনার প্রজেক্টে এগুলো সবই থাকতে হবে:
| ক্ষেত্র | প্রয়োজন |
|---|---|
| অ্যাকাউন্ট | Argon2id পাসওয়ার্ড হ্যাশিং, JWT অ্যাক্সেস টোকেন আর রোটেটিং রিফ্রেশ টোকেনসহ রেজিস্টার ও লগইন। প্রতিটা নোট আর প্রশ্ন একজন ব্যবহারকারীর, আর কেউ অন্যের ডেটা পড়তে পারে না। |
| ডেটাবেস | SQLAlchemy 2 আর Alembic মাইগ্রেশনসহ PostgreSQL: ব্যবহারকারী, নোট, প্রশ্ন আর একটা ইউসেজ টেবিল। কনস্ট্রেইন্ট ডেটাবেসে, ডুপ্লিকেটে 409, তালিকায় কিসেট পেজিনেশন। |
| ML এন্ডপয়েন্ট | joblib দিয়ে সেভ করা ছোট scikit-learn মডেল (যেমন নোটের বিষয় ক্লাসিফাই), lifespan-এ একবার লোড, ভ্যালিডেট করা ইনপুট, আর প্রতিটা রেসপন্সে model_version। |
| LLM এন্ডপয়েন্ট | প্রোভাইডার অ্যাডাপ্টারের (complete, stream, ping) পেছনে একটা /v1/ask এন্ডপয়েন্ট। ডিফল্ট একটা ফেক প্রোভাইডার, আসল প্রোভাইডার বাছা হয় সেটিংস দিয়ে। উত্তর স্ট্রিম হয় সার্ভার-সেন্ট ইভেন্টে। |
| লিমিট ও খরচ | Redis-এ প্রতি-ব্যবহারকারী রেট লিমিট (Retry-Afterসহ 429), দৈনিক টোকেন বাজেট, বাইরের প্রতিটা কলে টাইমআউট, আর প্রতি রিকোয়েস্টের টোকেন ও খরচের লগ, প্রম্পটের নয়। |
| টেস্ট | মক প্রোভাইডার ও ফেক ক্লকসহ pytest; ভুল ব্যবহারকারী, ভ্যালিডেশন এরর, লিমিট, স্ট্রিম করা উত্তর আর ব্যর্থ প্রোভাইডারের টেস্ট; openapi.json-এর কন্ট্রাক্ট স্ন্যাপশট। |
| নিরাপত্তা | OWASP API Security Top 10 (2023)-এর বিরুদ্ধে লিখিত রিভিউ, প্রতিটা ফাইন্ডিংয়ের জন্য ফিক্স ও টেস্ট, আর CI-তে সিক্রেট ও ডিপেন্ডেন্সি স্ক্যান। |
| প্যাকেজিং ও CI | নন-রুট চালানো মাল্টি-স্টেজ Dockerfile, API, PostgreSQL ও Redis-সহ compose.yaml, হেলথ চেক, আর প্রতি পুশে টেস্ট ও বিল্ড করা GitHub Actions ওয়ার্কফ্লো। |
| ডিপ্লয়মেন্ট | আপনার বাছা হোস্টে লাইভ, ট্যাগ করা রিলিজ থেকে, ডিপ্লয়ে মাইগ্রেশন, স্মোক টেস্ট, স্ট্রাকচার্ড লগ, হেলথ ও রেডিনেস এন্ডপয়েন্ট, আর রিহার্সাল দেওয়া রোলব্যাকসহ। |
| ডকুমেন্টেশন | একটা README (এটা কী, কীভাবে চালাবেন, কীভাবে ডিপ্লয় করবেন, এক ছবিতে আর্কিটেকচার), OpenAPI থেকে API রেফারেন্স, আর একটা ছোট রানবুক। |
ইচ্ছা করেই পরিধির বাইরে: ফ্রন্ট এন্ড, পেমেন্ট, ইমেইল, রিয়েল-টাইম চ্যাট, আর পেইড অ্যাকাউন্ট লাগে এমন সবকিছু। পুরো নম্বরের জন্য একটা ফেক প্রোভাইডারই যথেষ্ট; আপনি দেখাচ্ছেন আর্কিটেকচার, ভেন্ডর নয়।
মাইলস্টোন
প্রতিটা মাইলস্টোন শেষ হয় নিজের ব্রাঞ্চে একটা চালু প্রজেক্ট নিয়ে, পুল রিকোয়েস্টে মার্জ করা, CI সবুজ। সময় ফুরালে M6 পর্যন্ত গিয়ে থামা একটা কাজের প্রজেক্ট, M8 চেষ্টা করে না চলা প্রজেক্টের চেয়ে ভালো।
| # | মাইলস্টোন | শেষ হয় যখন | আবার পড়ুন |
|---|---|---|---|
| M1 | স্কেলেটন ও রিপোজিটরি | /health আর /ready সাড়া দেয়, সেটিংস আসে এনভায়রনমেন্ট থেকে, .gitignore আর .env.example আছে, CI-তে একটা টেস্ট পাস করে | ডিপেন্ডেন্সি, লাইফস্প্যান, মিডলওয়্যার ও সেটিংস |
| M2 | ডেটা ও অ্যাকাউন্ট | মাইগ্রেশন স্কিমা বানায়, রেজিস্টার ও লগইন চলে, ব্যবহারকারী শুধু নিজের নোট বানাতে ও দেখতে পারে | SQLAlchemy ও Alembic দিয়ে ডেটাবেস, অথেন্টিকেশন ও অথরাইজেশন |
| M3 | AI এন্ডপয়েন্ট | /v1/predict একটা লেবেল আর model_version দেয়; /v1/ask একটা ফেক উত্তর স্ট্রিম করে; দুটোই খারাপ ইনপুটে 422 দেয় | একটা ML মডেল সার্ভ করা, স্ট্রিমিংসহ LLM ব্যাকএন্ড বানানো |
| M4 | লিমিট, ক্যাশ ও খরচ | এক মিনিটে ১১তম রিকোয়েস্টে 429; বাজেট পেরোনো ব্যবহারকারী স্ট্রিম শুরুর আগেই প্রত্যাখ্যাত; প্রতিটা রিকোয়েস্ট টোকেন ও খরচ লগ করে | Redis দিয়ে ক্যাশিং, রেট লিমিটিং ও নির্ভরযোগ্যতা |
| M5 | পেশাদার টেস্ট | সব ব্যর্থতার পথ ঢাকা, টেস্টে আসল নেটওয়ার্ক নেই, স্যুট এক মিনিটের কমে চলে, কভারেজ রিপোর্ট হয় | পেশাদার API টেস্ট করা |
| M6 | নিরাপত্তা রিভিউ | দশটা ফাইন্ডিং লেখা (এমনকি "প্রযোজ্য নয়, কারণ…"), প্রতিটার ফিক্স ও টেস্টসহ; CI-তে pip-audit আর সিক্রেট স্ক্যান চলে | API নিরাপত্তা ও OWASP API Top 10 |
| M7 | কন্টেইনার | পরিষ্কার ক্লোন থেকে docker compose up কাজের স্ট্যাক দেয়; মাইগ্রেশন চলে ওয়ান-শট সার্ভিস হিসেবে | Docker: আপনার API প্যাকেজ করা, Docker Compose: API, PostgreSQL ও Redis একসাথে |
| M8 | শিপ করুন | রিলিজ ট্যাগ করুন, CI বিল্ড ও ডিপ্লয় করে, স্মোক টেস্ট পাস করে, একবার ইচ্ছা করে রোলব্যাক করেন, README-তে লাইভ URL আছে | GitHub Actions দিয়ে CI/CD, ডিপ্লয়মেন্ট ও প্রোডাকশনের প্রস্তুতি |
রিপোজিটরি শুরু করুন
FastAPI আর্কিটেকচার পাতা অনুসরণ করা কাঠামো রুটকে পাতলা আর লজিককে টেস্টযোগ্য রাখে। ফোল্ডার বানান, প্রথম কমিট করুন আর M1-এর ব্রাঞ্চ খুলুন:
mkdir -p ~/projects/study-assistant/{app/routers,app/services,app/repositories,app/schemas,tests,migrations,deploy,docs}
cd ~/projects/study-assistant
for d in app/routers app/services app/repositories app/schemas tests migrations deploy docs; do touch $d/.gitkeep; done
touch app/__init__.py app/main.py
printf '# Study Assistant API\n\nWhat it is, how to run it, how to deploy it.\n' > README.md
git init -q
git add .
git commit -q -m "Start the capstone"
git switch -q -c milestone/1-skeleton
git log --oneline --decorate53e48b6 (HEAD -> milestone/1-skeleton, main) Start the capstoneব্রাঞ্চের নাম, কমিট মেসেজ আর পুল রিকোয়েস্ট যেভাবে শিখেছেন সেভাবেই রাখুন: প্রতি মাইলস্টোনে একটা ব্রাঞ্চ, পরিষ্কার মেসেজসহ ছোট কমিট, কী বদলেছে আর কীভাবে টেস্ট করেছেন তা বলা PR বিবরণ, আর স্কোয়াশ মার্জ। শেষ কাঠামো এমন দেখায়:
study-assistant/
├── app/
│ ├── main.py # create_app(), lifespan, middleware, exception handlers
│ ├── settings.py # pydantic-settings, secrets as SecretStr
│ ├── routers/ # thin HTTP layer: auth, notes, predict, ask, health
│ ├── services/ # rules: auth, quota, provider adapters, model loading
│ ├── repositories/ # SQLAlchemy queries only
│ └── schemas/ # Pydantic request and response models
├── migrations/ # Alembic
├── tests/ # unit, API, and a few marked integration tests
├── deploy/ # render.yaml or Cloud Run notes, smoke_test.py
├── docs/ # architecture picture, runbook
├── Dockerfile
├── compose.yaml
├── .github/workflows/ # ci.yml, deploy.yml
├── .env.example
└── README.mdএকটা Makefile আপনাকে আর আপনার রিভিউয়ারদের একই ছোট কমান্ড দেয় (এর জন্য make লাগে, যা Linux ও macOS-এ আছে, আর Windows-এ আছে WSL বা Git Bash-এ):
# file: Makefile
.PHONY: test lint up down smoke
test:
python -m pytest -q
lint:
ruff check .
up:
docker compose up -d --build
down:
docker compose down
smoke:
python smoke_test.py $(URL) $(VERSION)গ্রহণযোগ্যতার চেকলিস্ট
আপনার ক্যাপস্টোন শেষ, যখন একজন অপরিচিত মানুষ শুধু আপনার রিপোজিটরি আর লাইভ URL থেকে প্রতিটা সারিতে টিক দিতে পারে। README-তে প্রতিটা টিকের পাশে প্রমাণ (একটা কমান্ড, ফাইল বা লিংক) লিখুন; "আমার মনে হয় হ্যাঁ" প্রমাণ নয়।
| যাচাই | প্রমাণ |
|---|---|
পরিষ্কার ক্লোন কপি করা .env.example নিয়ে docker compose up-এ চলে | README-র কমান্ড, নতুন মেশিন বা ফোল্ডারে চেষ্টা করা |
main-এ CI সবুজ: লিন্ট, টেস্ট, ডিপেন্ডেন্সি ও সিক্রেট স্ক্যান, ইমেজ বিল্ড | Actions রানের লিংক |
| টেস্টে নেটওয়ার্ক বা আসল কি লাগে না; ব্যর্থতার পথ ঢাকা | ভুল ব্যবহারকারী, 422, 429, প্রোভাইডার ব্যর্থতা, স্ট্রিম এররের টেস্টের নাম |
| id-ওয়ালা প্রতিটা রুট মালিকানা যাচাই করে; 401, 403, 404 ও 429 সঠিকভাবে ব্যবহার হয় | টেস্টে অথ টেস্টের একটা টেবিল |
| মাইগ্রেশন পুরো স্কিমা বানায়; ডিপ্লয় সেগুলো চালায়; সেগুলো ব্যাকওয়ার্ড কম্প্যাটিবল | CI-তে খালি ডেটাবেসে alembic upgrade head |
| Git ইতিহাস, লগ বা ইমেজে কোনো সিক্রেট নেই; সিক্রেট সেটিং বাধ্যতামূলক | সিক্রেট-স্ক্যান জব; কি-টা না থাকলে স্টার্টআপ টেস্ট |
| রেট, রিকোয়েস্ট সাইজ, কনকারেন্সি, সময় ও দৈনিক খরচের লিমিট আছে | প্রতিটার জন্য একটা টেস্ট বা লগ লাইন |
| লগ JSON, রিকোয়েস্ট ID বহন করে, আর প্রম্পট ছাড়া টোকেন ও খরচ দেখায় | ডকুমেন্টেশনে নমুনা লগ লাইন |
| ট্যাগ করা রিলিজ থেকে ডিপ্লয় হওয়া একটা URL HTTPS-এ উত্তর দেয়; ভার্সন দেখা যায় | তার বিরুদ্ধে চালানো স্মোক টেস্ট |
| একবার ইচ্ছা করে রোলব্যাক করেছেন আর সার্ভিস সুস্থ হয়েছে | ইতিহাসে দুটো ট্যাগ আর রিভার্ট কমিট |
| OWASP রিভিউ দশটা ঝুঁকিই তালিকাভুক্ত করে, ফিক্স ও টেস্টসহ, বা "প্রযোজ্য নয়"-এর কারণসহ | রিপোজিটরিতে docs/security-review |
| README আর্কিটেকচার, আপনার নেওয়া ট্রেড-অফ আর পরে কী করতেন তা ব্যাখ্যা করে | একটা ছবি আর এক পাতা লেখা |
নিজের বা মেন্টরের জন্য একটা সহজ গ্রেডিং: অবশ্যই (M1 থেকে M5 কাজ করে, একবার ডিপ্লয় হয়েছে), উচিত (M6 থেকে M8, রোলব্যাকের রিহার্সাল), বাড়তি (অ্যাডাপ্টারের পেছনে আসল LLM প্রোভাইডার, দীর্ঘ কাজের জন্য জব কিউ, OpenTelemetry ট্রেস, একটা স্টেজিং এনভায়রনমেন্ট, ক্যানারি রিলিজ)।
অ্যাডভান্সড চিট শিট
প্রতিটা সারি এমন কিছু যা টিউটোরিয়ালে চালিয়ে যাচাই করা হয়েছে। নিশ্চিত না হলে এখানে দেখুন, তারপর বিভাগের শিরোনামে বলা পাতাটা খুলুন।
Git ও GitHub (অ্যাডভান্সড Git, GitHub-এ টিম হিসেবে কাজ, AI প্রজেক্টে Git)
| দরকার | কমান্ড বা নিয়ম |
|---|---|
| অসমাপ্ত কাজ সরিয়ে রাখা | git stash push -u -m "msg", তারপর git stash pop (ফেরায় ও মুছে দেয়) বা apply (রেখে দেয়) |
| রিভিউয়ের আগে ব্রাঞ্চ গোছানো | git rebase -i <base> আর fixup, squash, reword; ফিরে আসতে --abort |
| একটা কমিট কপি করা | git cherry-pick -x <sha> |
| "হারানো" কমিট উদ্ধার | git reflog, তারপর git switch -c rescue <sha> (শুধু কমিট করা কাজ) |
| শেয়ার করা ইতিহাসে ফেরানো | git revert <sha> (একটা উল্টানো কমিট যোগ করে); শেয়ার করা ব্রাঞ্চে কখনো ফোর্স-পুশ নয় |
| প্রত্যাখ্যাত পুশ | git pull --rebase, তারপর পুশ; নিজের ব্রাঞ্চে --force-with-lease |
| রিলিজ | git tag -a v1.2.0 -m "...", git push --tags; ট্যাগ পুনরায় ব্যবহার নয় |
| ফর্ক | origin আপনার ফর্ক, upstream মূলটা; ব্রাঞ্চ, তারপর PR, রিভিউ, স্কোয়াশ মার্জ |
| বড় ফাইল | Git LFS (GitHub-এ ১০ GiB ফ্রি) বা নিজের স্টোরেজসহ DVC; Git-এ রাখুন পয়েন্টার |
| পুনরুৎপাদনযোগ্য Python | uv.lock কমিট করুন; uv sync --locked দিয়ে ইনস্টল |
| সিক্রেট কমিট হয়ে গেছে | আগে কি বদলান, তারপর git filter-repo, তারপর পুশ প্রোটেকশন ও স্ক্যান চালু করুন |
HTTP ও API ডিজাইন (HTTP গভীরে, মজবুত API ডিজাইন, ওয়েবহুক ও স্ট্রিমিং)
| বিষয় | নিয়ম |
|---|---|
| সেফ ও ইডেমপোটেন্ট | সেফ: GET, HEAD, OPTIONS। ইডেমপোটেন্ট: এগুলো আর PUT ও DELETE। POST কোনোটাই নয়, তাই শুধু Idempotency-Keyসহ রিট্রাই করুন। |
| স্ট্যাটাস কোড ক্লায়েন্টকে কী করতে বলে | 4xx রিকোয়েস্ট ঠিক করুন; 401 অথেন্টিকেট করুন; 403 বা 404 ছেড়ে দিন; 429 অপেক্ষা (Retry-After); 502, 503, 504 রিট্রাই |
| ক্যাশিং | সতেজতার জন্য Cache-Control; ETag আর If-None-Match দেয় 304; If-Match আর 412 হারানো আপডেট ঠেকায় |
| পেজিনেশন | অনন্য, ইনডেক্স করা কি-র ওপর কার্সর (কিসেট); অস্বচ্ছ কার্সর, সীমা বাঁধা limit, আর শেষে next_cursor: null |
| রিট্রাই | শুধু সাময়িক ব্যর্থতা; ফুল জিটারসহ এক্সপোনেনশিয়াল ব্যাকঅফ; Retry-After মানুন; সর্বোচ্চ চেষ্টার সংখ্যা ও রিট্রাই বাজেট |
| দীর্ঘ কাজ | Location স্ট্যাটাস URL-সহ 202 দিন; ক্লায়েন্ট ডেডলাইনসহ পোল করে |
| ভার্সনিং | সংযোজনমূলক পরিবর্তন পছন্দ করুন; নইলে /v2, সঙ্গে Deprecation ও Sunset হেডার |
| OAuth 2.0 | ব্যবহারকারীর জন্য authorization code + PKCE; সার্ভিসের জন্য client credentials; থার্ড-পার্টির জন্য কখনো password grant নয় (RFC 9700) |
| ওয়েবহুক | timestamp + "." + raw body HMAC-SHA256 দিয়ে সাইন করুন; hmac.compare_digest দিয়ে মেলান; পুরোনো টাইমস্ট্যাম্প প্রত্যাখ্যান; ইভেন্ট id দিয়ে ডিডুপ্লিকেট; দ্রুত 2xx দিন |
| SSE | data:, event:, id: ও retry: ফিল্ড, ইভেন্টের মাঝে ফাঁকা লাইন; FastAPI-তে EventSourceResponse ও ServerSentEvent |
ক্লায়েন্ট, FastAPI, ডেটাবেস ও অথ (পেশাদার API ক্লায়েন্ট থেকে অথেন্টিকেশন ও অথরাইজেশন)
| বিষয় | নিয়ম |
|---|---|
| httpx | প্রতি আপস্ট্রিমে একটা শেয়ার করা Client বা AsyncClient; স্পষ্ট কানেক্ট ও রিড টাইমআউট; Semaphoreসহ gather; টেস্টে respx (httpx2 রক্ষণাবেক্ষণ করা ফর্ক) |
| স্তর | রাউটার (HTTP), সার্ভিস (নিয়ম), রিপোজিটরি (SQL), স্কিমা (আকার); ইমপোর্ট এক দিকে চলে |
| ডিপেন্ডেন্সি ও লাইফস্প্যান | Annotated[X, Depends(f)]; শেয়ার করা রিসোর্স lifespan-এ বানান, app.state-এ রাখুন; টেস্টে app.dependency_overrides |
def না async def | ভেতরের সবকিছু await করা হলেই কেবল async def; ব্লকিং কোড সাধারণ def-এ (থ্রেডপুল) |
| ব্যাকগ্রাউন্ড কাজ | ছোট, হারালে ক্ষতি নেই এমন কাজে BackgroundTasks; টেকসই বা ভারী কাজে কিউ |
| প্রোব | /health সস্তা লাইভনেস; /ready নির্ভরতা যাচাই করে ও 503 দেয় |
| ডেটাবেস | প্রসেস প্রতি একটা ইঞ্জিন, রিকোয়েস্ট প্রতি একটা সেশন; IntegrityError হয় 409; selectinload দিয়ে N+1 এড়ান; আসল মাইগ্রেশনে বানানো আলাদা ডেটাবেসে টেস্ট |
| Alembic | alembic revision --autogenerate -m "msg", পড়ে দেখুন, প্রতিটা ডিপ্লয়ে alembic upgrade head, alembic downgrade -1, alembic current; নাম বদল দেখতে পায় না |
| পাসওয়ার্ড ও টোকেন | pwdlib-এ Argon2id; বাঁধা algorithmsসহ PyJWT; iss, exp ও টোকেনের ধরন যাচাই; ছোট অ্যাক্সেস টোকেন আর রোটেটিং রিফ্রেশ টোকেন |
| অথরাইজেশন | 401 = আপনি কে; 403 বা 404 = আপনার নয়; রোল আর অবজেক্ট রুটে প্রতিটায় মালিকানা যাচাই (BOLA) |
Redis, টেস্টিং ও AI সার্ভিস (ক্যাশিং… থেকে LLM ব্যাকএন্ড)
| বিষয় | নিয়ম |
|---|---|
| ক্যাশ | প্রতিটা কি-তে প্রিফিক্স, স্বাভাবিকীকৃত পরিচয় ও TTL; TTL, লেখার সময় মুছে ফেলা বা ভার্সন করা কি দিয়ে ইনভ্যালিডেট; LLM ফলাফল ক্যাশ শুধু ডিটারমিনিস্টিক হলে, কি-তে মডেল, প্রম্পট ভার্সন ও ব্যবহারকারীর স্কোপসহ |
| রেট লিমিট | ফিক্সড উইন্ডো (সহজ), স্লাইডিং উইন্ডো (নিখুঁত), টোকেন বাকেট (বার্স্ট ও টোকেনের খরচ); Retry-Afterসহ 429 |
| নির্ভরযোগ্যতা | সবকিছুতে টাইমআউট ও ডেডলাইন; রিট্রাই শুধু এক স্তরে; সার্কিট ব্রেকার; পরিকল্পিত ডিগ্রেডেশন; প্রতিটা লগ লাইনে রিকোয়েস্ট ID |
| টেস্ট পিরামিড | বাইরের জগৎ নকল করা অনেক দ্রুত ইউনিট ও API টেস্ট; কয়েকটা চিহ্নিত ইন্টিগ্রেশন টেস্ট; pytest.mark.parametrize আর সঠিক স্কোপের ফিক্সচার; কভারেজ ফাঁক খোঁজে, এটা লক্ষ্য নয় |
| বাইরেরটা মক করা | HTTP-র জন্য respx বা MockTransport; LLM-এর জন্য ফেক প্রোভাইডার; ইনজেক্ট করা যায় এমন ক্লক; API কন্ট্রাক্ট হিসেবে OpenAPI স্ন্যাপশট |
| মডেল সার্ভ করা | অফলাইনে ট্রেন; joblib দিয়ে একটা পাইপলাইন সেভ; সব ভার্সন lifespan-এ একবার লোড ও ওয়ার্ম-আপ; ফিচার ভ্যালিডেট; model_version ফেরত দিন; টাইমআউটসহ থ্রেডে চালান |
| LLM ব্যাকএন্ড | প্রোভাইডার অ্যাডাপ্টার (complete, stream, ping); কি আসে সেটিংস থেকে; SSE-তে স্ট্রিম; finally-তে ব্যবহার রেকর্ড; টোকেন, খরচ, প্রম্পট ও মডেল ভার্সন লগ, প্রম্পট নয়; স্ট্রিম শুরুর আগেই সীমা পেরোনো ব্যবহারকারীকে প্রত্যাখ্যান |
নিরাপত্তা, কন্টেইনার, CI/CD ও ডিপ্লয়মেন্ট (API নিরাপত্তা থেকে ডিপ্লয়মেন্ট)
| বিষয় | নিয়ম |
|---|---|
| OWASP API Top 10 (2023) | ১ ভাঙা অবজেক্ট-স্তরের অথরাইজেশন, ২ ভাঙা অথেন্টিকেশন, ৩ ভাঙা অবজেক্ট প্রপার্টি-স্তরের অথরাইজেশন, ৪ সীমাহীন রিসোর্স ব্যবহার, ৫ ভাঙা ফাংশন-স্তরের অথরাইজেশন, ৬ সংবেদনশীল ব্যবসায়িক প্রবাহে সীমাহীন প্রবেশ, ৭ সার্ভার-সাইড রিকোয়েস্ট ফোর্জারি, ৮ নিরাপত্তা ভুল-কনফিগারেশন, ৯ অনুপযুক্ত ইনভেন্টরি ব্যবস্থাপনা, ১০ API-র অনিরাপদ ব্যবহার |
| সবসময় | প্যারামিটারযুক্ত SQL; সঠিক CORS অরিজিন (ব্রাউজারের নিয়ম, অথেন্টিকেশন নয়); সাইজ লিমিট; এনভায়রনমেন্টে সিক্রেট; CI-তে pip-audit ও সিক্রেট স্ক্যান; HTTPS; লগে ব্যক্তিগত ডেটা নয় |
| Dockerfile | python:3.14-slim; ক্যাশের জন্য কোডের আগে ডিপেন্ডেন্সি; মাল্টি-স্টেজ বিল্ড; নন-রুট ব্যবহারকারী; এক্সেক-ফর্ম CMD; .venv, .git, .env-এর জন্য .dockerignore |
| Docker কমান্ড | docker build -t name:1.0.0 .; docker run --rm -p 8000:8000 --env-file .env name:1.0.0; docker logs; এক্সিট কোড 137 (মেরে ফেলা) ও 143 (SIGTERM) |
| Compose | সার্ভিসরা কথা বলে সার্ভিসের নামে; শুধু API পাবলিশ করুন; healthcheck আর depends_on: condition: service_healthy; মাইগ্রেশন ওয়ান-শট সার্ভিস; সিক্রেট /run/secrets/<name>-এ; যাচাইয়ে docker compose config; down -v ডেটা মুছে দেয় |
| GitHub Actions | ট্রিগার push, pull_request, workflow_dispatch; permissions: contents: read; থার্ড-পার্টি অ্যাকশন SHA-তে পিন; PR কোডসহ pull_request_target কখনো নয়; এনভায়রনমেন্টের মাধ্যমে ডিপ্লয় |
| ডিপ্লয়মেন্ট | একই কোড, আলাদা কনফিগ; $PORT; stdout-এ JSON লগ; ট্রাফিকের আগে মাইগ্রেশন; SIGTERM শাটডাউন; প্রতিটা ডিপ্লয়ের পর স্মোক টেস্ট; প্ল্যাটফর্ম, ট্যাগ বা git revert দিয়ে রোলব্যাক; বাজেট ও ক্যাপ; রিস্টোরের অনুশীলন |
এরপর কী
আপনি BitByte AI পথে Level 0-এর পঞ্চম বিষয় AI-এর জন্য Git, API ও ব্যাকএন্ড শেষ করেছেন। রাস্তা এখান থেকে এভাবে এগোয়:
| পরের গন্তব্য | সেখানে কী করবেন | এই টিউটোরিয়ালের কী কাজে লাগবে |
|---|---|---|
| প্রম্পট ইঞ্জিনিয়ারিং (Level 0, বিষয় ৬) | নির্ভরযোগ্য, কাঠামোবদ্ধ আউটপুট দেয় এমন প্রম্পট লেখা; সিস্টেম মেসেজ, উদাহরণ, ফরম্যাট ও হাতে হাতে মূল্যায়ন | LLM অ্যাডাপ্টার ও রিকোয়েস্ট স্কিমা, লগে প্রম্পট ভার্সন, /v1/chat-ধাঁচের কল |
| AI Engineer পথ | গভীরে LLM API, রিট্রিভাল-অগমেন্টেড জেনারেশন (RAG), এজেন্ট ও টুল ব্যবহার, MCP সার্ভার, ইভ্যালুয়েশন, আর LLMOps (ট্রেসিং, খরচ, AI সিস্টেম ডিপ্লয়) | সবকিছু: RAG সার্ভিস মানে ডেটাবেস, ক্যাশ, অথ, লিমিট, টেস্ট ও ডিপ্লয়মেন্টসহ একটা FastAPI সার্ভিস |
ক্যাপস্টোনের পরের সপ্তাহগুলোর জন্য কিছু ধারণা, মোটামুটি মূল্যের ক্রমে: ক্যাপস্টোনের লিংক CV আর GitHub প্রোফাইলের ওপরে রাখুন; কাউকে আপনার পুল রিকোয়েস্ট রিভিউ করতে বলুন আর আপনিও তাঁর পুল রিকোয়েস্ট রিভিউ করুন; অ্যাডাপ্টারের পেছনে একটা আসল প্রোভাইডার বসান আর বিলটা দেখতে কেমন তা লিখে রাখুন; OpenTelemetry দিয়ে ট্রেসিং আর দীর্ঘ কাজের জন্য জব কিউ যোগ করুন; মাসে একবার FastAPI, Pydantic ও SQLAlchemy-র চেঞ্জলগ পড়ুন, কারণ এই টিউটোরিয়ালের টুলগুলো দ্রুত বদলায়; আর Kubernetes বা Terraform শিখুন তখনই যখন আসল প্রজেক্টে লাগে, তার আগে নয়।
সাধারণ ভুল
- পরিধি বড় হয়ে যাওয়া। দশটা ফিচার, একটাও শেষ নয়। সমাধান: অন্য কিছুর আগে M1 থেকে M5 পুরো করুন, আর ফিচার ছাঁটুন, টেস্ট নয়।
- আগে ফ্রন্ট এন্ড বানানো। এটা অগ্রগতির মতো দেখায় আর কঠিন অংশ লুকিয়ে রাখে। সমাধান: M8 পর্যন্ত API চালান
curl, টেস্ট আর/docsদিয়ে। - ডিপ্লয়মেন্ট শেষ সন্ধ্যার জন্য রাখা। পোর্ট, সিক্রেট আর মাইগ্রেশনের সমস্যা দেখা দেয় শুধু আসল হোস্টে। সমাধান: M1 বা M2-তেই স্কেলেটন ডিপ্লয় করুন আর ডিপ্লয় করা অবস্থায় রাখুন।
- যে README শুধু বলে "main.py চালান"। কেউ, এক মাস পরে আপনি নিজেও, এটা চালু করতে পারবে না। সমাধান: কাজ করতে করতে README লিখুন আর পরিষ্কার ফোল্ডারে পরীক্ষা করুন।
- না বুঝে টিউটোরিয়াল নকল করা। ইন্টারভিউয়ে "এখানে এই স্ট্যাটাস কোড কেন?" প্রশ্নের উত্তর দিতে পারবেন না। সমাধান: প্রতিটা ফাইলের জন্য একটা বাক্যে লিখুন সেটা কেন আছে, আর ইচ্ছা করে একটা জিনিস বদলে দেখুন কী ভাঙে।
নিজে চেষ্টা করুন
- সহজ। আপনার ক্যাপস্টোনের শুরুর বিন্দু
v0.1.0নামের একটা অ্যানোটেটেড ট্যাগ দিয়ে চিহ্নিত করুন,main-এ ফিরে যান আর ট্যাগ ও ব্রাঞ্চের তালিকা দেখুন। - মাঝারি। আপনার ক্যাপস্টোনের স্মোক টেস্ট ডিজাইন করুন: লাইভ সার্ভিসের বিরুদ্ধে কোন কোন রিকোয়েস্ট করবে তা লিখুন, আর বলুন তার কোনগুলো কোনো ডেটা বদলাতে পারবে না।
- কঠিন। "LLM বিল এক রাতে দ্বিগুণ হয়ে গেছে" এই পরিস্থিতির জন্য রানবুকের একটা এন্ট্রি লিখুন: আগে কী দেখবেন, কোন ক্রমে, আর এটা ঠেকাতে কোন লিমিট বা সেটিং আগে থেকে যোগ করতেন।
উত্তর
সহজ। ট্যাগ একটা রিলিজ বা শুরুর বিন্দু চিহ্নিত করে, যাতে আপনি সবসময় সেখানে ফিরতে পারেন:
git switch -q main
git tag -a v0.1.0 -m "Capstone skeleton"
git tag --list
git branchv0.1.0
* main
milestone/1-skeletonমাঝারি। শুধু রিড-অনলি বা নিজে পরিষ্কার করে এমন রিকোয়েস্ট: GET /health (চালু কি, কোন ভার্সন?), GET /ready (ডেটাবেস নাগালে কি?), টোকেন ছাড়া একটা POST যার 401 দেওয়া উচিত, বৈধ টোকেন আর অবৈধ বডিসহ একটা POST যার 422 দেওয়া উচিত (কোনো সারি না লিখেই অথ আর ভ্যালিডেশন প্রমাণ করে), স্মোক-টেস্ট ব্যবহারকারীের টোকেনে একটা তালিকার GET, আর ফেক প্রোভাইডারের বিরুদ্ধে একটা স্ট্রিম করা /v1/ask (বা ছোট প্রম্পট আর কোনো খরচ নেই এমন বাজেটের একটা রিকোয়েস্ট)। ডেটা বানায় এমন কিছু চালাতে হলে একটা নির্দিষ্ট স্মোক-টেস্ট ব্যবহারকারী ব্যবহার করুন আর কাজ শেষে নিজে পরিষ্কার করুন। প্রতিটা ডিপ্লয়ের পর এটা চালান আর এক্সিট কোডকেই ঠিক করতে দিন পাইপলাইন এগোবে কি না, ঠিক ডিপ্লয়মেন্ট পাতার মতো।
কঠিন। ভালো রানবুক এন্ট্রি একটা ছোট, ক্রমানুসারে সাজানো তালিকা। প্রথমে ক্ষতি আটকান: দৈনিক টোকেন বাজেট কমান বা প্রোভাইডার সেটিং সস্তা মডেলে বদলান, আর কি ফাঁস হয়েছে সন্দেহ হলে সেটা বদলান। দ্বিতীয়ত, আপনার বানানো লগ দিয়ে কারণ খুঁজুন: গত ২৪ ঘণ্টার cost ব্যবহারকারী, এন্ডপয়েন্ট, prompt_version ও model_version ধরে গ্রুপ করুন, আর রিকোয়েস্টের সংখ্যা, রিট্রাই ও কেটে যাওয়া স্ট্রিম দেখুন। তৃতীয়ত, কারণ শনাক্ত করুন: কনটেক্সট দ্বিগুণ করা প্রম্পট পরিবর্তন, নন-ইডেমপোটেন্ট কলে রিট্রাই লুপ, একজন অপব্যবহারকারী, বা ফাঁস হওয়া কি। চতুর্থত, ঠিক করুন ও ঠেকান: প্রোভাইডার কলের আগেই প্রত্যাখ্যান করা প্রতি-ব্যবহারকারী ও গ্লোবাল দৈনিক বাজেট, প্রোভাইডারে খরচের সীমা, ৫০ ও ৮০ শতাংশে বাজেট অ্যালার্ট, রিট্রাই বাজেট, ওই ঘটনার একটা টেস্ট, আর পোস্ট-মর্টেমে একটা নোট। ওই তালিকার প্রতিটা জিনিস আপনি এই টিউটোরিয়ালে বানিয়েছেন।
সারসংক্ষেপ
- ক্যাপস্টোন আটটা মাইলস্টোনে বানানো একটা স্টাডি অ্যাসিস্ট্যান্ট ব্যাকএন্ড, প্রতিটা শেষ হয় একটা কাজের, মার্জ করা, ডিপ্লয় করা বা ডিপ্লয়যোগ্য প্রজেক্ট নিয়ে; ঐচ্ছিক কিছুর আগে M1 থেকে M5 শেষ করুন।
- গ্রহণযোগ্যতা মানে মতামত নয়, প্রমাণ: পরিষ্কার ক্লোন চলে, CI সবুজ, ব্যর্থতার পথ টেস্ট করা, সিক্রেট পরিষ্কার, লিমিট ও খরচের লগ আছে, ট্যাগ করা রিলিজ লাইভ, আর রোলব্যাকের রিহার্সাল হয়েছে।
- চিট শিটে Git, HTTP ও API ডিজাইন, ক্লায়েন্ট, FastAPI, ডেটাবেস, অথ, Redis, টেস্টিং, AI সার্ভিস, নিরাপত্তা, কন্টেইনার, CI/CD ও ডিপ্লয়মেন্ট এক জায়গায় আছে।
- পরের গন্তব্য প্রম্পট ইঞ্জিনিয়ারিং (Level 0, বিষয় ৬), তারপর AI Engineer পথ: LLM API, RAG, এজেন্ট, MCP, ইভাল ও LLMOps।
এরপর: প্রম্পট ইঞ্জিনিয়ারিং, BitByte AI পথে Level 0-এর পরের বিষয়, আর তারপর AI Engineer পথ। AI-এর জন্য Git, API ও ব্যাকএন্ড: অ্যাডভান্সড শেষ করার জন্য অভিনন্দন।