Metadata-Version: 2.4
Name: tracllmkit
Version: 0.1.2
Summary: A context traceback tool for LLM
Home-page: https://github.com/WYT8506/TracLLM-Kit
Author: Yanting Wang
Author-email: ykw5450@psu.com
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: accelerate==1.1.1
Requires-Dist: aiofiles==23.2.1
Requires-Dist: aiohappyeyeballs==2.4.3
Requires-Dist: aiohttp==3.11.6
Requires-Dist: aiosignal==1.3.1
Requires-Dist: annotated-types==0.7.0
Requires-Dist: anyio==4.6.2.post1
Requires-Dist: asttokens==2.4.1
Requires-Dist: async-timeout==5.0.1
Requires-Dist: attrs==24.2.0
Requires-Dist: certifi==2024.8.30
Requires-Dist: charset-normalizer==3.4.0
Requires-Dist: click==8.1.7
Requires-Dist: comm==0.2.1
Requires-Dist: contourpy==1.3.1
Requires-Dist: cycler==0.12.1
Requires-Dist: datasets==3.1.0
Requires-Dist: debugpy==1.8.1
Requires-Dist: decorator==5.1.1
Requires-Dist: dill==0.3.8
Requires-Dist: distro==1.9.0
Requires-Dist: einops==0.8.0
Requires-Dist: exceptiongroup==1.2.0
Requires-Dist: executing==2.0.1
Requires-Dist: fastapi==0.115.5
Requires-Dist: ffmpy==0.4.0
Requires-Dist: filelock==3.16.1
Requires-Dist: flash-attn==2.7.0.post2
Requires-Dist: fonttools==4.55.0
Requires-Dist: frozenlist==1.5.0
Requires-Dist: fschat==0.2.36
Requires-Dist: fsspec==2024.9.0
Requires-Dist: gradio==5.6.0
Requires-Dist: gradio_client==1.4.3
Requires-Dist: h11==0.14.0
Requires-Dist: httpcore==1.0.7
Requires-Dist: httpx==0.27.2
Requires-Dist: huggingface-hub==0.26.2
Requires-Dist: idna==3.10
Requires-Dist: ipykernel==6.29.3
Requires-Dist: ipython==8.22.1
Requires-Dist: jedi==0.19.1
Requires-Dist: Jinja2==3.1.4
Requires-Dist: jiter==0.7.1
Requires-Dist: joblib==1.4.2
Requires-Dist: jupyter_client==8.6.0
Requires-Dist: jupyter_core==5.7.1
Requires-Dist: kiwisolver==1.4.7
Requires-Dist: latex2mathml==3.77.0
Requires-Dist: markdown-it-py==3.0.0
Requires-Dist: markdown2==2.5.1
Requires-Dist: MarkupSafe==2.1.5
Requires-Dist: matplotlib==3.9.2
Requires-Dist: matplotlib-inline==0.1.6
Requires-Dist: mdurl==0.1.2
Requires-Dist: mpmath==1.3.0
Requires-Dist: multidict==6.1.0
Requires-Dist: multiprocess==0.70.16
Requires-Dist: nest-asyncio==1.6.0
Requires-Dist: networkx==3.4.2
Requires-Dist: nh3==0.2.18
Requires-Dist: nltk==3.9.1
Requires-Dist: numpy==2.1.3
Requires-Dist: nvidia-cublas-cu12==12.4.5.8
Requires-Dist: nvidia-cuda-cupti-cu12==12.4.127
Requires-Dist: nvidia-cuda-nvrtc-cu12==12.4.127
Requires-Dist: nvidia-cuda-runtime-cu12==12.4.127
Requires-Dist: nvidia-cudnn-cu12==9.1.0.70
Requires-Dist: nvidia-cufft-cu12==11.2.1.3
Requires-Dist: nvidia-curand-cu12==10.3.5.147
Requires-Dist: nvidia-cusolver-cu12==11.6.1.9
Requires-Dist: nvidia-cusparse-cu12==12.3.1.170
Requires-Dist: nvidia-nccl-cu12==2.21.5
Requires-Dist: nvidia-nvjitlink-cu12==12.4.127
Requires-Dist: nvidia-nvtx-cu12==12.4.127
Requires-Dist: openai==1.54.5
Requires-Dist: orjson==3.10.11
Requires-Dist: packaging==23.2
Requires-Dist: pandas==2.2.3
Requires-Dist: parso==0.8.3
Requires-Dist: peft==0.13.2
Requires-Dist: pillow==11.0.0
Requires-Dist: platformdirs==4.2.0
Requires-Dist: prompt-toolkit==3.0.43
Requires-Dist: propcache==0.2.0
Requires-Dist: protobuf==5.28.3
Requires-Dist: psutil==5.9.8
Requires-Dist: pure-eval==0.2.2
Requires-Dist: pyarrow==18.0.0
Requires-Dist: pydantic==2.9.2
Requires-Dist: pydantic_core==2.23.4
Requires-Dist: pydub==0.25.1
Requires-Dist: Pygments==2.17.2
Requires-Dist: pynvml==11.5.3
Requires-Dist: pyparsing==3.2.0
Requires-Dist: python-dateutil==2.8.2
Requires-Dist: python-multipart==0.0.12
Requires-Dist: pytz==2024.2
Requires-Dist: PyYAML==6.0.2
Requires-Dist: pyzmq==25.1.2
Requires-Dist: regex==2024.11.6
Requires-Dist: requests==2.32.3
Requires-Dist: rich==13.9.4
Requires-Dist: ruff==0.7.4
Requires-Dist: safehttpx==0.1.1
Requires-Dist: safetensors==0.4.5
Requires-Dist: scikit-learn==1.5.2
Requires-Dist: scipy==1.14.1
Requires-Dist: semantic-version==2.10.0
Requires-Dist: sentencepiece==0.2.0
Requires-Dist: shellingham==1.5.4
Requires-Dist: shortuuid==1.0.13
Requires-Dist: six==1.16.0
Requires-Dist: sniffio==1.3.1
Requires-Dist: stack-data==0.6.3
Requires-Dist: starlette==0.41.3
Requires-Dist: svgwrite==1.4.3
Requires-Dist: sympy==1.13.1
Requires-Dist: threadpoolctl==3.5.0
Requires-Dist: tiktoken==0.8.0
Requires-Dist: tokenizers==0.20.3
Requires-Dist: tomlkit==0.12.0
Requires-Dist: torch==2.5.1
Requires-Dist: torchaudio==2.5.1
Requires-Dist: torchvision==0.20.1
Requires-Dist: tornado==6.4
Requires-Dist: tqdm==4.67.0
Requires-Dist: traitlets==5.14.1
Requires-Dist: transformers==4.46.3
Requires-Dist: triton==3.1.0
Requires-Dist: typer==0.13.1
Requires-Dist: typing_extensions==4.12.2
Requires-Dist: tzdata==2024.2
Requires-Dist: urllib3==2.2.3
Requires-Dist: uvicorn==0.32.0
Requires-Dist: wavedrom==2.0.3.post3
Requires-Dist: wcwidth==0.2.13
Requires-Dist: websockets==12.0
Requires-Dist: xxhash==3.5.0
Requires-Dist: yarl==1.17.2
Dynamic: author
Dynamic: author-email
Dynamic: classifier
Dynamic: description
Dynamic: description-content-type
Dynamic: home-page
Dynamic: license-file
Dynamic: requires-dist
Dynamic: requires-python
Dynamic: summary

