Upload 10 files
Browse files- .gitattributes +1 -0
- NIlesh_Hanotia_AI.pdf +3 -0
- dataset.py +24 -0
- model.py +43 -0
- pdf.py +10 -0
- resume_text.docx +0 -0
- resume_text.txt +70 -0
- tokenizer.py +25 -0
- train.py +56 -0
- vocab.json +206 -0
- vocab.py +174 -0
.gitattributes
CHANGED
|
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
NIlesh_Hanotia_AI.pdf filter=lfs diff=lfs merge=lfs -text
|
NIlesh_Hanotia_AI.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:b1a0719bbefb24885a8bb1473a0e7128a12692817bf74a659a5951c7be7b1738
|
| 3 |
+
size 281525
|
dataset.py
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import json
|
| 2 |
+
from tokenizer import encode
|
| 3 |
+
|
| 4 |
+
# Load full resume text
|
| 5 |
+
with open("resume_text.txt", "r", encoding="utf-8") as f:
|
| 6 |
+
text = f.read()
|
| 7 |
+
|
| 8 |
+
data = encode(text)
|
| 9 |
+
context_length = 64
|
| 10 |
+
|
| 11 |
+
def get_pairs(data, context_length):
|
| 12 |
+
pairs = []
|
| 13 |
+
for i in range(len(data) - context_length):
|
| 14 |
+
x = data[i : i + context_length]
|
| 15 |
+
y = data[i + 1 : i + context_length + 1]
|
| 16 |
+
pairs.append((x, y))
|
| 17 |
+
return pairs
|
| 18 |
+
|
| 19 |
+
pairs = get_pairs(data, context_length)
|
| 20 |
+
|
| 21 |
+
print(f"Total characters encoded : {len(data)}")
|
| 22 |
+
print(f"Total training pairs : {len(pairs)}")
|
| 23 |
+
print(f"Sample input : {pairs[0][0][:10]} ...")
|
| 24 |
+
print(f"Sample target : {pairs[0][1][:10]} ...")
|
model.py
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import torch
|
| 2 |
+
import torch.nn as nn
|
| 3 |
+
|
| 4 |
+
vocab_size = 80
|
| 5 |
+
embed_dim = 128
|
| 6 |
+
num_heads = 4
|
| 7 |
+
num_layers = 3
|
| 8 |
+
context_length = 64
|
| 9 |
+
|
| 10 |
+
class ResumeEncoder(nn.Module):
|
| 11 |
+
def __init__(self):
|
| 12 |
+
super().__init__()
|
| 13 |
+
self.token_emb = nn.Embedding(vocab_size, embed_dim)
|
| 14 |
+
self.position_emb = nn.Embedding(context_length, embed_dim)
|
| 15 |
+
self.blocks = nn.Sequential(*[
|
| 16 |
+
nn.TransformerEncoderLayer(
|
| 17 |
+
d_model=embed_dim,
|
| 18 |
+
nhead=num_heads,
|
| 19 |
+
dim_feedforward=embed_dim * 4,
|
| 20 |
+
dropout=0.1,
|
| 21 |
+
batch_first=True
|
| 22 |
+
) for _ in range(num_layers)
|
| 23 |
+
])
|
| 24 |
+
self.output_head = nn.Linear(embed_dim, vocab_size)
|
| 25 |
+
|
| 26 |
+
def forward(self, x):
|
| 27 |
+
B, T = x.shape
|
| 28 |
+
tok = self.token_emb(x)
|
| 29 |
+
pos = self.position_emb(torch.arange(T, device=x.device))
|
| 30 |
+
x = self.blocks(tok + pos)
|
| 31 |
+
return self.output_head(x)
|
| 32 |
+
|
| 33 |
+
def encode(self, x):
|
| 34 |
+
# Returns single vector for a sequence β used for similarity search
|
| 35 |
+
tok = self.token_emb(x)
|
| 36 |
+
pos = self.position_emb(torch.arange(x.shape[-1], device=x.device))
|
| 37 |
+
out = self.blocks(tok + pos)
|
| 38 |
+
return out.mean(dim=-2)
|
| 39 |
+
|
| 40 |
+
if __name__ == "__main__":
|
| 41 |
+
model = ResumeEncoder()
|
| 42 |
+
print("Model created!")
|
| 43 |
+
print(f"Parameters: {sum(p.numel() for p in model.parameters()):,}")
|
pdf.py
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import pdfplumber
|
| 2 |
+
|
| 3 |
+
with pdfplumber.open("NIlesh_Hanotia_AI.pdf") as pdf:
|
| 4 |
+
text = "\n".join(page.extract_text() or "" for page in pdf.pages)
|
| 5 |
+
|
| 6 |
+
with open("resume_text.txt", "w", encoding="utf-8") as f:
|
| 7 |
+
f.write(text)
|
| 8 |
+
|
| 9 |
+
print("resume_text.txt saved!")
|
| 10 |
+
print(f"Total characters: {len(text)}")
|
resume_text.docx
ADDED
|
Binary file (11.4 kB). View file
|
|
|
resume_text.txt
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
NILESH HANOTIA
|
| 2 |
+
AI Implementation Lead | POC-to-Production Specialist | Enterprise AI Deployment
|
| 3 |
+
Ahmedabad, India | +91-9925537229 | nilesh.hanotia@outlook.com
|
| 4 |
+
CERTIFICATIONS
|
| 5 |
+
AWS Certified AI Practitioner | Amazon Web Services
|
| 6 |
+
PROFESSIONAL SUMMARY
|
| 7 |
+
AI implementation leader with 7+ years driving enterprise AI deployments from first discovery call through
|
| 8 |
+
production go-live. Specialise in POC design and execution, stakeholder alignment, and translating complex
|
| 9 |
+
LLM/AWS architectures into measurable business outcomes. At Armakuni, serve as the bridge between technical
|
| 10 |
+
delivery teams and enterprise clients β owning the full 11-stage POC lifecycle: project allocation, internal/external
|
| 11 |
+
kick-offs, weekly governance, execution, testing, delivery, and path-to-production planning. Independently
|
| 12 |
+
delivered 6+ AI products generating $5M+ combined revenue, with proven impact in healthcare, legal, analytics,
|
| 13 |
+
and automation domains.
|
| 14 |
+
CORE COMPETENCIES
|
| 15 |
+
AI Implementation & POC Delivery: End-to-end POC lifecycle ownership, POCβProduction roadmapping,
|
| 16 |
+
enterprise AI adoption strategy, deployment governance, MVP scoping, client validation
|
| 17 |
+
Technical Fluency: LLM pipelines & AI workflows, AWS services (Lambda, Bedrock, API Gateway, DynamoDB,
|
| 18 |
+
CloudWatch), serverless architecture, API integrations, solution architecture collaboration, logging & observability
|
| 19 |
+
(Langfuse, Langsmith)
|
| 20 |
+
Stakeholder & Delivery Leadership: Executive alignment, discovery workshops, SOW-to-delivery conversion,
|
| 21 |
+
weekly PSR reporting, risk & escalation management, account expansion strategy, cross-functional team
|
| 22 |
+
coordination
|
| 23 |
+
PROFESSIONAL EXPERIENCE
|
| 24 |
+
Customer Solution Consultant (CSC) β AI Implementation β Armakuni 2025 β Present
|
| 25 |
+
Own end-to-end delivery of AI POCs and rapid engagements (5β8 weeks) across enterprise clients in healthcare,
|
| 26 |
+
legal, and automation sectors.
|
| 27 |
+
β’ Drive the full 11-stage POC lifecycle: project allocation, SOW review, internal/external kick-offs, planning,
|
| 28 |
+
weekly governance, execution oversight, testing & client validation, delivery, and path-to-production.
|
| 29 |
+
β’ Convert Statements of Work into executable delivery plans with milestones, sprint cadences, RACI matrices,
|
| 30 |
+
and risk registers.
|
| 31 |
+
β’ Serve as primary bridge between developers, solution architects, DevOps, and enterprise client
|
| 32 |
+
stakeholders β ensuring technical decisions align with business outcomes.
|
| 33 |
+
β’ Lead weekly executive reporting (PSR), risk management, and scope control; escalate proactively across a
|
| 34 |
+
structured L1βL3 escalation matrix.
|
| 35 |
+
β’ Develop deep working knowledge of AWS services (Lambda, Bedrock, API Gateway, CloudWatch) and LLM
|
| 36 |
+
pipeline architecture to engage credibly with both technical teams and client leadership.
|
| 37 |
+
β’ Create and maintain technical documentation β process flows, README files, test cases β to ensure
|
| 38 |
+
production readiness from day one of execution.
|
| 39 |
+
β’ Facilitate path-to-production workshops with clients, mapping POC learnings to scalable architecture,
|
| 40 |
+
compliance requirements (GDPR, HIPAA), and business value expansion plans.
|
| 41 |
+
β’ Identify account expansion, cross-sell, and upsell opportunities, contributing to long-term Armakuni account
|
| 42 |
+
growth strategy.
|
| 43 |
+
AI Product & Implementation Lead β Independent Consultant 2021 β 2025
|
| 44 |
+
Delivered AI products end-to-end β from problem discovery and architecture design through deployment, user
|
| 45 |
+
adoption, and ongoing iteration β serving 10,000+ users across multiple industries.
|
| 46 |
+
β’ Designed and deployed 6+ production AI systems generating $5M+ combined revenue across healthcare,
|
| 47 |
+
legal, enterprise analytics, and automation domains.
|
| 48 |
+
β’ Led full AI product lifecycle: stakeholder discovery, requirements definition, LLM workflow design, MVP
|
| 49 |
+
build, UAT, and phased production rollout.
|
| 50 |
+
β’ Reduced manual client workflows by 80β90% through targeted AI automation, directly measurable in client
|
| 51 |
+
operations.
|
| 52 |
+
β’ Translated complex enterprise business needs into implementable technical architectures β working hands-
|
| 53 |
+
on across AWS, API integrations, and AI/LLM pipelines.
|
| 54 |
+
β’ Built and validated AI products with real users, iterating rapidly based on adoption data and feedback to
|
| 55 |
+
drive retention and expansion.
|
| 56 |
+
β’ Simultaneously built independent projects including real-time trading systems on AWS (Lambda,
|
| 57 |
+
DynamoDB, API Gateway, Bedrock, CloudWatch) β deepening hands-on serverless and AI infrastructure
|
| 58 |
+
expertise.
|
| 59 |
+
EARLIER CAREER
|
| 60 |
+
Product Analyst β Cignex Datamatics 2020 β 2021
|
| 61 |
+
Business Product Analyst β Cygnet Infotech 2019 β 2020
|
| 62 |
+
Associate Product Manager β Aimdek Technologies 2017 β 2019
|
| 63 |
+
TECHNICAL TOOLING
|
| 64 |
+
Cloud & AI: AWS (Lambda, Bedrock, API Gateway, DynamoDB, CloudWatch, CloudFront, CDK) | LLM
|
| 65 |
+
Pipelines | Langfuse | Langsmith
|
| 66 |
+
Dev & Data: Python | SQL | APIs | Docker | Tableau | Mixpanel
|
| 67 |
+
Delivery & Design: Jira | Zoho Projects | Figma | Panda.doc | Agile/Scrum
|
| 68 |
+
EDUCATION
|
| 69 |
+
Post Graduate Diploma in Business Administration β St. Kabir Institute
|
| 70 |
+
Bachelor of Commerce β IGNOU
|
tokenizer.py
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import json
|
| 2 |
+
|
| 3 |
+
# Load vocab
|
| 4 |
+
with open("vocab.json", "r", encoding="utf-8") as f:
|
| 5 |
+
vocab = json.load(f)
|
| 6 |
+
|
| 7 |
+
stoi = vocab["stoi"]
|
| 8 |
+
itos = {int(k): v for k, v in vocab["itos"].items()}
|
| 9 |
+
vocab_size = vocab["vocab_size"]
|
| 10 |
+
|
| 11 |
+
def encode(text):
|
| 12 |
+
return [stoi[c] for c in text if c in stoi]
|
| 13 |
+
|
| 14 |
+
def decode(ids):
|
| 15 |
+
return ''.join([itos[i] for i in ids])
|
| 16 |
+
|
| 17 |
+
if __name__ == "__main__":
|
| 18 |
+
sample = "python developer with aws experience in ahmedabad"
|
| 19 |
+
encoded = encode(sample)
|
| 20 |
+
decoded = decode(encoded)
|
| 21 |
+
|
| 22 |
+
print(f"Sample text : {sample}")
|
| 23 |
+
print(f"Encoded : {encoded}")
|
| 24 |
+
print(f"Decoded back : {decoded}")
|
| 25 |
+
print(f"Vocab size : {vocab_size}")
|
train.py
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import torch
|
| 2 |
+
import torch.nn.functional as F
|
| 3 |
+
from torch.utils.data import Dataset, DataLoader
|
| 4 |
+
from model import ResumeEncoder
|
| 5 |
+
from tokenizer import encode
|
| 6 |
+
|
| 7 |
+
# Load resume text
|
| 8 |
+
with open("resume_text.txt", "r", encoding="utf-8") as f:
|
| 9 |
+
text = f.read()
|
| 10 |
+
|
| 11 |
+
data = encode(text)
|
| 12 |
+
context_length = 64
|
| 13 |
+
|
| 14 |
+
class ResumeDataset(Dataset):
|
| 15 |
+
def __init__(self, data, context_length):
|
| 16 |
+
self.data = data
|
| 17 |
+
self.context_length = context_length
|
| 18 |
+
|
| 19 |
+
def __len__(self):
|
| 20 |
+
return len(self.data) - self.context_length
|
| 21 |
+
|
| 22 |
+
def __getitem__(self, idx):
|
| 23 |
+
x = torch.tensor(self.data[idx : idx + self.context_length])
|
| 24 |
+
y = torch.tensor(self.data[idx + 1 : idx + self.context_length + 1])
|
| 25 |
+
return x, y
|
| 26 |
+
|
| 27 |
+
dataset = ResumeDataset(data, context_length)
|
| 28 |
+
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
|
| 29 |
+
|
| 30 |
+
model = ResumeEncoder()
|
| 31 |
+
optimizer = torch.optim.AdamW(model.parameters(), lr=3e-4)
|
| 32 |
+
epochs = 500
|
| 33 |
+
|
| 34 |
+
|
| 35 |
+
for epoch in range(1, epochs + 1):
|
| 36 |
+
total_loss = 0
|
| 37 |
+
for x, y in dataloader:
|
| 38 |
+
logits = model(x)
|
| 39 |
+
B, T, C = logits.shape
|
| 40 |
+
loss = F.cross_entropy(logits.view(B*T, C), y.view(B*T))
|
| 41 |
+
optimizer.zero_grad()
|
| 42 |
+
loss.backward()
|
| 43 |
+
optimizer.step()
|
| 44 |
+
total_loss += loss.item()
|
| 45 |
+
|
| 46 |
+
avg_loss = total_loss / len(dataloader)
|
| 47 |
+
|
| 48 |
+
if epoch % 10 == 0:
|
| 49 |
+
print(f"Epoch {epoch}/{epochs} | Loss: {avg_loss:.4f}")
|
| 50 |
+
|
| 51 |
+
if epoch % 50 == 0:
|
| 52 |
+
torch.save(model.state_dict(), f"resume_encoder_epoch{epoch}.pth")
|
| 53 |
+
print(f" β Checkpoint saved at epoch {epoch}")
|
| 54 |
+
|
| 55 |
+
torch.save(model.state_dict(), "resume_encoder.pth")
|
| 56 |
+
print("Final model saved!")
|
vocab.json
ADDED
|
@@ -0,0 +1,206 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"stoi": {
|
| 3 |
+
" ": 0,
|
| 4 |
+
"e": 1,
|
| 5 |
+
"n": 2,
|
| 6 |
+
"t": 3,
|
| 7 |
+
"i": 4,
|
| 8 |
+
"a": 5,
|
| 9 |
+
"o": 6,
|
| 10 |
+
"r": 7,
|
| 11 |
+
"s": 8,
|
| 12 |
+
"l": 9,
|
| 13 |
+
"c": 10,
|
| 14 |
+
"d": 11,
|
| 15 |
+
"u": 12,
|
| 16 |
+
"p": 13,
|
| 17 |
+
",": 14,
|
| 18 |
+
"m": 15,
|
| 19 |
+
"g": 16,
|
| 20 |
+
"\n": 17,
|
| 21 |
+
"h": 18,
|
| 22 |
+
"A": 19,
|
| 23 |
+
"y": 20,
|
| 24 |
+
"I": 21,
|
| 25 |
+
"v": 22,
|
| 26 |
+
"-": 23,
|
| 27 |
+
"P": 24,
|
| 28 |
+
"C": 25,
|
| 29 |
+
"k": 26,
|
| 30 |
+
"b": 27,
|
| 31 |
+
"w": 28,
|
| 32 |
+
"L": 29,
|
| 33 |
+
"f": 30,
|
| 34 |
+
"S": 31,
|
| 35 |
+
"O": 32,
|
| 36 |
+
"D": 33,
|
| 37 |
+
".": 34,
|
| 38 |
+
"E": 35,
|
| 39 |
+
"x": 36,
|
| 40 |
+
"2": 37,
|
| 41 |
+
"|": 38,
|
| 42 |
+
"0": 39,
|
| 43 |
+
"R": 40,
|
| 44 |
+
"M": 41,
|
| 45 |
+
"\u2014": 42,
|
| 46 |
+
"W": 43,
|
| 47 |
+
"T": 44,
|
| 48 |
+
"1": 45,
|
| 49 |
+
"N": 46,
|
| 50 |
+
"B": 47,
|
| 51 |
+
"&": 48,
|
| 52 |
+
":": 49,
|
| 53 |
+
"(": 50,
|
| 54 |
+
")": 51,
|
| 55 |
+
"G": 52,
|
| 56 |
+
"+": 53,
|
| 57 |
+
"9": 54,
|
| 58 |
+
"5": 55,
|
| 59 |
+
"F": 56,
|
| 60 |
+
"\u2013": 57,
|
| 61 |
+
"/": 58,
|
| 62 |
+
"H": 59,
|
| 63 |
+
"U": 60,
|
| 64 |
+
"j": 61,
|
| 65 |
+
"7": 62,
|
| 66 |
+
"3": 63,
|
| 67 |
+
"6": 64,
|
| 68 |
+
"$": 65,
|
| 69 |
+
"\u2192": 66,
|
| 70 |
+
"V": 67,
|
| 71 |
+
"8": 68,
|
| 72 |
+
"q": 69,
|
| 73 |
+
"K": 70,
|
| 74 |
+
"@": 71,
|
| 75 |
+
"z": 72,
|
| 76 |
+
"Y": 73,
|
| 77 |
+
"X": 74,
|
| 78 |
+
";": 75,
|
| 79 |
+
"%": 76,
|
| 80 |
+
"Q": 77,
|
| 81 |
+
"J": 78,
|
| 82 |
+
"Z": 79
|
| 83 |
+
},
|
| 84 |
+
"itos": {
|
| 85 |
+
"0": " ",
|
| 86 |
+
"1": "e",
|
| 87 |
+
"2": "n",
|
| 88 |
+
"3": "t",
|
| 89 |
+
"4": "i",
|
| 90 |
+
"5": "a",
|
| 91 |
+
"6": "o",
|
| 92 |
+
"7": "r",
|
| 93 |
+
"8": "s",
|
| 94 |
+
"9": "l",
|
| 95 |
+
"10": "c",
|
| 96 |
+
"11": "d",
|
| 97 |
+
"12": "u",
|
| 98 |
+
"13": "p",
|
| 99 |
+
"14": ",",
|
| 100 |
+
"15": "m",
|
| 101 |
+
"16": "g",
|
| 102 |
+
"17": "\n",
|
| 103 |
+
"18": "h",
|
| 104 |
+
"19": "A",
|
| 105 |
+
"20": "y",
|
| 106 |
+
"21": "I",
|
| 107 |
+
"22": "v",
|
| 108 |
+
"23": "-",
|
| 109 |
+
"24": "P",
|
| 110 |
+
"25": "C",
|
| 111 |
+
"26": "k",
|
| 112 |
+
"27": "b",
|
| 113 |
+
"28": "w",
|
| 114 |
+
"29": "L",
|
| 115 |
+
"30": "f",
|
| 116 |
+
"31": "S",
|
| 117 |
+
"32": "O",
|
| 118 |
+
"33": "D",
|
| 119 |
+
"34": ".",
|
| 120 |
+
"35": "E",
|
| 121 |
+
"36": "x",
|
| 122 |
+
"37": "2",
|
| 123 |
+
"38": "|",
|
| 124 |
+
"39": "0",
|
| 125 |
+
"40": "R",
|
| 126 |
+
"41": "M",
|
| 127 |
+
"42": "\u2014",
|
| 128 |
+
"43": "W",
|
| 129 |
+
"44": "T",
|
| 130 |
+
"45": "1",
|
| 131 |
+
"46": "N",
|
| 132 |
+
"47": "B",
|
| 133 |
+
"48": "&",
|
| 134 |
+
"49": ":",
|
| 135 |
+
"50": "(",
|
| 136 |
+
"51": ")",
|
| 137 |
+
"52": "G",
|
| 138 |
+
"53": "+",
|
| 139 |
+
"54": "9",
|
| 140 |
+
"55": "5",
|
| 141 |
+
"56": "F",
|
| 142 |
+
"57": "\u2013",
|
| 143 |
+
"58": "/",
|
| 144 |
+
"59": "H",
|
| 145 |
+
"60": "U",
|
| 146 |
+
"61": "j",
|
| 147 |
+
"62": "7",
|
| 148 |
+
"63": "3",
|
| 149 |
+
"64": "6",
|
| 150 |
+
"65": "$",
|
| 151 |
+
"66": "\u2192",
|
| 152 |
+
"67": "V",
|
| 153 |
+
"68": "8",
|
| 154 |
+
"69": "q",
|
| 155 |
+
"70": "K",
|
| 156 |
+
"71": "@",
|
| 157 |
+
"72": "z",
|
| 158 |
+
"73": "Y",
|
| 159 |
+
"74": "X",
|
| 160 |
+
"75": ";",
|
| 161 |
+
"76": "%",
|
| 162 |
+
"77": "Q",
|
| 163 |
+
"78": "J",
|
| 164 |
+
"79": "Z"
|
| 165 |
+
},
|
| 166 |
+
"vocab_size": 80,
|
| 167 |
+
"keywords": {
|
| 168 |
+
"skills": [
|
| 169 |
+
"python",
|
| 170 |
+
"aws",
|
| 171 |
+
"sql",
|
| 172 |
+
"docker",
|
| 173 |
+
"llm",
|
| 174 |
+
"bedrock",
|
| 175 |
+
"lambda",
|
| 176 |
+
"api",
|
| 177 |
+
"langfuse",
|
| 178 |
+
"langsmith",
|
| 179 |
+
"tableau",
|
| 180 |
+
"figma",
|
| 181 |
+
"jira",
|
| 182 |
+
"cdk"
|
| 183 |
+
],
|
| 184 |
+
"education": [
|
| 185 |
+
"bachelor",
|
| 186 |
+
"post graduate",
|
| 187 |
+
"diploma",
|
| 188 |
+
"commerce",
|
| 189 |
+
"business administration"
|
| 190 |
+
],
|
| 191 |
+
"experience": [
|
| 192 |
+
"7"
|
| 193 |
+
],
|
| 194 |
+
"location": [
|
| 195 |
+
"ahmedabad",
|
| 196 |
+
"india"
|
| 197 |
+
],
|
| 198 |
+
"roles": [
|
| 199 |
+
"ai implementation",
|
| 200 |
+
"product manager",
|
| 201 |
+
"consultant",
|
| 202 |
+
"analyst",
|
| 203 |
+
"solution consultant"
|
| 204 |
+
]
|
| 205 |
+
}
|
| 206 |
+
}
|
vocab.py
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import json
|
| 2 |
+
import re
|
| 3 |
+
from collections import Counter
|
| 4 |
+
|
| 5 |
+
# ββ Raw resume text βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 6 |
+
RESUME_TEXT = """
|
| 7 |
+
NILESH HANOTIA
|
| 8 |
+
AI Implementation Lead | POC-to-Production Specialist | Enterprise AI Deployment
|
| 9 |
+
Ahmedabad, India | +91-9925537229 | nilesh.hanotia@outlook.com
|
| 10 |
+
|
| 11 |
+
CERTIFICATIONS
|
| 12 |
+
AWS Certified AI Practitioner | Amazon Web Services
|
| 13 |
+
|
| 14 |
+
PROFESSIONAL SUMMARY
|
| 15 |
+
AI implementation leader with 7+ years driving enterprise AI deployments from first discovery call through
|
| 16 |
+
production go-live. Specialise in POC design and execution, stakeholder alignment, and translating complex
|
| 17 |
+
LLM/AWS architectures into measurable business outcomes. At Armakuni, serve as the bridge between technical
|
| 18 |
+
delivery teams and enterprise clients β owning the full 11-stage POC lifecycle: project allocation, internal/external
|
| 19 |
+
kick-offs, weekly governance, execution, testing, delivery, and path-to-production planning. Independently
|
| 20 |
+
delivered 6+ AI products generating $5M+ combined revenue, with proven impact in healthcare, legal, analytics,
|
| 21 |
+
and automation domains.
|
| 22 |
+
|
| 23 |
+
CORE COMPETENCIES
|
| 24 |
+
AI Implementation & POC Delivery: End-to-end POC lifecycle ownership, POCβProduction roadmapping,
|
| 25 |
+
enterprise AI adoption strategy, deployment governance, MVP scoping, client validation
|
| 26 |
+
Technical Fluency: LLM pipelines & AI workflows, AWS services (Lambda, Bedrock, API Gateway, DynamoDB,
|
| 27 |
+
CloudWatch), serverless architecture, API integrations, solution architecture collaboration, logging & observability
|
| 28 |
+
(Langfuse, Langsmith)
|
| 29 |
+
Stakeholder & Delivery Leadership: Executive alignment, discovery workshops, SOW-to-delivery conversion,
|
| 30 |
+
weekly PSR reporting, risk & escalation management, account expansion strategy, cross-functional team
|
| 31 |
+
coordination
|
| 32 |
+
|
| 33 |
+
PROFESSIONAL EXPERIENCE
|
| 34 |
+
Customer Solution Consultant (CSC) β AI Implementation β Armakuni 2025 β Present
|
| 35 |
+
Own end-to-end delivery of AI POCs and rapid engagements (5β8 weeks) across enterprise clients in healthcare,
|
| 36 |
+
legal, and automation sectors.
|
| 37 |
+
- Drive the full 11-stage POC lifecycle: project allocation, SOW review, internal/external kick-offs, planning,
|
| 38 |
+
weekly governance, execution oversight, testing & client validation, delivery, and path-to-production.
|
| 39 |
+
- Convert Statements of Work into executable delivery plans with milestones, sprint cadences, RACI matrices,
|
| 40 |
+
and risk registers.
|
| 41 |
+
- Serve as primary bridge between developers, solution architects, DevOps, and enterprise client
|
| 42 |
+
stakeholders β ensuring technical decisions align with business outcomes.
|
| 43 |
+
- Lead weekly executive reporting (PSR), risk management, and scope control; escalate proactively across a
|
| 44 |
+
structured L1βL3 escalation matrix.
|
| 45 |
+
- Develop deep working knowledge of AWS services (Lambda, Bedrock, API Gateway, CloudWatch) and LLM
|
| 46 |
+
pipeline architecture to engage credibly with both technical teams and client leadership.
|
| 47 |
+
- Create and maintain technical documentation β process flows, README files, test cases β to ensure
|
| 48 |
+
production readiness from day one of execution.
|
| 49 |
+
- Facilitate path-to-production workshops with clients, mapping POC learnings to scalable architecture,
|
| 50 |
+
compliance requirements (GDPR, HIPAA), and business value expansion plans.
|
| 51 |
+
- Identify account expansion, cross-sell, and upsell opportunities, contributing to long-term Armakuni account
|
| 52 |
+
growth strategy.
|
| 53 |
+
|
| 54 |
+
AI Product & Implementation Lead β Independent Consultant 2021 β 2025
|
| 55 |
+
Delivered AI products end-to-end β from problem discovery and architecture design through deployment, user
|
| 56 |
+
adoption, and ongoing iteration β serving 10,000+ users across multiple industries.
|
| 57 |
+
- Designed and deployed 6+ production AI systems generating $5M+ combined revenue across healthcare,
|
| 58 |
+
legal, enterprise analytics, and automation domains.
|
| 59 |
+
- Led full AI product lifecycle: stakeholder discovery, requirements definition, LLM workflow design, MVP
|
| 60 |
+
build, UAT, and phased production rollout.
|
| 61 |
+
- Reduced manual client workflows by 80-90% through targeted AI automation, directly measurable in client
|
| 62 |
+
operations.
|
| 63 |
+
- Translated complex enterprise business needs into implementable technical architectures β working hands-on
|
| 64 |
+
across AWS, API integrations, and AI/LLM pipelines.
|
| 65 |
+
- Built and validated AI products with real users, iterating rapidly based on adoption data and feedback to
|
| 66 |
+
drive retention and expansion.
|
| 67 |
+
- Simultaneously built independent projects including real-time trading systems on AWS (Lambda,
|
| 68 |
+
DynamoDB, API Gateway, Bedrock, CloudWatch) β deepening hands-on serverless and AI infrastructure expertise.
|
| 69 |
+
|
| 70 |
+
EARLIER CAREER
|
| 71 |
+
Product Analyst β Cignex Datamatics 2020 β 2021
|
| 72 |
+
Business Product Analyst β Cygnet Infotech 2019 β 2020
|
| 73 |
+
Associate Product Manager β Aimdek Technologies 2017 β 2019
|
| 74 |
+
|
| 75 |
+
TECHNICAL TOOLING
|
| 76 |
+
Cloud & AI: AWS (Lambda, Bedrock, API Gateway, DynamoDB, CloudWatch, CloudFront, CDK) | LLM Pipelines | Langfuse | Langsmith
|
| 77 |
+
Dev & Data: Python | SQL | APIs | Docker | Tableau | Mixpanel
|
| 78 |
+
Delivery & Design: Jira | Zoho Projects | Figma | Panda.doc | Agile/Scrum
|
| 79 |
+
|
| 80 |
+
EDUCATION
|
| 81 |
+
Post Graduate Diploma in Business Administration β St. Kabir Institute
|
| 82 |
+
Bachelor of Commerce β IGNOU
|
| 83 |
+
"""
|
| 84 |
+
|
| 85 |
+
# ββ Step 1: Build character-level vocabulary ββββββββββββββββββββββββββββββββββ
|
| 86 |
+
def build_vocab(text):
|
| 87 |
+
# Count frequency of every character
|
| 88 |
+
char_counts = Counter(text)
|
| 89 |
+
|
| 90 |
+
# Sort by frequency (most common first)
|
| 91 |
+
sorted_chars = sorted(char_counts.items(), key=lambda x: -x[1])
|
| 92 |
+
|
| 93 |
+
# Assign ID to each unique character
|
| 94 |
+
stoi = {ch: idx for idx, (ch, _) in enumerate(sorted_chars)}
|
| 95 |
+
itos = {idx: ch for ch, idx in stoi.items()}
|
| 96 |
+
|
| 97 |
+
return stoi, itos, char_counts, sorted_chars
|
| 98 |
+
|
| 99 |
+
# ββ Step 2: Encode full text βββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 100 |
+
def encode(text, stoi):
|
| 101 |
+
return [stoi[ch] for ch in text if ch in stoi]
|
| 102 |
+
|
| 103 |
+
# ββ Step 3: Extract key terms from resume βββββββββββββββββββββββββββββββββββββ
|
| 104 |
+
def extract_keywords(text):
|
| 105 |
+
text_lower = text.lower()
|
| 106 |
+
|
| 107 |
+
skills = ["python", "aws", "sql", "docker", "llm", "bedrock", "lambda",
|
| 108 |
+
"api", "langfuse", "langsmith", "tableau", "figma", "jira", "cdk"]
|
| 109 |
+
education = ["bachelor", "post graduate", "diploma", "commerce", "business administration"]
|
| 110 |
+
experience = re.findall(r'(\d+)\+?\s*years?', text_lower)
|
| 111 |
+
locations = ["ahmedabad", "india"]
|
| 112 |
+
roles = ["ai implementation", "product manager", "consultant", "analyst",
|
| 113 |
+
"product lead", "solution consultant"]
|
| 114 |
+
|
| 115 |
+
found_skills = [s for s in skills if s in text_lower]
|
| 116 |
+
found_education = [e for e in education if e in text_lower]
|
| 117 |
+
found_roles = [r for r in roles if r in text_lower]
|
| 118 |
+
|
| 119 |
+
return {
|
| 120 |
+
"skills" : found_skills,
|
| 121 |
+
"education" : found_education,
|
| 122 |
+
"experience": experience,
|
| 123 |
+
"location" : locations,
|
| 124 |
+
"roles" : found_roles
|
| 125 |
+
}
|
| 126 |
+
|
| 127 |
+
# ββ Main βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 128 |
+
if __name__ == "__main__":
|
| 129 |
+
print("=" * 55)
|
| 130 |
+
print(" VOCABULARY BUILDER β NILESH HANOTIA RESUME")
|
| 131 |
+
print("=" * 55)
|
| 132 |
+
|
| 133 |
+
stoi, itos, char_counts, sorted_chars = build_vocab(RESUME_TEXT)
|
| 134 |
+
|
| 135 |
+
print(f"\nTotal characters (with repeats) : {len(RESUME_TEXT)}")
|
| 136 |
+
print(f"Unique characters : {len(stoi)}")
|
| 137 |
+
print(f"Vocab size : {len(stoi)}")
|
| 138 |
+
|
| 139 |
+
print("\nββ Top 15 most frequent characters ββ")
|
| 140 |
+
for ch, count in sorted_chars[:15]:
|
| 141 |
+
display = repr(ch)
|
| 142 |
+
print(f" {display:6s} β ID {stoi[ch]:3d} | appears {count:4d} times")
|
| 143 |
+
|
| 144 |
+
print("\nββ Full Character β ID mapping ββ")
|
| 145 |
+
for ch, idx in stoi.items():
|
| 146 |
+
display = repr(ch)
|
| 147 |
+
print(f" {display:6s} β {idx}")
|
| 148 |
+
|
| 149 |
+
# Encode a sample
|
| 150 |
+
sample = "AI Implementation Lead with AWS and Python skills"
|
| 151 |
+
encoded = encode(sample, stoi)
|
| 152 |
+
print(f"\nββ Sample Encoding ββ")
|
| 153 |
+
print(f" Text : {sample}")
|
| 154 |
+
print(f" Encoded : {encoded}")
|
| 155 |
+
|
| 156 |
+
# Extract keywords
|
| 157 |
+
print(f"\nββ Extracted Keywords from Resume ββ")
|
| 158 |
+
keywords = extract_keywords(RESUME_TEXT)
|
| 159 |
+
for key, values in keywords.items():
|
| 160 |
+
print(f" {key:12s}: {values}")
|
| 161 |
+
|
| 162 |
+
# Save vocab to JSON
|
| 163 |
+
vocab_data = {
|
| 164 |
+
"stoi" : stoi,
|
| 165 |
+
"itos" : {str(k): v for k, v in itos.items()},
|
| 166 |
+
"vocab_size": len(stoi),
|
| 167 |
+
"keywords" : extract_keywords(RESUME_TEXT)
|
| 168 |
+
}
|
| 169 |
+
|
| 170 |
+
with open("vocab.json", "w") as f:
|
| 171 |
+
json.dump(vocab_data, f, indent=2)
|
| 172 |
+
|
| 173 |
+
print(f"\nβ
vocab.json saved β {len(stoi)} characters mapped")
|
| 174 |
+
print("β
Ready for Step 2: Tokenizer")
|