Search & Retrieval Applied Scientist spanning lexical retrieval, dense retrieval, hybrid search, and neural reranking.
7 years · 16 merged upstream PRs · 42Maru Search 5.5y · MetLife Production ML
I turn production relevance failures into reproducible research, evaluation protocols, and upstream fixes across Lucene, Elasticsearch, sentence-transformers, and Transformers.
Neural ranking correctness. Padding changed ListMLE/PListMLE loss and
valid-document gradients. Maintainer-reported NanoBEIR R100 mean nDCG@10:
ListMLE ~0.39 -> 0.529; matched PListMLE 0.514 -> 0.525.
Research study ·
sentence-transformers #3827
Query semantics. An exact Korean source phrase produced match=1,
match_phrase(slop=0)=0, and match_phrase(slop=1)=1. Fixed two graph
position-gap paths.
Research study ·
Elasticsearch #152931
Text representation. Added an offset-correct Hangul composition filter so
canonically equivalent NFD/NFC modern Hangul can receive equivalent nori
analysis.
Research study ·
Apache Lucene #16242
Korean text -> Lucene/nori -> Elasticsearch query semantics
-> BM25 + dense retrieval -> hybrid fusion
-> cross-encoder reranking -> relevance evaluation
Ranking-objective correctness: Can irrelevant batch padding alter a query's optimization signal and downstream reranker quality?
Representation correctness: Which Unicode, morphology, and token-graph boundaries erase distinctions before ranking?
Polarity-aware retrieval: Do lexical, dense, and reranked systems prefer evidence supporting the opposite proposition?
Each study follows the same evidence chain:
Production-shaped failure -> minimal reproduction -> broken invariant -> controlled experiment -> measured impact -> upstream validation.
Production search. 5.5 years on 42Maru's search team across BM25 relevance, contrastive retrieval, RAG/MRC QA, large-scale indexing, and crawler systems. Enterprise evidence: DSME semantic QA, Hana Bank OCR-NLP/AML.
Production insurance ML. Current MetLife work across features, training, deployment, retraining, monitoring, and online-tested churn, fraud-risk, channel, and cross-sell models.
Retrieval research lab. 36,983 evidence passages; 544-row silver retrieval
study; best checked-in clause@20 64.9%; 444-triple polarity stress across
lexical, dense, and reranked systems.
Reproducible public companion.
Public data assets. Led task design, annotation guidelines, QA, and baseline evaluation for five NIA AI Hub releases totaling approximately 2.3M QA pairs and a 304M-token corpus. Downstream reuse: K-FinHallu, FINALE.
Open-source depth. 16 merged external contributions across Lucene, Elasticsearch, sentence-transformers, Transformers, MLflow, and LlamaIndex. Full PR search.
Information Retrieval · Search Relevance · BM25 · Dense Retrieval ·
Hybrid Search · Learning to Rank · Cross-Encoder Reranking ·
Hard-Negative Mining · Lucene · Elasticsearch · PyTorch ·
sentence-transformers · ANN · nDCG · Recall · RAG Evaluation
Full upstream record: 16 merged contributions
- sentence-transformers #3827: excluded padding from the ListMLE/PListMLE Plackett-Luce normalizer and added a padding-invariance regression. Maintainer-reported NanoBEIR R100 mean nDCG@10: ListMLE approximately
0.39 -> 0.529; matched PListMLE0.514 -> 0.525. Merged. - Apache Lucene #16242: added an opt-in
HangulCompositionCharFilterto nori with offset correction and deliberately narrow Unicode scope. Merged. - Elasticsearch #151157: documented that the default nori
XPNstop tag can remove meaning-bearing prefixes (비급여 -> 급여,부담보 -> 담보) and documented configuration remedies. Merged. - Elasticsearch #152931: preserved position holes in graph phrase queries, fixing exact-source false negatives with span and nori end-to-end tests. Merged.
- sentence-transformers #3817: fixed gathered positives being masked as false negatives in distributed GIST losses. Merged.
- sentence-transformers #3821: made relative-margin filtering sign-independent in mining and GIST losses. Merged.
- sentence-transformers #3816: avoided materializing the full non-FAISS query-corpus similarity matrix; a 10K x 100K local run reduced peak RSS from 4.56 GB to 1.09 GB while preserving outputs. Merged.
- sentence-transformers #3812: added MPS support to cached-loss random-state handling. Merged.
- sentence-transformers #3800: fixed bf16/fp16 training crashes across six learning-to-rank losses. Merged.
- Transformers #46530: fixed CJK stop-string matching on byte-fragment tokenizers. Merged.
- Transformers #46670: made continuous-batching output a snapshot, preventing mutable delivered chunks and soft-reset bookkeeping drift. Merged.
- Transformers #46624: fixed dynamic RoPE failing to reset
inv_freqwhenlayer_type=None. Merged. - Transformers #46763: rounded the ue8m0 FP8 scale before quantization so dequantization matches the stored inverse. Merged.
- Transformers #46784: fixed Moonshine training loss being shifted twice. Merged.
- LlamaIndex #21900: fixed text-splitter recursion when one CJK or emoji token exceeds
chunk_size. Merged. - MLflow #23957: fixed
genai.evaluate()dropping dataset expectations and tags withscorers=[]. Merged.
- PyTorch #187779: MPS fused RMSNorm fp32 weight multiplication. Approved, pending merge.
- vLLM #45168: Hermes parser boundary reproduction. Closed without merge.
- spaCy #13974: Korean tokenizer offsets.
- FAISS #5272: musllinux wheels.
- search_system: runnable Korean insurance-clause retrieval with nori BM25, BGE-M3, hybrid fusion, cross-encoder reranking, Elasticsearch, and FastAPI.
- ko-evidence-bench: privacy-safe retrieval evaluation, synthetic probes, aggregate studies, and representation-correctness research.
- fraud-dataset-validity: reproducible validity audit of public synthetic fraud datasets.
- insurance-bias-probe: controlled demographic-consistency probes for Korean insurance answers.