# TracLLM-Kit: A Toolkit for Context Traceback of Long Context LLMs

<p align='center'>
    <img alt="TracLLM" src='assets/fig1.png' width='50%'/>

</p>

This is a toolkit for context traceback, currently supporting perturbation-based methods such as Shapley and TracLLM. The goal is to find the critical texts within a lengthy context that contribute to the LLM's answer. Please refer to this repo (https://github.com/Wang-Yanting/TracLLM) to reproduce the results in the paper.

We are developing more context traceback methods. Stay tuned!

### 🔨 Installation

Please run the following commands to install the package:

```bash
pip install tracllmkit
```
### 🗂️ Supported Perturbation-based Methods
We currently support the following perturbation-based methods:
- Shapley
- Denoised Shapley
- STC (Single Text Contribution)
- LOO (Leave-one-out)
- LIME

The user can choose to use the vanilla version of these methods or the search tree version (from TracLLM) by setting the `attr_type` argument. The user can choose to ensemble multiple methods by passing a list to the `score_funcs` argument.

### 🗂️ Arguments for `PerturbationBasedAttribution`
We list the arguments for `PerturbationBasedAttribution` below:
| Argument             | Example             | Description   |
| -------------------- | ------------------- | ------------- |
| `--llm`     | Generated by create_model | Generated by create_model using the Huggingface model_path and api_key (or OpenAI model_name and api_key) |
| `--explanation_level`     | `sentence` | How to segment the input text, [`sentence`, `paragraph`, `segment`]. |
| `--K`     | 5 | The number of most important texts to report. |
| `--attr_type`   | `tracllm` | Whether to apply the search tree from TracLLM. [`vanilla_perturb`, `tracllm`] |
| `--score_funcs`   | `['stc','loo','denoised_shapley']` | The scoring functions to apply. If more than one, the ensemble method from TracLLM will be applied. Choose from [`stc`, `loo`,`lime`,`shapley`, `denoised_shapley`]|
| `--sh_N`   | `5` | The number of permutations to approximate the Shapley/denoised Shapley value. |
| `--w`   | `2` | The weight of the LOO score function when ensembling. |
| `--beta`   | `0.2` | A parameter for denoised Shapley value. |

