<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Projects |</title><link>https://dhruvmadhwal.github.io/projects/</link><atom:link href="https://dhruvmadhwal.github.io/projects/index.xml" rel="self" type="application/rss+xml"/><description>Projects</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Sun, 19 May 2024 00:00:00 +0000</lastBuildDate><image><url>https://dhruvmadhwal.github.io/media/icon.svg</url><title>Projects</title><link>https://dhruvmadhwal.github.io/projects/</link></image><item><title>Dishcovery</title><link>https://dhruvmadhwal.github.io/projects/pandas/</link><pubDate>Sun, 26 Oct 2025 00:00:00 +0000</pubDate><guid>https://dhruvmadhwal.github.io/projects/pandas/</guid><description>&lt;p&gt;Dishcovery started from a simple truth: I love food, and I&amp;rsquo;m lucky enough to be an adventurous eater with zero dietary restrictions. But I quickly learned that coordinating meals with a group is a completely different story.&lt;/p&gt;
&lt;p&gt;As an international student at ASU, I kept running into the same problem when trying to grab food with friends. Everyone has constraints—someone needs vegetarian or Jain options, someone is lactose intolerant, someone is on a strict budget, and no one wants to travel too far. Finding a place that satisfies all of those constraints before everyone gets hangry is incredibly frustrating.&lt;/p&gt;
&lt;p&gt;Existing apps help you find restaurants, but they don’t help you find the exact dish that works. So, I built Dishcovery to let you search the way you actually think.&lt;/p&gt;
&lt;h2 id="search-the-way-you-actually-think"&gt;Search the Way You Actually Think&lt;/h2&gt;
&lt;p&gt;Instead of browsing menus manually, you can search for exactly what you need:&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&amp;ldquo;vegan ramen under $15 within 2 miles&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&amp;ldquo;gluten-free dessert with no dairy&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You get specific dishes with prices, dietary tags, and locations.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How It Works&lt;/h2&gt;
&lt;p&gt;Under the hood, it combines:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Menu scraping &amp;amp; OCR to digitize restaurant offerings&lt;/li&gt;
&lt;li&gt;LLM-based parsing to identify ingredients and map dietary tags&lt;/li&gt;
&lt;li&gt;Structured data + natural language search to connect users to the right meal&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="current-scope"&gt;Current Scope&lt;/h2&gt;
&lt;p&gt;The current MVP is intentionally limited in scope: it covers ~30 restaurants around ASU as a focused pilot rather than pretending to be a polished production platform. Right now, the bigger goal is to validate the idea, improve the quality of the results, and learn where automation matters most. I&amp;rsquo;m actively working on expanding restaurant coverage and making more of the ingestion, extraction, and tagging pipeline automatic and reliable.&lt;/p&gt;
&lt;p&gt;If you want to try it yourself, check it out
. And if you&amp;rsquo;re curious about the inner workings, you can take a closer look
.&lt;/p&gt;</description></item><item><title>Multi-Hop Reasoning Agent</title><link>https://dhruvmadhwal.github.io/projects/pytorch/</link><pubDate>Sun, 01 Jun 2025 00:00:00 +0000</pubDate><guid>https://dhruvmadhwal.github.io/projects/pytorch/</guid><description>&lt;p&gt;Large language models can answer many questions directly, but they often struggle when a question requires several connected steps. Research shows that breaking complex questions into smaller sub-questions can improve performance, especially when each step is supported by retrieved evidence instead of relying only on model memory (
,
,
).&lt;/p&gt;
&lt;h2 id="why-multi-hop-reasoning"&gt;Why Multi-Hop Reasoning?&lt;/h2&gt;
&lt;p&gt;This project builds on that idea by creating a multi-agent question answering system for complex, multi-step questions. Instead of sending one large prompt to a model, the system decomposes the task, plans intermediate steps, retrieves evidence when needed, and synthesizes a final answer.&lt;/p&gt;
&lt;p&gt;The goal is to produce answers that are grounded and traceable rather than purely guessed from model memory. This is useful for questions that require combining facts across domains such as sports, geography, literature, or current events.&lt;/p&gt;
&lt;p&gt;For example, consider the question:&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;What country is home to the city where the author of &lt;em&gt;Pride and Prejudice&lt;/em&gt; was born?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A direct answer requires multiple connected steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Identify the author of &lt;em&gt;Pride and Prejudice&lt;/em&gt;.&lt;br&gt;
Answer: Jane Austen.&lt;/li&gt;
&lt;li&gt;Find where Jane Austen was born.&lt;br&gt;
Answer: Steventon, Hampshire.&lt;/li&gt;
&lt;li&gt;Determine which country Steventon is in.&lt;br&gt;
Answer: England.&lt;/li&gt;
&lt;li&gt;Synthesize the final answer.&lt;br&gt;
Final answer: England.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This kind of question is simple for a person, but it illustrates why multi-hop reasoning matters: the answer is not found in a single fact. The system has to connect several pieces of information in the right order.&lt;/p&gt;
&lt;h2 id="how-the-agent-works"&gt;How the Agent Works&lt;/h2&gt;
&lt;p&gt;The agent coordinates several specialized components: a planner that decides how to approach the question, a retrieval step that gathers supporting information, a code execution step for calculations or data processing, and a synthesis step that produces the final answer.&lt;/p&gt;
&lt;p&gt;It supports both closed-book reasoning and retrieval-augmented answering using RAG and live web search. It also includes state tracking and stall recovery, allowing the agent to continue through longer reasoning chains without getting stuck.&lt;/p&gt;
&lt;h2 id="implementation"&gt;Implementation&lt;/h2&gt;
&lt;p&gt;I implemented the system in Python using LangGraph and LangChain, with structured outputs through Pydantic and asynchronous execution using asyncio. I also built a Streamlit interface that shows the agent’s intermediate steps, making it easier to inspect how the final answer was reached.&lt;/p&gt;
&lt;p&gt;Overall, this project was an experiment in making LLM-based question answering more reliable by combining decomposition, retrieval, tool use, and multi-agent orchestration.&lt;/p&gt;
&lt;p&gt;If you want to try it yourself, check out the demo
. And if you&amp;rsquo;d like to take a closer look at the implementation, you can find the code
.&lt;/p&gt;</description></item><item><title>Machine Unlearning in Small Language Models</title><link>https://dhruvmadhwal.github.io/projects/scikit/</link><pubDate>Wed, 25 Dec 2024 00:00:00 +0000</pubDate><guid>https://dhruvmadhwal.github.io/projects/scikit/</guid><description>&lt;p&gt;Large language models can memorize facts during training, but removing a specific piece of knowledge after training is not straightforward. Retraining a model from scratch is expensive, and deleting the original data does not guarantee that the model will stop producing what it learned.&lt;/p&gt;
&lt;h2 id="why-unlearning-matters"&gt;Why Unlearning Matters&lt;/h2&gt;
&lt;p&gt;Machine unlearning studies how to make a model intentionally forget targeted information while preserving its general abilities. This matters because models may need to forget private data, copyrighted material, outdated facts, or unsafe responses.&lt;/p&gt;
&lt;p&gt;Prior work such as
showed that approximate unlearning can reduce a model’s ability to recall specific content while keeping much of its general performance intact. Other recent work, such as
, has explored unlearning as a way to remove harmful behavior, copyrighted content, and memorized knowledge from language models.&lt;/p&gt;
&lt;h2 id="what-i-explored"&gt;What I Explored&lt;/h2&gt;
&lt;p&gt;In this project, I explored machine unlearning for small language models in the 3B-4B parameter range. I focused on two techniques: random labeling and gradient ascent.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;With random labeling, the model is fine-tuned on incorrect or randomized answers for the fact it should forget.&lt;/li&gt;
&lt;li&gt;With gradient ascent, the training objective is reversed so the model becomes worse at recalling the targeted information.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="efficiency-through-lightweight-adaptation"&gt;Efficiency Through Lightweight Adaptation&lt;/h2&gt;
&lt;p&gt;To keep the process efficient, I used PEFT and LoRA adapters with quantization. This allowed me to change the model’s behavior without fully retraining it.&lt;/p&gt;
&lt;h2 id="evaluation"&gt;Evaluation&lt;/h2&gt;
&lt;p&gt;A major challenge was making the model forget the target fact without damaging its broader question-answering ability. To evaluate this, I tested whether the model stopped producing the targeted answer while also measuring general performance using BLEU, ROUGE-L, BERTScore, and
, a benchmark designed to measure whether models produce truthful answers rather than imitating common falsehoods.&lt;/p&gt;</description></item></channel></rss>