get-name / README.md
Qrzysztof's picture
add README.md
ed1ccd9 verified
|
Raw
History Blame
5.17 kB
---
language:
- en
license: apache-2.0
datasets:
- cactus-needle/base
metrics: []
model-index: []
pipeline_tag: text-generation
base_model: Cactus-Compute/needle2
tags:
- needle
- cactus-needle
- tool-calling
- named-entity-extraction
- lora
---
# Get Name — addressee/given-name extraction for cactus-needle
`get-name` is a small LoRA fine-tune of the **cactus-needle** base model
(`Cactus-Compute/needle2`) that extracts the **given (first) name of the
intended person** in a piece of text.
It was trained to answer one question: *"which single person is this text
about / addressed to, and what is that person's first name?"* — and to call a
tool only when such a person exists.
| Input | Output |
| --- | --- |
| `Nice to meet you, Alex` | `Alex` |
| `By the way, Alice, if you don't know, how old am I?` | `Alice` |
| `The birth certificate was issued to John Snow` | `John` |
| `Right now, there are me, Carl, Stephanie, and you, Greg, in the room.` | `Greg` |
| `Please let Maria know about the meeting.` | `Maria` |
| `Give this package to Lucas.` | `Lucas` |
| `Hi everyone, thanks for coming.` | *(no call)* |
| `My brother Carl lives in Boston.` | *(no call — mention, not target)* |
## Behaviour
- **Given name only.** Full names are collapsed to the first name on purpose
(`John Snow``John`, `James Miller``James`).
- **Single target.** In enumerations the person directly addressed
(`you, Greg`) is preferred over names merely listed (`the team was Carl,
Stephanie, and Greg` → no call).
- **No call when there is no target:** group greetings, place names, brands,
assistants (Siri/Alexa), generic salutations, and passive mentions.
## How to use
The archive is a needle `.cact` weights file for `cactus-needle`.
```sh
# pull the archive
needle download Qrzysztof/get-name
```
```python
from needle import Needle
tool = {
"name": "extract_name",
"parameters": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The given (first) name of the intended person; never the surname.",
}
},
"required": ["name"],
},
}
system = (
"You extract the given (first) name of the intended person. "
"If the text has no intended person, do not call the tool."
)
agent = Needle(tools=[tool], weights="tuned.cact", system=system)
print(agent.complete("Nice to meet you, Alex"))
# {"name": "Alex"}
```
> **Note:** the `system` prompt above is mandatory for best results — the model
> was trained with it in every example and the same string must be passed at
> inference.
## Training
- **Method:** LoRA adapters (rank 16, alpha 32) on the five attention
projections of every layer of a frozen `Cactus-Compute/needle2` base; engine,
tokenizer and confidence head untouched. Adapter merged into the weights at
export.
- **Data:** ~1,100 hand-curated, template-augmented examples in needle's
tool-calling JSONL format (`data.jsonl` in this repo), 88 % positive /
12 % negative, covering:
- greetings & welcomes,
- vocative / direct address (incl. titled forms, `Dr. John Snow, …`),
- documents issued to a person (birth certificates, passports, licences…),
- enumerations with an addressed member (`…and you, Greg,…`),
- message targets and relays (`Tell Maria…`, `Pass this note to Owen…`),
- off-topic no-call examples (groups, places, brands, assistants, generic
salutations).
- **Hyper-parameters:** batch 16, lr 1e-4 with warmup + cosine decay, grad
clip 1.0, epochs chosen so the held-out loss lands ~0.5 (see Known
limitations), validation split 0.1, seq len 256.
- **Recipe:** `needle finetune data.jsonl --epochs 9 --lora-rank 16` then
`needle build checkpoints/needle2.pkl --lora adapter.pkl --out tuned.cact`.
Training ran on a single Colab T4 and took a few minutes per run.
## Known limitations
- **False-positive rejection is the weak point.** The tuning budget between
*never calls the tool* and *calls a tool on everything* is narrow for this
"is it really addressed to a person?" discrimination. This release is tuned
on the extraction side (strong recall on intended targets). If you need
stricter rejection, retrain with a higher negative share (25 %+) and stop a
little earlier on the validation curve.
- **Sequential calls in one process:** repeated `complete()` calls in the same
long-lived process showed degraded output on later calls. For batch work,
run one fresh process per text (one query each) or recreate the `Needle`
object between batches.
- **Confidence head is not tuned:** tuned weights report `confidence` as
`None` and a warning is emitted at construction (expected with needle LoRA
blends).
- **Non-English input:** like the base model, out-of-domain text (and Spanish
in particular) is not well calibrated.
## Files
- `tuned.cact` — merged, exported weights (13.7 MB) for `Needle(weights=...)`.
- `data.jsonl` — the training dataset (browser-search friendly, one JSON
object per line).
- `tool.json` — the `extract_name` tool schema.
- `README.md` — this card.