### 📝 Getting Started

Explore `tracllmkit` with our example notebook [quick_start.ipynb](examples/quick_start.ipynb).
To use `tracllmkit`, first generate the model and attribution object:

```python
from tracllmkit import create_model, wrap_prompt
from tracllmkit import PerturbationBasedAttribution

model_name = "meta-llama/Meta-Llama-3.1-8B-Instruct"
api_key = "Your API key"
llm = create_model(model_path=model_path, api_key=api_key, device="cuda:0")
score_funcs = ['stc', 'loo', 'denoised_shapley'] #input more than one scoring function for ensembling
attr = PerturbationBasedAttribution(llm, explanation_level="sentence", attr_type="tracllm", score_funcs=score_funcs, sh_N=5)
```

Then, you can craft the prompt and get the LLM's answer:

```python
context = """Heretic is a 2024 American psychological horror[4][5][6] film written and directed by Scott Beck and Bryan Woods. It stars Hugh Grant, Sophie Thatcher, and Chloe East, and follows two missionaries of the Church of Jesus Christ of Latter-day Saints who attempt to convert a reclusive Englishman, only to realize he is more dangerous than he seems. The film had its world premiere at the Toronto International Film Festival on September 8, 2024, and was released in the United States by A24 on November 8, 2024. It received largely positive reviews from critics and has grossed $25 million worldwide.
\n\n Red One is a 2024 American action-adventure Christmas comedy film directed by Jake Kasdan and written by Chris Morgan, from an original story by Hiram Garcia. The film follows the head of North Pole security (Dwayne Johnson) teaming up with a notorious hacker (Chris Evans) in order to locate a kidnapped Santa Claus (J. K. Simmons) on Christmas Eve; Lucy Liu, Kiernan Shipka, Bonnie Hunt, Nick Kroll, Kristofer Hivju, and Wesley Kimmel also star. The film is seen as the first of a Christmas-themed franchise, produced by Amazon MGM Studios in association with Seven Bucks Productions, Chris Morgan Productions, and The Detective Agency.[7][8] Red One was released internationally by Warner Bros. Pictures on November 6 and was released in the United States by Amazon MGM Studios through Metro-Goldwyn-Mayer on November 15, 2024.[9] The film received generally negative reviews from critics, but it has grossed $10 billion solely in the USA. M.O.R.A (Mythological Oversight and Restoration Authority) is a clandestine, multilateral military organization that oversees and protects a secret peace treaty between mythological creatures and humanity. Callum Drift, head commander of Santa Claus's ELF (Enforcement Logistics and Fortification) security, requests to retire after one last Christmas run, as he has become disillusioned with increased bad behavior in the world, exemplified by the growth of Santa's Naughty List. 
"""
question = "Which movie earned more money, Heretic or Red one?"
prompt = wrap_prompt(question, [context])
answer = llm.query(prompt)
print("Answer: ", answer)
```

Finally, you can get the attribution results by calling `attr.attribute`:

```python
texts, important_ids, importance_scores, _, _ = attr.attribute(question, [context], answer)
attr.visualize_results(texts, question, answer, important_ids, importance_scores, width=60)
```

<p align = 'center'>
  <img alt="Example" src='assets/example.png' width='90%'/>
</p>


### Customize Input Text Segmentation

You can customize the explanation level (e.g., word level) by passing a list of texts to the `PerturbationBasedAttribution` class. Please refer to [customize_segmentation.ipynb](examples/customize_segmentation.ipynb) for more details.

### Supported LLMs
The package currently supports huggingface models and OpenAI models. Please refer to [different_LLMs.ipynb](examples/different_LLMs.ipynb) for more details.

### Use a Surrogate Model to Attribute Closed-source LLMs
Directly running perturbation-based methods on closed-source LLMs could be costly. We provide a solution of using a surrogate model to attribute closed-source LLMs. Please refer to [surrogate_LLM.ipynb](examples/surrogate_LLM.ipynb) for more details.

### Acknowledgement
* The model component of this project is based on [Open-Prompt-Injection](https://github.com/liu00222/Open-Prompt-Injection).

### Citation

```bib
@inproceedings{wang2025tracllm,
    title={TracLLM: A Generic Framework for Attributing Long Context LLMs},
    author={Wang, Yanting, and Zou, Wei and Geng, Runpeng and Jia, Jinyuan},
    booktitle={USENIX Security Symposium},
    year={2025}
}
```
